...
1 package release
2
3 import (
4 "fmt"
5
6 v1 "github.com/google/go-containerregistry/pkg/v1"
7 "github.com/google/go-containerregistry/pkg/v1/types"
8
9 "edge-infra.dev/pkg/f8n/warehouse/oci"
10 "edge-infra.dev/pkg/f8n/warehouse/pallet"
11 )
12
13 func ImageIndex(a oci.Artifact) (EdgeRelease, error) {
14 idx, isIdx := a.(v1.ImageIndex)
15 if !isIdx {
16 return EdgeRelease{}, fmt.Errorf("artifact could not be coerced into Image Index")
17 }
18
19 idxMan, err := idx.IndexManifest()
20 if err != nil {
21 return EdgeRelease{}, err
22 }
23
24 meta, err := metadataFromAnnotations(idxMan.Annotations)
25 if err != nil {
26 return EdgeRelease{}, err
27 }
28
29 pallets, err := palletsFromManifests(idx, idxMan.Manifests)
30 if err != nil {
31 return EdgeRelease{}, err
32 }
33 if len(pallets) == 0 {
34 dig, _ := a.Digest()
35 return EdgeRelease{}, fmt.Errorf("no pallets found for artifact %s", dig.Hex)
36 }
37 return New(meta, pallets), nil
38 }
39
40 func palletsFromManifests(idx v1.ImageIndex, descrs []v1.Descriptor) ([]pallet.Pallet, error) {
41 pallets := []pallet.Pallet{}
42
43 for _, descr := range descrs {
44 switch descr.MediaType {
45 case types.OCIImageIndex:
46 palletIdx, err := idx.ImageIndex(descr.Digest)
47 if err != nil {
48 return nil, err
49 }
50
51 p, err := pallet.New(palletIdx)
52 if err != nil {
53 return nil, err
54 }
55
56 pallets = append(pallets, p)
57 case types.OCIManifestSchema1:
58 palletImg, err := idx.Image(descr.Digest)
59 if err != nil {
60 return nil, err
61 }
62
63 p, err := pallet.New(palletImg)
64 if err != nil {
65 return nil, err
66 }
67
68 pallets = append(pallets, p)
69 default:
70 return nil, fmt.Errorf("unknown MediaType from remote Artifact")
71 }
72 }
73 return pallets, nil
74 }
75
View as plain text