@@ -13,6 +13,7 @@ import (
1313 "github.com/google/go-containerregistry/pkg/v1/empty"
1414 "github.com/google/go-containerregistry/pkg/v1/mutate"
1515 "github.com/google/go-containerregistry/pkg/v1/remote"
16+ "github.com/google/go-containerregistry/pkg/v1/types"
1617)
1718
1819func 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
5556 return result , nil
5657}
5758
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 () {
6470 img , err := remote .Index (d , opts ... )
6571 if err != nil {
6672 return nil , err
6773 }
68- result = append (result , img )
74+ return & mutate.IndexAddendum {
75+ Add : img ,
76+ }, nil
6977 }
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
7195}
7296
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 ) {
7498 for _ , entry := range typed .Sorted (data ) {
75- d , err := name . NewDigest (entry .Value .Image )
99+ add , err := digestToIndexAddendum (entry .Value .Image , opts )
76100 if err != nil {
77101 return nil , err
78102 }
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 )
80111 if err != nil {
81112 return nil , err
82113 }
83- result = append (result , img )
114+ result = append (result , * add )
84115
85116 sidecarImages , err := images (entry .Value .Sidecars , opts )
86117 if err != nil {
@@ -108,7 +139,7 @@ func digestOnly(imageData v1.ImagesData) (result v1.ImagesData, err error) {
108139 return
109140}
110141
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 ) {
112143 remoteImages , err := containerImages (data .Containers , opts )
113144 if err != nil {
114145 return nil , err
@@ -130,6 +161,19 @@ func allImages(data v1.ImagesData, opts []remote.Option) (result []ggcrv1.ImageI
130161 return
131162}
132163
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+
133177func createAppManifest (ctx context.Context , c client.Client , ref string , data v1.ImagesData , fullDigest bool ) (string , error ) {
134178 d , err := name .NewDigest (ref )
135179 if err != nil {
@@ -146,20 +190,24 @@ func createAppManifest(ctx context.Context, c client.Client, ref string, data v1
146190 return "" , err
147191 }
148192
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 {
150199 Add : appImage ,
200+ Descriptor : ggcrv1.Descriptor {
201+ Platform : platform ,
202+ },
151203 })
152204
153205 images , err := allImages (data , opts )
154206 if err != nil {
155207 return "" , err
156208 }
157209
158- for _ , image := range images {
159- index = mutate .AppendManifests (index , mutate.IndexAddendum {
160- Add : image ,
161- })
162- }
210+ index = mutate .AppendManifests (index , images ... )
163211
164212 h , err := index .Digest ()
165213 if err != nil {
0 commit comments