123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- package image // import "github.com/docker/docker/integration/image"
- import (
- "context"
- "fmt"
- "testing"
- "github.com/docker/docker/testutil"
- "gotest.tools/v3/assert"
- is "gotest.tools/v3/assert/cmp"
- )
- // 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) {
- 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)))
- }
|