summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2018-07-18 22:50:53 +0200
committerAtomic Bot <atomic-devel@projectatomic.io>2018-07-23 12:44:38 +0000
commit70589c326c2da7616ff0c4def8792130543ff383 (patch)
tree1f2f19610d76182e9c04872f9e817a6b62873fc1
parent501acd460ef0acd5c4ab8d935efc1696916d23fe (diff)
downloadpodman-70589c326c2da7616ff0c4def8792130543ff383.tar.gz
podman-70589c326c2da7616ff0c4def8792130543ff383.tar.bz2
podman-70589c326c2da7616ff0c4def8792130543ff383.zip
Split normalizeTag from Image.TagImage
... so that it can be tested without side effects, and add the tests. Should not change behavior. Signed-off-by: Miloslav Trmač <mitr@redhat.com> Closes: #1112 Approved by: rhatdan
-rw-r--r--libpod/image/image.go17
-rw-r--r--libpod/image/image_test.go22
2 files changed, 35 insertions, 4 deletions
diff --git a/libpod/image/image.go b/libpod/image/image.go
index 3863338b5..7ea851f5d 100644
--- a/libpod/image/image.go
+++ b/libpod/image/image.go
@@ -457,12 +457,11 @@ func getImageDigest(ctx context.Context, src types.ImageReference, sc *types.Sys
return "@" + digest.Hex(), nil
}
-// TagImage adds a tag to the given image
-func (i *Image) TagImage(tag string) error {
- i.reloadImage()
+// normalizeTag returns the canonical version of tag for use in Image.Names()
+func normalizeTag(tag string) (string, error) {
decomposedTag, err := decompose(tag)
if err != nil {
- return err
+ return "", err
}
// If the input does not have a tag, we need to add one (latest)
if !decomposedTag.isTagged {
@@ -472,6 +471,16 @@ func (i *Image) TagImage(tag string) error {
if !decomposedTag.hasRegistry {
tag = fmt.Sprintf("%s/%s", DefaultLocalRepo, tag)
}
+ return tag, nil
+}
+
+// TagImage adds a tag to the given image
+func (i *Image) TagImage(tag string) error {
+ i.reloadImage()
+ tag, err := normalizeTag(tag)
+ if err != nil {
+ return err
+ }
tags := i.Names()
if util.StringInSlice(tag, tags) {
return nil
diff --git a/libpod/image/image_test.go b/libpod/image/image_test.go
index 04877dbe5..2236b2010 100644
--- a/libpod/image/image_test.go
+++ b/libpod/image/image_test.go
@@ -198,3 +198,25 @@ func Test_stripSha256(t *testing.T) {
assert.Equal(t, stripSha256("sha256:"), "sha256:")
assert.Equal(t, stripSha256("sha256:a"), "a")
}
+
+func TestNormalizeTag(t *testing.T) {
+ const digestSuffix = "@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+
+ for _, c := range []struct{ input, expected string }{
+ {"#", ""}, // Clearly invalid
+ {"example.com/busybox", "example.com/busybox:latest"}, // Qualified name-only
+ {"example.com/busybox:notlatest", "example.com/busybox:notlatest"}, // Qualified name:tag
+ {"example.com/busybox" + digestSuffix, "example.com/busybox" + digestSuffix + ":none"}, // Qualified name@digest; FIXME: The result is not even syntactically valid!
+ {"example.com/busybox:notlatest" + digestSuffix, "example.com/busybox:notlatest" + digestSuffix}, // Qualified name:tag@digest
+ {"busybox:latest", "localhost/busybox:latest"}, // Unqualified name-only
+ {"ns/busybox:latest", "ns/busybox:latest"}, // Unqualified with a dot-less namespace FIXME: "ns" is treated as a registry
+ } {
+ res, err := normalizeTag(c.input)
+ if c.expected == "" {
+ assert.Error(t, err, c.input)
+ } else {
+ assert.NoError(t, err, c.input)
+ assert.Equal(t, c.expected, res)
+ }
+ }
+}