Signed-off-by: David Calavera <david.calavera@gmail.com>
| ... | ... |
@@ -240,15 +240,28 @@ func validateNoSchema(reposName string) error {
|
| 240 | 240 |
|
| 241 | 241 |
// ValidateRepositoryName validates a repository name |
| 242 | 242 |
func ValidateRepositoryName(reposName string) error {
|
| 243 |
- var err error |
|
| 244 |
- if err = validateNoSchema(reposName); err != nil {
|
|
| 245 |
- return err |
|
| 243 |
+ _, _, err := loadRepositoryName(reposName, true) |
|
| 244 |
+ return err |
|
| 245 |
+} |
|
| 246 |
+ |
|
| 247 |
+// loadRepositoryName returns the repo name splitted into index name |
|
| 248 |
+// and remote repo name. It returns an error if the name is not valid. |
|
| 249 |
+func loadRepositoryName(reposName string, checkRemoteName bool) (string, string, error) {
|
|
| 250 |
+ if err := validateNoSchema(reposName); err != nil {
|
|
| 251 |
+ return "", "", err |
|
| 246 | 252 |
} |
| 247 | 253 |
indexName, remoteName := splitReposName(reposName) |
| 248 |
- if _, err = ValidateIndexName(indexName); err != nil {
|
|
| 249 |
- return err |
|
| 254 |
+ |
|
| 255 |
+ var err error |
|
| 256 |
+ if indexName, err = ValidateIndexName(indexName); err != nil {
|
|
| 257 |
+ return "", "", err |
|
| 250 | 258 |
} |
| 251 |
- return validateRemoteName(remoteName) |
|
| 259 |
+ if checkRemoteName {
|
|
| 260 |
+ if err = validateRemoteName(remoteName); err != nil {
|
|
| 261 |
+ return "", "", err |
|
| 262 |
+ } |
|
| 263 |
+ } |
|
| 264 |
+ return indexName, remoteName, nil |
|
| 252 | 265 |
} |
| 253 | 266 |
|
| 254 | 267 |
// NewIndexInfo returns IndexInfo configuration from indexName |
| ... | ... |
@@ -302,34 +315,22 @@ func splitReposName(reposName string) (string, string) {
|
| 302 | 302 |
|
| 303 | 303 |
// NewRepositoryInfo validates and breaks down a repository name into a RepositoryInfo |
| 304 | 304 |
func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool) (*RepositoryInfo, error) {
|
| 305 |
- if err := validateNoSchema(reposName); err != nil {
|
|
| 305 |
+ indexName, remoteName, err := loadRepositoryName(reposName, !bySearch) |
|
| 306 |
+ if err != nil {
|
|
| 306 | 307 |
return nil, err |
| 307 | 308 |
} |
| 308 | 309 |
|
| 309 |
- indexName, remoteName := splitReposName(reposName) |
|
| 310 |
- |
|
| 311 |
- if !bySearch {
|
|
| 312 |
- if err := validateRemoteName(remoteName); err != nil {
|
|
| 313 |
- return nil, err |
|
| 314 |
- } |
|
| 315 |
- } |
|
| 316 |
- |
|
| 317 | 310 |
repoInfo := &RepositoryInfo{
|
| 318 | 311 |
RemoteName: remoteName, |
| 319 | 312 |
} |
| 320 | 313 |
|
| 321 |
- var err error |
|
| 322 | 314 |
repoInfo.Index, err = config.NewIndexInfo(indexName) |
| 323 | 315 |
if err != nil {
|
| 324 | 316 |
return nil, err |
| 325 | 317 |
} |
| 326 | 318 |
|
| 327 | 319 |
if repoInfo.Index.Official {
|
| 328 |
- normalizedName := repoInfo.RemoteName |
|
| 329 |
- if strings.HasPrefix(normalizedName, "library/") {
|
|
| 330 |
- // If pull "library/foo", it's stored locally under "foo" |
|
| 331 |
- normalizedName = strings.SplitN(normalizedName, "/", 2)[1] |
|
| 332 |
- } |
|
| 320 |
+ normalizedName := normalizeLibraryRepoName(repoInfo.RemoteName) |
|
| 333 | 321 |
|
| 334 | 322 |
repoInfo.LocalName = normalizedName |
| 335 | 323 |
repoInfo.RemoteName = normalizedName |
| ... | ... |
@@ -343,7 +344,7 @@ func (config *ServiceConfig) NewRepositoryInfo(reposName string, bySearch bool) |
| 343 | 343 |
|
| 344 | 344 |
repoInfo.CanonicalName = "docker.io/" + repoInfo.RemoteName |
| 345 | 345 |
} else {
|
| 346 |
- repoInfo.LocalName = repoInfo.Index.Name + "/" + repoInfo.RemoteName |
|
| 346 |
+ repoInfo.LocalName = localNameFromRemote(repoInfo.Index.Name, repoInfo.RemoteName) |
|
| 347 | 347 |
repoInfo.CanonicalName = repoInfo.LocalName |
| 348 | 348 |
|
| 349 | 349 |
} |
| ... | ... |
@@ -379,10 +380,38 @@ func ParseIndexInfo(reposName string) (*IndexInfo, error) {
|
| 379 | 379 |
|
| 380 | 380 |
// NormalizeLocalName transforms a repository name into a normalize LocalName |
| 381 | 381 |
// Passes through the name without transformation on error (image id, etc) |
| 382 |
+// It does not use the repository info because we don't want to load |
|
| 383 |
+// the repository index and do request over the network. |
|
| 382 | 384 |
func NormalizeLocalName(name string) string {
|
| 383 |
- repoInfo, err := ParseRepositoryInfo(name) |
|
| 385 |
+ indexName, remoteName, err := loadRepositoryName(name, true) |
|
| 384 | 386 |
if err != nil {
|
| 385 | 387 |
return name |
| 386 | 388 |
} |
| 387 |
- return repoInfo.LocalName |
|
| 389 |
+ |
|
| 390 |
+ var officialIndex bool |
|
| 391 |
+ // Return any configured index info, first. |
|
| 392 |
+ if index, ok := emptyServiceConfig.IndexConfigs[indexName]; ok {
|
|
| 393 |
+ officialIndex = index.Official |
|
| 394 |
+ } |
|
| 395 |
+ |
|
| 396 |
+ if officialIndex {
|
|
| 397 |
+ return normalizeLibraryRepoName(remoteName) |
|
| 398 |
+ } |
|
| 399 |
+ return localNameFromRemote(indexName, remoteName) |
|
| 400 |
+} |
|
| 401 |
+ |
|
| 402 |
+// normalizeLibraryRepoName removes the library prefix from |
|
| 403 |
+// the repository name for official repos. |
|
| 404 |
+func normalizeLibraryRepoName(name string) string {
|
|
| 405 |
+ if strings.HasPrefix(name, "library/") {
|
|
| 406 |
+ // If pull "library/foo", it's stored locally under "foo" |
|
| 407 |
+ name = strings.SplitN(name, "/", 2)[1] |
|
| 408 |
+ } |
|
| 409 |
+ return name |
|
| 410 |
+} |
|
| 411 |
+ |
|
| 412 |
+// localNameFromRemote combines the index name and the repo remote name |
|
| 413 |
+// to generate a repo local name. |
|
| 414 |
+func localNameFromRemote(indexName, remoteName string) string {
|
|
| 415 |
+ return indexName + "/" + remoteName |
|
| 388 | 416 |
} |