func TestValidateImageStream(t *testing.T) { namespace63Char := strings.Repeat("a", 63) name191Char := strings.Repeat("b", 191) name192Char := "x" + name191Char missingNameErr := field.Required(field.NewPath("metadata", "name"), "") missingNameErr.Detail = "name or generateName is required" tests := map[string]struct { namespace string name string dockerImageRepository string specTags map[string]api.TagReference statusTags map[string]api.TagEventList expected field.ErrorList }{ "missing name": { namespace: "foo", name: "", expected: field.ErrorList{missingNameErr}, }, "no slash in Name": { namespace: "foo", name: "foo/bar", expected: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), "foo/bar", `may not contain '/'`), }, }, "no percent in Name": { namespace: "foo", name: "foo%%bar", expected: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), "foo%%bar", `may not contain '%'`), }, }, "other invalid name": { namespace: "foo", name: "foo bar", expected: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), "foo bar", `must match "[a-z0-9]+(?:[._-][a-z0-9]+)*"`), }, }, "missing namespace": { namespace: "", name: "foo", expected: field.ErrorList{ field.Required(field.NewPath("metadata", "namespace"), ""), }, }, "invalid namespace": { namespace: "!$", name: "foo", expected: field.ErrorList{ field.Invalid(field.NewPath("metadata", "namespace"), "!$", `must match the regex [a-z0-9]([-a-z0-9]*[a-z0-9])? (e.g. 'my-name' or '123-abc')`), }, }, "invalid dockerImageRepository": { namespace: "namespace", name: "foo", dockerImageRepository: "a-|///bbb", expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "dockerImageRepository"), "a-|///bbb", "invalid reference format"), }, }, "invalid dockerImageRepository with tag": { namespace: "namespace", name: "foo", dockerImageRepository: "a/b:tag", expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "dockerImageRepository"), "a/b:tag", "the repository name may not contain a tag"), }, }, "invalid dockerImageRepository with ID": { namespace: "namespace", name: "foo", dockerImageRepository: "a/b@sha256:something", expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "dockerImageRepository"), "a/b@sha256:something", "invalid reference format"), }, }, "status tag missing dockerImageReference": { namespace: "namespace", name: "foo", statusTags: map[string]api.TagEventList{ "tag": { Items: []api.TagEvent{ {DockerImageReference: ""}, {DockerImageReference: "foo/bar:latest"}, {DockerImageReference: ""}, }, }, }, expected: field.ErrorList{ field.Required(field.NewPath("status", "tags").Key("tag").Child("items").Index(0).Child("dockerImageReference"), ""), field.Required(field.NewPath("status", "tags").Key("tag").Child("items").Index(2).Child("dockerImageReference"), ""), }, }, "referencePolicy.type must be valid": { namespace: "namespace", name: "foo", specTags: map[string]api.TagReference{ "tag": { From: &kapi.ObjectReference{ Kind: "DockerImage", Name: "abc", }, ReferencePolicy: api.TagReferencePolicy{Type: api.TagReferencePolicyType("Other")}, }, }, expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "tags").Key("tag").Child("referencePolicy", "type"), api.TagReferencePolicyType("Other"), "valid values are \"Source\", \"Local\""), }, }, "ImageStreamTags can't be scheduled": { namespace: "namespace", name: "foo", specTags: map[string]api.TagReference{ "tag": { From: &kapi.ObjectReference{ Kind: "DockerImage", Name: "abc", }, ImportPolicy: api.TagImportPolicy{Scheduled: true}, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, "other": { From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "other:latest", }, ImportPolicy: api.TagImportPolicy{Scheduled: true}, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, }, expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "tags").Key("other").Child("importPolicy", "scheduled"), true, "only tags pointing to Docker repositories may be scheduled for background import"), }, }, "image IDs can't be scheduled": { namespace: "namespace", name: "foo", specTags: map[string]api.TagReference{ "badid": { From: &kapi.ObjectReference{ Kind: "DockerImage", Name: "abc@badid", }, ImportPolicy: api.TagImportPolicy{Scheduled: true}, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, }, expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "tags").Key("badid").Child("from", "name"), "abc@badid", "invalid reference format"), }, }, "ImageStreamImages can't be scheduled": { namespace: "namespace", name: "foo", specTags: map[string]api.TagReference{ "otherimage": { From: &kapi.ObjectReference{ Kind: "ImageStreamImage", Name: "other@latest", }, ImportPolicy: api.TagImportPolicy{Scheduled: true}, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, }, expected: field.ErrorList{ field.Invalid(field.NewPath("spec", "tags").Key("otherimage").Child("importPolicy", "scheduled"), true, "only tags pointing to Docker repositories may be scheduled for background import"), }, }, "valid": { namespace: "namespace", name: "foo", specTags: map[string]api.TagReference{ "tag": { From: &kapi.ObjectReference{ Kind: "DockerImage", Name: "abc", }, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, "other": { From: &kapi.ObjectReference{ Kind: "ImageStreamTag", Name: "other:latest", }, ReferencePolicy: api.TagReferencePolicy{Type: api.SourceTagReferencePolicy}, }, }, statusTags: map[string]api.TagEventList{ "tag": { Items: []api.TagEvent{ {DockerImageReference: "foo/bar:latest"}, }, }, }, expected: field.ErrorList{}, }, "shortest name components": { namespace: "f", name: "g", expected: field.ErrorList{}, }, "all possible characters used": { namespace: "abcdefghijklmnopqrstuvwxyz-1234567890", name: "abcdefghijklmnopqrstuvwxyz-1234567890.dot_underscore-dash", expected: field.ErrorList{}, }, "max name and namespace length met": { namespace: namespace63Char, name: name191Char, expected: field.ErrorList{}, }, "max name and namespace length exceeded": { namespace: namespace63Char, name: name192Char, expected: field.ErrorList{ field.Invalid(field.NewPath("metadata", "name"), name192Char, "'namespace/name' cannot be longer than 255 characters"), }, }, } for name, test := range tests { stream := api.ImageStream{ ObjectMeta: kapi.ObjectMeta{ Namespace: test.namespace, Name: test.name, }, Spec: api.ImageStreamSpec{ DockerImageRepository: test.dockerImageRepository, Tags: test.specTags, }, Status: api.ImageStreamStatus{ Tags: test.statusTags, }, } errs := ValidateImageStream(&stream) if e, a := test.expected, errs; !reflect.DeepEqual(e, a) { t.Errorf("%s: unexpected errors: %s", name, diff.ObjectReflectDiff(e, a)) } } }
func autoConvert_v1_TagReferencePolicy_To_api_TagReferencePolicy(in *TagReferencePolicy, out *api.TagReferencePolicy, s conversion.Scope) error { out.Type = api.TagReferencePolicyType(in.Type) return nil }