@@ -18,7 +18,9 @@ package rest
18
18
19
19
import (
20
20
"context"
21
+ "reflect"
21
22
"testing"
23
+ "time"
22
24
23
25
v1 "k8s.io/api/core/v1"
24
26
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -52,15 +54,32 @@ func TestBeforeDelete(t *testing.T) {
52
54
options * metav1.DeleteOptions
53
55
}
54
56
55
- makePod := func (deletionGracePeriodSeconds int64 ) * v1.Pod {
57
+ // snapshot and restore real metav1Now function
58
+ originalMetav1Now := metav1Now
59
+ t .Cleanup (func () {
60
+ metav1Now = originalMetav1Now
61
+ })
62
+
63
+ // make now refer to a fixed point in time
64
+ now := metav1.Time {Time : time .Now ().Truncate (time .Second )}
65
+ metav1Now = func () metav1.Time {
66
+ return now
67
+ }
68
+
69
+ makePodWithDeletionTimestamp := func (deletionTimestamp * metav1.Time , deletionGracePeriodSeconds int64 ) * v1.Pod {
56
70
return & v1.Pod {
57
71
TypeMeta : metav1.TypeMeta {APIVersion : "v1" , Kind : "Pod" },
58
72
ObjectMeta : metav1.ObjectMeta {
59
- DeletionTimestamp : & metav1. Time {} ,
73
+ DeletionTimestamp : deletionTimestamp ,
60
74
DeletionGracePeriodSeconds : & deletionGracePeriodSeconds ,
61
75
},
62
76
}
63
77
}
78
+ makePod := func (deletionGracePeriodSeconds int64 ) * v1.Pod {
79
+ deletionTimestamp := now
80
+ deletionTimestamp .Time = deletionTimestamp .Time .Add (time .Duration (deletionGracePeriodSeconds ) * time .Second )
81
+ return makePodWithDeletionTimestamp (& deletionTimestamp , deletionGracePeriodSeconds )
82
+ }
64
83
makeOption := func (gracePeriodSeconds int64 ) * metav1.DeleteOptions {
65
84
return & metav1.DeleteOptions {
66
85
GracePeriodSeconds : & gracePeriodSeconds ,
@@ -74,6 +93,7 @@ func TestBeforeDelete(t *testing.T) {
74
93
wantGracefulPending bool
75
94
wantGracePeriodSeconds * int64
76
95
wantDeletionGracePeriodSeconds * int64
96
+ wantDeletionTimestamp * metav1.Time
77
97
wantErr bool
78
98
}{
79
99
{
@@ -271,6 +291,28 @@ func TestBeforeDelete(t *testing.T) {
271
291
wantGraceful : false ,
272
292
wantGracefulPending : true ,
273
293
},
294
+ {
295
+ name : "when a shorter non-zero grace period would move into the past" ,
296
+ args : args {
297
+ pod : makePodWithDeletionTimestamp (& metav1.Time {Time : now .Time .Add (- time .Minute )}, 60 ),
298
+ options : makeOption (50 ),
299
+ },
300
+ wantDeletionTimestamp : & now ,
301
+ wantDeletionGracePeriodSeconds : utilpointer .Int64 (1 ),
302
+ wantGracePeriodSeconds : utilpointer .Int64 (50 ),
303
+ wantGraceful : true ,
304
+ },
305
+ {
306
+ name : "when a zero grace period would move into the past" ,
307
+ args : args {
308
+ pod : makePodWithDeletionTimestamp (& metav1.Time {Time : now .Time .Add (- time .Minute )}, 60 ),
309
+ options : makeOption (0 ),
310
+ },
311
+ wantDeletionTimestamp : & now ,
312
+ wantDeletionGracePeriodSeconds : utilpointer .Int64 (0 ),
313
+ wantGracePeriodSeconds : utilpointer .Int64 (0 ),
314
+ wantGraceful : true ,
315
+ },
274
316
}
275
317
for _ , tt := range tests {
276
318
t .Run (tt .name , func (t * testing.T ) {
@@ -301,6 +343,11 @@ func TestBeforeDelete(t *testing.T) {
301
343
if ! utilpointer .Int64Equal (tt .args .options .GracePeriodSeconds , tt .wantGracePeriodSeconds ) {
302
344
t .Errorf ("options.GracePeriodSeconds = %v, want %v" , ptr .Deref (tt .args .options .GracePeriodSeconds , 0 ), ptr .Deref (tt .wantGracePeriodSeconds , 0 ))
303
345
}
346
+ if tt .wantDeletionTimestamp != nil {
347
+ if ! reflect .DeepEqual (tt .args .pod .DeletionTimestamp , tt .wantDeletionTimestamp ) {
348
+ t .Errorf ("pod.deletionTimestamp = %v, want %v" , tt .args .pod .DeletionTimestamp , tt .wantDeletionTimestamp )
349
+ }
350
+ }
304
351
})
305
352
}
306
353
}
0 commit comments