-
Notifications
You must be signed in to change notification settings - Fork 61
/
types.go
156 lines (131 loc) · 3.23 KB
/
types.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Copyright 2024 The Carvel Authors.
// SPDX-License-Identifier: Apache-2.0
package imagedesc
import (
"io"
regv1 "github.com/google/go-containerregistry/pkg/v1"
regv1types "github.com/google/go-containerregistry/pkg/v1/types"
)
type ImageOrIndex struct {
Image *ImageWithRef
Index *ImageIndexWithRef
Labels map[string]string
OrigRef string
}
type ImageWithRef interface {
regv1.Image
Ref() string
Tag() string
}
type ImageIndexWithRef interface {
regv1.ImageIndex
Ref() string
Tag() string
}
type LayerProvider interface {
FindLayer(ImageLayerDescriptor) (LayerContents, error)
}
type LayerContents interface {
Open() (io.ReadCloser, error)
}
type ImageOrImageIndexDescriptor struct {
ImageIndex *ImageIndexDescriptor
Image *ImageDescriptor
}
type ImageIndexDescriptor struct {
Refs []string
Images []ImageDescriptor
Indexes []ImageIndexDescriptor
MediaType string
Digest string
Raw string
Tag string
OrigRef string
Labels map[string]string
}
type ImageDescriptor struct {
Refs []string
Layers []ImageLayerDescriptor
Config ConfigDescriptor
Manifest ManifestDescriptor
Tag string
OrigRef string
Labels map[string]string
}
type ImageLayerDescriptor struct {
MediaType string
Digest string
DiffID string
Size int64
}
type ConfigDescriptor struct {
Digest string
Raw string
}
type ManifestDescriptor struct {
MediaType string
Digest string
Raw string
}
func (td ImageLayerDescriptor) IsDistributable() bool {
// Example layer representation for windows rootfs:
// "mediaType": "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip",
// "size": 1654613376,
// "digest": "sha256:31f9df80631e7b5d379647ee7701ff50e009bd2c03b30a67a0a8e7bba4a26f94",
// "urls": ["https://mcr.microsoft.com/v2/windows/servercore/blobs/sha256:31f9df80631e7b5d379647ee7701ff50e009bd2c03b30a67a0a8e7bba4a26f94"]
return regv1types.MediaType(td.MediaType).IsDistributable()
}
func (td ImageOrImageIndexDescriptor) SortKey() string {
switch {
case td.ImageIndex != nil:
return td.ImageIndex.SortKey()
case td.Image != nil:
return td.Image.SortKey()
default:
panic("ImageOrImageIndexDescriptor: expected imageIndex or image to be non-nil")
}
}
// OrigRef returns ImagesLock's image value
// of an Image or an ImageIndex
func (td ImageOrImageIndexDescriptor) OrigRef() string {
switch {
case td.Image != nil:
return (*td.Image).OrigRef
case td.ImageIndex != nil:
return (*td.ImageIndex).OrigRef
default:
panic("Unknown item")
}
}
func (td ImageIndexDescriptor) SortKey() string { return td.Digest }
func (td ImageDescriptor) SortKey() string { return td.Manifest.Digest + "/" + td.Config.Digest }
func (t ImageOrIndex) Digest() (regv1.Hash, error) {
switch {
case t.Image != nil:
return (*t.Image).Digest()
case t.Index != nil:
return (*t.Index).Digest()
default:
panic("Unknown item")
}
}
func (t ImageOrIndex) Ref() string {
switch {
case t.Image != nil:
return (*t.Image).Ref()
case t.Index != nil:
return (*t.Index).Ref()
default:
panic("Unknown item")
}
}
func (t ImageOrIndex) Tag() string {
switch {
case t.Image != nil:
return (*t.Image).Tag()
case t.Index != nil:
return (*t.Index).Tag()
default:
panic("Unknown item")
}
}