From 2701342a0cce19c0d6a75481997578ed4498b802 Mon Sep 17 00:00:00 2001 From: Chanwit Kaewkasi Date: Sun, 31 May 2015 21:01:00 +0700 Subject: [PATCH 1/2] fix matching image name with private repo Signed-off-by: Chanwit Kaewkasi --- cluster/image.go | 21 +++++++++++++++++---- cluster/image_test.go | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/cluster/image.go b/cluster/image.go index fe1f1ffd35..6a2d63a277 100644 --- a/cluster/image.go +++ b/cluster/image.go @@ -21,18 +21,31 @@ func (image *Image) Match(IDOrName string, matchTag bool) bool { return true } + repo := "" name := IDOrName + if strings.Contains(IDOrName, "/") { + parts := strings.SplitN(IDOrName, "/", 2) + repo = parts[0] + "/" + name = parts[1] + } if matchTag { - if len(strings.SplitN(IDOrName, ":", 2)) == 1 { - name = IDOrName + ":latest" + if len(strings.SplitN(name, ":", 2)) == 1 { + name = repo + name + ":latest" + } else { + name = repo + name } } else { - name = strings.SplitN(IDOrName, ":", 2)[0] + name = repo + strings.SplitN(name, ":", 2)[0] } for _, repoTag := range image.RepoTags { if matchTag == false { - repoTag = strings.SplitN(repoTag, ":", 2)[0] + if strings.Contains(repoTag, "/") { + parts := strings.SplitN(repoTag, "/", 2) + repoTag = parts[0] + "/" + strings.SplitN(parts[1], ":", 2)[0] + } else { + repoTag = strings.SplitN(repoTag, ":", 2)[0] + } } if repoTag == name { return true diff --git a/cluster/image_test.go b/cluster/image_test.go index 39ab1f89b8..06532e5a68 100644 --- a/cluster/image_test.go +++ b/cluster/image_test.go @@ -32,3 +32,19 @@ func TestMatch(t *testing.T) { assert.False(t, img.Match("nam", false)) assert.False(t, img.Match("na", false)) } + +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)) +} From 7725b572c2e2b46e05ce0ac9e31ec44fabb131fa Mon Sep 17 00:00:00 2001 From: Chanwit Kaewkasi Date: Mon, 1 Jun 2015 00:43:52 +0700 Subject: [PATCH 2/2] refactor parsing to a function Signed-off-by: Chanwit Kaewkasi --- cluster/image.go | 56 ++++++++++++++++++++++++++++--------------- cluster/image_test.go | 29 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/cluster/image.go b/cluster/image.go index 6a2d63a277..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,33 +50,22 @@ func (image *Image) Match(IDOrName string, matchTag bool) bool { return true } - repo := "" - name := IDOrName - if strings.Contains(IDOrName, "/") { - parts := strings.SplitN(IDOrName, "/", 2) - repo = parts[0] + "/" - name = parts[1] - } + imageName := IDOrName + repo, name, tag := parseImageName(imageName) if matchTag { - if len(strings.SplitN(name, ":", 2)) == 1 { - name = repo + name + ":latest" - } else { - name = repo + name + if tag == "" { + imageName = toImageName(repo, name, "latest") } } else { - name = repo + strings.SplitN(name, ":", 2)[0] + imageName = toImageName(repo, name, "") } for _, repoTag := range image.RepoTags { if matchTag == false { - if strings.Contains(repoTag, "/") { - parts := strings.SplitN(repoTag, "/", 2) - repoTag = parts[0] + "/" + strings.SplitN(parts[1], ":", 2)[0] - } else { - 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 06532e5a68..3c4e15823f 100644 --- a/cluster/image_test.go +++ b/cluster/image_test.go @@ -33,6 +33,35 @@ func TestMatch(t *testing.T) { 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{}