...
1
2
3 package mutate
4
5 import (
6 "fmt"
7
8 v1 "github.com/google/go-containerregistry/pkg/v1"
9 "github.com/google/go-containerregistry/pkg/v1/mutate"
10
11 wh "edge-infra.dev/pkg/f8n/warehouse"
12 "edge-infra.dev/pkg/f8n/warehouse/oci"
13 )
14
15
16
17
18
19
20
21
22
23
24
25
26
27 func AppendManifests(idx v1.ImageIndex, artifacts ...oci.Artifact) (v1.ImageIndex, error) {
28 if len(artifacts) == 0 {
29 return nil, fmt.Errorf("mutate.AppendManifests: at least one artifact is required")
30 }
31 adds, err := artifactsToAddendums(artifacts)
32 if err != nil {
33 return nil, fmt.Errorf("mutate.AppendManifests: %w", err)
34 }
35
36 return mutate.AppendManifests(idx, adds...), nil
37 }
38
39
40
41 func artifactsToAddendums(aa []oci.Artifact) ([]mutate.IndexAddendum, error) {
42 var adds []mutate.IndexAddendum
43 for _, a := range aa {
44 add, err := artifactToAddendum(a)
45 if err != nil {
46 return nil, err
47 }
48 adds = append(adds, add)
49 }
50 return adds, nil
51 }
52
53
54
55
56 func artifactToAddendum(a oci.Artifact) (mutate.IndexAddendum, error) {
57 desc := v1.Descriptor{}
58 switch a := a.(type) {
59
60
61 case oci.Unwrapper:
62 return artifactToAddendum(a.Unwrap())
63 case v1.Image:
64 manifest, err := a.Manifest()
65 if err != nil {
66 return mutate.IndexAddendum{}, fmt.Errorf("failed to parse image manifest: %w", err)
67 }
68 desc.Annotations = descAnnotations(manifest.Annotations)
69 case v1.ImageIndex:
70 manifest, err := a.IndexManifest()
71 if err != nil {
72 return mutate.IndexAddendum{}, fmt.Errorf("failed to parse image index manifest: %w", err)
73 }
74 desc.Annotations = descAnnotations(manifest.Annotations)
75 default:
76
77
78 return mutate.IndexAddendum{}, fmt.Errorf("%w", oci.ErrInvalidArtifact)
79 }
80
81 return mutate.IndexAddendum{Add: a, Descriptor: desc}, nil
82 }
83
84
85
86 func descAnnotations(annos map[string]string) map[string]string {
87 m := map[string]string{}
88 for k, v := range annos {
89 switch k {
90 case wh.AnnotationName:
91 m[wh.AnnotationRefName] = v
92 case wh.AnnotationClusterProviders:
93 m[wh.AnnotationClusterProviders] = v
94 case wh.AnnotationKind:
95 m[wh.AnnotationKind] = v
96 }
97 }
98 return m
99 }
100
View as plain text