Skip to content

Commit 6ff2eb1

Browse files
author
zhouhao
committed
make the image-tool work with -rc5
Signed-off-by: zhouhao <[email protected]>
1 parent 38db2e4 commit 6ff2eb1

File tree

3 files changed

+78
-39
lines changed

3 files changed

+78
-39
lines changed

image/descriptor.go

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,22 @@ import (
2323
"strings"
2424

2525
"github.com/opencontainers/go-digest"
26+
"github.com/opencontainers/image-spec/specs-go/v1"
2627
"github.com/pkg/errors"
2728
)
2829

29-
type descriptor struct {
30-
MediaType string `json:"mediaType"`
31-
Digest string `json:"digest"`
32-
Size int64 `json:"size"`
33-
}
30+
type descriptor v1.Descriptor
3431

3532
func (d *descriptor) algo() string {
36-
pts := strings.SplitN(d.Digest, ":", 2)
33+
pts := strings.SplitN(string(d.Digest), ":", 2)
3734
if len(pts) != 2 {
3835
return ""
3936
}
4037
return pts[0]
4138
}
4239

4340
func (d *descriptor) hash() string {
44-
pts := strings.SplitN(d.Digest, ":", 2)
41+
pts := strings.SplitN(string(d.Digest), ":", 2)
4542
if len(pts) != 2 {
4643
return ""
4744
}
@@ -50,17 +47,22 @@ func (d *descriptor) hash() string {
5047

5148
func listReferences(w walker) (map[string]*descriptor, error) {
5249
refs := make(map[string]*descriptor)
50+
var index v1.ImageIndex
5351

5452
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
55-
if info.IsDir() || !strings.HasPrefix(path, "refs") {
53+
if info.IsDir() || filepath.Clean(path) != "index.json" {
5654
return nil
5755
}
5856

59-
var d descriptor
60-
if err := json.NewDecoder(r).Decode(&d); err != nil {
57+
if err := json.NewDecoder(r).Decode(&index); err != nil {
6158
return err
6259
}
63-
refs[info.Name()] = &d
60+
61+
for i := 0; i < len(index.Manifests); i++ {
62+
if index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"] != "" {
63+
refs[index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"]] = (*descriptor)(&index.Manifests[i].Descriptor)
64+
}
65+
}
6466

6567
return nil
6668
}); err != nil {
@@ -71,21 +73,28 @@ func listReferences(w walker) (map[string]*descriptor, error) {
7173

7274
func findDescriptor(w walker, name string) (*descriptor, error) {
7375
var d descriptor
74-
dpath := filepath.Join("refs", name)
76+
var index v1.ImageIndex
7577

7678
switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
77-
if info.IsDir() || filepath.Clean(path) != dpath {
79+
if info.IsDir() || filepath.Clean(path) != "index.json" {
7880
return nil
7981
}
8082

81-
if err := json.NewDecoder(r).Decode(&d); err != nil {
83+
if err := json.NewDecoder(r).Decode(&index); err != nil {
8284
return err
8385
}
8486

85-
return errEOW
87+
for i := 0; i < len(index.Manifests); i++ {
88+
if index.Manifests[i].Descriptor.Annotations["org.opencontainers.ref.name"] == name {
89+
d = (descriptor)(index.Manifests[i].Descriptor)
90+
return errEOW
91+
}
92+
}
93+
94+
return nil
8695
}); err {
8796
case nil:
88-
return nil, fmt.Errorf("%s: descriptor not found", dpath)
97+
return nil, fmt.Errorf("index.json: descriptor not found")
8998
case errEOW:
9099
return &d, nil
91100
default:
@@ -105,7 +114,7 @@ func (d *descriptor) validate(w walker, mts []string) error {
105114
return fmt.Errorf("invalid descriptor MediaType %q", d.MediaType)
106115
}
107116

108-
parsed, err := digest.Parse(d.Digest)
117+
parsed, err := digest.Parse(string(d.Digest))
109118
if err != nil {
110119
return err
111120
}

image/image_test.go

Lines changed: 50 additions & 20 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,16 +238,16 @@ 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 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

@@ -297,7 +327,7 @@ func createHashedBlob(name string) (descriptor, error) {
297327
return descriptor{}, err
298328
}
299329

300-
parsed, err := digest.Parse(desc.Digest)
330+
parsed, err := digest.Parse(string(desc.Digest))
301331
if err != nil {
302332
return descriptor{}, err
303333
}
@@ -325,7 +355,7 @@ func newDescriptor(name string) (descriptor, error) {
325355
}
326356

327357
return descriptor{
328-
Digest: digester.Digest().String(),
358+
Digest: digester.Digest(),
329359
Size: size,
330360
}, nil
331361
}

image/manifest_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func testUnpackLayer(t *testing.T, compression string, invalid bool) {
143143
testManifest := manifest{
144144
Layers: []descriptor{descriptor{
145145
MediaType: mediatype,
146-
Digest: digester.Digest().String(),
146+
Digest: digester.Digest(),
147147
}},
148148
}
149149
err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs"))
@@ -212,7 +212,7 @@ func TestUnpackLayerRemovePartialyUnpackedFile(t *testing.T) {
212212
testManifest := manifest{
213213
Layers: []descriptor{descriptor{
214214
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
215-
Digest: digester.Digest().String(),
215+
Digest: digester.Digest(),
216216
}},
217217
}
218218
err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs"))

0 commit comments

Comments
 (0)