// importFromRepository imports the repository named on the ImageStreamImport, if any, importing up to maximumTags, and reporting // status on each image that is attempted to be imported. If the repository cannot be found or tags cannot be retrieved, the repository // status field is set. func (i *ImageStreamImporter) importFromRepository(ctx gocontext.Context, retriever RepositoryRetriever, isi *api.ImageStreamImport, maximumTags int, limiter flowcontrol.RateLimiter) { if isi.Spec.Repository == nil { return } cache := i.digestToRepositoryCache[ctx] isi.Status.Repository = &api.RepositoryImportStatus{} status := isi.Status.Repository spec := isi.Spec.Repository from := spec.From if from.Kind != "DockerImage" { return } // TODO: This should be removed in 1.6 // See for more info: https://github.com/openshift/origin/pull/11774#issuecomment-258905994 var ( err error ref api.DockerImageReference ) if from.Name != "*" { ref, err = api.ParseDockerImageReference(from.Name) if err != nil { status.Status = invalidStatus("", field.Invalid(field.NewPath("from", "name"), from.Name, fmt.Sprintf("invalid name: %v", err))) return } } else { ref = api.DockerImageReference{Name: from.Name} } defaultRef := ref.DockerClientDefaults() repoName := defaultRef.RepositoryName() registryURL := defaultRef.RegistryURL() key := repositoryKey{url: *registryURL, name: repoName} repo := &importRepository{ Ref: ref, Registry: &key.url, Name: key.name, Insecure: spec.ImportPolicy.Insecure, MaximumTags: maximumTags, } i.importRepositoryFromDocker(ctx, retriever, repo, limiter) if repo.Err != nil { status.Status = imageImportStatus(repo.Err, "", "repository") return } additional := []string{} tagKey := manifestKey{repositoryKey: key} for _, s := range repo.AdditionalTags { tagKey.value = s if image, ok := cache[tagKey]; ok { repo.Tags = append(repo.Tags, importTag{ Name: s, Image: image, }) } else { additional = append(additional, s) } } status.AdditionalTags = additional failures := 0 status.Status.Status = unversioned.StatusSuccess status.Images = make([]api.ImageImportStatus, len(repo.Tags)) for i, tag := range repo.Tags { status.Images[i].Tag = tag.Name if tag.Err != nil { failures++ status.Images[i].Status = imageImportStatus(tag.Err, "", "repository") continue } status.Images[i].Status.Status = unversioned.StatusSuccess copied := *tag.Image ref.Tag, ref.ID = tag.Name, copied.Name copied.DockerImageReference = ref.MostSpecific().Exact() status.Images[i].Image = &copied } if failures > 0 { status.Status.Status = unversioned.StatusFailure status.Status.Reason = unversioned.StatusReason("ImportFailed") switch failures { case 1: status.Status.Message = "one of the images from this repository failed to import" default: status.Status.Message = fmt.Sprintf("%d of the images from this repository failed to import", failures) } } }