diff --git a/cluster/image.go b/cluster/image.go index fe1f1ffd35..45e5781f5d 100644 --- a/cluster/image.go +++ b/cluster/image.go @@ -13,6 +13,35 @@ type Image struct { Engine *Engine } +func toImageName(repo string, name string, tag string) string { + fullname := name + if tag != "" { + fullname = name + ":" + tag + } + if repo != "" { + fullname = repo + "/" + fullname + } + return fullname +} + +func parseImageName(fullname string) (repo string, name string, tag string) { + parts := strings.SplitN(fullname, "/", 2) + + nameAndTag := parts[0] + if len(parts) == 2 { + repo = parts[0] + nameAndTag = parts[1] + } + + parts = strings.SplitN(nameAndTag, ":", 2) + name = parts[0] + if len(parts) == 2 { + tag = parts[1] + } + + return +} + // Match is exported func (image *Image) Match(IDOrName string, matchTag bool) bool { size := len(IDOrName) @@ -21,20 +50,22 @@ func (image *Image) Match(IDOrName string, matchTag bool) bool { return true } - name := IDOrName + imageName := IDOrName + repo, name, tag := parseImageName(imageName) if matchTag { - if len(strings.SplitN(IDOrName, ":", 2)) == 1 { - name = IDOrName + ":latest" + if tag == "" { + imageName = toImageName(repo, name, "latest") } } else { - name = strings.SplitN(IDOrName, ":", 2)[0] + imageName = toImageName(repo, name, "") } for _, repoTag := range image.RepoTags { if matchTag == false { - repoTag = strings.SplitN(repoTag, ":", 2)[0] + r, n, _ := parseImageName(repoTag) + repoTag = toImageName(r, n, "") } - if repoTag == name { + if repoTag == imageName { return true } } diff --git a/cluster/image_test.go b/cluster/image_test.go index 39ab1f89b8..3c4e15823f 100644 --- a/cluster/image_test.go +++ b/cluster/image_test.go @@ -32,3 +32,48 @@ func TestMatch(t *testing.T) { assert.False(t, img.Match("nam", false)) assert.False(t, img.Match("na", false)) } + +func TestParseImage(t *testing.T) { + repo, name, tag := parseImageName("private.registry.com:5000/name:latest") + assert.Equal(t, repo, "private.registry.com:5000") + assert.Equal(t, name, "name") + assert.Equal(t, tag, "latest") + + repo, name, tag = parseImageName("name:latest") + assert.Equal(t, repo, "") + assert.Equal(t, name, "name") + assert.Equal(t, tag, "latest") + + repo, name, tag = parseImageName("name") + assert.Equal(t, repo, "") + assert.Equal(t, name, "name") + assert.Equal(t, tag, "") + + repo, name, tag = parseImageName("") + assert.Equal(t, repo, "") + assert.Equal(t, name, "") + assert.Equal(t, tag, "") +} + +func TestToImage(t *testing.T) { + assert.Equal(t, toImageName("", "name", ""), "name") + assert.Equal(t, toImageName("", "name", "latest"), "name:latest") + assert.Equal(t, toImageName("a", "name", ""), "a/name") + assert.Equal(t, toImageName("private.registry.com:5000", "name", "latest"), "private.registry.com:5000/name:latest") +} + +func TestMatchPrivateRepo(t *testing.T) { + img := Image{} + + img.Id = "378954456789" + img.RepoTags = []string{"private.registry.com:5000/name:latest"} + + assert.True(t, img.Match("private.registry.com:5000/name:latest", true)) + assert.True(t, img.Match("private.registry.com:5000/name", true)) + assert.False(t, img.Match("private.registry.com:5000/nam", true)) + assert.False(t, img.Match("private.registry.com:5000/na", true)) + + assert.True(t, img.Match("private.registry.com:5000/name", false)) + assert.False(t, img.Match("private.registry.com:5000/nam", false)) + assert.False(t, img.Match("private.registry.com:5000/na", false)) +}