Skip to content

Commit 89b10c1

Browse files
author
noah
authored
fix: use distribution to parse references (#275)
* fix: use distribution to parse references fixes #273 * fix: keep docker.io if it was specified * fix: remove library/ if it was added
1 parent e42f982 commit 89b10c1

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

pkg/image/image.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"time"
66

77
"github.com/argoproj-labs/argocd-image-updater/pkg/tag"
8+
9+
"github.com/distribution/distribution/v3/reference"
810
)
911

1012
type ContainerImage struct {
@@ -22,6 +24,40 @@ type ContainerImageList []*ContainerImage
2224

2325
// NewFromIdentifier parses an image identifier and returns a populated ContainerImage
2426
func NewFromIdentifier(identifier string) *ContainerImage {
27+
imgRef := identifier
28+
alias := ""
29+
if strings.Contains(identifier, "=") {
30+
n := strings.SplitN(identifier, "=", 2)
31+
imgRef = n[1]
32+
alias = n[0]
33+
}
34+
if parsed, err := reference.ParseNormalizedNamed(imgRef); err == nil {
35+
img := ContainerImage{}
36+
img.RegistryURL = reference.Domain(parsed)
37+
// remove default registry for backwards-compatibility
38+
if img.RegistryURL == "docker.io" && !strings.HasPrefix(imgRef, "docker.io") {
39+
img.RegistryURL = ""
40+
}
41+
img.ImageAlias = alias
42+
img.ImageName = reference.Path(parsed)
43+
// if library/ was added to the image name, remove it
44+
if !strings.HasPrefix(imgRef, "library/") {
45+
img.ImageName = strings.TrimPrefix(img.ImageName, "library/")
46+
}
47+
if digested, ok := parsed.(reference.Digested); ok {
48+
img.ImageTag = &tag.ImageTag{
49+
TagDigest: string(digested.Digest()),
50+
}
51+
} else if tagged, ok := parsed.(reference.Tagged); ok {
52+
img.ImageTag = &tag.ImageTag{
53+
TagName: tagged.Tag(),
54+
}
55+
}
56+
img.original = identifier
57+
return &img
58+
}
59+
60+
// if distribution couldn't parse it, fall back to the legacy parsing logic
2561
img := ContainerImage{}
2662
img.RegistryURL = getRegistryFromIdentifier(identifier)
2763
img.ImageAlias, img.ImageName, img.ImageTag = getImageTagFromIdentifier(identifier)

pkg/image/image_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,26 @@ func Test_ParseImageTags(t *testing.T) {
2222
assert.Equal(t, "jannfis/test-image", image.GetFullNameWithoutTag())
2323
})
2424

25+
t.Run("Single element image name is unmodified", func(t *testing.T) {
26+
image := NewFromIdentifier("test-image")
27+
assert.Empty(t, image.RegistryURL)
28+
assert.Empty(t, image.ImageAlias)
29+
assert.Equal(t, "test-image", image.ImageName)
30+
require.Nil(t, image.ImageTag)
31+
assert.Equal(t, "test-image", image.GetFullNameWithTag())
32+
assert.Equal(t, "test-image", image.GetFullNameWithoutTag())
33+
})
34+
35+
t.Run("library image name is unmodified", func(t *testing.T) {
36+
image := NewFromIdentifier("library/test-image")
37+
assert.Empty(t, image.RegistryURL)
38+
assert.Empty(t, image.ImageAlias)
39+
assert.Equal(t, "library/test-image", image.ImageName)
40+
require.Nil(t, image.ImageTag)
41+
assert.Equal(t, "library/test-image", image.GetFullNameWithTag())
42+
assert.Equal(t, "library/test-image", image.GetFullNameWithoutTag())
43+
})
44+
2545
t.Run("Parse valid image name with registry info", func(t *testing.T) {
2646
image := NewFromIdentifier("gcr.io/jannfis/test-image:0.1")
2747
assert.Equal(t, "gcr.io", image.RegistryURL)
@@ -33,6 +53,17 @@ func Test_ParseImageTags(t *testing.T) {
3353
assert.Equal(t, "gcr.io/jannfis/test-image", image.GetFullNameWithoutTag())
3454
})
3555

56+
t.Run("Parse valid image name with default registry info", func(t *testing.T) {
57+
image := NewFromIdentifier("docker.io/jannfis/test-image:0.1")
58+
assert.Equal(t, "docker.io", image.RegistryURL)
59+
assert.Empty(t, image.ImageAlias)
60+
assert.Equal(t, "jannfis/test-image", image.ImageName)
61+
require.NotNil(t, image.ImageTag)
62+
assert.Equal(t, "0.1", image.ImageTag.TagName)
63+
assert.Equal(t, "docker.io/jannfis/test-image:0.1", image.GetFullNameWithTag())
64+
assert.Equal(t, "docker.io/jannfis/test-image", image.GetFullNameWithoutTag())
65+
})
66+
3667
t.Run("Parse valid image name with digest tag", func(t *testing.T) {
3768
image := NewFromIdentifier("gcr.io/jannfis/test-image@sha256:abcde")
3869
assert.Equal(t, "gcr.io", image.RegistryURL)
@@ -70,6 +101,13 @@ func Test_ParseImageTags(t *testing.T) {
70101
assert.Equal(t, "jannfis/test-image", image.ImageName)
71102
assert.Nil(t, image.ImageTag)
72103
})
104+
t.Run("#273 classic-web=registry:5000/classic-web", func(t *testing.T) {
105+
image := NewFromIdentifier("classic-web=registry:5000/classic-web")
106+
assert.Equal(t, "registry:5000", image.RegistryURL)
107+
assert.Equal(t, "classic-web", image.ImageAlias)
108+
assert.Equal(t, "classic-web", image.ImageName)
109+
assert.Nil(t, image.ImageTag)
110+
})
73111
}
74112

75113
func Test_ImageToString(t *testing.T) {

0 commit comments

Comments
 (0)