@@ -17,19 +17,27 @@ limitations under the License.
17
17
package node
18
18
19
19
import (
20
+ "fmt"
20
21
"time"
21
22
22
23
batchv1 "k8s.io/api/batch/v1"
23
24
v1 "k8s.io/api/core/v1"
25
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24
26
"k8s.io/apimachinery/pkg/util/wait"
27
+ clientset "k8s.io/client-go/kubernetes"
25
28
"k8s.io/kubernetes/pkg/util/slice"
26
29
"k8s.io/kubernetes/test/e2e/framework"
27
30
jobutil "k8s.io/kubernetes/test/e2e/framework/job"
28
31
29
32
"github.com/onsi/ginkgo"
30
33
)
31
34
32
- const dummyFinalizer = "k8s.io/dummy-finalizer"
35
+ const (
36
+ dummyFinalizer = "k8s.io/dummy-finalizer"
37
+
38
+ // JobTimeout is how long to wait for a job to finish.
39
+ JobTimeout = 15 * time .Minute
40
+ )
33
41
34
42
var _ = framework .KubeDescribe ("[Feature:TTLAfterFinished][NodeAlphaFeature:TTLAfterFinished]" , func () {
35
43
f := framework .NewDefaultFramework ("ttlafterfinished" )
@@ -47,7 +55,7 @@ func cleanupJob(f *framework.Framework, job *batchv1.Job) {
47
55
removeFinalizerFunc := func (j * batchv1.Job ) {
48
56
j .ObjectMeta .Finalizers = slice .RemoveString (j .ObjectMeta .Finalizers , dummyFinalizer , nil )
49
57
}
50
- _ , err := jobutil . UpdateJobWithRetries (c , ns , job .Name , removeFinalizerFunc )
58
+ _ , err := updateJobWithRetries (c , ns , job .Name , removeFinalizerFunc )
51
59
framework .ExpectNoError (err )
52
60
jobutil .WaitForJobGone (c , ns , job .Name , wait .ForeverTestTimeout )
53
61
@@ -78,13 +86,13 @@ func testFinishedJob(f *framework.Framework) {
78
86
framework .ExpectNoError (err )
79
87
80
88
framework .Logf ("Wait for TTL after finished controller to delete the Job" )
81
- err = jobutil . WaitForJobDeleting (c , ns , job .Name )
89
+ err = waitForJobDeleting (c , ns , job .Name )
82
90
framework .ExpectNoError (err )
83
91
84
92
framework .Logf ("Check Job's deletionTimestamp and compare with the time when the Job finished" )
85
93
job , err = jobutil .GetJob (c , ns , job .Name )
86
94
framework .ExpectNoError (err )
87
- finishTime := jobutil . FinishTime (job )
95
+ finishTime := FinishTime (job )
88
96
finishTimeUTC := finishTime .UTC ()
89
97
framework .ExpectNotEqual (finishTime .IsZero (), true )
90
98
@@ -94,3 +102,49 @@ func testFinishedJob(f *framework.Framework) {
94
102
expireAtUTC := finishTimeUTC .Add (time .Duration (ttl ) * time .Second )
95
103
framework .ExpectEqual (deleteAtUTC .Before (expireAtUTC ), false )
96
104
}
105
+
106
+ // FinishTime returns finish time of the specified job.
107
+ func FinishTime (finishedJob * batchv1.Job ) metav1.Time {
108
+ var finishTime metav1.Time
109
+ for _ , c := range finishedJob .Status .Conditions {
110
+ if (c .Type == batchv1 .JobComplete || c .Type == batchv1 .JobFailed ) && c .Status == v1 .ConditionTrue {
111
+ return c .LastTransitionTime
112
+ }
113
+ }
114
+ return finishTime
115
+ }
116
+
117
+ // updateJobWithRetries updates job with retries.
118
+ func updateJobWithRetries (c clientset.Interface , namespace , name string , applyUpdate func (* batchv1.Job )) (job * batchv1.Job , err error ) {
119
+ jobs := c .BatchV1 ().Jobs (namespace )
120
+ var updateErr error
121
+ pollErr := wait .PollImmediate (framework .Poll , JobTimeout , func () (bool , error ) {
122
+ if job , err = jobs .Get (name , metav1.GetOptions {}); err != nil {
123
+ return false , err
124
+ }
125
+ // Apply the update, then attempt to push it to the apiserver.
126
+ applyUpdate (job )
127
+ if job , err = jobs .Update (job ); err == nil {
128
+ framework .Logf ("Updating job %s" , name )
129
+ return true , nil
130
+ }
131
+ updateErr = err
132
+ return false , nil
133
+ })
134
+ if pollErr == wait .ErrWaitTimeout {
135
+ pollErr = fmt .Errorf ("couldn't apply the provided updated to job %q: %v" , name , updateErr )
136
+ }
137
+ return job , pollErr
138
+ }
139
+
140
+ // waitForJobDeleting uses c to wait for the Job jobName in namespace ns to have
141
+ // a non-nil deletionTimestamp (i.e. being deleted).
142
+ func waitForJobDeleting (c clientset.Interface , ns , jobName string ) error {
143
+ return wait .PollImmediate (framework .Poll , JobTimeout , func () (bool , error ) {
144
+ curr , err := c .BatchV1 ().Jobs (ns ).Get (jobName , metav1.GetOptions {})
145
+ if err != nil {
146
+ return false , err
147
+ }
148
+ return curr .ObjectMeta .DeletionTimestamp != nil , nil
149
+ })
150
+ }
0 commit comments