tag_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package image // import "github.com/docker/docker/integration/image"
  2. import (
  3. "context"
  4. "fmt"
  5. "testing"
  6. "github.com/docker/docker/testutil"
  7. "gotest.tools/v3/assert"
  8. is "gotest.tools/v3/assert/cmp"
  9. )
  10. // tagging a named image in a new unprefixed repo should work
  11. func TestTagUnprefixedRepoByNameOrName(t *testing.T) {
  12. defer setupTest(t)()
  13. client := testEnv.APIClient()
  14. ctx := context.Background()
  15. // By name
  16. err := client.ImageTag(ctx, "busybox:latest", "testfoobarbaz")
  17. assert.NilError(t, err)
  18. // By ID
  19. insp, _, err := client.ImageInspectWithRaw(ctx, "busybox")
  20. assert.NilError(t, err)
  21. err = client.ImageTag(ctx, insp.ID, "testfoobarbaz")
  22. assert.NilError(t, err)
  23. }
  24. // ensure we don't allow the use of invalid repository names or tags; these tag operations should fail
  25. // TODO (yongtang): Migrate to unit tests
  26. func TestTagInvalidReference(t *testing.T) {
  27. defer setupTest(t)()
  28. client := testEnv.APIClient()
  29. ctx := context.Background()
  30. invalidRepos := []string{"fo$z$", "Foo@3cc", "Foo$3", "Foo*3", "Fo^3", "Foo!3", "F)xcz(", "fo%asd", "FOO/bar"}
  31. for _, repo := range invalidRepos {
  32. err := client.ImageTag(ctx, "busybox", repo)
  33. assert.Check(t, is.ErrorContains(err, "not a valid repository/tag"))
  34. }
  35. longTag := testutil.GenerateRandomAlphaOnlyString(121)
  36. 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}
  37. for _, repotag := range invalidTags {
  38. err := client.ImageTag(ctx, "busybox", repotag)
  39. assert.Check(t, is.ErrorContains(err, "not a valid repository/tag"))
  40. }
  41. // test repository name begin with '-'
  42. err := client.ImageTag(ctx, "busybox:latest", "-busybox:test")
  43. assert.Check(t, is.ErrorContains(err, "Error parsing reference"))
  44. // test namespace name begin with '-'
  45. err = client.ImageTag(ctx, "busybox:latest", "-test/busybox:test")
  46. assert.Check(t, is.ErrorContains(err, "Error parsing reference"))
  47. // test index name begin with '-'
  48. err = client.ImageTag(ctx, "busybox:latest", "-index:5000/busybox:test")
  49. assert.Check(t, is.ErrorContains(err, "Error parsing reference"))
  50. // test setting tag fails
  51. err = client.ImageTag(ctx, "busybox:latest", "sha256:sometag")
  52. assert.Check(t, is.ErrorContains(err, "refusing to create an ambiguous tag using digest algorithm as name"))
  53. }
  54. // ensure we allow the use of valid tags
  55. func TestTagValidPrefixedRepo(t *testing.T) {
  56. defer setupTest(t)()
  57. client := testEnv.APIClient()
  58. ctx := context.Background()
  59. validRepos := []string{"fooo/bar", "fooaa/test", "foooo:t", "HOSTNAME.DOMAIN.COM:443/foo/bar"}
  60. for _, repo := range validRepos {
  61. err := client.ImageTag(ctx, "busybox", repo)
  62. assert.NilError(t, err)
  63. }
  64. }
  65. // tag an image with an existed tag name without -f option should work
  66. func TestTagExistedNameWithoutForce(t *testing.T) {
  67. defer setupTest(t)()
  68. client := testEnv.APIClient()
  69. ctx := context.Background()
  70. err := client.ImageTag(ctx, "busybox:latest", "busybox:test")
  71. assert.NilError(t, err)
  72. }
  73. // ensure tagging using official names works
  74. // ensure all tags result in the same name
  75. func TestTagOfficialNames(t *testing.T) {
  76. defer setupTest(t)()
  77. client := testEnv.APIClient()
  78. ctx := context.Background()
  79. names := []string{
  80. "docker.io/busybox",
  81. "index.docker.io/busybox",
  82. "library/busybox",
  83. "docker.io/library/busybox",
  84. "index.docker.io/library/busybox",
  85. }
  86. for _, name := range names {
  87. err := client.ImageTag(ctx, "busybox", name+":latest")
  88. assert.NilError(t, err)
  89. // ensure we don't have multiple tag names.
  90. insp, _, err := client.ImageInspectWithRaw(ctx, "busybox")
  91. assert.NilError(t, err)
  92. assert.Assert(t, !is.Contains(insp.RepoTags, name)().Success())
  93. }
  94. for _, name := range names {
  95. err := client.ImageTag(ctx, name+":latest", "fooo/bar:latest")
  96. assert.NilError(t, err)
  97. }
  98. }
  99. // ensure tags can not match digests
  100. func TestTagMatchesDigest(t *testing.T) {
  101. defer setupTest(t)()
  102. client := testEnv.APIClient()
  103. ctx := context.Background()
  104. digest := "busybox@sha256:abcdef76720241213f5303bda7704ec4c2ef75613173910a56fb1b6e20251507"
  105. // test setting tag fails
  106. err := client.ImageTag(ctx, "busybox:latest", digest)
  107. assert.Check(t, is.ErrorContains(err, "refusing to create a tag with a digest reference"))
  108. // check that no new image matches the digest
  109. _, _, err = client.ImageInspectWithRaw(ctx, digest)
  110. assert.Check(t, is.ErrorContains(err, fmt.Sprintf("No such image: %s", digest)))
  111. }