Make NormalizeLocalName to not reach the network to normalize names.
Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
parent
9516a01c56
commit
3eeebe7be3
1 changed files with 53 additions and 24 deletions
|
@ -240,15 +240,28 @@ func validateNoSchema(reposName string) error {
|
||||||
|
|
||||||
// ValidateRepositoryName validates a repository name
|
// ValidateRepositoryName validates a repository name
|
||||||
func ValidateRepositoryName(reposName string) error {
|
func ValidateRepositoryName(reposName string) error {
|
||||||
var err error
|
_, _, err := loadRepositoryName(reposName, true)
|
||||||
if err = validateNoSchema(reposName); err != nil {
|
return err
|
||||||
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)
|
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
|
// 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
|
// NewRepositoryInfo validates and breaks down a repository name into a RepositoryInfo
|
||||||
func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool) (*RepositoryInfo, error) {
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
indexName, remoteName := splitReposName(reposName)
|
|
||||||
|
|
||||||
if !bySearch {
|
|
||||||
if err := validateRemoteName(remoteName); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repoInfo := &RepositoryInfo{
|
repoInfo := &RepositoryInfo{
|
||||||
RemoteName: remoteName,
|
RemoteName: remoteName,
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
|
||||||
repoInfo.Index, err = config.NewIndexInfo(indexName)
|
repoInfo.Index, err = config.NewIndexInfo(indexName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if repoInfo.Index.Official {
|
if repoInfo.Index.Official {
|
||||||
normalizedName := repoInfo.RemoteName
|
normalizedName := normalizeLibraryRepoName(repoInfo.RemoteName)
|
||||||
if strings.HasPrefix(normalizedName, "library/") {
|
|
||||||
// If pull "library/foo", it's stored locally under "foo"
|
|
||||||
normalizedName = strings.SplitN(normalizedName, "/", 2)[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
repoInfo.LocalName = normalizedName
|
repoInfo.LocalName = normalizedName
|
||||||
repoInfo.RemoteName = normalizedName
|
repoInfo.RemoteName = normalizedName
|
||||||
|
@ -343,7 +344,7 @@ func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool)
|
||||||
|
|
||||||
repoInfo.CanonicalName = "docker.io/" + repoInfo.RemoteName
|
repoInfo.CanonicalName = "docker.io/" + repoInfo.RemoteName
|
||||||
} else {
|
} else {
|
||||||
repoInfo.LocalName = repoInfo.Index.Name + "/" + repoInfo.RemoteName
|
repoInfo.LocalName = localNameFromRemote(repoInfo.Index.Name, repoInfo.RemoteName)
|
||||||
repoInfo.CanonicalName = repoInfo.LocalName
|
repoInfo.CanonicalName = repoInfo.LocalName
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -379,10 +380,38 @@ func ParseIndexInfo(reposName string) (*IndexInfo, error) {
|
||||||
|
|
||||||
// NormalizeLocalName transforms a repository name into a normalize LocalName
|
// NormalizeLocalName transforms a repository name into a normalize LocalName
|
||||||
// Passes through the name without transformation on error (image id, etc)
|
// 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 {
|
func NormalizeLocalName(name string) string {
|
||||||
repoInfo, err := ParseRepositoryInfo(name)
|
indexName, remoteName, err := loadRepositoryName(name, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return name
|
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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue