From 77c7d6efcf6d262594589a603103b67d77d74ea4 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:27:57 +0800 Subject: [PATCH 01/15] Chore: add basic make function for stateful set Add name and namespace tweak functions --- pkg/apis/apps/validation/validation_test.go | 240 ++++++-------------- 1 file changed, 71 insertions(+), 169 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index b245ac5ae2d..aaec3a08859 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -42,6 +42,38 @@ func intStrAddr(intOrStr intstr.IntOrString) *intstr.IntOrString { return &intOrStr } +type statefulSetTweak func(ss *apps.StatefulSet) + +func mkStatefulSet(template *api.PodTemplate, tweaks ...statefulSetTweak) apps.StatefulSet { + ss := apps.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, + Spec: apps.StatefulSetSpec{ + PodManagementPolicy: apps.OrderedReadyPodManagement, + Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"a": "b"}}, + Template: template.Template, + UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, + }, + } + + for _, tw := range tweaks { + tw(&ss) + } + + return ss +} + +func tweakName(name string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.ObjectMeta.Name = name + } +} + +func tweakNamespace(ns string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.ObjectMeta.Namespace = ns + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -95,27 +127,11 @@ func TestValidateStatefulSet(t *testing.T) { successCases := []testCase{ { name: "alpha name", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakName("abc")), }, { name: "alphanumeric name", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakName("abc-123")), }, { name: "parallel pod management", @@ -212,60 +228,28 @@ func TestValidateStatefulSet(t *testing.T) { errorCases := []testCase{ { name: "zero-length name", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakName("")), errs: field.ErrorList{ field.Required(field.NewPath("metadata", "name"), ""), }, }, { name: "name-with-dots", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc.123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakName("abc.123")), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), "abc.123", ""), }, }, { name: "long name", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: strings.Repeat("a", 64), Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakName(strings.Repeat("a", 64))), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), strings.Repeat("a", 64), ""), }, }, { name: "missing-namespace", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123"}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakNamespace("")), errs: field.ErrorList{ field.Required(field.NewPath("metadata", "namespace"), ""), }, @@ -1029,46 +1013,14 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update containers 1", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: addContainersValidTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update containers 1", + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(addContainersValidTemplate), }, { - name: "update containers 2", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: addContainersValidTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update containers 2", + old: mkStatefulSet(addContainersValidTemplate), + update: mkStatefulSet(&validPodTemplate), }, { name: "update containers and pvc retention policy 1", @@ -1234,49 +1186,17 @@ func TestValidateStatefulSetUpdate(t *testing.T) { errorCases := []testCase{ { - name: "update name", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc2", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update name", + old: mkStatefulSet(&validPodTemplate, tweakName("abc")), + update: mkStatefulSet(&validPodTemplate, tweakName("abc2")), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), nil, ""), }, }, { - name: "update namespace", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault + "1"}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update namespace", + old: mkStatefulSet(&validPodTemplate, tweakNamespace(metav1.NamespaceDefault)), + update: mkStatefulSet(&validPodTemplate, tweakNamespace(metav1.NamespaceDefault+"1")), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "namespace"), nil, ""), }, @@ -1496,22 +1416,20 @@ func TestValidateControllerRevision(t *testing.T) { } } - ss := apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, + podTemplate := api.PodTemplate{ + Template: api.PodTemplateSpec{ + Spec: api.PodSpec{ + RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: api.DNSClusterFirst, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, }, }, } + ss := mkStatefulSet(&podTemplate) + var ( valid = newControllerRevision("validname", "validns", &ss, 0) badRevision = newControllerRevision("validname", "validns", &ss, -1) @@ -1561,37 +1479,21 @@ func TestValidateControllerRevisionUpdate(t *testing.T) { } } - ss := apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, - }, - }, - } - modifiedss := apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "cdf", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyAlways, - DNSPolicy: api.DNSClusterFirst, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{"foo": "bar"}, - }, + podTemplate := api.PodTemplate{ + Template: api.PodTemplateSpec{ + Spec: api.PodSpec{ + RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: api.DNSClusterFirst, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, }, }, } + ss := mkStatefulSet(&podTemplate, tweakName("abc")) + modifiedss := mkStatefulSet(&podTemplate, tweakName("cdf")) + var ( valid = newControllerRevision("1", "validname", "validns", &ss, 0) noVersion = newControllerRevision("", "validname", "validns", &ss, 0) From 7fc08e0ce700f14c77a3127647a8657bf444550d Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:31:09 +0800 Subject: [PATCH 02/15] Chore: add pod management policy tweak function --- pkg/apis/apps/validation/validation_test.go | 69 +++++---------------- 1 file changed, 14 insertions(+), 55 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index aaec3a08859..90d5410ef68 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -74,6 +74,12 @@ func tweakNamespace(ns string) statefulSetTweak { } } +func tweakPodManagementPolicy(policy apps.PodManagementPolicyType) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.PodManagementPolicy = policy + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -135,27 +141,11 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "parallel pod management", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy(apps.ParallelPodManagement)), }, { name: "ordered ready pod management", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.OnDeleteStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy(apps.OrderedReadyPodManagement)), }, { name: "update strategy", @@ -1226,48 +1216,17 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update pod management policy 1", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update pod management policy 1", + old: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy("")), + update: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy(apps.OrderedReadyPodManagement)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), }, }, { - name: "update pod management policy 2", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update pod management policy 2", + old: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy(apps.ParallelPodManagement)), + update: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy(apps.OrderedReadyPodManagement)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), }, From 4418a9f59068bdab8f64cce6ceaa6a32920337ce Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:34:52 +0800 Subject: [PATCH 03/15] Chore: add replicas tweak function --- pkg/apis/apps/validation/validation_test.go | 99 ++++----------------- 1 file changed, 19 insertions(+), 80 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 90d5410ef68..6732757991c 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -80,6 +80,12 @@ func tweakPodManagementPolicy(policy apps.PodManagementPolicyType) statefulSetTw } } +func tweakReplicas(replicas int32) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.Replicas = replicas + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -276,16 +282,7 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "negative_replicas", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Replicas: -1, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakReplicas(-1)), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "replicas"), nil, ""), }, @@ -507,48 +504,24 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "empty pod management policy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: "", - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakPodManagementPolicy(""), + tweakReplicas(3), + ), errs: field.ErrorList{ field.Required(field.NewPath("spec", "podManagementPolicy"), ""), }, }, { name: "invalid pod management policy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: "foo", - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakPodManagementPolicy("foo")), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "podManagementPolicy"), nil, ""), }, }, { name: "set active deadline seconds", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: invalidPodTemplate2.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&invalidPodTemplate2, tweakReplicas(3)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec", "template", "spec", "activeDeadlineSeconds"), ""), }, @@ -981,26 +954,9 @@ func TestValidateStatefulSetUpdate(t *testing.T) { successCases := []testCase{ { - name: "update replica count", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Replicas: 3, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update replica count", + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(&validPodTemplate, tweakReplicas(3)), }, { name: "update containers 1", @@ -1232,26 +1188,9 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update to negative replicas", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Replicas: -1, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update to negative replicas", + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(&validPodTemplate, tweakReplicas(-1)), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "replicas"), nil, ""), }, From 2161d095fa118b4c7efc7fff33475de4c6e2f45d Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:42:38 +0800 Subject: [PATCH 04/15] Chore: add template restart policy tweak function --- pkg/apis/apps/validation/validation_test.go | 71 +++------------------ 1 file changed, 9 insertions(+), 62 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 6732757991c..8b606668ead 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -86,6 +86,12 @@ func tweakReplicas(replicas int32) statefulSetTweak { } } +func tweakTemplateRestartPolicy(rp api.RestartPolicy) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.Template.Spec.RestartPolicy = rp + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -354,80 +360,21 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid restart policy 1", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyOnFailure, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: validLabels, - }, - }, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakTemplateRestartPolicy(api.RestartPolicyOnFailure)), errs: field.ErrorList{ field.NotSupported(field.NewPath("spec", "template", "spec", "restartPolicy"), nil, nil), }, }, { name: "invalid restart policy 2", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - RestartPolicy: api.RestartPolicyNever, - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: validLabels, - }, - }, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakTemplateRestartPolicy(api.RestartPolicyNever)), errs: field.ErrorList{ field.NotSupported(field.NewPath("spec", "template", "spec", "restartPolicy"), nil, nil), }, }, { name: "empty restart policy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: api.PodTemplateSpec{ - Spec: api.PodSpec{ - DNSPolicy: api.DNSClusterFirst, - Containers: []api.Container{{Name: "ctr", Image: "image", ImagePullPolicy: "IfNotPresent"}}, - }, - ObjectMeta: metav1.ObjectMeta{ - Labels: validLabels, - }, - }, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakTemplateRestartPolicy("")), errs: field.ErrorList{ field.NotSupported(field.NewPath("spec", "template", "spec", "restartPolicy"), nil, nil), }, From 3eb34d8b6ce7464d6b5402856acc1b4ee208fa6b Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:43:47 +0800 Subject: [PATCH 05/15] Chore: add min ready seconds tweak function --- pkg/apis/apps/validation/validation_test.go | 53 +++++---------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 8b606668ead..bbdcd2764ad 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -92,6 +92,12 @@ func tweakTemplateRestartPolicy(rp api.RestartPolicy) statefulSetTweak { } } +func tweakMinReadySeconds(t int32) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.MinReadySeconds = t + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -986,49 +992,14 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update min ready seconds 1", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - MinReadySeconds: 10, - }, - }, + name: "update min ready seconds 1", + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(&validPodTemplate, tweakMinReadySeconds(10)), }, { - name: "update min ready seconds 2", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - MinReadySeconds: 5, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - MinReadySeconds: 10, - }, - }, + name: "update min ready seconds 2", + old: mkStatefulSet(&validPodTemplate, tweakMinReadySeconds(5)), + update: mkStatefulSet(&validPodTemplate, tweakMinReadySeconds(10)), }, { name: "update existing instance with now-invalid name", From 18ba7c0e4334bc376d530dea112e37e8a9e66ba9 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:49:41 +0800 Subject: [PATCH 06/15] Chore: add ordinal start tweak function --- pkg/apis/apps/validation/validation_test.go | 63 ++++++--------------- 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index bbdcd2764ad..57055a6ae02 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -98,6 +98,12 @@ func tweakMinReadySeconds(t int32) statefulSetTweak { } } +func tweakOrdinalsStart(s int32) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.Ordinals = &apps.StatefulSetOrdinals{Start: s} + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -219,17 +225,10 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "ordinals.start positive value", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - Ordinals: &apps.StatefulSetOrdinals{Start: 2}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakOrdinalsStart(2), + ), }, } @@ -580,18 +579,11 @@ func TestValidateStatefulSet(t *testing.T) { }, }, { - name: "invalid ordinals.start ", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - Ordinals: &apps.StatefulSetOrdinals{Start: -2}, - }, - }, + name: "invalid ordinals.start", + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakOrdinalsStart(-2), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "ordinals.start"), nil, ""), }, @@ -1023,28 +1015,9 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update existing instance with .spec.ordinals.start", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc.123.example", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc.123.example", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - Ordinals: &apps.StatefulSetOrdinals{ - Start: 3, - }, - }, - }, + name: "update existing instance with .spec.ordinals.start", + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(&validPodTemplate, tweakOrdinalsStart(3)), }, } From b907d5af49fe5cab9065aac5f5dfb8a7d586eb1a Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 11:55:34 +0800 Subject: [PATCH 07/15] Chore: add finalizers tweak function --- pkg/apis/apps/validation/validation_test.go | 28 +++++++-------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 57055a6ae02..0031d5d78bb 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -74,6 +74,12 @@ func tweakNamespace(ns string) statefulSetTweak { } } +func tweakFinalizers(finalizers ...string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.ObjectMeta.Finalizers = finalizers + } +} + func tweakPodManagementPolicy(policy apps.PodManagementPolicyType) statefulSetTweak { return func(ss *apps.StatefulSet) { ss.Spec.PodManagementPolicy = policy @@ -994,25 +1000,9 @@ func TestValidateStatefulSetUpdate(t *testing.T) { update: mkStatefulSet(&validPodTemplate, tweakMinReadySeconds(10)), }, { - name: "update existing instance with now-invalid name", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc.123.example", Namespace: metav1.NamespaceDefault, Finalizers: []string{"final"}}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc.123.example", Namespace: metav1.NamespaceDefault, Finalizers: []string{}}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + name: "update existing instance with now-invalid name", + old: mkStatefulSet(&validPodTemplate, tweakFinalizers("final")), + update: mkStatefulSet(&validPodTemplate, tweakFinalizers()), }, { name: "update existing instance with .spec.ordinals.start", From ec34891782c97a5233733400f025c3cb19a22826 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 12:00:30 +0800 Subject: [PATCH 08/15] Chore: add annotation tweak function --- pkg/apis/apps/validation/validation_test.go | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 0031d5d78bb..c2d1605b725 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -74,6 +74,15 @@ func tweakNamespace(ns string) statefulSetTweak { } } +func tweakAnnotations(key string, value string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + if ss.ObjectMeta.Annotations == nil { + ss.ObjectMeta.Annotations = map[string]string{} + } + ss.ObjectMeta.Annotations[key] = value + } +} + func tweakFinalizers(finalizers ...string) statefulSetTweak { return func(ss *apps.StatefulSet) { ss.ObjectMeta.Finalizers = finalizers @@ -350,21 +359,9 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid_annotation", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - Annotations: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakAnnotations("NoUppercaseOrSpecialCharsLike=Equals", "bar"), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "annotations"), nil, ""), }, From 5e0161b3de889b94961cf1950a1e4c66c29927bc Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 13:06:56 +0800 Subject: [PATCH 09/15] Chore: add labels tweak function --- pkg/apis/apps/validation/validation_test.go | 27 +++++++++------------ 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index c2d1605b725..142dca6b94a 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -74,6 +74,15 @@ func tweakNamespace(ns string) statefulSetTweak { } } +func tweakLabels(key string, value string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + if ss.ObjectMeta.Labels == nil { + ss.ObjectMeta.Labels = map[string]string{} + } + ss.ObjectMeta.Labels[key] = value + } +} + func tweakAnnotations(key string, value string) statefulSetTweak { return func(ss *apps.StatefulSet) { if ss.ObjectMeta.Annotations == nil { @@ -315,21 +324,9 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid_label", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakLabels("NoUppercaseOrSpecialCharsLike=Equals", "bar"), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "labels"), nil, ""), }, From f3ffeae426f2f2aad6fd37226b5783868e99a183 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 13:13:15 +0800 Subject: [PATCH 10/15] Chore: add update strategy type tweak function --- pkg/apis/apps/validation/validation_test.go | 56 +++++++-------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 142dca6b94a..66b5076c6bf 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -128,6 +128,12 @@ func tweakOrdinalsStart(s int32) statefulSetTweak { } } +func tweakUpdateStrategyType(t apps.StatefulSetUpdateStrategyType) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.UpdateStrategy.Type = t + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -386,32 +392,20 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid update strategy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: "foo"}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType("foo"), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy"), nil, ""), }, }, { name: "empty update strategy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: ""}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(""), + ), errs: field.ErrorList{ field.Required(field.NewPath("spec", "updateStrategy"), ""), }, @@ -964,24 +958,10 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, { name: "update update strategy", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.OnDeleteStatefulSetStrategyType}, - }, - }, + old: mkStatefulSet(&validPodTemplate), + update: mkStatefulSet(&validPodTemplate, + tweakUpdateStrategyType(apps.OnDeleteStatefulSetStrategyType), + ), }, { name: "update min ready seconds 1", From 1b17b4fa7998267985539110d0d66d79a052d606 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 13:19:13 +0800 Subject: [PATCH 11/15] Chore: add rolling update partition type tweak function --- pkg/apis/apps/validation/validation_test.go | 63 ++++++++------------- 1 file changed, 23 insertions(+), 40 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 66b5076c6bf..f2812b00309 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -134,6 +134,15 @@ func tweakUpdateStrategyType(t apps.StatefulSetUpdateStrategyType) statefulSetTw } } +func tweakRollingUpdatePartition(partition int32) statefulSetTweak { + return func(ss *apps.StatefulSet) { + if ss.Spec.UpdateStrategy.RollingUpdate == nil { + ss.Spec.UpdateStrategy.RollingUpdate = &apps.RollingUpdateStatefulSetStrategy{} + } + ss.Spec.UpdateStrategy.RollingUpdate.Partition = partition + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -203,20 +212,11 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "update strategy", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{ - Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: func() *apps.RollingUpdateStatefulSetStrategy { - return &apps.RollingUpdateStatefulSetStrategy{Partition: 2} - }()}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.RollingUpdateStatefulSetStrategyType), + tweakRollingUpdatePartition(2), + ), }, { name: "PVC policy " + enableStatefulSetAutoDeletePVC, @@ -412,38 +412,21 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid rolling update", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.OnDeleteStatefulSetStrategyType, - RollingUpdate: func() *apps.RollingUpdateStatefulSetStrategy { - return &apps.RollingUpdateStatefulSetStrategy{Partition: 1} - }()}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.OnDeleteStatefulSetStrategyType), + tweakRollingUpdatePartition(1), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate"), nil, ""), }, }, { name: "negative parition", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: func() *apps.RollingUpdateStatefulSetStrategy { - return &apps.RollingUpdateStatefulSetStrategy{Partition: -1} - }()}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakRollingUpdatePartition(-1), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate", "partition"), nil, ""), }, From f97d3cf74865246b8ed94586ae1d61059b56e4f4 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 13:23:20 +0800 Subject: [PATCH 12/15] Chore: add rolling update max unavailable type tweak function --- pkg/apis/apps/validation/validation_test.go | 91 +++++++-------------- 1 file changed, 30 insertions(+), 61 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index f2812b00309..48fd4256b01 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -143,6 +143,15 @@ func tweakRollingUpdatePartition(partition int32) statefulSetTweak { } } +func tweakMaxUnavailable(mu intstr.IntOrString) statefulSetTweak { + return func(ss *apps.StatefulSet) { + if ss.Spec.UpdateStrategy.RollingUpdate == nil { + ss.Spec.UpdateStrategy.RollingUpdate = &apps.RollingUpdateStatefulSetStrategy{} + } + ss.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable = intStrAddr(mu) + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -236,22 +245,12 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "maxUnavailable with parallel pod management", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{ - Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: &apps.RollingUpdateStatefulSetStrategy{ - Partition: 2, - MaxUnavailable: intStrAddr(intstr.FromInt(2)), - }, - }, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.RollingUpdateStatefulSetStrategyType), + tweakRollingUpdatePartition(2), + tweakMaxUnavailable(intstr.FromInt(2)), + ), }, { name: "ordinals.start positive value", @@ -494,63 +493,33 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "zero maxUnavailable", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{ - Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: &apps.RollingUpdateStatefulSetStrategy{ - MaxUnavailable: intStrAddr(intstr.FromInt(0)), - }, - }, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.RollingUpdateStatefulSetStrategyType), + tweakMaxUnavailable(intstr.FromInt(0)), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate", "maxUnavailable"), nil, ""), }, }, { name: "zero percent maxUnavailable", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{ - Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: &apps.RollingUpdateStatefulSetStrategy{ - MaxUnavailable: intStrAddr(intstr.FromString("0%")), - }, - }, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.RollingUpdateStatefulSetStrategyType), + tweakMaxUnavailable(intstr.FromString("0%")), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate", "maxUnavailable"), nil, ""), }, }, { name: "greater than 100 percent maxUnavailable", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.ParallelPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - Replicas: 3, - UpdateStrategy: apps.StatefulSetUpdateStrategy{ - Type: apps.RollingUpdateStatefulSetStrategyType, - RollingUpdate: &apps.RollingUpdateStatefulSetStrategy{ - MaxUnavailable: intStrAddr(intstr.FromString("101%")), - }, - }, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakReplicas(3), + tweakUpdateStrategyType(apps.RollingUpdateStatefulSetStrategyType), + tweakMaxUnavailable(intstr.FromString("101%")), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate", "maxUnavailable"), nil, ""), }, From ba9dfe686fd94b5f2e6f6f96d964b302cc3f602f Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 13:28:09 +0800 Subject: [PATCH 13/15] Chore: add persistent volume claim template tweak function --- pkg/apis/apps/validation/validation_test.go | 78 ++++----------------- 1 file changed, 15 insertions(+), 63 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 48fd4256b01..02b4dd305f9 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -128,6 +128,12 @@ func tweakOrdinalsStart(s int32) statefulSetTweak { } } +func tweakPVCTemplate(pvc ...api.PersistentVolumeClaim) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.VolumeClaimTemplates = pvc + } +} + func tweakUpdateStrategyType(t apps.StatefulSetUpdateStrategyType) statefulSetTweak { return func(ss *apps.StatefulSet) { ss.Spec.UpdateStrategy.Type = t @@ -1003,79 +1009,25 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, }, { - name: "update pvc template size", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplate}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplateChangedSize}, - }, - }, + name: "update pvc template size", + old: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplate)), + update: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplateChangedSize)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), }, }, { - name: "update pvc template storage class", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplate}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplateChangedClass}, - }, - }, + name: "update pvc template storage class", + old: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplate)), + update: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplateChangedClass)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), }, }, { - name: "add new pvc template", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplate}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - VolumeClaimTemplates: []api.PersistentVolumeClaim{validPVCTemplate, validPVCTemplate2}, - }, - }, + name: "add new pvc template", + old: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplate)), + update: mkStatefulSet(&validPodTemplate, tweakPVCTemplate(validPVCTemplate, validPVCTemplate2)), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), }, From 4cab11f26f0080330d9dc83b73757eb6952d1d60 Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 14:12:57 +0800 Subject: [PATCH 14/15] Chore: add persistent volume claim retention policy tweak function --- pkg/apis/apps/validation/validation_test.go | 137 +++++++++----------- 1 file changed, 58 insertions(+), 79 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 02b4dd305f9..649d87f6796 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -158,6 +158,36 @@ func tweakMaxUnavailable(mu intstr.IntOrString) statefulSetTweak { } } +func tweakPVCPolicy(policy *apps.StatefulSetPersistentVolumeClaimRetentionPolicy) statefulSetTweak { + return func(ss *apps.StatefulSet) { + ss.Spec.PersistentVolumeClaimRetentionPolicy = policy + } +} + +type pvcPolicyTweak func(policy *apps.StatefulSetPersistentVolumeClaimRetentionPolicy) + +func mkPVCPolicy(tweaks ...pvcPolicyTweak) *apps.StatefulSetPersistentVolumeClaimRetentionPolicy { + policy := &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{} + + for _, tw := range tweaks { + tw(policy) + } + + return policy +} + +func tweakPVCDeletedPolicy(t apps.PersistentVolumeClaimRetentionPolicyType) pvcPolicyTweak { + return func(policy *apps.StatefulSetPersistentVolumeClaimRetentionPolicy) { + policy.WhenDeleted = t + } +} + +func tweakPVCScalePolicy(t apps.PersistentVolumeClaimRetentionPolicyType) pvcPolicyTweak { + return func(policy *apps.StatefulSetPersistentVolumeClaimRetentionPolicy) { + policy.WhenScaled = t + } +} + func TestValidateStatefulSet(t *testing.T) { validLabels := map[string]string{"a": "b"} validPodTemplate := api.PodTemplate{ @@ -235,19 +265,12 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "PVC policy " + enableStatefulSetAutoDeletePVC, - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - PersistentVolumeClaimRetentionPolicy: &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{ - WhenDeleted: apps.DeletePersistentVolumeClaimRetentionPolicyType, - WhenScaled: apps.RetainPersistentVolumeClaimRetentionPolicyType, - }, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakPVCPolicy(mkPVCPolicy( + tweakPVCDeletedPolicy(apps.DeletePersistentVolumeClaimRetentionPolicyType), + tweakPVCScalePolicy(apps.RetainPersistentVolumeClaimRetentionPolicyType), + )), + ), }, { name: "maxUnavailable with parallel pod management", @@ -462,16 +485,9 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "empty PersistentVolumeClaimRetentionPolicy " + enableStatefulSetAutoDeletePVC, - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PersistentVolumeClaimRetentionPolicy: &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{}, - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakPVCPolicy(mkPVCPolicy()), + ), errs: field.ErrorList{ field.NotSupported(field.NewPath("spec", "persistentVolumeClaimRetentionPolicy", "whenDeleted"), nil, nil), field.NotSupported(field.NewPath("spec", "persistentVolumeClaimRetentionPolicy", "whenScaled"), nil, nil), @@ -479,19 +495,12 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid PersistentVolumeClaimRetentionPolicy " + enableStatefulSetAutoDeletePVC, - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PersistentVolumeClaimRetentionPolicy: &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{ - WhenScaled: apps.PersistentVolumeClaimRetentionPolicyType("invalid-retention-policy"), - WhenDeleted: apps.PersistentVolumeClaimRetentionPolicyType("invalid-retention-policy"), - }, - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, + tweakPVCPolicy(mkPVCPolicy( + tweakPVCDeletedPolicy("invalid-retention-policy"), + tweakPVCScalePolicy("invalid-retention-policy"), + )), + ), errs: field.ErrorList{ field.NotSupported(field.NewPath("spec", "persistentVolumeClaimRetentionPolicy", "whenDeleted"), nil, nil), field.NotSupported(field.NewPath("spec", "persistentVolumeClaimRetentionPolicy", "whenScaled"), nil, nil), @@ -867,52 +876,22 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, { name: "update containers and pvc retention policy 1", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: addContainersValidTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - PersistentVolumeClaimRetentionPolicy: &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{ - WhenDeleted: apps.RetainPersistentVolumeClaimRetentionPolicyType, - WhenScaled: apps.RetainPersistentVolumeClaimRetentionPolicyType, - }, - }, - }, + old: mkStatefulSet(addContainersValidTemplate), + update: mkStatefulSet(&validPodTemplate, + tweakPVCPolicy(mkPVCPolicy( + tweakPVCDeletedPolicy(apps.RetainPersistentVolumeClaimRetentionPolicyType), + tweakPVCScalePolicy(apps.RetainPersistentVolumeClaimRetentionPolicyType), + )), + ), }, { name: "update containers and pvc retention policy 2", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: addContainersValidTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - PersistentVolumeClaimRetentionPolicy: &apps.StatefulSetPersistentVolumeClaimRetentionPolicy{ - WhenScaled: apps.RetainPersistentVolumeClaimRetentionPolicyType, - }, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + old: mkStatefulSet(&validPodTemplate, + tweakPVCPolicy(mkPVCPolicy( + tweakPVCScalePolicy(apps.RetainPersistentVolumeClaimRetentionPolicyType), + )), + ), + update: mkStatefulSet(&validPodTemplate), }, { name: "update update strategy", From ddc13e983b5be6976b1969583550c21ab103a32a Mon Sep 17 00:00:00 2001 From: Qirui Date: Mon, 20 Mar 2023 15:01:03 +0800 Subject: [PATCH 15/15] Chore: add selector labels tweak function --- pkg/apis/apps/validation/validation_test.go | 70 ++++++--------------- 1 file changed, 20 insertions(+), 50 deletions(-) diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 649d87f6796..ee4e9e75bfc 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -110,6 +110,16 @@ func tweakReplicas(replicas int32) statefulSetTweak { } } +func tweakSelectorLabels(labels map[string]string) statefulSetTweak { + return func(ss *apps.StatefulSet) { + if labels == nil { + ss.Spec.Selector = nil + } else { + ss.Spec.Selector = &metav1.LabelSelector{MatchLabels: labels} + } + } +} + func tweakTemplateRestartPolicy(rp api.RestartPolicy) statefulSetTweak { return func(ss *apps.StatefulSet) { ss.Spec.Template.Spec.RestartPolicy = rp @@ -321,14 +331,7 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "empty selector", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakSelectorLabels(nil)), errs: field.ErrorList{ field.Required(field.NewPath("spec", "selector"), ""), field.Invalid(field.NewPath("spec", "template", "metadata", "labels"), nil, ""), // selector is empty, labels are not, so select doesn't match labels @@ -336,15 +339,7 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "selector_doesnt_match", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&validPodTemplate, tweakSelectorLabels(map[string]string{"foo": "bar"})), errs: field.ErrorList{ field.Invalid(field.NewPath("spec", "template", "metadata", "labels"), nil, ""), }, @@ -367,21 +362,10 @@ func TestValidateStatefulSet(t *testing.T) { }, { name: "invalid_label 2", - set: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "abc-123", - Namespace: metav1.NamespaceDefault, - Labels: map[string]string{ - "NoUppercaseOrSpecialCharsLike=Equals": "bar", - }, - }, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: invalidLabels}, - Template: invalidPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + set: mkStatefulSet(&invalidPodTemplate, + tweakLabels("NoUppercaseOrSpecialCharsLike=Equals", "bar"), + tweakSelectorLabels(invalidLabels), + ), errs: field.ErrorList{ field.Invalid(field.NewPath("metadata", "labels"), nil, ""), field.Invalid(field.NewPath("spec", "selector"), nil, ""), @@ -941,24 +925,10 @@ func TestValidateStatefulSetUpdate(t *testing.T) { }, { name: "update selector", - old: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels}, - Template: validPodTemplate.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, - update: apps.StatefulSet{ - ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, - Spec: apps.StatefulSetSpec{ - PodManagementPolicy: apps.OrderedReadyPodManagement, - Selector: &metav1.LabelSelector{MatchLabels: validLabels2}, - Template: validPodTemplate2.Template, - UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, - }, - }, + old: mkStatefulSet(&validPodTemplate, tweakSelectorLabels(validLabels)), + update: mkStatefulSet(&validPodTemplate2, + tweakSelectorLabels(validLabels2), + ), errs: field.ErrorList{ field.Forbidden(field.NewPath("spec"), ""), },