dotcloud/docker

View on GitHub
distribution/repository.go

Summary

Maintainability
A
35 mins
Test Coverage
package distribution

import (
    "context"

    "github.com/containerd/log"
    "github.com/distribution/reference"
    "github.com/docker/distribution"
    "github.com/docker/docker/errdefs"
)

// GetRepositories returns a list of repositories configured for the given
// reference. Multiple repositories can be returned if the reference is for
// the default (Docker Hub) registry and a mirror is configured, but it omits
// registries that were not reachable (pinging the /v2/ endpoint failed).
//
// It returns an error if it was unable to reach any of the registries for
// the given reference, or if the provided reference is invalid.
func GetRepositories(ctx context.Context, ref reference.Named, config *ImagePullConfig) ([]distribution.Repository, error) {
    repoInfo, err := config.RegistryService.ResolveRepository(ref)
    if err != nil {
        return nil, errdefs.InvalidParameter(err)
    }
    // makes sure name is not empty or `scratch`
    if err := validateRepoName(repoInfo.Name); err != nil {
        return nil, errdefs.InvalidParameter(err)
    }

    endpoints, err := config.RegistryService.LookupPullEndpoints(reference.Domain(repoInfo.Name))
    if err != nil {
        return nil, err
    }

    var (
        repositories []distribution.Repository
        lastError    error
    )
    for _, endpoint := range endpoints {
        repo, err := newRepository(ctx, repoInfo, endpoint, nil, config.AuthConfig, "pull")
        if err != nil {
            log.G(ctx).WithFields(log.Fields{"endpoint": endpoint.URL.String(), "error": err}).Info("endpoint")
            lastError = err
            continue
        }
        repositories = append(repositories, repo)
    }
    if len(repositories) == 0 {
        return nil, lastError
    }
    return repositories, nil
}