| 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 | |
| } |