Chore: add basic make function for stateful set
Add name and namespace tweak functions
This commit is contained in:
@@ -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)
|
||||||
|
Reference in New Issue
Block a user