Remove ambiguity for unsupported official repository input

Officials repositories always have 2 part names with the first part
being library and second part being the offical repository name. Names
with more than 2 parts should not hit the special case for official
repositories since they are not valid official repositories.
Add tests for this ambiguity and to ensure that 3 part names are
supports for the default repository, as used by the docker store.

Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan)
This commit is contained in:
Derek McGowan 2017-01-11 10:46:48 -08:00
parent ff68ca391b
commit 24cbdc41ba
No known key found for this signature in database
GPG key ID: F58C5D0A4405ACDB
2 changed files with 35 additions and 3 deletions

View file

@ -12,7 +12,7 @@ import (
var ( var (
legacyDefaultDomain = "index.docker.io" legacyDefaultDomain = "index.docker.io"
defaultDomain = "docker.io" defaultDomain = "docker.io"
defaultRepoPrefix = "library/" officialRepoName = "library"
defaultTag = "latest" defaultTag = "latest"
) )
@ -70,7 +70,7 @@ func splitDockerDomain(name string) (domain, remainder string) {
domain = defaultDomain domain = defaultDomain
} }
if domain == defaultDomain && !strings.ContainsRune(remainder, '/') { if domain == defaultDomain && !strings.ContainsRune(remainder, '/') {
remainder = defaultRepoPrefix + remainder remainder = officialRepoName + "/" + remainder
} }
return return
} }
@ -89,7 +89,10 @@ func familiarizeName(named namedRepository) repository {
if repo.domain == defaultDomain { if repo.domain == defaultDomain {
repo.domain = "" repo.domain = ""
repo.path = strings.TrimPrefix(repo.path, defaultRepoPrefix) // Handle official repositories which have the pattern "library/<official repo name>"
if split := strings.Split(repo.path, "/"); len(split) == 2 && split[0] == officialRepoName {
repo.path = split[1]
}
} }
return repo return repo
} }

View file

@ -208,6 +208,20 @@ func TestParseRepositoryInfo(t *testing.T) {
AmbiguousName: "index.docker.io/library/ubuntu-12.04-base", AmbiguousName: "index.docker.io/library/ubuntu-12.04-base",
Domain: "docker.io", Domain: "docker.io",
}, },
{
RemoteName: "library/foo/bar",
FamiliarName: "library/foo/bar",
FullName: "docker.io/library/foo/bar",
AmbiguousName: "",
Domain: "docker.io",
},
{
RemoteName: "store/foo/bar",
FamiliarName: "store/foo/bar",
FullName: "docker.io/store/foo/bar",
AmbiguousName: "",
Domain: "docker.io",
},
} }
for _, tcase := range tcases { for _, tcase := range tcases {
@ -483,6 +497,21 @@ func TestNormalizedSplitHostname(t *testing.T) {
domain: "xn--n3h.com:18080", domain: "xn--n3h.com:18080",
name: "foo", name: "foo",
}, },
{
input: "docker.io/foo",
domain: "docker.io",
name: "library/foo",
},
{
input: "docker.io/library/foo",
domain: "docker.io",
name: "library/foo",
},
{
input: "docker.io/library/foo/bar",
domain: "docker.io",
name: "library/foo/bar",
},
} }
for _, testcase := range testcases { for _, testcase := range testcases {
failf := func(format string, v ...interface{}) { failf := func(format string, v ...interface{}) {