package release import ( "fmt" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/types" "edge-infra.dev/pkg/f8n/warehouse/oci" "edge-infra.dev/pkg/f8n/warehouse/pallet" ) func ImageIndex(a oci.Artifact) (EdgeRelease, error) { idx, isIdx := a.(v1.ImageIndex) if !isIdx { return EdgeRelease{}, fmt.Errorf("artifact could not be coerced into Image Index") } idxMan, err := idx.IndexManifest() if err != nil { return EdgeRelease{}, err } meta, err := metadataFromAnnotations(idxMan.Annotations) if err != nil { return EdgeRelease{}, err } pallets, err := palletsFromManifests(idx, idxMan.Manifests) if err != nil { return EdgeRelease{}, err } if len(pallets) == 0 { dig, _ := a.Digest() return EdgeRelease{}, fmt.Errorf("no pallets found for artifact %s", dig.Hex) } return New(meta, pallets), nil } func palletsFromManifests(idx v1.ImageIndex, descrs []v1.Descriptor) ([]pallet.Pallet, error) { pallets := []pallet.Pallet{} for _, descr := range descrs { switch descr.MediaType { case types.OCIImageIndex: palletIdx, err := idx.ImageIndex(descr.Digest) if err != nil { return nil, err } p, err := pallet.New(palletIdx) if err != nil { return nil, err } pallets = append(pallets, p) case types.OCIManifestSchema1: palletImg, err := idx.Image(descr.Digest) if err != nil { return nil, err } p, err := pallet.New(palletImg) if err != nil { return nil, err } pallets = append(pallets, p) default: return nil, fmt.Errorf("unknown MediaType from remote Artifact") } } return pallets, nil }