@@ -668,14 +668,15 @@ func (imp *ImageStreamImporter) getManifest(
668668 return nil , nil , nil , utilerrors .NewAggregate (errs )
669669}
670670
671- func manifestFromManifestList (
671+ func selectManifestForPlatform (
672672 ctx context.Context ,
673- manifestList * manifestlist. DeserializedManifestList ,
673+ manifest distribution. Manifest ,
674674 ref reference.Named ,
675675 s distribution.ManifestService ,
676676 preferArch , preferOS string ,
677677) (distribution.Manifest , godigest.Digest , error ) {
678- if len (manifestList .Manifests ) == 0 {
678+ descriptors := manifest .References ()
679+ if len (descriptors ) == 0 {
679680 return nil , "" , fmt .Errorf ("no manifests in manifest list" )
680681 }
681682
@@ -687,7 +688,7 @@ func manifestFromManifestList(
687688 }
688689
689690 var manifestDigest godigest.Digest
690- for _ , manifestDescriptor := range manifestList . Manifests {
691+ for _ , manifestDescriptor := range descriptors {
691692 if manifestDescriptor .Platform .Architecture == preferArch && manifestDescriptor .Platform .OS == preferOS {
692693 manifestDigest = manifestDescriptor .Digest
693694 break
@@ -698,7 +699,7 @@ func manifestFromManifestList(
698699 // arch/os, prefer x86/linux before falling back to "first image in the manifestlist"
699700 // as a last resort.
700701 if manifestDigest == "" {
701- for _ , manifestDescriptor := range manifestList . Manifests {
702+ for _ , manifestDescriptor := range descriptors {
702703 if manifestDescriptor .Platform .Architecture == "amd64" && manifestDescriptor .Platform .OS == "linux" {
703704 manifestDigest = manifestDescriptor .Digest
704705 break
@@ -707,8 +708,11 @@ func manifestFromManifestList(
707708 }
708709
709710 if manifestDigest == "" {
710- klog .V (5 ).Infof ("unable to find %s/%s manifest in manifest list %s, doing conservative fail by switching to the first one: %#+v" , preferOS , preferArch , ref .String (), manifestList .Manifests [0 ])
711- manifestDigest = manifestList .Manifests [0 ].Digest
711+ klog .V (5 ).Infof (
712+ "unable to find %s/%s manifest in manifest list %s, doing conservative fail by switching to the first one: %#+v" ,
713+ preferOS , preferArch , ref .String (), descriptors [0 ],
714+ )
715+ manifestDigest = descriptors [0 ].Digest
712716 }
713717
714718 manifest , err := s .Get (ctx , manifestDigest )
@@ -730,33 +734,39 @@ func (imp *ImageStreamImporter) importManifest(
730734 preferArch , preferOS string ,
731735 importMode imageapi.ImportModeType ,
732736) (image * imageapi.Image , err error ) {
733- legacyManifestListImport := importMode == "" || importMode == imageapi .ImportModeLegacy
734- manifestList , isManifestList := manifest .(* manifestlist.DeserializedManifestList )
735- if isManifestList && legacyManifestListImport {
736- manifest , d , err = manifestFromManifestList (ctx , manifestList , ref , s , preferArch , preferOS )
737+
738+ // In case we are dealing with an image index or a manifest list, select the right image.
739+ _ , isIndex := manifest .(* ocischema.DeserializedImageIndex )
740+ _ , isList := manifest .(* manifestlist.DeserializedManifestList )
741+ if isIndex || isList {
742+ if importMode != "" && importMode != imageapi .ImportModeLegacy {
743+ return manifestToImage (manifest , d )
744+ }
745+
746+ manifest , d , err = selectManifestForPlatform (ctx , manifest , ref , s , preferArch , preferOS )
737747 if err != nil {
738748 return nil , formatRepositoryError (ref , err )
739749 }
740750 }
741751
742- if isManifestList && ! legacyManifestListImport {
743- image , err = manifestListToImage (manifestList , d )
744- return
745- } else if deserializedManifest , isSchema2 := manifest .(* schema2.DeserializedManifest ); isSchema2 {
746- imageConfig , getImportConfigErr := b .Get (ctx , deserializedManifest .Config .Digest )
752+ switch manifest := manifest .(type ) {
753+ case * schema2.DeserializedManifest :
754+ imageConfig , getImportConfigErr := b .Get (ctx , manifest .Config .Digest )
747755 if getImportConfigErr != nil {
748756 klog .V (5 ).Infof ("unable to get image config by digest %q for image %s: %#v" , d , ref .String (), getImportConfigErr )
749757 return image , formatRepositoryError (ref , getImportConfigErr )
750758 }
751- image , err = schema2OrOCIToImage (deserializedManifest , imageConfig , d )
752- } else if deserializedManifest , isOCISchema := manifest .(* ocischema.DeserializedManifest ); isOCISchema {
753- imageConfig , getImportConfigErr := b .Get (ctx , deserializedManifest .Config .Digest )
759+ image , err = schema2OrOCIToImage (manifest , imageConfig , d )
760+
761+ case * ocischema.DeserializedManifest :
762+ imageConfig , getImportConfigErr := b .Get (ctx , manifest .Config .Digest )
754763 if getImportConfigErr != nil {
755764 klog .V (5 ).Infof ("unable to get image config by digest %q for image %s: %#v" , d , ref .String (), getImportConfigErr )
756765 return image , formatRepositoryError (ref , getImportConfigErr )
757766 }
758767 image , err = schema2OrOCIToImage (manifest , imageConfig , d )
759- } else {
768+
769+ default :
760770 err = fmt .Errorf ("unsupported image manifest type: %T" , manifest )
761771 klog .V (5 ).Info (err )
762772 }
0 commit comments