diff --git a/pkg/api/v1/conversion.go b/pkg/api/v1/conversion.go index 160b063b010..de01ce0189a 100644 --- a/pkg/api/v1/conversion.go +++ b/pkg/api/v1/conversion.go @@ -493,6 +493,12 @@ func Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in *PodTemplateSpec, out // taking responsibility to ensure mutation of in is not exposed // back to the caller. in.Spec.InitContainers = values + + // Call defaulters explicitly until annotations are removed + for i := range in.Spec.InitContainers { + c := &in.Spec.InitContainers[i] + SetDefaults_Container(c) + } } if err := autoConvert_v1_PodTemplateSpec_To_api_PodTemplateSpec(in, out, s); err != nil { diff --git a/pkg/api/v1/defaults.go b/pkg/api/v1/defaults.go index 89412479061..fbc5872c46b 100644 --- a/pkg/api/v1/defaults.go +++ b/pkg/api/v1/defaults.go @@ -112,7 +112,6 @@ func SetDefaults_Container(obj *Container) { _, tag, _, _ := parsers.ParseImageName(obj.Image) // Check image tag - if tag == "latest" { obj.ImagePullPolicy = PullAlways } else { diff --git a/pkg/api/v1/defaults_test.go b/pkg/api/v1/defaults_test.go index bcc1de67301..909ea68b3a7 100644 --- a/pkg/api/v1/defaults_test.go +++ b/pkg/api/v1/defaults_test.go @@ -17,6 +17,7 @@ limitations under the License. package v1_test import ( + "encoding/json" "reflect" "testing" @@ -230,6 +231,72 @@ func TestSetDefaultReplicationControllerReplicas(t *testing.T) { } } +func TestSetDefaultReplicationControllerImagePullPolicy(t *testing.T) { + containersWithoutPullPolicy, _ := json.Marshal([]map[string]interface{}{ + { + "name": "install", + "image": "busybox:latest", + }, + }) + + containersWithPullPolicy, _ := json.Marshal([]map[string]interface{}{ + { + "name": "install", + "imagePullPolicy": "IfNotPresent", + }, + }) + + tests := []struct { + rc versioned.ReplicationController + expectPullPolicy versioned.PullPolicy + }{ + { + rc: versioned.ReplicationController{ + Spec: versioned.ReplicationControllerSpec{ + Template: &versioned.PodTemplateSpec{ + ObjectMeta: versioned.ObjectMeta{ + Annotations: map[string]string{ + "pod.beta.kubernetes.io/init-containers": string(containersWithoutPullPolicy), + }, + }, + }, + }, + }, + expectPullPolicy: versioned.PullAlways, + }, + { + rc: versioned.ReplicationController{ + Spec: versioned.ReplicationControllerSpec{ + Template: &versioned.PodTemplateSpec{ + ObjectMeta: versioned.ObjectMeta{ + Annotations: map[string]string{ + "pod.beta.kubernetes.io/init-containers": string(containersWithPullPolicy), + }, + }, + }, + }, + }, + expectPullPolicy: versioned.PullIfNotPresent, + }, + } + + for _, test := range tests { + rc := &test.rc + obj2 := roundTrip(t, runtime.Object(rc)) + rc2, ok := obj2.(*versioned.ReplicationController) + if !ok { + t.Errorf("unexpected object: %v", rc2) + t.FailNow() + } + if test.expectPullPolicy != rc2.Spec.Template.Spec.InitContainers[0].ImagePullPolicy { + t.Errorf("expected ImagePullPolicy: %s, got: %s", + test.expectPullPolicy, + rc2.Spec.Template.Spec.InitContainers[0].ImagePullPolicy, + ) + } + } +} + func TestSetDefaultService(t *testing.T) { svc := &versioned.Service{} obj2 := roundTrip(t, runtime.Object(svc))