Merge pull request #878 from chanwit/private-reg-tag

fix matching image name with private repo
This commit is contained in:
Andrea Luzzardi 2015-06-01 15:35:45 -07:00
commit 0e32d052cf
2 changed files with 82 additions and 6 deletions

View File

@ -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
}
}

View File

@ -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))
}