From aec4594a8ddb331fedf1b3b15fbe78c4f335f4ad Mon Sep 17 00:00:00 2001 From: Dawn Chen Date: Fri, 16 Jan 2015 15:02:36 -0800 Subject: [PATCH] Introduce validatePullPolicyWithDefault to validation. --- pkg/api/validation/validation.go | 24 ++++++++++++++ pkg/api/validation/validation_test.go | 48 +++++++++++++++++++++++++++ pkg/kubelet/config/http_test.go | 6 ++-- 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 5e64bb80a0c..293b78bd5ea 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -266,6 +266,29 @@ func validateLifecycle(lifecycle *api.Lifecycle) errs.ValidationErrorList { return allErrs } +// TODO(dchen1107): Move this along with other defaulting values +func validatePullPolicyWithDefault(ctr *api.Container) errs.ValidationErrorList { + allErrors := errs.ValidationErrorList{} + + // TODO(dchen1107): Move ParseImageName code to pkg/util + if len(ctr.ImagePullPolicy) == 0 { + parts := strings.Split(ctr.Image, ":") + // Check image tag + if parts[len(parts)-1] == "latest" { + ctr.ImagePullPolicy = api.PullAlways + } else { + ctr.ImagePullPolicy = api.PullIfNotPresent + } + } + if ctr.ImagePullPolicy != api.PullAlways && + ctr.ImagePullPolicy != api.PullIfNotPresent && + ctr.ImagePullPolicy != api.PullNever { + allErrors = append(allErrors, errs.NewFieldNotSupported("", ctr.ImagePullPolicy)) + } + + return allErrors +} + func validateContainers(containers []api.Container, volumes util.StringSet) errs.ValidationErrorList { allErrs := errs.ValidationErrorList{} @@ -294,6 +317,7 @@ func validateContainers(containers []api.Container, volumes util.StringSet) errs cErrs = append(cErrs, validatePorts(ctr.Ports).Prefix("ports")...) cErrs = append(cErrs, validateEnv(ctr.Env).Prefix("env")...) cErrs = append(cErrs, validateVolumeMounts(ctr.VolumeMounts, volumes).Prefix("volumeMounts")...) + cErrs = append(cErrs, validatePullPolicyWithDefault(ctr).Prefix("pullPolicy")...) allErrs = append(allErrs, cErrs.PrefixIndex(i)...) } // Check for colliding ports across all containers. diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 352c9d6f0eb..0549cb1bfa8 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -220,6 +220,54 @@ func TestValidateVolumeMounts(t *testing.T) { } } +func TestValidatePullPolicy(t *testing.T) { + type T struct { + Container api.Container + ExpectedPolicy api.PullPolicy + } + testCases := map[string]T{ + "NotPresent1": { + api.Container{Name: "abc", Image: "image:latest", ImagePullPolicy: "PullIfNotPresent"}, + api.PullIfNotPresent, + }, + "NotPresent2": { + api.Container{Name: "abc1", Image: "image", ImagePullPolicy: "PullIfNotPresent"}, + api.PullIfNotPresent, + }, + "Always1": { + api.Container{Name: "123", Image: "image:latest", ImagePullPolicy: "PullAlways"}, + api.PullAlways, + }, + "Always2": { + api.Container{Name: "1234", Image: "image", ImagePullPolicy: "PullAlways"}, + api.PullAlways, + }, + "Never1": { + api.Container{Name: "abc-123", Image: "image:latest", ImagePullPolicy: "PullNever"}, + api.PullNever, + }, + "Never2": { + api.Container{Name: "abc-1234", Image: "image", ImagePullPolicy: "PullNever"}, + api.PullNever, + }, + "DefaultToNotPresent": {api.Container{Name: "notPresent", Image: "image"}, api.PullIfNotPresent}, + "DefaultToNotPresent2": {api.Container{Name: "notPresent1", Image: "image:sometag"}, api.PullIfNotPresent}, + "DefaultToAlways1": {api.Container{Name: "always", Image: "image:latest"}, api.PullAlways}, + "DefaultToAlways2": {api.Container{Name: "always", Image: "foo.bar.com:5000/my/image:latest"}, api.PullAlways}, + } + for k, v := range testCases { + ctr := &v.Container + errs := validatePullPolicyWithDefault(ctr) + if len(errs) != 0 { + t.Errorf("case[%s] expected success, got %#v", k, errs) + } + if ctr.ImagePullPolicy != v.ExpectedPolicy { + t.Errorf("case[%s] expected policy %v, got %v", k, v.ExpectedPolicy, ctr.ImagePullPolicy) + } + } + +} + func TestValidateContainers(t *testing.T) { volumes := util.StringSet{} capabilities.SetForTests(capabilities.Capabilities{ diff --git a/pkg/kubelet/config/http_test.go b/pkg/kubelet/config/http_test.go index f0e0f08b71f..ca69aab1608 100644 --- a/pkg/kubelet/config/http_test.go +++ b/pkg/kubelet/config/http_test.go @@ -156,7 +156,8 @@ func TestExtractFromHTTP(t *testing.T) { Containers: []api.Container{{ Name: "1", Image: "foo", - TerminationMessagePath: "/dev/termination-log"}}, + TerminationMessagePath: "/dev/termination-log", + ImagePullPolicy: "PullIfNotPresent"}}, }, }, api.BoundPod{ @@ -169,7 +170,8 @@ func TestExtractFromHTTP(t *testing.T) { Containers: []api.Container{{ Name: "1", Image: "foo", - TerminationMessagePath: "/dev/termination-log"}}, + TerminationMessagePath: "/dev/termination-log", + ImagePullPolicy: "PullIfNotPresent"}}, }, }), },