-
Notifications
You must be signed in to change notification settings - Fork 61
/
described_image_index.go
87 lines (71 loc) · 2.38 KB
/
described_image_index.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0
package imagedesc
import (
"encoding/json"
"fmt"
regv1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/types"
)
type DescribedImageIndex struct {
desc ImageIndexDescriptor
images []regv1.Image
indexes []regv1.ImageIndex
}
var _ regv1.ImageIndex = DescribedImageIndex{}
func NewDescribedImageIndex(desc ImageIndexDescriptor,
images []regv1.Image, indexes []regv1.ImageIndex) DescribedImageIndex {
return DescribedImageIndex{desc, images, indexes}
}
func (i DescribedImageIndex) Ref() string { return i.desc.Refs[0] }
func (i DescribedImageIndex) MediaType() (types.MediaType, error) {
return types.MediaType(i.desc.MediaType), nil
}
func (i DescribedImageIndex) Tag() string {
return i.desc.Tag
}
func (i DescribedImageIndex) Digest() (regv1.Hash, error) { return regv1.NewHash(i.desc.Digest) }
func (i DescribedImageIndex) RawManifest() ([]byte, error) { return []byte(i.desc.Raw), nil }
func (i DescribedImageIndex) Size() (int64, error) { return int64(len(i.desc.Raw)), nil }
func (i DescribedImageIndex) IndexManifest() (*regv1.IndexManifest, error) {
var manifest *regv1.IndexManifest
err := json.Unmarshal([]byte(i.desc.Raw), &manifest)
if err != nil {
return nil, err
}
return manifest, nil
}
// Image retrieve the image that matches the provided digest
func (i DescribedImageIndex) Image(digest regv1.Hash) (regv1.Image, error) {
for _, img := range i.images {
imgDigest, err := img.Digest()
if err != nil {
return nil, err
}
if imgDigest.String() == digest.String() {
return img, nil
}
}
return nil, fmt.Errorf("Expected to find image '%s' by digest", digest)
}
// Images retrieve all images associated with the described image
func (i DescribedImageIndex) Images() []regv1.Image {
return i.images
}
// Indexes retrieve all indexes associated with the described image
func (i DescribedImageIndex) Indexes() []regv1.ImageIndex {
return i.indexes
}
// ImageIndex retrieve the index that matches the provided digest
func (i DescribedImageIndex) ImageIndex(digest regv1.Hash) (regv1.ImageIndex, error) {
for _, idx := range i.indexes {
idxDigest, err := idx.Digest()
if err != nil {
return nil, err
}
if idxDigest.String() == digest.String() {
return idx, nil
}
}
return nil, fmt.Errorf("Expected to find index '%s' by digest", digest)
}