Skip to content

Commit

Permalink
Allow image layers to use any custom media type (#1136)
Browse files Browse the repository at this point in the history
Workaround for #1133

Co-authored-by: Ryan Miller <rvmiller@google.com>
  • Loading branch information
rvmiller89 and Ryan Miller committed Oct 4, 2021
1 parent 2459de3 commit 9ae11fe
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 14 deletions.
20 changes: 9 additions & 11 deletions pkg/v1/layout/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,17 +93,10 @@ func (li *layoutImage) LayerByDigest(h v1.Hash) (partial.CompressedLayer, error)

for _, desc := range manifest.Layers {
if h == desc.Digest {
switch desc.MediaType {
case types.OCILayer, types.DockerLayer:
return &compressedBlob{
path: li.path,
desc: desc,
}, nil
default:
// TODO: We assume everything is a compressed blob, but that might not be true.
// TODO: Handle foreign layers.
return nil, fmt.Errorf("unexpected media type: %v for layer: %v", desc.MediaType, desc.Digest)
}
return &compressedBlob{
path: li.path,
desc: desc,
}, nil
}
}

Expand Down Expand Up @@ -131,6 +124,11 @@ func (b *compressedBlob) MediaType() (types.MediaType, error) {
return b.desc.MediaType, nil
}

// Descriptor implements partial.withDescriptor.
func (b *compressedBlob) Descriptor() (*v1.Descriptor, error) {
return &b.desc, nil
}

// See partial.Exists.
func (b *compressedBlob) Exists() (bool, error) {
_, err := os.Stat(b.path.blobPath(b.desc.Digest))
Expand Down
40 changes: 37 additions & 3 deletions pkg/v1/layout/image_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,15 @@ var (
Algorithm: "sha256",
Hex: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
}
bogusPath = filepath.Join("testdata", "does_not_exist")
testPath = filepath.Join("testdata", "test_index")
testPathOneImage = filepath.Join("testdata", "test_index_one_image")
customManifestDigest = v1.Hash{
Algorithm: "sha256",
Hex: "b544f71ecd82372bc9a3c0dbef378abfd2734fe437df81ff6e242a0d720d8e3e",
}
bogusPath = filepath.Join("testdata", "does_not_exist")
testPath = filepath.Join("testdata", "test_index")
testPathOneImage = filepath.Join("testdata", "test_index_one_image")
testPathMediaType = filepath.Join("testdata", "test_index_media_type")
customMediaType types.MediaType = "application/tar+gzip"
)

func TestImage(t *testing.T) {
Expand Down Expand Up @@ -145,3 +151,31 @@ func TestImageErrors(t *testing.T) {
t.Errorf("Image(%s, %s) = nil, expected err", bogusPath, bogusDigest)
}
}

func TestImageCustomMediaType(t *testing.T) {
lp, err := FromPath(testPathMediaType)
if err != nil {
t.Fatalf("FromPath() = %v", err)
}
img, err := lp.Image(customManifestDigest)
if err != nil {
t.Fatalf("Image() = %v", err)
}
mt, err := img.MediaType()
if err != nil {
t.Errorf("MediaType() = %v", err)
} else if got, want := mt, types.OCIManifestSchema1; got != want {
t.Errorf("MediaType(); want: %v got: %v", want, got)
}
layers, err := img.Layers()
if err != nil {
t.Fatalf("img.Layers() = %v", err)
}
mediaType, err := layers[0].MediaType()
if err != nil {
t.Fatalf("img.Layers() = %v", err)
}
if got, want := mediaType, customMediaType; got != want {
t.Fatalf("MediaType(); want: %q got: %q", want, got)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.cncf.helm.config.v1+json",
"digest": "sha256:ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356",
"size": 3
},
"layers": [
{
"mediaType": "application/tar+gzip",
"digest": "sha256:dc52c6e48a1d51a96047b059f16889bc889c4b4c28f3b36b3f93187f62fc0b2b",
"size": 167
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
Binary file not shown.
10 changes: 10 additions & 0 deletions pkg/v1/layout/testdata/test_index_media_type/index.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"schemaVersion": 2,
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"size": 391,
"digest": "sha256:b544f71ecd82372bc9a3c0dbef378abfd2734fe437df81ff6e242a0d720d8e3e"
}
]
}
3 changes: 3 additions & 0 deletions pkg/v1/layout/testdata/test_index_media_type/oci-layout
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"imageLayoutVersion": "1.0.0"
}

0 comments on commit 9ae11fe

Please sign in to comment.