Chore: add basic make function for stateful set

Add name and namespace tweak functions
This commit is contained in:
Qirui
2023-03-20 11:27:57 +08:00
parent 7387ccbd31
commit 77c7d6efcf

View File

@@ -42,6 +42,38 @@ func intStrAddr(intOrStr intstr.IntOrString) *intstr.IntOrString {
return &intOrStr 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) { func TestValidateStatefulSet(t *testing.T) {
validLabels := map[string]string{"a": "b"} validLabels := map[string]string{"a": "b"}
validPodTemplate := api.PodTemplate{ validPodTemplate := api.PodTemplate{
@@ -95,27 +127,11 @@ func TestValidateStatefulSet(t *testing.T) {
successCases := []testCase{ successCases := []testCase{
{ {
name: "alpha name", name: "alpha name",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakName("abc")),
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: "alphanumeric name", name: "alphanumeric name",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakName("abc-123")),
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},
},
},
}, },
{ {
name: "parallel pod management", name: "parallel pod management",
@@ -212,60 +228,28 @@ func TestValidateStatefulSet(t *testing.T) {
errorCases := []testCase{ errorCases := []testCase{
{ {
name: "zero-length name", name: "zero-length name",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakName("")),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Required(field.NewPath("metadata", "name"), ""), field.Required(field.NewPath("metadata", "name"), ""),
}, },
}, },
{ {
name: "name-with-dots", name: "name-with-dots",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakName("abc.123")),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Invalid(field.NewPath("metadata", "name"), "abc.123", ""), field.Invalid(field.NewPath("metadata", "name"), "abc.123", ""),
}, },
}, },
{ {
name: "long name", name: "long name",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakName(strings.Repeat("a", 64))),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Invalid(field.NewPath("metadata", "name"), strings.Repeat("a", 64), ""), field.Invalid(field.NewPath("metadata", "name"), strings.Repeat("a", 64), ""),
}, },
}, },
{ {
name: "missing-namespace", name: "missing-namespace",
set: apps.StatefulSet{ set: mkStatefulSet(&validPodTemplate, tweakNamespace("")),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Required(field.NewPath("metadata", "namespace"), ""), field.Required(field.NewPath("metadata", "namespace"), ""),
}, },
@@ -1029,46 +1013,14 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
}, },
}, },
{ {
name: "update containers 1", name: "update containers 1",
old: apps.StatefulSet{ old: mkStatefulSet(&validPodTemplate),
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, update: mkStatefulSet(addContainersValidTemplate),
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 2", name: "update containers 2",
old: apps.StatefulSet{ old: mkStatefulSet(addContainersValidTemplate),
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, update: mkStatefulSet(&validPodTemplate),
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 and pvc retention policy 1", name: "update containers and pvc retention policy 1",
@@ -1234,49 +1186,17 @@ func TestValidateStatefulSetUpdate(t *testing.T) {
errorCases := []testCase{ errorCases := []testCase{
{ {
name: "update name", name: "update name",
old: apps.StatefulSet{ old: mkStatefulSet(&validPodTemplate, tweakName("abc")),
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, update: mkStatefulSet(&validPodTemplate, tweakName("abc2")),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Invalid(field.NewPath("metadata", "name"), nil, ""), field.Invalid(field.NewPath("metadata", "name"), nil, ""),
}, },
}, },
{ {
name: "update namespace", name: "update namespace",
old: apps.StatefulSet{ old: mkStatefulSet(&validPodTemplate, tweakNamespace(metav1.NamespaceDefault)),
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, update: mkStatefulSet(&validPodTemplate, tweakNamespace(metav1.NamespaceDefault+"1")),
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},
},
},
errs: field.ErrorList{ errs: field.ErrorList{
field.Invalid(field.NewPath("metadata", "namespace"), nil, ""), field.Invalid(field.NewPath("metadata", "namespace"), nil, ""),
}, },
@@ -1496,22 +1416,20 @@ func TestValidateControllerRevision(t *testing.T) {
} }
} }
ss := apps.StatefulSet{ podTemplate := api.PodTemplate{
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, Template: api.PodTemplateSpec{
Spec: apps.StatefulSetSpec{ Spec: api.PodSpec{
Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, RestartPolicy: api.RestartPolicyAlways,
Template: api.PodTemplateSpec{ DNSPolicy: api.DNSClusterFirst,
Spec: api.PodSpec{ },
RestartPolicy: api.RestartPolicyAlways, ObjectMeta: metav1.ObjectMeta{
DNSPolicy: api.DNSClusterFirst, Labels: map[string]string{"a": "b"},
},
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{"foo": "bar"},
},
}, },
}, },
} }
ss := mkStatefulSet(&podTemplate)
var ( var (
valid = newControllerRevision("validname", "validns", &ss, 0) valid = newControllerRevision("validname", "validns", &ss, 0)
badRevision = newControllerRevision("validname", "validns", &ss, -1) badRevision = newControllerRevision("validname", "validns", &ss, -1)
@@ -1561,37 +1479,21 @@ func TestValidateControllerRevisionUpdate(t *testing.T) {
} }
} }
ss := apps.StatefulSet{ podTemplate := api.PodTemplate{
ObjectMeta: metav1.ObjectMeta{Name: "abc", Namespace: metav1.NamespaceDefault}, Template: api.PodTemplateSpec{
Spec: apps.StatefulSetSpec{ Spec: api.PodSpec{
Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, RestartPolicy: api.RestartPolicyAlways,
Template: api.PodTemplateSpec{ DNSPolicy: api.DNSClusterFirst,
Spec: api.PodSpec{ },
RestartPolicy: api.RestartPolicyAlways, ObjectMeta: metav1.ObjectMeta{
DNSPolicy: api.DNSClusterFirst, Labels: map[string]string{"a": "b"},
},
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"},
},
}, },
}, },
} }
ss := mkStatefulSet(&podTemplate, tweakName("abc"))
modifiedss := mkStatefulSet(&podTemplate, tweakName("cdf"))
var ( var (
valid = newControllerRevision("1", "validname", "validns", &ss, 0) valid = newControllerRevision("1", "validname", "validns", &ss, 0)
noVersion = newControllerRevision("", "validname", "validns", &ss, 0) noVersion = newControllerRevision("", "validname", "validns", &ss, 0)