Skip to content

Commit 2d16afd

Browse files
author
Zhou Hao
authored
Merge pull request opencontainers#144 from q384566678/up-validate
make the image-tool work with -rc5
2 parents 167397d + 017b697 commit 2d16afd

File tree

7 files changed

+121
-102
lines changed

7 files changed

+121
-102
lines changed

image/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ import (
3333

3434
type config v1.Image
3535

36-
func findConfig(w walker, d *descriptor) (*config, error) {
36+
func findConfig(w walker, d *v1.Descriptor) (*config, error) {
3737
var c config
38-
cpath := filepath.Join("blobs", d.algo(), d.hash())
38+
cpath := filepath.Join("blobs", string(d.Digest.Algorithm()), d.Digest.Hex())
3939

4040
switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
4141
if info.IsDir() || filepath.Clean(path) != cpath {

image/descriptor.go

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,47 +20,29 @@ import (
2020
"io"
2121
"os"
2222
"path/filepath"
23-
"strings"
2423

25-
"github.com/opencontainers/go-digest"
24+
"github.com/opencontainers/image-spec/specs-go/v1"
2625
"github.com/pkg/errors"
2726
)
2827

29-
type descriptor struct {
30-
MediaType string `json:"mediaType"`
31-
Digest string `json:"digest"`
32-
Size int64 `json:"size"`
33-
}
34-
35-
func (d *descriptor) algo() string {
36-
pts := strings.SplitN(d.Digest, ":", 2)
37-
if len(pts) != 2 {
38-
return ""
39-
}
40-
return pts[0]
41-
}
42-
43-
func (d *descriptor) hash() string {
44-
pts := strings.SplitN(d.Digest, ":", 2)
45-
if len(pts) != 2 {
46-
return ""
47-
}
48-
return pts[1]
49-
}
50-
51-
func listReferences(w walker) (map[string]*descriptor, error) {
52-
refs := make(map[string]*descriptor)
28+
func listReferences(w walker) (map[string]*v1.Descriptor, error) {
29+
refs := make(map[string]*v1.Descriptor)
30+
var index v1.ImageIndex
5331

5432
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
55-
if info.IsDir() || !strings.HasPrefix(path, "refs") {
33+
if info.IsDir() || filepath.Clean(path) != "index.json" {
5634
return nil
5735
}
5836

59-
var d descriptor
60-
if err := json.NewDecoder(r).Decode(&d); err != nil {
37+
if err := json.NewDecoder(r).Decode(&index); err != nil {
6138
return err
6239
}
63-
refs[info.Name()] = &d
40+
41+
for i := 0; i < len(index.Manifests); i++ {
42+
if index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"] != "" {
43+
refs[index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"]] = &index.Manifests[i].Descriptor
44+
}
45+
}
6446

6547
return nil
6648
}); err != nil {
@@ -69,31 +51,38 @@ func listReferences(w walker) (map[string]*descriptor, error) {
6951
return refs, nil
7052
}
7153

72-
func findDescriptor(w walker, name string) (*descriptor, error) {
73-
var d descriptor
74-
dpath := filepath.Join("refs", name)
54+
func findDescriptor(w walker, name string) (*v1.Descriptor, error) {
55+
var d v1.Descriptor
56+
var index v1.ImageIndex
7557

7658
switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
77-
if info.IsDir() || filepath.Clean(path) != dpath {
59+
if info.IsDir() || filepath.Clean(path) != "index.json" {
7860
return nil
7961
}
8062

81-
if err := json.NewDecoder(r).Decode(&d); err != nil {
63+
if err := json.NewDecoder(r).Decode(&index); err != nil {
8264
return err
8365
}
8466

85-
return errEOW
67+
for i := 0; i < len(index.Manifests); i++ {
68+
if index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"] == name {
69+
d = index.Manifests[i].Descriptor
70+
return errEOW
71+
}
72+
}
73+
74+
return nil
8675
}); err {
8776
case nil:
88-
return nil, fmt.Errorf("%s: descriptor not found", dpath)
77+
return nil, fmt.Errorf("index.json: descriptor not found")
8978
case errEOW:
9079
return &d, nil
9180
default:
9281
return nil, err
9382
}
9483
}
9584

96-
func (d *descriptor) validate(w walker, mts []string) error {
85+
func validateDescriptor(d *v1.Descriptor, w walker, mts []string) error {
9786
var found bool
9887
for _, mt := range mts {
9988
if d.MediaType == mt {
@@ -105,13 +94,12 @@ func (d *descriptor) validate(w walker, mts []string) error {
10594
return fmt.Errorf("invalid descriptor MediaType %q", d.MediaType)
10695
}
10796

108-
parsed, err := digest.Parse(d.Digest)
109-
if err != nil {
97+
if err := d.Digest.Validate(); err != nil {
11098
return err
11199
}
112100

113101
// Copy the contents of the layer in to the verifier
114-
verifier := parsed.Verifier()
102+
verifier := d.Digest.Verifier()
115103
numBytes, err := w.get(*d, verifier)
116104
if err != nil {
117105
return err

image/image.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func validate(w walker, refs []string, out *log.Logger) error {
8484
return fmt.Errorf("reference %s not found", ref)
8585
}
8686

87-
if err = d.validate(w, validRefMediaTypes); err != nil {
87+
if err = validateDescriptor(d, w, validRefMediaTypes); err != nil {
8888
return err
8989
}
9090

@@ -135,7 +135,7 @@ func unpack(w walker, dest, refName string) error {
135135
return err
136136
}
137137

138-
if err = ref.validate(w, validRefMediaTypes); err != nil {
138+
if err = validateDescriptor(ref, w, validRefMediaTypes); err != nil {
139139
return err
140140
}
141141

@@ -183,7 +183,7 @@ func createRuntimeBundle(w walker, dest, refName, rootfs string) error {
183183
return err
184184
}
185185

186-
if err = ref.validate(w, validRefMediaTypes); err != nil {
186+
if err = validateDescriptor(ref, w, validRefMediaTypes); err != nil {
187187
return err
188188
}
189189

image/image_test.go

Lines changed: 68 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ import (
3131
)
3232

3333
const (
34-
refTag = "latest"
35-
34+
refTag = "latest"
3635
layoutStr = `{"imageLayoutVersion": "1.0.0"}`
3736

3837
configStr = `{
@@ -91,8 +90,44 @@ const (
9190
)
9291

9392
var (
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

200230
func 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

Comments
 (0)