Browse code

Make NormalizeLocalName to not reach the network to normalize names.

Signed-off-by: David Calavera <david.calavera@gmail.com>

David Calavera authored on 2015/11/17 00:27:22
Showing 1 changed files
... ...
@@ -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
 }