diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 01949720c1..7d031b0a21 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -40,7 +40,7 @@ "Rev": "c7a04fda2ad804601385f054c19b69cf43fcfe46" }, { - "ImportPath": "github.com/docker/docker/pkg/parsers/filters", + "ImportPath": "github.com/docker/docker/pkg/parsers", "Comment": "v1.4.1-3245-g443437f", "Rev": "443437f5ea04da9d62bf3e05d7951f7d30e77d96" }, diff --git a/cluster/image.go b/cluster/image.go index 45e5781f5d..f93c7427ca 100644 --- a/cluster/image.go +++ b/cluster/image.go @@ -3,6 +3,7 @@ package cluster import ( "strings" + "github.com/docker/docker/pkg/parsers" "github.com/samalba/dockerclient" ) @@ -13,59 +14,24 @@ 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) + // TODO: prefix match can cause false positives with image names if image.Id == IDOrName || (size > 2 && strings.HasPrefix(image.Id, IDOrName)) { return true } - imageName := IDOrName - repo, name, tag := parseImageName(imageName) - if matchTag { - if tag == "" { - imageName = toImageName(repo, name, "latest") - } - } else { - imageName = toImageName(repo, name, "") - } + repoName, tag := parsers.ParseRepositoryTag(IDOrName) - for _, repoTag := range image.RepoTags { - if matchTag == false { - r, n, _ := parseImageName(repoTag) - repoTag = toImageName(r, n, "") + for _, imageRepoTag := range image.RepoTags { + imageRepoName, imageTag := parsers.ParseRepositoryTag(imageRepoTag) + + if matchTag == false && imageRepoName == repoName { + return true } - if repoTag == imageName { + if imageRepoName == repoName && (imageTag == tag || tag == "") { return true } } diff --git a/cluster/image_test.go b/cluster/image_test.go index 3c4e15823f..06532e5a68 100644 --- a/cluster/image_test.go +++ b/cluster/image_test.go @@ -33,35 +33,6 @@ 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{}