| package image // import "github.com/docker/docker/integration/image" |
| |
| import ( |
| "context" |
| "fmt" |
| "testing" |
| |
| "github.com/docker/docker/internal/testutil" |
| "gotest.tools/assert" |
| is "gotest.tools/assert/cmp" |
| "gotest.tools/skip" |
| ) |
| |
| // tagging a named image in a new unprefixed repo should work |
| func TestTagUnprefixedRepoByNameOrName(t *testing.T) { |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| // By name |
| err := client.ImageTag(ctx, "busybox:latest", "testfoobarbaz") |
| assert.NilError(t, err) |
| |
| // By ID |
| insp, _, err := client.ImageInspectWithRaw(ctx, "busybox") |
| assert.NilError(t, err) |
| err = client.ImageTag(ctx, insp.ID, "testfoobarbaz") |
| assert.NilError(t, err) |
| } |
| |
| // ensure we don't allow the use of invalid repository names or tags; these tag operations should fail |
| // TODO (yongtang): Migrate to unit tests |
| func TestTagInvalidReference(t *testing.T) { |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| invalidRepos := []string{"fo$z$", "Foo@3cc", "Foo$3", "Foo*3", "Fo^3", "Foo!3", "F)xcz(", "fo%asd", "FOO/bar"} |
| |
| for _, repo := range invalidRepos { |
| err := client.ImageTag(ctx, "busybox", repo) |
| assert.Check(t, is.ErrorContains(err, "not a valid repository/tag")) |
| } |
| |
| longTag := testutil.GenerateRandomAlphaOnlyString(121) |
| |
| invalidTags := []string{"repo:fo$z$", "repo:Foo@3cc", "repo:Foo$3", "repo:Foo*3", "repo:Fo^3", "repo:Foo!3", "repo:%goodbye", "repo:#hashtagit", "repo:F)xcz(", "repo:-foo", "repo:..", longTag} |
| |
| for _, repotag := range invalidTags { |
| err := client.ImageTag(ctx, "busybox", repotag) |
| assert.Check(t, is.ErrorContains(err, "not a valid repository/tag")) |
| } |
| |
| // test repository name begin with '-' |
| err := client.ImageTag(ctx, "busybox:latest", "-busybox:test") |
| assert.Check(t, is.ErrorContains(err, "Error parsing reference")) |
| |
| // test namespace name begin with '-' |
| err = client.ImageTag(ctx, "busybox:latest", "-test/busybox:test") |
| assert.Check(t, is.ErrorContains(err, "Error parsing reference")) |
| |
| // test index name begin with '-' |
| err = client.ImageTag(ctx, "busybox:latest", "-index:5000/busybox:test") |
| assert.Check(t, is.ErrorContains(err, "Error parsing reference")) |
| |
| // test setting tag fails |
| err = client.ImageTag(ctx, "busybox:latest", "sha256:sometag") |
| assert.Check(t, is.ErrorContains(err, "refusing to create an ambiguous tag using digest algorithm as name")) |
| } |
| |
| // ensure we allow the use of valid tags |
| func TestTagValidPrefixedRepo(t *testing.T) { |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| validRepos := []string{"fooo/bar", "fooaa/test", "foooo:t", "HOSTNAME.DOMAIN.COM:443/foo/bar"} |
| |
| for _, repo := range validRepos { |
| err := client.ImageTag(ctx, "busybox", repo) |
| assert.NilError(t, err) |
| } |
| } |
| |
| // tag an image with an existed tag name without -f option should work |
| func TestTagExistedNameWithoutForce(t *testing.T) { |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| err := client.ImageTag(ctx, "busybox:latest", "busybox:test") |
| assert.NilError(t, err) |
| } |
| |
| // ensure tagging using official names works |
| // ensure all tags result in the same name |
| func TestTagOfficialNames(t *testing.T) { |
| skip.If(t, testEnv.OSType == "windows") |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| names := []string{ |
| "docker.io/busybox", |
| "index.docker.io/busybox", |
| "library/busybox", |
| "docker.io/library/busybox", |
| "index.docker.io/library/busybox", |
| } |
| |
| for _, name := range names { |
| err := client.ImageTag(ctx, "busybox", name+":latest") |
| assert.NilError(t, err) |
| |
| // ensure we don't have multiple tag names. |
| insp, _, err := client.ImageInspectWithRaw(ctx, "busybox") |
| assert.NilError(t, err) |
| assert.Assert(t, !is.Contains(insp.RepoTags, name)().Success()) |
| } |
| |
| for _, name := range names { |
| err := client.ImageTag(ctx, name+":latest", "fooo/bar:latest") |
| assert.NilError(t, err) |
| } |
| } |
| |
| // ensure tags can not match digests |
| func TestTagMatchesDigest(t *testing.T) { |
| defer setupTest(t)() |
| client := testEnv.APIClient() |
| ctx := context.Background() |
| |
| digest := "busybox@sha256:abcdef76720241213f5303bda7704ec4c2ef75613173910a56fb1b6e20251507" |
| // test setting tag fails |
| err := client.ImageTag(ctx, "busybox:latest", digest) |
| assert.Check(t, is.ErrorContains(err, "refusing to create a tag with a digest reference")) |
| |
| // check that no new image matches the digest |
| _, _, err = client.ImageInspectWithRaw(ctx, digest) |
| assert.Check(t, is.ErrorContains(err, fmt.Sprintf("No such image: %s", digest))) |
| } |