@@ -13,6 +13,7 @@ import (
13
13
"github.com/google/go-containerregistry/pkg/v1/empty"
14
14
"github.com/google/go-containerregistry/pkg/v1/mutate"
15
15
"github.com/google/go-containerregistry/pkg/v1/remote"
16
+ "github.com/google/go-containerregistry/pkg/v1/types"
16
17
)
17
18
18
19
func digestOnlyImages (data map [string ]v1.ImageData ) (map [string ]v1.ImageData , error ) {
@@ -55,32 +56,62 @@ func digestOnlyContainers(data map[string]v1.ContainerData) (map[string]v1.Conta
55
56
return result , nil
56
57
}
57
58
58
- func images (data map [string ]v1.ImageData , opts []remote.Option ) (result []ggcrv1.ImageIndex , _ error ) {
59
- for _ , entry := range typed .Sorted (data ) {
60
- d , err := name .NewDigest (entry .Value .Image )
61
- if err != nil {
62
- return nil , err
63
- }
59
+ func digestToIndexAddendum (ref string , opts []remote.Option ) (* mutate.IndexAddendum , error ) {
60
+ d , err := name .NewDigest (ref )
61
+ if err != nil {
62
+ return nil , err
63
+ }
64
+ descriptor , err := remote .Head (d , opts ... )
65
+ if err != nil {
66
+ return nil , err
67
+ }
68
+
69
+ if descriptor .MediaType .IsIndex () {
64
70
img , err := remote .Index (d , opts ... )
65
71
if err != nil {
66
72
return nil , err
67
73
}
68
- result = append (result , img )
74
+ return & mutate.IndexAddendum {
75
+ Add : img ,
76
+ }, nil
69
77
}
70
- return
78
+
79
+ img , err := remote .Image (d , opts ... )
80
+ if err != nil {
81
+ return nil , err
82
+ }
83
+
84
+ platform , err := imagePlatform (img )
85
+ if err != nil {
86
+ return nil , err
87
+ }
88
+
89
+ return & mutate.IndexAddendum {
90
+ Add : img ,
91
+ Descriptor : ggcrv1.Descriptor {
92
+ Platform : platform ,
93
+ },
94
+ }, nil
71
95
}
72
96
73
- func containerImages (data map [string ]v1.ContainerData , opts []remote.Option ) (result []ggcrv1. ImageIndex , _ error ) {
97
+ func images (data map [string ]v1.ImageData , opts []remote.Option ) (result []mutate. IndexAddendum , _ error ) {
74
98
for _ , entry := range typed .Sorted (data ) {
75
- d , err := name . NewDigest (entry .Value .Image )
99
+ add , err := digestToIndexAddendum (entry .Value .Image , opts )
76
100
if err != nil {
77
101
return nil , err
78
102
}
79
- img , err := remote .Index (d , opts ... )
103
+ result = append (result , * add )
104
+ }
105
+ return
106
+ }
107
+
108
+ func containerImages (data map [string ]v1.ContainerData , opts []remote.Option ) (result []mutate.IndexAddendum , _ error ) {
109
+ for _ , entry := range typed .Sorted (data ) {
110
+ add , err := digestToIndexAddendum (entry .Value .Image , opts )
80
111
if err != nil {
81
112
return nil , err
82
113
}
83
- result = append (result , img )
114
+ result = append (result , * add )
84
115
85
116
sidecarImages , err := images (entry .Value .Sidecars , opts )
86
117
if err != nil {
@@ -108,7 +139,7 @@ func digestOnly(imageData v1.ImagesData) (result v1.ImagesData, err error) {
108
139
return
109
140
}
110
141
111
- func allImages (data v1.ImagesData , opts []remote.Option ) (result []ggcrv1. ImageIndex , _ error ) {
142
+ func allImages (data v1.ImagesData , opts []remote.Option ) (result []mutate. IndexAddendum , _ error ) {
112
143
remoteImages , err := containerImages (data .Containers , opts )
113
144
if err != nil {
114
145
return nil , err
@@ -130,6 +161,19 @@ func allImages(data v1.ImagesData, opts []remote.Option) (result []ggcrv1.ImageI
130
161
return
131
162
}
132
163
164
+ func imagePlatform (img ggcrv1.Image ) (* ggcrv1.Platform , error ) {
165
+ config , err := img .ConfigFile ()
166
+ if err != nil {
167
+ return nil , err
168
+ }
169
+ return & ggcrv1.Platform {
170
+ Architecture : config .Architecture ,
171
+ OS : config .OS ,
172
+ OSVersion : config .OSVersion ,
173
+ Variant : config .Variant ,
174
+ }, nil
175
+ }
176
+
133
177
func createAppManifest (ctx context.Context , c client.Client , ref string , data v1.ImagesData , fullDigest bool ) (string , error ) {
134
178
d , err := name .NewDigest (ref )
135
179
if err != nil {
@@ -146,20 +190,24 @@ func createAppManifest(ctx context.Context, c client.Client, ref string, data v1
146
190
return "" , err
147
191
}
148
192
149
- index := mutate .AppendManifests (empty .Index , mutate.IndexAddendum {
193
+ platform , err := imagePlatform (appImage )
194
+ if err != nil {
195
+ return "" , err
196
+ }
197
+
198
+ index := mutate .AppendManifests (mutate .IndexMediaType (empty .Index , types .DockerManifestList ), mutate.IndexAddendum {
150
199
Add : appImage ,
200
+ Descriptor : ggcrv1.Descriptor {
201
+ Platform : platform ,
202
+ },
151
203
})
152
204
153
205
images , err := allImages (data , opts )
154
206
if err != nil {
155
207
return "" , err
156
208
}
157
209
158
- for _ , image := range images {
159
- index = mutate .AppendManifests (index , mutate.IndexAddendum {
160
- Add : image ,
161
- })
162
- }
210
+ index = mutate .AppendManifests (index , images ... )
163
211
164
212
h , err := index .Digest ()
165
213
if err != nil {
0 commit comments