@@ -187,11 +187,12 @@ func TestControllerV2SyncCronJob(t *testing.T) {
187
187
188
188
testCases := map [string ]struct {
189
189
// cj spec
190
- concurrencyPolicy batchv1.ConcurrencyPolicy
191
- suspend bool
192
- schedule string
193
- timeZone * string
194
- deadline int64
190
+ concurrencyPolicy batchv1.ConcurrencyPolicy
191
+ suspend bool
192
+ schedule string
193
+ timeZone * string
194
+ deadline int64
195
+ successfulJobsHistoryLimit * int32
195
196
196
197
// cj status
197
198
ranPreviously bool
@@ -208,6 +209,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
208
209
// expectations
209
210
expectCreate bool
210
211
expectDelete bool
212
+ expectCompleted bool
211
213
expectActive int
212
214
expectedWarnings int
213
215
expectErr bool
@@ -419,6 +421,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
419
421
expectedRequeueDuration : 1 * time .Minute + nextScheduleDelta ,
420
422
expectUpdateStatus : true ,
421
423
jobPresentInCJActiveStatus : true ,
424
+ expectCompleted : true ,
422
425
},
423
426
"prev ran but done, not time, F" : {
424
427
concurrencyPolicy : "Forbid" ,
@@ -431,6 +434,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
431
434
expectedRequeueDuration : 1 * time .Minute + nextScheduleDelta ,
432
435
expectUpdateStatus : true ,
433
436
jobPresentInCJActiveStatus : true ,
437
+ expectCompleted : true ,
434
438
},
435
439
"prev ran but done, not time, R" : {
436
440
concurrencyPolicy : "Replace" ,
@@ -443,6 +447,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
443
447
expectedRequeueDuration : 1 * time .Minute + nextScheduleDelta ,
444
448
expectUpdateStatus : true ,
445
449
jobPresentInCJActiveStatus : true ,
450
+ expectCompleted : true ,
446
451
},
447
452
"prev ran but done, is time, A" : {
448
453
concurrencyPolicy : "Allow" ,
@@ -457,6 +462,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
457
462
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
458
463
expectUpdateStatus : true ,
459
464
jobPresentInCJActiveStatus : true ,
465
+ expectCompleted : true ,
460
466
},
461
467
"prev ran but done, is time, create job failed, A" : {
462
468
concurrencyPolicy : "Allow" ,
@@ -469,6 +475,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
469
475
expectErr : false ,
470
476
expectUpdateStatus : true ,
471
477
jobPresentInCJActiveStatus : true ,
478
+ expectCompleted : true ,
472
479
},
473
480
"prev ran but done, is time, job not present in CJ active status, create job failed, A" : {
474
481
concurrencyPolicy : "Allow" ,
@@ -495,6 +502,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
495
502
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
496
503
expectUpdateStatus : true ,
497
504
jobPresentInCJActiveStatus : true ,
505
+ expectCompleted : true ,
498
506
},
499
507
"prev ran but done, is time, R" : {
500
508
concurrencyPolicy : "Replace" ,
@@ -509,6 +517,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
509
517
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
510
518
expectUpdateStatus : true ,
511
519
jobPresentInCJActiveStatus : true ,
520
+ expectCompleted : true ,
512
521
},
513
522
"prev ran but done, is time, suspended" : {
514
523
concurrencyPolicy : "Allow" ,
@@ -520,6 +529,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
520
529
now : * justAfterTheHour (),
521
530
expectUpdateStatus : true ,
522
531
jobPresentInCJActiveStatus : true ,
532
+ expectCompleted : true ,
523
533
},
524
534
"prev ran but done, is time, past deadline" : {
525
535
concurrencyPolicy : "Allow" ,
@@ -532,6 +542,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
532
542
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
533
543
expectUpdateStatus : true ,
534
544
jobPresentInCJActiveStatus : true ,
545
+ expectCompleted : true ,
535
546
},
536
547
"prev ran but done, is time, not past deadline" : {
537
548
concurrencyPolicy : "Allow" ,
@@ -546,6 +557,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
546
557
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
547
558
expectUpdateStatus : true ,
548
559
jobPresentInCJActiveStatus : true ,
560
+ expectCompleted : true ,
549
561
},
550
562
551
563
"still active, not time, A" : {
@@ -701,6 +713,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
701
713
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
702
714
expectUpdateStatus : true ,
703
715
jobPresentInCJActiveStatus : true ,
716
+ expectCompleted : true ,
704
717
},
705
718
"prev ran but done, long overdue, not past deadline, R" : {
706
719
concurrencyPolicy : "Replace" ,
@@ -716,6 +729,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
716
729
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
717
730
expectUpdateStatus : true ,
718
731
jobPresentInCJActiveStatus : true ,
732
+ expectCompleted : true ,
719
733
},
720
734
"prev ran but done, long overdue, not past deadline, F" : {
721
735
concurrencyPolicy : "Forbid" ,
@@ -731,6 +745,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
731
745
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
732
746
expectUpdateStatus : true ,
733
747
jobPresentInCJActiveStatus : true ,
748
+ expectCompleted : true ,
734
749
},
735
750
"prev ran but done, long overdue, no deadline, A" : {
736
751
concurrencyPolicy : "Allow" ,
@@ -746,6 +761,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
746
761
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
747
762
expectUpdateStatus : true ,
748
763
jobPresentInCJActiveStatus : true ,
764
+ expectCompleted : true ,
749
765
},
750
766
"prev ran but done, long overdue, no deadline, R" : {
751
767
concurrencyPolicy : "Replace" ,
@@ -761,6 +777,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
761
777
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
762
778
expectUpdateStatus : true ,
763
779
jobPresentInCJActiveStatus : true ,
780
+ expectCompleted : true ,
764
781
},
765
782
"prev ran but done, long overdue, no deadline, F" : {
766
783
concurrencyPolicy : "Forbid" ,
@@ -776,6 +793,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
776
793
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
777
794
expectUpdateStatus : true ,
778
795
jobPresentInCJActiveStatus : true ,
796
+ expectCompleted : true ,
779
797
},
780
798
781
799
"prev ran but done, long overdue, past medium deadline, A" : {
@@ -791,6 +809,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
791
809
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
792
810
expectUpdateStatus : true ,
793
811
jobPresentInCJActiveStatus : true ,
812
+ expectCompleted : true ,
794
813
},
795
814
"prev ran but done, long overdue, past short deadline, A" : {
796
815
concurrencyPolicy : "Allow" ,
@@ -805,6 +824,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
805
824
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
806
825
expectUpdateStatus : true ,
807
826
jobPresentInCJActiveStatus : true ,
827
+ expectCompleted : true ,
808
828
},
809
829
810
830
"prev ran but done, long overdue, past medium deadline, R" : {
@@ -820,6 +840,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
820
840
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
821
841
expectUpdateStatus : true ,
822
842
jobPresentInCJActiveStatus : true ,
843
+ expectCompleted : true ,
823
844
},
824
845
"prev ran but done, long overdue, past short deadline, R" : {
825
846
concurrencyPolicy : "Replace" ,
@@ -834,6 +855,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
834
855
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
835
856
expectUpdateStatus : true ,
836
857
jobPresentInCJActiveStatus : true ,
858
+ expectCompleted : true ,
837
859
},
838
860
839
861
"prev ran but done, long overdue, past medium deadline, F" : {
@@ -849,6 +871,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
849
871
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
850
872
expectUpdateStatus : true ,
851
873
jobPresentInCJActiveStatus : true ,
874
+ expectCompleted : true ,
852
875
},
853
876
"prev ran but done, long overdue, past short deadline, F" : {
854
877
concurrencyPolicy : "Forbid" ,
@@ -863,6 +886,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
863
886
expectedRequeueDuration : 1 * time .Hour + nextScheduleDelta ,
864
887
expectUpdateStatus : true ,
865
888
jobPresentInCJActiveStatus : true ,
889
+ expectCompleted : true ,
866
890
},
867
891
868
892
// Tests for time skews
@@ -1026,6 +1050,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1026
1050
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
1027
1051
expectUpdateStatus : true ,
1028
1052
jobPresentInCJActiveStatus : true ,
1053
+ expectCompleted : true ,
1029
1054
},
1030
1055
"with @every schedule, prev ran but done, is time" : {
1031
1056
concurrencyPolicy : "Allow" ,
@@ -1042,6 +1067,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1042
1067
expectedRequeueDuration : 1 * time .Hour - 1 * time .Minute + nextScheduleDelta ,
1043
1068
expectUpdateStatus : true ,
1044
1069
jobPresentInCJActiveStatus : true ,
1070
+ expectCompleted : true ,
1045
1071
},
1046
1072
"with @every schedule, prev ran but done, is time, past deadline" : {
1047
1073
concurrencyPolicy : "Allow" ,
@@ -1056,6 +1082,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1056
1082
expectedRequeueDuration : 1 * time .Hour - time .Second * time .Duration (shortDead + 1 ) + nextScheduleDelta ,
1057
1083
expectUpdateStatus : true ,
1058
1084
jobPresentInCJActiveStatus : true ,
1085
+ expectCompleted : true ,
1059
1086
},
1060
1087
// This test will fail: the logic around StartingDeadlineSecond in getNextScheduleTime messes up
1061
1088
// the time that calculating schedule.Next(earliestTime) is based on. While this works perfectly
@@ -1157,6 +1184,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1157
1184
expectedRequeueDuration : 1 * time .Minute + nextScheduleDelta ,
1158
1185
expectUpdateStatus : true ,
1159
1186
jobPresentInCJActiveStatus : true ,
1187
+ expectCompleted : true ,
1160
1188
},
1161
1189
"with @every schedule, prev ran but done, long overdue, past deadline" : {
1162
1190
concurrencyPolicy : "Allow" ,
@@ -1172,6 +1200,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1172
1200
expectedRequeueDuration : 1 * time .Hour - time .Second * time .Duration (shortDead + 1 ) + nextScheduleDelta ,
1173
1201
expectUpdateStatus : true ,
1174
1202
jobPresentInCJActiveStatus : true ,
1203
+ expectCompleted : true ,
1175
1204
},
1176
1205
"do nothing if the namespace is terminating" : {
1177
1206
jobCreateError : & errors.StatusError {ErrStatus : metav1.Status {Details : & metav1.StatusDetails {Causes : []metav1.StatusCause {
@@ -1193,6 +1222,29 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1193
1222
expectErr : true ,
1194
1223
jobPresentInCJActiveStatus : false ,
1195
1224
},
1225
+ "set lastsuccessfultime if successfulJobHistoryLimit is zero" : {
1226
+ successfulJobsHistoryLimit : pointer .Int32 (0 ),
1227
+ ranPreviously : true ,
1228
+ schedule : onTheHour ,
1229
+ expectUpdateStatus : true ,
1230
+ expectCompleted : true ,
1231
+ jobPresentInCJActiveStatus : true ,
1232
+ },
1233
+ "set lastsuccessfultime if successfulJobHistoryLimit is ten" : {
1234
+ successfulJobsHistoryLimit : pointer .Int32 (10 ),
1235
+ ranPreviously : true ,
1236
+ schedule : onTheHour ,
1237
+ expectUpdateStatus : true ,
1238
+ expectCompleted : true ,
1239
+ jobPresentInCJActiveStatus : true ,
1240
+ },
1241
+ "set lastsuccessfultime if successfulJobHistoryLimit is nil" : {
1242
+ ranPreviously : true ,
1243
+ schedule : onTheHour ,
1244
+ expectUpdateStatus : true ,
1245
+ expectCompleted : true ,
1246
+ jobPresentInCJActiveStatus : true ,
1247
+ },
1196
1248
}
1197
1249
for name , tc := range testCases {
1198
1250
name := name
@@ -1204,6 +1256,7 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1204
1256
cj .Spec .Suspend = & tc .suspend
1205
1257
cj .Spec .Schedule = tc .schedule
1206
1258
cj .Spec .TimeZone = tc .timeZone
1259
+ cj .Spec .SuccessfulJobsHistoryLimit = tc .successfulJobsHistoryLimit
1207
1260
if tc .deadline != noDead {
1208
1261
cj .Spec .StartingDeadlineSeconds = & tc .deadline
1209
1262
}
@@ -1229,14 +1282,16 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1229
1282
}
1230
1283
job .UID = "1234"
1231
1284
job .Namespace = cj .Namespace
1285
+
1286
+ ref , err := getRef (job )
1287
+ if err != nil {
1288
+ t .Fatalf ("%s: unexpected error getting the job object reference: %v" , name , err )
1289
+ }
1290
+ if tc .jobPresentInCJActiveStatus {
1291
+ cj .Status .Active = []v1.ObjectReference {* ref }
1292
+ }
1293
+
1232
1294
if tc .stillActive {
1233
- ref , err := getRef (job )
1234
- if err != nil {
1235
- t .Fatalf ("%s: unexpected error getting the job object reference: %v" , name , err )
1236
- }
1237
- if tc .jobPresentInCJActiveStatus {
1238
- cj .Status .Active = []v1.ObjectReference {* ref }
1239
- }
1240
1295
realCJ .Status .Active = []v1.ObjectReference {* ref }
1241
1296
if ! tc .jobStillNotFoundInLister {
1242
1297
js = append (js , job )
@@ -1341,6 +1396,9 @@ func TestControllerV2SyncCronJob(t *testing.T) {
1341
1396
if tc .expectDelete {
1342
1397
expectedEvents ++
1343
1398
}
1399
+ if tc .expectCompleted {
1400
+ expectedEvents ++
1401
+ }
1344
1402
if name == "still active, is time, F" {
1345
1403
// this is the only test case where we would raise an event for not scheduling
1346
1404
expectedEvents ++
0 commit comments