From e3a22d8f9e59c94c93203279e9c4c6a3ce96939e Mon Sep 17 00:00:00 2001 From: foxish Date: Mon, 17 Jul 2017 12:29:43 -0700 Subject: [PATCH] DS: added v1beta2/defaults --- pkg/apis/apps/v1beta2/defaults.go | 35 +++++++ pkg/apis/apps/v1beta2/defaults_test.go | 123 +++++++++++++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/pkg/apis/apps/v1beta2/defaults.go b/pkg/apis/apps/v1beta2/defaults.go index cbf031f5f40..f7c62d1fe2a 100644 --- a/pkg/apis/apps/v1beta2/defaults.go +++ b/pkg/apis/apps/v1beta2/defaults.go @@ -27,6 +27,41 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { return RegisterDefaults(scheme) } +func SetDefaults_DaemonSet(obj *appsv1beta2.DaemonSet) { + labels := obj.Spec.Template.Labels + + // TODO: support templates defined elsewhere when we support them in the API + if labels != nil { + if obj.Spec.Selector == nil { + obj.Spec.Selector = &metav1.LabelSelector{ + MatchLabels: labels, + } + } + if len(obj.Labels) == 0 { + obj.Labels = labels + } + } + updateStrategy := &obj.Spec.UpdateStrategy + if updateStrategy.Type == "" { + updateStrategy.Type = appsv1beta2.OnDeleteDaemonSetStrategyType + } + if updateStrategy.Type == appsv1beta2.RollingUpdateDaemonSetStrategyType { + if updateStrategy.RollingUpdate == nil { + rollingUpdate := appsv1beta2.RollingUpdateDaemonSet{} + updateStrategy.RollingUpdate = &rollingUpdate + } + if updateStrategy.RollingUpdate.MaxUnavailable == nil { + // Set default MaxUnavailable as 1 by default. + maxUnavailable := intstr.FromInt(1) + updateStrategy.RollingUpdate.MaxUnavailable = &maxUnavailable + } + } + if obj.Spec.RevisionHistoryLimit == nil { + obj.Spec.RevisionHistoryLimit = new(int32) + *obj.Spec.RevisionHistoryLimit = 10 + } +} + func SetDefaults_StatefulSet(obj *appsv1beta2.StatefulSet) { if len(obj.Spec.PodManagementPolicy) == 0 { obj.Spec.PodManagementPolicy = appsv1beta2.OrderedReadyPodManagement diff --git a/pkg/apis/apps/v1beta2/defaults_test.go b/pkg/apis/apps/v1beta2/defaults_test.go index 294f1ca92d8..15d09735715 100644 --- a/pkg/apis/apps/v1beta2/defaults_test.go +++ b/pkg/apis/apps/v1beta2/defaults_test.go @@ -32,6 +32,129 @@ import ( . "k8s.io/kubernetes/pkg/apis/apps/v1beta2" ) +func TestSetDefaultDaemonSetSpec(t *testing.T) { + defaultLabels := map[string]string{"foo": "bar"} + period := int64(v1.DefaultTerminationGracePeriodSeconds) + defaultTemplate := v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, + SecurityContext: &v1.PodSecurityContext{}, + TerminationGracePeriodSeconds: &period, + SchedulerName: api.DefaultSchedulerName, + }, + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + } + templateNoLabel := v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, + SecurityContext: &v1.PodSecurityContext{}, + TerminationGracePeriodSeconds: &period, + SchedulerName: api.DefaultSchedulerName, + }, + } + tests := []struct { + original *appsv1beta2.DaemonSet + expected *appsv1beta2.DaemonSet + }{ + { // Labels change/defaulting test. + original: &appsv1beta2.DaemonSet{ + Spec: appsv1beta2.DaemonSetSpec{ + Template: defaultTemplate, + }, + }, + expected: &appsv1beta2.DaemonSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: defaultLabels, + }, + Spec: appsv1beta2.DaemonSetSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: defaultLabels, + }, + Template: defaultTemplate, + UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + { // Labels change/defaulting test. + original: &appsv1beta2.DaemonSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "bar": "foo", + }, + }, + Spec: appsv1beta2.DaemonSetSpec{ + Template: defaultTemplate, + RevisionHistoryLimit: newInt32(1), + }, + }, + expected: &appsv1beta2.DaemonSet{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "bar": "foo", + }, + }, + Spec: appsv1beta2.DaemonSetSpec{ + Selector: &metav1.LabelSelector{ + MatchLabels: defaultLabels, + }, + Template: defaultTemplate, + UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + }, + RevisionHistoryLimit: newInt32(1), + }, + }, + }, + { // Update strategy. + original: &appsv1beta2.DaemonSet{}, + expected: &appsv1beta2.DaemonSet{ + Spec: appsv1beta2.DaemonSetSpec{ + Template: templateNoLabel, + UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + { // Custom unique label key. + original: &appsv1beta2.DaemonSet{ + Spec: appsv1beta2.DaemonSetSpec{}, + }, + expected: &appsv1beta2.DaemonSet{ + Spec: appsv1beta2.DaemonSetSpec{ + Template: templateNoLabel, + UpdateStrategy: appsv1beta2.DaemonSetUpdateStrategy{ + Type: appsv1beta2.OnDeleteDaemonSetStrategyType, + }, + RevisionHistoryLimit: newInt32(10), + }, + }, + }, + } + + for i, test := range tests { + original := test.original + expected := test.expected + obj2 := roundTrip(t, runtime.Object(original)) + got, ok := obj2.(*appsv1beta2.DaemonSet) + if !ok { + t.Errorf("(%d) unexpected object: %v", i, got) + t.FailNow() + } + if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) { + t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec) + } + } +} + func TestSetDefaultDeployment(t *testing.T) { defaultIntOrString := intstr.FromString("25%") differentIntOrString := intstr.FromInt(5)