Skip to content

Commit c7cf852

Browse files
committed
test: Add Origin field support to ReplicationController spec.Replicas validation test
1 parent 07477c6 commit c7cf852

File tree

2 files changed

+131
-86
lines changed

2 files changed

+131
-86
lines changed

pkg/apis/core/validation/validation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6266,7 +6266,7 @@ func ValidateReplicationControllerSpec(spec, oldSpec *core.ReplicationController
62666266
allErrs := field.ErrorList{}
62676267
allErrs = append(allErrs, ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...)
62686268
allErrs = append(allErrs, ValidateNonEmptySelector(spec.Selector, fldPath.Child("selector"))...)
6269-
allErrs = append(allErrs, ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...)
6269+
allErrs = append(allErrs, ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas")).WithOrigin("minimum")...)
62706270
allErrs = append(allErrs, ValidatePodTemplateSpecForRC(spec.Template, spec.Selector, spec.Replicas, fldPath.Child("template"), opts)...)
62716271
return allErrs
62726272
}

pkg/apis/core/validation/validation_test.go

Lines changed: 130 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -16791,144 +16791,179 @@ func TestValidateReplicationController(t *testing.T) {
1679116791
}
1679216792
}
1679316793

16794-
errorCases := map[string]core.ReplicationController{
16794+
errorCases := map[string]struct {
16795+
rc core.ReplicationController
16796+
expectedOrigin []string
16797+
}{
1679516798
"zero-length ID": {
16796-
ObjectMeta: metav1.ObjectMeta{Name: "", Namespace: metav1.NamespaceDefault},
16797-
Spec: core.ReplicationControllerSpec{
16798-
Selector: validSelector,
16799-
Template: &validPodTemplate.Template,
16799+
rc: core.ReplicationController{
16800+
ObjectMeta: metav1.ObjectMeta{Name: "", Namespace: metav1.NamespaceDefault},
16801+
Spec: core.ReplicationControllerSpec{
16802+
Selector: validSelector,
16803+
Template: &validPodTemplate.Template,
16804+
},
1680016805
},
1680116806
},
1680216807
"missing-namespace": {
16803-
ObjectMeta: metav1.ObjectMeta{Name: "abc-123"},
16804-
Spec: core.ReplicationControllerSpec{
16805-
Selector: validSelector,
16806-
Template: &validPodTemplate.Template,
16808+
rc: core.ReplicationController{
16809+
ObjectMeta: metav1.ObjectMeta{Name: "abc-123"},
16810+
Spec: core.ReplicationControllerSpec{
16811+
Selector: validSelector,
16812+
Template: &validPodTemplate.Template,
16813+
},
1680716814
},
1680816815
},
1680916816
"empty selector": {
16810-
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16811-
Spec: core.ReplicationControllerSpec{
16812-
Template: &validPodTemplate.Template,
16817+
rc: core.ReplicationController{
16818+
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16819+
Spec: core.ReplicationControllerSpec{
16820+
Template: &validPodTemplate.Template,
16821+
},
1681316822
},
1681416823
},
1681516824
"selector_doesnt_match": {
16816-
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16817-
Spec: core.ReplicationControllerSpec{
16818-
Selector: map[string]string{"foo": "bar"},
16819-
Template: &validPodTemplate.Template,
16825+
rc: core.ReplicationController{
16826+
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16827+
Spec: core.ReplicationControllerSpec{
16828+
Selector: map[string]string{"foo": "bar"},
16829+
Template: &validPodTemplate.Template,
16830+
},
1682016831
},
1682116832
},
1682216833
"invalid manifest": {
16823-
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16824-
Spec: core.ReplicationControllerSpec{
16825-
Selector: validSelector,
16834+
rc: core.ReplicationController{
16835+
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16836+
Spec: core.ReplicationControllerSpec{
16837+
Selector: validSelector,
16838+
},
1682616839
},
1682716840
},
1682816841
"read-write persistent disk with > 1 pod": {
16829-
ObjectMeta: metav1.ObjectMeta{Name: "abc"},
16830-
Spec: core.ReplicationControllerSpec{
16831-
Replicas: 2,
16832-
Selector: validSelector,
16833-
Template: &readWriteVolumePodTemplate.Template,
16842+
rc: core.ReplicationController{
16843+
ObjectMeta: metav1.ObjectMeta{Name: "abc"},
16844+
Spec: core.ReplicationControllerSpec{
16845+
Replicas: 2,
16846+
Selector: validSelector,
16847+
Template: &readWriteVolumePodTemplate.Template,
16848+
},
1683416849
},
1683516850
},
1683616851
"negative_replicas": {
16837-
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16838-
Spec: core.ReplicationControllerSpec{
16839-
Replicas: -1,
16840-
Selector: validSelector,
16852+
rc: core.ReplicationController{
16853+
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault},
16854+
Spec: core.ReplicationControllerSpec{
16855+
Replicas: -1,
16856+
Selector: validSelector,
16857+
},
16858+
},
16859+
expectedOrigin: []string{
16860+
"minimum",
1684116861
},
1684216862
},
1684316863
"invalid_label": {
16844-
ObjectMeta: metav1.ObjectMeta{
16845-
Name: "abc-123",
16846-
Namespace: metav1.NamespaceDefault,
16847-
Labels: map[string]string{
16848-
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16864+
rc: core.ReplicationController{
16865+
ObjectMeta: metav1.ObjectMeta{
16866+
Name: "abc-123",
16867+
Namespace: metav1.NamespaceDefault,
16868+
Labels: map[string]string{
16869+
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16870+
},
16871+
},
16872+
Spec: core.ReplicationControllerSpec{
16873+
Selector: validSelector,
16874+
Template: &validPodTemplate.Template,
1684916875
},
16850-
},
16851-
Spec: core.ReplicationControllerSpec{
16852-
Selector: validSelector,
16853-
Template: &validPodTemplate.Template,
1685416876
},
1685516877
},
1685616878
"invalid_label 2": {
16857-
ObjectMeta: metav1.ObjectMeta{
16858-
Name: "abc-123",
16859-
Namespace: metav1.NamespaceDefault,
16860-
Labels: map[string]string{
16861-
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16879+
rc: core.ReplicationController{
16880+
ObjectMeta: metav1.ObjectMeta{
16881+
Name: "abc-123",
16882+
Namespace: metav1.NamespaceDefault,
16883+
Labels: map[string]string{
16884+
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16885+
},
16886+
},
16887+
Spec: core.ReplicationControllerSpec{
16888+
Template: &invalidPodTemplate.Template,
1686216889
},
16863-
},
16864-
Spec: core.ReplicationControllerSpec{
16865-
Template: &invalidPodTemplate.Template,
1686616890
},
1686716891
},
1686816892
"invalid_annotation": {
16869-
ObjectMeta: metav1.ObjectMeta{
16870-
Name: "abc-123",
16871-
Namespace: metav1.NamespaceDefault,
16872-
Annotations: map[string]string{
16873-
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16893+
rc: core.ReplicationController{
16894+
ObjectMeta: metav1.ObjectMeta{
16895+
Name: "abc-123",
16896+
Namespace: metav1.NamespaceDefault,
16897+
Annotations: map[string]string{
16898+
"NoUppercaseOrSpecialCharsLike=Equals": "bar",
16899+
},
16900+
},
16901+
Spec: core.ReplicationControllerSpec{
16902+
Selector: validSelector,
16903+
Template: &validPodTemplate.Template,
1687416904
},
16875-
},
16876-
Spec: core.ReplicationControllerSpec{
16877-
Selector: validSelector,
16878-
Template: &validPodTemplate.Template,
1687916905
},
1688016906
},
1688116907
"invalid restart policy 1": {
16882-
ObjectMeta: metav1.ObjectMeta{
16883-
Name: "abc-123",
16884-
Namespace: metav1.NamespaceDefault,
16885-
},
16886-
Spec: core.ReplicationControllerSpec{
16887-
Selector: validSelector,
16888-
Template: &core.PodTemplateSpec{
16889-
Spec: podtest.MakePodSpec(podtest.SetRestartPolicy(core.RestartPolicyOnFailure)),
16890-
ObjectMeta: metav1.ObjectMeta{
16891-
Labels: validSelector,
16908+
rc: core.ReplicationController{
16909+
ObjectMeta: metav1.ObjectMeta{
16910+
Name: "abc-123",
16911+
Namespace: metav1.NamespaceDefault,
16912+
},
16913+
Spec: core.ReplicationControllerSpec{
16914+
Selector: validSelector,
16915+
Template: &core.PodTemplateSpec{
16916+
Spec: podtest.MakePodSpec(podtest.SetRestartPolicy(core.RestartPolicyOnFailure)),
16917+
ObjectMeta: metav1.ObjectMeta{
16918+
Labels: validSelector,
16919+
},
1689216920
},
1689316921
},
1689416922
},
1689516923
},
1689616924
"invalid restart policy 2": {
16897-
ObjectMeta: metav1.ObjectMeta{
16898-
Name: "abc-123",
16899-
Namespace: metav1.NamespaceDefault,
16900-
},
16901-
Spec: core.ReplicationControllerSpec{
16902-
Selector: validSelector,
16903-
Template: &core.PodTemplateSpec{
16904-
Spec: podtest.MakePodSpec(podtest.SetRestartPolicy(core.RestartPolicyNever)),
16905-
ObjectMeta: metav1.ObjectMeta{
16906-
Labels: validSelector,
16925+
rc: core.ReplicationController{
16926+
ObjectMeta: metav1.ObjectMeta{
16927+
Name: "abc-123",
16928+
Namespace: metav1.NamespaceDefault,
16929+
},
16930+
Spec: core.ReplicationControllerSpec{
16931+
Selector: validSelector,
16932+
Template: &core.PodTemplateSpec{
16933+
Spec: podtest.MakePodSpec(podtest.SetRestartPolicy(core.RestartPolicyNever)),
16934+
ObjectMeta: metav1.ObjectMeta{
16935+
Labels: validSelector,
16936+
},
1690716937
},
1690816938
},
1690916939
},
1691016940
},
1691116941
"template may not contain ephemeral containers": {
16912-
ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault},
16913-
Spec: core.ReplicationControllerSpec{
16914-
Replicas: 1,
16915-
Selector: validSelector,
16916-
Template: &core.PodTemplateSpec{
16917-
ObjectMeta: metav1.ObjectMeta{
16918-
Labels: validSelector,
16942+
rc: core.ReplicationController{
16943+
ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault},
16944+
Spec: core.ReplicationControllerSpec{
16945+
Replicas: 1,
16946+
Selector: validSelector,
16947+
Template: &core.PodTemplateSpec{
16948+
ObjectMeta: metav1.ObjectMeta{
16949+
Labels: validSelector,
16950+
},
16951+
Spec: podtest.MakePodSpec(
16952+
podtest.SetEphemeralContainers(core.EphemeralContainer{EphemeralContainerCommon: core.EphemeralContainerCommon{Name: "debug", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}),
16953+
),
1691916954
},
16920-
Spec: podtest.MakePodSpec(
16921-
podtest.SetEphemeralContainers(core.EphemeralContainer{EphemeralContainerCommon: core.EphemeralContainerCommon{Name: "debug", Image: "image", ImagePullPolicy: "IfNotPresent", TerminationMessagePolicy: "File"}}),
16922-
),
1692316955
},
1692416956
},
1692516957
},
1692616958
}
1692716959
for k, v := range errorCases {
16928-
errs := ValidateReplicationController(&v, PodValidationOptions{})
16960+
errs := ValidateReplicationController(&v.rc, PodValidationOptions{})
1692916961
if len(errs) == 0 {
1693016962
t.Errorf("expected failure for %s", k)
1693116963
}
16964+
16965+
expectedOrigins := sets.NewString(v.expectedOrigin...)
16966+
1693216967
for i := range errs {
1693316968
field := errs[i].Field
1693416969
if !strings.HasPrefix(field, "spec.template.") &&
@@ -16944,6 +16979,16 @@ func TestValidateReplicationController(t *testing.T) {
1694416979
field != "status.replicas" {
1694516980
t.Errorf("%s: missing prefix for: %v", k, errs[i])
1694616981
}
16982+
16983+
if len(v.expectedOrigin) > 0 && errs[i].Origin != "" {
16984+
if !expectedOrigins.Has(errs[i].Origin) {
16985+
t.Errorf("%s: unexpected origin for: %v, expected one of %v", k, errs[i].Origin, v.expectedOrigin)
16986+
}
16987+
expectedOrigins.Delete(errs[i].Origin)
16988+
}
16989+
}
16990+
if len(expectedOrigins) > 0 {
16991+
t.Errorf("%s: missing errors with origin: %v", k, expectedOrigins.List())
1694716992
}
1694816993
}
1694916994
}

0 commit comments

Comments
 (0)