@@ -31,8 +31,7 @@ import (
3131)
3232
3333const (
34- refTag = "latest"
35-
34+ refTag = "latest"
3635 layoutStr = `{"imageLayoutVersion": "1.0.0"}`
3736
3837 configStr = `{
@@ -91,8 +90,44 @@ const (
9190)
9291
9392var (
94- refStr = `{"digest":"<manifest_digest>","mediaType":"application/vnd.oci.image.manifest.v1+json","size":<manifest_size>}`
95-
93+ indexStr = `{
94+ "schemaVersion": 2,
95+ "manifests": [
96+ {
97+ "mediaType": "application/vnd.oci.image.index.v1+json",
98+ "size": <manifest_size>,
99+ "digest": "<manifest_digest>",
100+ "annotations": {
101+ "org.opencontainers.ref.name": "v1.0"
102+ }
103+ },
104+ {
105+ "mediaType": "application/vnd.oci.image.manifest.v1+json",
106+ "size": <manifest_size>,
107+ "digest": "<manifest_digest>",
108+ "platform": {
109+ "architecture": "ppc64le",
110+ "os": "linux"
111+ },
112+ "annotations": {
113+ "org.opencontainers.ref.name": "latest"
114+ }
115+ },
116+ {
117+ "mediaType": "application/xml",
118+ "size": <manifest_size>,
119+ "digest": "<manifest_digest>",
120+ "annotations": {
121+ "org.freedesktop.specifications.metainfo.version": "1.0",
122+ "org.freedesktop.specifications.metainfo.type": "AppStream"
123+ }
124+ }
125+ ],
126+ "annotations": {
127+ "com.example.index.revision": "r124356"
128+ }
129+ }
130+ `
96131 manifestStr = `{
97132 "annotations": null,
98133 "config": {
@@ -162,11 +197,6 @@ func createImageLayoutBundle(il imageLayout) error {
162197 return err
163198 }
164199
165- err = os .MkdirAll (filepath .Join (il .rootDir , "refs" ), 0700 )
166- if err != nil {
167- return err
168- }
169-
170200 // create image layout file
171201 err = createLayoutFile (il .rootDir )
172202 if err != nil {
@@ -178,14 +208,14 @@ func createImageLayoutBundle(il imageLayout) error {
178208 if err != nil {
179209 return err
180210 }
181- il .manifest = strings .Replace (il .manifest , "<layer_digest>" , desc .Digest , 1 )
211+ il .manifest = strings .Replace (il .manifest , "<layer_digest>" , string ( desc .Digest ) , 1 )
182212 il .manifest = strings .Replace (il .manifest , "<layer_size>" , strconv .FormatInt (desc .Size , 10 ), 1 )
183213
184214 desc , err = createConfigFile (il .rootDir , il .config )
185215 if err != nil {
186216 return err
187217 }
188- il .manifest = strings .Replace (il .manifest , "<config_digest>" , desc .Digest , 1 )
218+ il .manifest = strings .Replace (il .manifest , "<config_digest>" , string ( desc .Digest ) , 1 )
189219 il .manifest = strings .Replace (il .manifest , "<config_size>" , strconv .FormatInt (desc .Size , 10 ), 1 )
190220
191221 // create manifest blob file
@@ -194,7 +224,7 @@ func createImageLayoutBundle(il imageLayout) error {
194224 return err
195225 }
196226
197- return createRefFile (il .rootDir , il . ref , desc )
227+ return createIndexFile (il .rootDir , desc )
198228}
199229
200230func createLayoutFile (root string ) error {
@@ -208,61 +238,61 @@ func createLayoutFile(root string) error {
208238 return err
209239}
210240
211- func createRefFile (root , ref string , mft descriptor ) error {
212- refpath := filepath .Join (root , "refs" , ref )
213- f , err := os .Create (refpath )
241+ func createIndexFile (root string , mft v1. Descriptor ) error {
242+ indexpath := filepath .Join (root , "index.json" )
243+ f , err := os .Create (indexpath )
214244 if err != nil {
215245 return err
216246 }
217247 defer f .Close ()
218- refStr = strings .Replace (refStr , "<manifest_digest>" , mft .Digest , - 1 )
219- refStr = strings .Replace (refStr , "<manifest_size>" , strconv .FormatInt (mft .Size , 10 ), - 1 )
220- _ , err = io .Copy (f , bytes .NewBuffer ([]byte (refStr )))
248+ indexStr = strings .Replace (indexStr , "<manifest_digest>" , string ( mft .Digest ) , - 1 )
249+ indexStr = strings .Replace (indexStr , "<manifest_size>" , strconv .FormatInt (mft .Size , 10 ), - 1 )
250+ _ , err = io .Copy (f , bytes .NewBuffer ([]byte (indexStr )))
221251 return err
222252}
223253
224- func createManifestFile (root , str string ) (descriptor , error ) {
254+ func createManifestFile (root , str string ) (v1. Descriptor , error ) {
225255 name := filepath .Join (root , "blobs" , "sha256" , "test-manifest" )
226256 f , err := os .Create (name )
227257 if err != nil {
228- return descriptor {}, err
258+ return v1. Descriptor {}, err
229259 }
230260 defer f .Close ()
231261
232262 _ , err = io .Copy (f , bytes .NewBuffer ([]byte (str )))
233263 if err != nil {
234- return descriptor {}, err
264+ return v1. Descriptor {}, err
235265 }
236266
237267 return createHashedBlob (name )
238268}
239269
240- func createConfigFile (root , config string ) (descriptor , error ) {
270+ func createConfigFile (root , config string ) (v1. Descriptor , error ) {
241271 name := filepath .Join (root , "blobs" , "sha256" , "test-config" )
242272 f , err := os .Create (name )
243273 if err != nil {
244- return descriptor {}, err
274+ return v1. Descriptor {}, err
245275 }
246276 defer f .Close ()
247277
248278 _ , err = io .Copy (f , bytes .NewBuffer ([]byte (config )))
249279 if err != nil {
250- return descriptor {}, err
280+ return v1. Descriptor {}, err
251281 }
252282
253283 return createHashedBlob (name )
254284}
255285
256- func createImageLayerFile (root string , list []tarContent ) (descriptor , error ) {
286+ func createImageLayerFile (root string , list []tarContent ) (v1. Descriptor , error ) {
257287 name := filepath .Join (root , "blobs" , "sha256" , "test-layer" )
258288 err := createTarBlob (name , list )
259289 if err != nil {
260- return descriptor {}, err
290+ return v1. Descriptor {}, err
261291 }
262292
263293 desc , err := createHashedBlob (name )
264294 if err != nil {
265- return descriptor {}, err
295+ return v1. Descriptor {}, err
266296 }
267297
268298 desc .MediaType = v1 .MediaTypeImageLayer
@@ -291,41 +321,40 @@ func createTarBlob(name string, list []tarContent) error {
291321 return nil
292322}
293323
294- func createHashedBlob (name string ) (descriptor , error ) {
324+ func createHashedBlob (name string ) (v1. Descriptor , error ) {
295325 desc , err := newDescriptor (name )
296326 if err != nil {
297- return descriptor {}, err
327+ return v1. Descriptor {}, err
298328 }
299329
300- parsed , err := digest .Parse (desc .Digest )
301- if err != nil {
302- return descriptor {}, err
330+ if err := desc .Digest .Validate (); err != nil {
331+ return v1.Descriptor {}, err
303332 }
304333
305334 // Rename the file to hashed-digest name.
306- err = os .Rename (name , filepath .Join (filepath .Dir (name ), parsed .Hex ()))
335+ err = os .Rename (name , filepath .Join (filepath .Dir (name ), desc . Digest .Hex ()))
307336 if err != nil {
308- return descriptor {}, err
337+ return v1. Descriptor {}, err
309338 }
310339
311340 return desc , nil
312341}
313342
314- func newDescriptor (name string ) (descriptor , error ) {
343+ func newDescriptor (name string ) (v1. Descriptor , error ) {
315344 file , err := os .Open (name )
316345 if err != nil {
317- return descriptor {}, err
346+ return v1. Descriptor {}, err
318347 }
319348 defer file .Close ()
320349
321350 digester := digest .SHA256 .Digester ()
322351 size , err := io .Copy (digester .Hash (), file )
323352 if err != nil {
324- return descriptor {}, err
353+ return v1. Descriptor {}, err
325354 }
326355
327- return descriptor {
328- Digest : digester .Digest (). String () ,
356+ return v1. Descriptor {
357+ Digest : digester .Digest (),
329358 Size : size ,
330359 }, nil
331360}
0 commit comments