@@ -17,6 +17,7 @@ limitations under the License.
17
17
package validation
18
18
19
19
import (
20
+ "strconv"
20
21
"strings"
21
22
"testing"
22
23
@@ -41,6 +42,7 @@ func TestValidateStatefulSet(t *testing.T) {
41
42
},
42
43
},
43
44
}
45
+
44
46
invalidLabels := map [string ]string {"NoUppercaseOrSpecialCharsLike=Equals" : "b" }
45
47
invalidPodTemplate := api.PodTemplate {
46
48
Template : api.PodTemplateSpec {
@@ -53,6 +55,21 @@ func TestValidateStatefulSet(t *testing.T) {
53
55
},
54
56
},
55
57
}
58
+
59
+ invalidTime := int64 (60 )
60
+ invalidPodTemplate2 := api.PodTemplate {
61
+ Template : api.PodTemplateSpec {
62
+ ObjectMeta : metav1.ObjectMeta {
63
+ Labels : map [string ]string {"foo" : "bar" },
64
+ },
65
+ Spec : api.PodSpec {
66
+ RestartPolicy : api .RestartPolicyOnFailure ,
67
+ DNSPolicy : api .DNSClusterFirst ,
68
+ ActiveDeadlineSeconds : & invalidTime ,
69
+ },
70
+ },
71
+ }
72
+
56
73
successCases := []apps.StatefulSet {
57
74
{
58
75
ObjectMeta : metav1.ObjectMeta {Name : "abc" , Namespace : metav1 .NamespaceDefault },
@@ -105,10 +122,13 @@ func TestValidateStatefulSet(t *testing.T) {
105
122
},
106
123
},
107
124
}
108
- for _ , successCase := range successCases {
109
- if errs := ValidateStatefulSet (& successCase ); len (errs ) != 0 {
110
- t .Errorf ("expected success: %v" , errs )
111
- }
125
+
126
+ for i , successCase := range successCases {
127
+ t .Run ("success case " + strconv .Itoa (i ), func (t * testing.T ) {
128
+ if errs := ValidateStatefulSet (& successCase ); len (errs ) != 0 {
129
+ t .Errorf ("expected success: %v" , errs )
130
+ }
131
+ })
112
132
}
113
133
114
134
errorCases := map [string ]apps.StatefulSet {
@@ -260,6 +280,29 @@ func TestValidateStatefulSet(t *testing.T) {
260
280
UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : "foo" },
261
281
},
262
282
},
283
+ "empty udpate strategy" : {
284
+ ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
285
+ Spec : apps.StatefulSetSpec {
286
+ PodManagementPolicy : apps .OrderedReadyPodManagement ,
287
+ Selector : & metav1.LabelSelector {MatchLabels : validLabels },
288
+ Template : validPodTemplate .Template ,
289
+ Replicas : 3 ,
290
+ UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : "" },
291
+ },
292
+ },
293
+ "invalid rolling update" : {
294
+ ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
295
+ Spec : apps.StatefulSetSpec {
296
+ PodManagementPolicy : apps .OrderedReadyPodManagement ,
297
+ Selector : & metav1.LabelSelector {MatchLabels : validLabels },
298
+ Template : validPodTemplate .Template ,
299
+ Replicas : 3 ,
300
+ UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : apps .OnDeleteStatefulSetStrategyType ,
301
+ RollingUpdate : func () * apps.RollingUpdateStatefulSetStrategy {
302
+ return & apps.RollingUpdateStatefulSetStrategy {Partition : 1 }
303
+ }()},
304
+ },
305
+ },
263
306
"negative parition" : {
264
307
ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
265
308
Spec : apps.StatefulSetSpec {
@@ -273,31 +316,67 @@ func TestValidateStatefulSet(t *testing.T) {
273
316
}()},
274
317
},
275
318
},
319
+ "empty pod management policy" : {
320
+ ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
321
+ Spec : apps.StatefulSetSpec {
322
+ PodManagementPolicy : "" ,
323
+ Selector : & metav1.LabelSelector {MatchLabels : validLabels },
324
+ Template : validPodTemplate .Template ,
325
+ Replicas : 3 ,
326
+ UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : apps .RollingUpdateStatefulSetStrategyType },
327
+ },
328
+ },
329
+ "invalid pod management policy" : {
330
+ ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
331
+ Spec : apps.StatefulSetSpec {
332
+ PodManagementPolicy : "foo" ,
333
+ Selector : & metav1.LabelSelector {MatchLabels : validLabels },
334
+ Template : validPodTemplate .Template ,
335
+ Replicas : 3 ,
336
+ UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : apps .RollingUpdateStatefulSetStrategyType },
337
+ },
338
+ },
339
+ "set active deadline seconds" : {
340
+ ObjectMeta : metav1.ObjectMeta {Name : "abc-123" , Namespace : metav1 .NamespaceDefault },
341
+ Spec : apps.StatefulSetSpec {
342
+ PodManagementPolicy : "foo" ,
343
+ Selector : & metav1.LabelSelector {MatchLabels : validLabels },
344
+ Template : invalidPodTemplate2 .Template ,
345
+ Replicas : 3 ,
346
+ UpdateStrategy : apps.StatefulSetUpdateStrategy {Type : apps .RollingUpdateStatefulSetStrategyType },
347
+ },
348
+ },
276
349
}
350
+
277
351
for k , v := range errorCases {
278
- errs := ValidateStatefulSet (& v )
279
- if len (errs ) == 0 {
280
- t .Errorf ("expected failure for %s" , k )
281
- }
282
- for i := range errs {
283
- field := errs [i ].Field
284
- if ! strings .HasPrefix (field , "spec.template." ) &&
285
- field != "metadata.name" &&
286
- field != "metadata.namespace" &&
287
- field != "spec.selector" &&
288
- field != "spec.template" &&
289
- field != "GCEPersistentDisk.ReadOnly" &&
290
- field != "spec.replicas" &&
291
- field != "spec.template.labels" &&
292
- field != "metadata.annotations" &&
293
- field != "metadata.labels" &&
294
- field != "status.replicas" &&
295
- field != "spec.updateStrategy" &&
296
- field != "spec.updateStrategy.rollingUpdate" &&
297
- field != "spec.updateStrategy.rollingUpdate.partition" {
298
- t .Errorf ("%s: missing prefix for: %v" , k , errs [i ])
352
+ t .Run (k , func (t * testing.T ) {
353
+ errs := ValidateStatefulSet (& v )
354
+ if len (errs ) == 0 {
355
+ t .Errorf ("expected failure for %s" , k )
299
356
}
300
- }
357
+
358
+ for i := range errs {
359
+ field := errs [i ].Field
360
+ if ! strings .HasPrefix (field , "spec.template." ) &&
361
+ field != "metadata.name" &&
362
+ field != "metadata.namespace" &&
363
+ field != "spec.selector" &&
364
+ field != "spec.template" &&
365
+ field != "GCEPersistentDisk.ReadOnly" &&
366
+ field != "spec.replicas" &&
367
+ field != "spec.template.labels" &&
368
+ field != "metadata.annotations" &&
369
+ field != "metadata.labels" &&
370
+ field != "status.replicas" &&
371
+ field != "spec.updateStrategy" &&
372
+ field != "spec.updateStrategy.rollingUpdate" &&
373
+ field != "spec.updateStrategy.rollingUpdate.partition" &&
374
+ field != "spec.podManagementPolicy" &&
375
+ field != "spec.template.spec.activeDeadlineSeconds" {
376
+ t .Errorf ("%s: missing prefix for: %v" , k , errs [i ])
377
+ }
378
+ }
379
+ })
301
380
}
302
381
}
303
382
@@ -399,19 +478,21 @@ func TestValidateStatefulSetStatus(t *testing.T) {
399
478
}
400
479
401
480
for _ , test := range tests {
402
- status := apps.StatefulSetStatus {
403
- Replicas : test .replicas ,
404
- ReadyReplicas : test .readyReplicas ,
405
- CurrentReplicas : test .currentReplicas ,
406
- UpdatedReplicas : test .updatedReplicas ,
407
- ObservedGeneration : test .observedGeneration ,
408
- CollisionCount : test .collisionCount ,
409
- }
481
+ t .Run (test .name , func (t * testing.T ) {
482
+ status := apps.StatefulSetStatus {
483
+ Replicas : test .replicas ,
484
+ ReadyReplicas : test .readyReplicas ,
485
+ CurrentReplicas : test .currentReplicas ,
486
+ UpdatedReplicas : test .updatedReplicas ,
487
+ ObservedGeneration : test .observedGeneration ,
488
+ CollisionCount : test .collisionCount ,
489
+ }
410
490
411
- errs := ValidateStatefulSetStatus (& status , field .NewPath ("status" ))
412
- if hasErr := len (errs ) > 0 ; hasErr != test .expectedErr {
413
- t .Errorf ("%s: expected error: %t, got error: %t\n errors: %s" , test .name , test .expectedErr , hasErr , errs .ToAggregate ().Error ())
414
- }
491
+ errs := ValidateStatefulSetStatus (& status , field .NewPath ("status" ))
492
+ if hasErr := len (errs ) > 0 ; hasErr != test .expectedErr {
493
+ t .Errorf ("%s: expected error: %t, got error: %t\n errors: %s" , test .name , test .expectedErr , hasErr , errs .ToAggregate ().Error ())
494
+ }
495
+ })
415
496
}
416
497
}
417
498
@@ -462,6 +543,7 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
462
543
},
463
544
},
464
545
}
546
+
465
547
type psUpdateTest struct {
466
548
old apps.StatefulSet
467
549
update apps.StatefulSet
@@ -529,13 +611,17 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
529
611
},
530
612
},
531
613
}
532
- for _ , successCase := range successCases {
533
- successCase .old .ObjectMeta .ResourceVersion = "1"
534
- successCase .update .ObjectMeta .ResourceVersion = "1"
535
- if errs := ValidateStatefulSetUpdate (& successCase .update , & successCase .old ); len (errs ) != 0 {
536
- t .Errorf ("expected success: %v" , errs )
537
- }
614
+
615
+ for i , successCase := range successCases {
616
+ t .Run ("success case " + strconv .Itoa (i ), func (t * testing.T ) {
617
+ successCase .old .ObjectMeta .ResourceVersion = "1"
618
+ successCase .update .ObjectMeta .ResourceVersion = "1"
619
+ if errs := ValidateStatefulSetUpdate (& successCase .update , & successCase .old ); len (errs ) != 0 {
620
+ t .Errorf ("expected success: %v" , errs )
621
+ }
622
+ })
538
623
}
624
+
539
625
errorCases := map [string ]psUpdateTest {
540
626
"more than one read/write" : {
541
627
old : apps.StatefulSet {
@@ -656,10 +742,13 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
656
742
},
657
743
},
658
744
}
745
+
659
746
for testName , errorCase := range errorCases {
660
- if errs := ValidateStatefulSetUpdate (& errorCase .update , & errorCase .old ); len (errs ) == 0 {
661
- t .Errorf ("expected failure: %s" , testName )
662
- }
747
+ t .Run (testName , func (t * testing.T ) {
748
+ if errs := ValidateStatefulSetUpdate (& errorCase .update , & errorCase .old ); len (errs ) == 0 {
749
+ t .Errorf ("expected failure: %s" , testName )
750
+ }
751
+ })
663
752
}
664
753
}
665
754
@@ -715,13 +804,15 @@ func TestValidateControllerRevision(t *testing.T) {
715
804
}
716
805
717
806
for name , tc := range tests {
718
- errs := ValidateControllerRevision (& tc .history )
719
- if tc .isValid && len (errs ) > 0 {
720
- t .Errorf ("%v: unexpected error: %v" , name , errs )
721
- }
722
- if ! tc .isValid && len (errs ) == 0 {
723
- t .Errorf ("%v: unexpected non-error" , name )
724
- }
807
+ t .Run (name , func (t * testing.T ) {
808
+ errs := ValidateControllerRevision (& tc .history )
809
+ if tc .isValid && len (errs ) > 0 {
810
+ t .Errorf ("%v: unexpected error: %v" , name , errs )
811
+ }
812
+ if ! tc .isValid && len (errs ) == 0 {
813
+ t .Errorf ("%v: unexpected non-error" , name )
814
+ }
815
+ })
725
816
}
726
817
}
727
818
@@ -809,12 +900,14 @@ func TestValidateControllerRevisionUpdate(t *testing.T) {
809
900
}
810
901
811
902
for _ , tc := range cases {
812
- errs := ValidateControllerRevisionUpdate (& tc .newHistory , & tc .oldHistory )
813
- if tc .isValid && len (errs ) > 0 {
814
- t .Errorf ("%v: unexpected error: %v" , tc .name , errs )
815
- }
816
- if ! tc .isValid && len (errs ) == 0 {
817
- t .Errorf ("%v: unexpected non-error" , tc .name )
818
- }
903
+ t .Run (tc .name , func (t * testing.T ) {
904
+ errs := ValidateControllerRevisionUpdate (& tc .newHistory , & tc .oldHistory )
905
+ if tc .isValid && len (errs ) > 0 {
906
+ t .Errorf ("%v: unexpected error: %v" , tc .name , errs )
907
+ }
908
+ if ! tc .isValid && len (errs ) == 0 {
909
+ t .Errorf ("%v: unexpected non-error" , tc .name )
910
+ }
911
+ })
819
912
}
820
913
}
0 commit comments