Make NormalizeLocalName to not reach the network to normalize names.

Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
David Calavera 2015-11-16 10:27:22 -05:00
parent 9516a01c56
commit 3eeebe7be3

View File

@ -240,15 +240,28 @@ func validateNoSchema(reposName string) error {
// ValidateRepositoryName validates a repository name
func ValidateRepositoryName(reposName string) error {
var err error
if err = validateNoSchema(reposName); err != nil {
_, _, err := loadRepositoryName(reposName, true)
return err
}
// loadRepositoryName returns the repo name splitted into index name
// and remote repo name. It returns an error if the name is not valid.
func loadRepositoryName(reposName string, checkRemoteName bool) (string, string, error) {
if err := validateNoSchema(reposName); err != nil {
return "", "", err
}
indexName, remoteName := splitReposName(reposName)
if _, err = ValidateIndexName(indexName); err != nil {
return err
var err error
if indexName, err = ValidateIndexName(indexName); err != nil {
return "", "", err
}
return validateRemoteName(remoteName)
if checkRemoteName {
if err = validateRemoteName(remoteName); err != nil {
return "", "", err
}
}
return indexName, remoteName, nil
}
// NewIndexInfo returns IndexInfo configuration from indexName
@ -302,34 +315,22 @@ func splitReposName(reposName string) (string, string) {
// NewRepositoryInfo validates and breaks down a repository name into a RepositoryInfo
func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool) (*RepositoryInfo, error) {
if err := validateNoSchema(reposName); err != nil {
indexName, remoteName, err := loadRepositoryName(reposName, !bySearch)
if err != nil {
return nil, err
}
indexName, remoteName := splitReposName(reposName)
if !bySearch {
if err := validateRemoteName(remoteName); err != nil {
return nil, err
}
}
repoInfo := &RepositoryInfo{
RemoteName: remoteName,
}
var err error
repoInfo.Index, err = config.NewIndexInfo(indexName)
if err != nil {
return nil, err
}
if repoInfo.Index.Official {
normalizedName := repoInfo.RemoteName
if strings.HasPrefix(normalizedName, "library/") {
// If pull "library/foo", it's stored locally under "foo"
normalizedName = strings.SplitN(normalizedName, "/", 2)[1]
}
normalizedName := normalizeLibraryRepoName(repoInfo.RemoteName)
repoInfo.LocalName = normalizedName
repoInfo.RemoteName = normalizedName
@ -343,7 +344,7 @@ func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool)
repoInfo.CanonicalName = "docker.io/" + repoInfo.RemoteName
} else {
repoInfo.LocalName = repoInfo.Index.Name + "/" + repoInfo.RemoteName
repoInfo.LocalName = localNameFromRemote(repoInfo.Index.Name, repoInfo.RemoteName)
repoInfo.CanonicalName = repoInfo.LocalName
}
@ -379,10 +380,38 @@ func ParseIndexInfo(reposName string) (*IndexInfo, error) {
// NormalizeLocalName transforms a repository name into a normalize LocalName
// Passes through the name without transformation on error (image id, etc)
// It does not use the repository info because we don't want to load
// the repository index and do request over the network.
func NormalizeLocalName(name string) string {
repoInfo, err := ParseRepositoryInfo(name)
indexName, remoteName, err := loadRepositoryName(name, true)
if err != nil {
return name
}
return repoInfo.LocalName
var officialIndex bool
// Return any configured index info, first.
if index, ok := emptyServiceConfig.IndexConfigs[indexName]; ok {
officialIndex = index.Official
}
if officialIndex {
return normalizeLibraryRepoName(remoteName)
}
return localNameFromRemote(indexName, remoteName)
}
// normalizeLibraryRepoName removes the library prefix from
// the repository name for official repos.
func normalizeLibraryRepoName(name string) string {
if strings.HasPrefix(name, "library/") {
// If pull "library/foo", it's stored locally under "foo"
name = strings.SplitN(name, "/", 2)[1]
}
return name
}
// localNameFromRemote combines the index name and the repo remote name
// to generate a repo local name.
func localNameFromRemote(indexName, remoteName string) string {
return indexName + "/" + remoteName
}