@@ -18,6 +18,7 @@ package layouts
18
18
19
19
import (
20
20
"encoding/json"
21
+ "errors"
21
22
"fmt"
22
23
"os"
23
24
"path"
@@ -75,8 +76,8 @@ func NewImageLayouts() *ImageLayouts {
75
76
}
76
77
}
77
78
78
- // Layouts returns a list of layout.Path's in it. Undefined path's are not included in the list.
79
- func (l * ImageLayouts ) Layouts () []layout.Path {
79
+ // AsList returns a list of layout.Path's in it. Undefined path's are not included in the list.
80
+ func (l * ImageLayouts ) AsList () []layout.Path {
80
81
layoutsValue := reflect .ValueOf (l ).Elem ()
81
82
layoutPathType := reflect .TypeOf (layout .Path ("" ))
82
83
@@ -284,7 +285,7 @@ func FindDeckhouseModulesImages(
284
285
maps .Copy (moduleImageLayouts .ReleaseImages , releaseImages )
285
286
286
287
if len (moduleImageLayouts .ModuleImages ) == 0 {
287
- return fmt .Errorf ("found no releases matching filter for %s" , module .Name )
288
+ return fmt .Errorf ("found no releases for %s" , module .Name )
288
289
}
289
290
290
291
layouts .Modules [module .Name ] = moduleImageLayouts
@@ -293,6 +294,8 @@ func FindDeckhouseModulesImages(
293
294
return nil
294
295
}
295
296
297
+ var ErrImageNotFound = errors .New ("image not found" )
298
+
296
299
func FindImageByTag (l layout.Path , tag string ) (v1.Image , error ) {
297
300
index , err := l .ImageIndex ()
298
301
if err != nil {
@@ -303,13 +306,62 @@ func FindImageByTag(l layout.Path, tag string) (v1.Image, error) {
303
306
return nil , err
304
307
}
305
308
306
- for _ , imageManifest := range indexManifest .Manifests {
307
- for key , value := range imageManifest .Annotations {
309
+ for _ , imageDescriptor := range indexManifest .Manifests {
310
+ for key , value := range imageDescriptor .Annotations {
311
+ if key == "org.opencontainers.image.ref.name" && strings .HasSuffix (value , ":" + tag ) {
312
+ return index .Image (imageDescriptor .Digest )
313
+ }
314
+ }
315
+ }
316
+
317
+ return nil , ErrImageNotFound
318
+ }
319
+
320
+ func FindImageDescriptorByTag (l layout.Path , tag string ) (v1.Descriptor , error ) {
321
+ index , err := l .ImageIndex ()
322
+ if err != nil {
323
+ return v1.Descriptor {}, err
324
+ }
325
+ indexManifest , err := index .IndexManifest ()
326
+ if err != nil {
327
+ return v1.Descriptor {}, err
328
+ }
329
+
330
+ for _ , imageDescriptor := range indexManifest .Manifests {
331
+ for key , value := range imageDescriptor .Annotations {
308
332
if key == "org.opencontainers.image.ref.name" && strings .HasSuffix (value , ":" + tag ) {
309
- return index .Image (imageManifest .Digest )
333
+ return imageDescriptor , nil
334
+ }
335
+ }
336
+ }
337
+
338
+ return v1.Descriptor {}, ErrImageNotFound
339
+ }
340
+
341
+ func TagImage (l layout.Path , imageDigest v1.Hash , tag string ) error {
342
+ index , err := l .ImageIndex ()
343
+ if err != nil {
344
+ return err
345
+ }
346
+ indexManifest , err := index .IndexManifest ()
347
+ if err != nil {
348
+ return err
349
+ }
350
+
351
+ for _ , imageDescriptor := range indexManifest .Manifests {
352
+ if imageDescriptor .Digest == imageDigest {
353
+ imageRepo , _ , found := strings .Cut (imageDescriptor .Annotations ["org.opencontainers.image.ref.name" ], ":" )
354
+ // If there is no ":" symbol in the image reference, then it must be a reference by digest and those are fine as is
355
+ if found {
356
+ imageDescriptor .Annotations ["org.opencontainers.image.ref.name" ] = imageRepo + ":" + tag
357
+ }
358
+ imageDescriptor .Annotations ["io.deckhouse.image.short_tag" ] = tag
359
+ if err = l .AppendDescriptor (imageDescriptor ); err != nil {
360
+ return fmt .Errorf ("append descriptor %s: %w" , tag , err )
310
361
}
362
+ return nil
311
363
}
312
364
}
313
365
314
- return nil , nil
366
+ return ErrImageNotFound
315
367
}
0 commit comments