diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index dfcf4499882..f3dfa83c8d5 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -208,7 +208,7 @@ type DeploymentSpec struct { Selector map[string]string `json:"selector,omitempty"` // Template describes the pods that will be created. - Template *api.PodTemplateSpec `json:"template,omitempty"` + Template api.PodTemplateSpec `json:"template"` // The deployment strategy to use to replace existing pods with new ones. Strategy DeploymentStrategy `json:"strategy,omitempty"` diff --git a/pkg/apis/extensions/v1beta1/conversion.go b/pkg/apis/extensions/v1beta1/conversion.go index f17e97ac624..165dceaeaed 100644 --- a/pkg/apis/extensions/v1beta1/conversion.go +++ b/pkg/apis/extensions/v1beta1/conversion.go @@ -213,13 +213,8 @@ func convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec(in *extensions. } else { out.Selector = nil } - if in.Template != nil { - out.Template = new(v1.PodTemplateSpec) - if err := convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(in.Template, out.Template, s); err != nil { - return err - } - } else { - out.Template = nil + if err := convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err } if err := convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { return err @@ -244,13 +239,8 @@ func convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec(in *DeploymentS } else { out.Selector = nil } - if in.Template != nil { - out.Template = new(api.PodTemplateSpec) - if err := convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in.Template, out.Template, s); err != nil { - return err - } - } else { - out.Template = nil + if err := convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil { + return err } if err := convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil { return err diff --git a/pkg/apis/extensions/v1beta1/defaults.go b/pkg/apis/extensions/v1beta1/defaults.go index 48beebb69e6..c30858975d9 100644 --- a/pkg/apis/extensions/v1beta1/defaults.go +++ b/pkg/apis/extensions/v1beta1/defaults.go @@ -45,10 +45,8 @@ func addDefaultingFuncs() { }, func(obj *Deployment) { // Default labels and selector to labels from pod template spec. - var labels map[string]string - if obj.Spec.Template != nil { - labels = obj.Spec.Template.Labels - } + labels := obj.Spec.Template.Labels + if labels != nil { if len(obj.Spec.Selector) == 0 { obj.Spec.Selector = labels diff --git a/pkg/apis/extensions/v1beta1/defaults_test.go b/pkg/apis/extensions/v1beta1/defaults_test.go index baab807924d..f351dfc0f06 100644 --- a/pkg/apis/extensions/v1beta1/defaults_test.go +++ b/pkg/apis/extensions/v1beta1/defaults_test.go @@ -88,6 +88,15 @@ func TestSetDefaultDeployment(t *testing.T) { defaultIntOrString := util.NewIntOrStringFromInt(1) differentIntOrString := util.NewIntOrStringFromInt(5) deploymentLabelKey := "deployment.kubernetes.io/podTemplateHash" + period := int64(v1.DefaultTerminationGracePeriodSeconds) + defaultTemplate := v1.PodTemplateSpec{ + Spec: v1.PodSpec{ + DNSPolicy: v1.DNSClusterFirst, + RestartPolicy: v1.RestartPolicyAlways, + SecurityContext: &v1.PodSecurityContext{}, + TerminationGracePeriodSeconds: &period, + }, + } tests := []struct { original *Deployment expected *Deployment @@ -104,6 +113,7 @@ func TestSetDefaultDeployment(t *testing.T) { MaxUnavailable: &defaultIntOrString, }, }, + Template: defaultTemplate, UniqueLabelKey: newString(deploymentLabelKey), }, }, @@ -129,6 +139,7 @@ func TestSetDefaultDeployment(t *testing.T) { MaxUnavailable: &defaultIntOrString, }, }, + Template: defaultTemplate, UniqueLabelKey: newString(deploymentLabelKey), }, }, @@ -148,6 +159,7 @@ func TestSetDefaultDeployment(t *testing.T) { Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, + Template: defaultTemplate, UniqueLabelKey: newString(deploymentLabelKey), }, }, @@ -168,6 +180,7 @@ func TestSetDefaultDeployment(t *testing.T) { Strategy: DeploymentStrategy{ Type: RecreateDeploymentStrategyType, }, + Template: defaultTemplate, UniqueLabelKey: newString("customDeploymentKey"), }, }, @@ -184,7 +197,7 @@ func TestSetDefaultDeployment(t *testing.T) { t.FailNow() } if !reflect.DeepEqual(got.Spec, expected.Spec) { - t.Errorf("got different than expected: %v, %v", got, expected) + t.Errorf("got different than expected:\n\t%+v\ngot:\n\t%+v", got.Spec, expected.Spec) } } } diff --git a/pkg/apis/extensions/v1beta1/types.go b/pkg/apis/extensions/v1beta1/types.go index 7ab25c25621..be05d516d14 100644 --- a/pkg/apis/extensions/v1beta1/types.go +++ b/pkg/apis/extensions/v1beta1/types.go @@ -201,7 +201,7 @@ type DeploymentSpec struct { Selector map[string]string `json:"selector,omitempty"` // Template describes the pods that will be created. - Template *v1.PodTemplateSpec `json:"template,omitempty"` + Template v1.PodTemplateSpec `json:"template"` // The deployment strategy to use to replace existing pods with new ones. Strategy DeploymentStrategy `json:"strategy,omitempty"` diff --git a/pkg/apis/extensions/validation/validation.go b/pkg/apis/extensions/validation/validation.go index 7c1210ae8ed..28bcddc3adb 100644 --- a/pkg/apis/extensions/validation/validation.go +++ b/pkg/apis/extensions/validation/validation.go @@ -265,7 +265,7 @@ func ValidateDeploymentSpec(spec *extensions.DeploymentSpec) errs.ValidationErro allErrs := errs.ValidationErrorList{} allErrs = append(allErrs, apivalidation.ValidateNonEmptySelector(spec.Selector, "selector")...) allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(spec.Replicas), "replicas")...) - allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpecForRC(spec.Template, spec.Selector, spec.Replicas, "template")...) + allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpecForRC(&spec.Template, spec.Selector, spec.Replicas, "template")...) allErrs = append(allErrs, ValidateDeploymentStrategy(&spec.Strategy, "strategy")...) allErrs = append(allErrs, apivalidation.ValidateLabelName(spec.UniqueLabelKey, "uniqueLabel")...) return allErrs diff --git a/pkg/apis/extensions/validation/validation_test.go b/pkg/apis/extensions/validation/validation_test.go index f0fbad786fd..c7e2ac04184 100644 --- a/pkg/apis/extensions/validation/validation_test.go +++ b/pkg/apis/extensions/validation/validation_test.go @@ -613,7 +613,7 @@ func validDeployment() *extensions.Deployment { Selector: map[string]string{ "name": "abc", }, - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Name: "abc", Namespace: api.NamespaceDefault, diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 01d33843d68..65878e77041 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -151,7 +151,7 @@ func (d *DeploymentController) getNewRC(deployment extensions.Deployment) (*api. Spec: api.ReplicationControllerSpec{ Replicas: 0, Selector: newRCSelector, - Template: newRCTemplate, + Template: &newRCTemplate, }, } createdRC, err := d.client.ReplicationControllers(namespace).Create(&newRC) diff --git a/pkg/kubectl/describe_test.go b/pkg/kubectl/describe_test.go index f57d1e174bf..4332992cbd0 100644 --- a/pkg/kubectl/describe_test.go +++ b/pkg/kubectl/describe_test.go @@ -503,7 +503,7 @@ func TestDescribeDeployment(t *testing.T) { Namespace: "foo", }, Spec: extensions.DeploymentSpec{ - Template: &api.PodTemplateSpec{}, + Template: api.PodTemplateSpec{}, }, }) c := &describeClient{T: t, Namespace: "foo", Interface: fake} diff --git a/pkg/kubectl/resource_printer_test.go b/pkg/kubectl/resource_printer_test.go index fe2e2776fec..dd576aeada8 100644 --- a/pkg/kubectl/resource_printer_test.go +++ b/pkg/kubectl/resource_printer_test.go @@ -1237,7 +1237,7 @@ func TestPrintDeployment(t *testing.T) { }, Spec: extensions.DeploymentSpec{ Replicas: 5, - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ Spec: api.PodSpec{Containers: make([]api.Container, 2)}, }, }, diff --git a/pkg/registry/deployment/etcd/etcd_test.go b/pkg/registry/deployment/etcd/etcd_test.go index ea184f481b1..7dd90a2baf0 100755 --- a/pkg/registry/deployment/etcd/etcd_test.go +++ b/pkg/registry/deployment/etcd/etcd_test.go @@ -48,7 +48,7 @@ func validNewDeployment() *extensions.Deployment { }, Spec: extensions.DeploymentSpec{ Selector: map[string]string{"a": "b"}, - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: map[string]string{"a": "b"}, }, diff --git a/pkg/util/deployment/deployment.go b/pkg/util/deployment/deployment.go index 59ca0c95b04..59806d8acd3 100644 --- a/pkg/util/deployment/deployment.go +++ b/pkg/util/deployment/deployment.go @@ -49,7 +49,8 @@ func GetOldRCs(deployment extensions.Deployment, c client.Interface) ([]*api.Rep rcLabelsSelector := labels.SelectorFromSet(rc.Spec.Selector) if rcLabelsSelector.Matches(podLabelsSelector) { // Filter out RC that has the same pod template spec as the deployment - that is the new RC. - if api.Semantic.DeepEqual(rc.Spec.Template, GetNewRCTemplate(deployment)) { + newRCTemplate := GetNewRCTemplate(deployment) + if api.Semantic.DeepEqual(rc.Spec.Template, &newRCTemplate) { continue } oldRCs[rc.ObjectMeta.Name] = rc @@ -74,7 +75,7 @@ func GetNewRC(deployment extensions.Deployment, c client.Interface) (*api.Replic newRCTemplate := GetNewRCTemplate(deployment) for _, rc := range rcList.Items { - if api.Semantic.DeepEqual(rc.Spec.Template, newRCTemplate) { + if api.Semantic.DeepEqual(rc.Spec.Template, &newRCTemplate) { // This is the new RC. return &rc, nil } @@ -84,9 +85,9 @@ func GetNewRC(deployment extensions.Deployment, c client.Interface) (*api.Replic } // Returns the desired PodTemplateSpec for the new RC corresponding to the given RC. -func GetNewRCTemplate(deployment extensions.Deployment) *api.PodTemplateSpec { +func GetNewRCTemplate(deployment extensions.Deployment) api.PodTemplateSpec { // newRC will have the same template as in deployment spec, plus a unique label in some cases. - newRCTemplate := &api.PodTemplateSpec{ + newRCTemplate := api.PodTemplateSpec{ ObjectMeta: deployment.Spec.Template.ObjectMeta, Spec: deployment.Spec.Template.Spec, } @@ -113,7 +114,7 @@ func CloneAndAddLabel(labels map[string]string, labelKey string, labelValue uint return newLabels } -func GetPodTemplateSpecHash(template *api.PodTemplateSpec) uint32 { +func GetPodTemplateSpecHash(template api.PodTemplateSpec) uint32 { podTemplateSpecHasher := adler32.New() util.DeepHashObject(podTemplateSpecHasher, template) return podTemplateSpecHasher.Sum32() diff --git a/test/e2e/deployment.go b/test/e2e/deployment.go index e844b7b65ac..85915040435 100644 --- a/test/e2e/deployment.go +++ b/test/e2e/deployment.go @@ -18,6 +18,7 @@ package e2e import ( "fmt" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" deploymentutil "k8s.io/kubernetes/pkg/util/deployment" @@ -54,7 +55,7 @@ func testNewDeployment(f *Framework) { Replicas: 1, Selector: podLabels, UniqueLabelKey: "deployment.kubernetes.io/podTemplateHash", - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: podLabels, }, @@ -147,7 +148,7 @@ func testRollingUpdateDeployment(f *Framework) { Replicas: 3, Selector: deploymentPodLabels, UniqueLabelKey: "deployment.kubernetes.io/podTemplateHash", - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: deploymentPodLabels, }, @@ -228,7 +229,7 @@ func testRollingUpdateDeploymentEvents(f *Framework) { Replicas: 1, Selector: deploymentPodLabels, UniqueLabelKey: "deployment.kubernetes.io/podTemplateHash", - Template: &api.PodTemplateSpec{ + Template: api.PodTemplateSpec{ ObjectMeta: api.ObjectMeta{ Labels: deploymentPodLabels, },