Skip to content

Commit 5bf00d9

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#55669 from yuexiao-wang/apis-validate
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. add unit test for ValidateStatefulSet Signed-off-by: yuexiao-wang <[email protected]> **What this PR does / why we need it**: add unit test for ValidateStatefulSetSpec **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes # **Special notes for your reviewer**: **Release note**: ```release-note NONE ```
2 parents 8a4a39d + 400f554 commit 5bf00d9

File tree

2 files changed

+155
-63
lines changed

2 files changed

+155
-63
lines changed

pkg/apis/apps/validation/validation.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path) fi
9494
int64(spec.UpdateStrategy.RollingUpdate.Partition),
9595
fldPath.Child("updateStrategy").Child("rollingUpdate").Child("partition"))...)
9696
}
97-
9897
default:
9998
allErrs = append(allErrs,
10099
field.Invalid(fldPath.Child("updateStrategy"), spec.UpdateStrategy,
@@ -124,7 +123,7 @@ func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path) fi
124123
allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)}))
125124
}
126125
if spec.Template.Spec.ActiveDeadlineSeconds != nil {
127-
allErrs = append(allErrs, field.Invalid(fldPath.Child("spec", "activeDeadlineSeconds"), spec.Template.Spec.ActiveDeadlineSeconds, "must not be specified"))
126+
allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "spec", "activeDeadlineSeconds"), spec.Template.Spec.ActiveDeadlineSeconds, "must not be specified"))
128127
}
129128

130129
return allErrs

pkg/apis/apps/validation/validation_test.go

Lines changed: 154 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package validation
1818

1919
import (
20+
"strconv"
2021
"strings"
2122
"testing"
2223

@@ -41,6 +42,7 @@ func TestValidateStatefulSet(t *testing.T) {
4142
},
4243
},
4344
}
45+
4446
invalidLabels := map[string]string{"NoUppercaseOrSpecialCharsLike=Equals": "b"}
4547
invalidPodTemplate := api.PodTemplate{
4648
Template: api.PodTemplateSpec{
@@ -53,6 +55,21 @@ func TestValidateStatefulSet(t *testing.T) {
5355
},
5456
},
5557
}
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+
5673
successCases := []apps.StatefulSet{
5774
{
5875
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
@@ -105,10 +122,13 @@ func TestValidateStatefulSet(t *testing.T) {
105122
},
106123
},
107124
}
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+
})
112132
}
113133

114134
errorCases := map[string]apps.StatefulSet{
@@ -260,6 +280,29 @@ func TestValidateStatefulSet(t *testing.T) {
260280
UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: "foo"},
261281
},
262282
},
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+
},
263306
"negative parition": {
264307
ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault},
265308
Spec: apps.StatefulSetSpec{
@@ -273,31 +316,67 @@ func TestValidateStatefulSet(t *testing.T) {
273316
}()},
274317
},
275318
},
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+
},
276349
}
350+
277351
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)
299356
}
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+
})
301380
}
302381
}
303382

@@ -399,19 +478,21 @@ func TestValidateStatefulSetStatus(t *testing.T) {
399478
}
400479

401480
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+
}
410490

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\nerrors: %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\nerrors: %s", test.name, test.expectedErr, hasErr, errs.ToAggregate().Error())
494+
}
495+
})
415496
}
416497
}
417498

@@ -462,6 +543,7 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
462543
},
463544
},
464545
}
546+
465547
type psUpdateTest struct {
466548
old apps.StatefulSet
467549
update apps.StatefulSet
@@ -529,13 +611,17 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
529611
},
530612
},
531613
}
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+
})
538623
}
624+
539625
errorCases := map[string]psUpdateTest{
540626
"more than one read/write": {
541627
old: apps.StatefulSet{
@@ -656,10 +742,13 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
656742
},
657743
},
658744
}
745+
659746
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+
})
663752
}
664753
}
665754

@@ -715,13 +804,15 @@ func TestValidateControllerRevision(t *testing.T) {
715804
}
716805

717806
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+
})
725816
}
726817
}
727818

@@ -809,12 +900,14 @@ func TestValidateControllerRevisionUpdate(t *testing.T) {
809900
}
810901

811902
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+
})
819912
}
820913
}

0 commit comments

Comments
 (0)