// getRepositoryMountCandidates returns an array of v2 metadata items belonging to the given registry. The // array is sorted from youngest to oldest. If requireReigstryMatch is true, the resulting array will contain // only metadata entries having registry part of SourceRepository matching the part of repoInfo. func getRepositoryMountCandidates( repoInfo reference.Named, hmacKey []byte, max int, v2Metadata []metadata.V2Metadata, ) []metadata.V2Metadata { candidates := []metadata.V2Metadata{} for _, meta := range v2Metadata { sourceRepo, err := reference.ParseNamed(meta.SourceRepository) if err != nil || repoInfo.Hostname() != sourceRepo.Hostname() { continue } // target repository is not a viable candidate if meta.SourceRepository == repoInfo.FullName() { continue } candidates = append(candidates, meta) } sortV2MetadataByLikenessAndAge(repoInfo, hmacKey, candidates) if max >= 0 && len(candidates) > max { // select the youngest metadata candidates = candidates[:max] } return candidates }
// newRepositoryInfo validates and breaks down a repository name into a RepositoryInfo func newRepositoryInfo(config *serviceConfig, name reference.Named) (*RepositoryInfo, error) { index, err := newIndexInfo(config, name.Hostname()) if err != nil { return nil, err } official := !strings.ContainsRune(name.Name(), '/') return &RepositoryInfo{name, index, official}, nil }
func (i *Image) PullImage(ctx context.Context, ref reference.Named, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error { defer trace.End(trace.Begin(ref.String())) log.Debugf("PullImage: ref = %+v, metaheaders = %+v\n", ref, metaHeaders) options := imagec.Options{ Destination: os.TempDir(), Reference: ref.String(), Timeout: imagec.DefaultHTTPTimeout, Outstream: outStream, } if authConfig != nil { if len(authConfig.Username) > 0 { options.Username = authConfig.Username } if len(authConfig.Password) > 0 { options.Password = authConfig.Password } } portLayerServer := PortLayerServer() if portLayerServer != "" { options.Host = portLayerServer } insecureRegistries := InsecureRegistries() for _, registry := range insecureRegistries { if registry == ref.Hostname() { options.InsecureAllowHTTP = true break } } log.Infof("PullImage: reference: %s, %s, portlayer: %#v", options.Reference, options.Host, portLayerServer) ic := imagec.NewImageC(options, streamformatter.NewJSONStreamFormatter()) err := ic.PullImage() if err != nil { return err } return nil }