Skip to content

Commit 7efffe9

Browse files
committed
image: Add ImageLayoutVersion and check oci-layout in tar engines
The new engine code isn't very DRY, but I haven't decided where to collect this sort of shared stuff yet. And it's not very long, so it's not too terrible to leave it WET. Signed-off-by: W. Trevor King <[email protected]>
1 parent e0810de commit 7efffe9

File tree

3 files changed

+86
-6
lines changed

3 files changed

+86
-6
lines changed

image/cas/layout/tar.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ package layout
1616

1717
import (
1818
"archive/tar"
19+
"encoding/json"
1920
"errors"
2021
"fmt"
2122
"io"
2223
"os"
2324
"strings"
2425

2526
"github.com/opencontainers/image-spec/image/cas"
27+
"github.com/opencontainers/image-spec/image/structure"
2628
)
2729

2830
// TarEngine is a cas.Engine backed by a tar file.
@@ -31,11 +33,40 @@ type TarEngine struct {
3133
}
3234

3335
// GetTarEngine returns a TarEngine.
34-
func GetTarEngine(file ReadSeekCloser) (engine cas.Engine, err error) {
35-
engine = &TarEngine{
36+
func GetTarEngine(file ReadSeekCloser) (eng cas.Engine, err error) {
37+
engine := &TarEngine{
3638
reader: file,
3739
}
38-
return engine, nil
40+
41+
_, err = engine.reader.Seek(0, os.SEEK_SET)
42+
if err != nil {
43+
return nil, err
44+
}
45+
46+
tarReader := tar.NewReader(engine.reader)
47+
for {
48+
header, err := tarReader.Next()
49+
if err == io.EOF {
50+
return nil, errors.New("oci-layout not found")
51+
}
52+
if err != nil {
53+
return nil, err
54+
}
55+
56+
if header.Name == "./oci-layout" {
57+
decoder := json.NewDecoder(tarReader)
58+
var version structure.ImageLayoutVersion
59+
err = decoder.Decode(&version)
60+
if err != nil {
61+
return nil, err
62+
}
63+
if version.Version != "1.0.0" {
64+
return nil, fmt.Errorf("unrecognized imageLayoutVersion: %q", version.Version)
65+
}
66+
67+
return engine, nil
68+
}
69+
}
3970
}
4071

4172
// Put adds a new blob to the store.

image/refs/layout/tar.go

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,40 @@ type TarEngine struct {
3434
}
3535

3636
// GetTarEngine returns a TarEngine.
37-
func GetTarEngine(file casLayout.ReadSeekCloser) (engine refs.Engine, err error) {
38-
engine = &TarEngine{
37+
func GetTarEngine(file casLayout.ReadSeekCloser) (eng refs.Engine, err error) {
38+
engine := &TarEngine{
3939
reader: file,
4040
}
4141

42-
return engine, nil
42+
_, err = engine.reader.Seek(0, os.SEEK_SET)
43+
if err != nil {
44+
return nil, err
45+
}
46+
47+
tarReader := tar.NewReader(engine.reader)
48+
for {
49+
header, err := tarReader.Next()
50+
if err == io.EOF {
51+
return nil, errors.New("oci-layout not found")
52+
}
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
if header.Name == "./oci-layout" {
58+
decoder := json.NewDecoder(tarReader)
59+
var version structure.ImageLayoutVersion
60+
err = decoder.Decode(&version)
61+
if err != nil {
62+
return nil, err
63+
}
64+
if version.Version != "1.0.0" {
65+
return nil, fmt.Errorf("unrecognized imageLayoutVersion: %q", version.Version)
66+
}
67+
68+
return engine, nil
69+
}
70+
}
4371
}
4472

4573
// Put adds a new reference to the store.

image/structure/image_layout.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2016 The Linux Foundation
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package structure
16+
17+
// ImageLayoutVersion represents the oci-version content for the image
18+
// layout format.
19+
type ImageLayoutVersion struct {
20+
Version string `json:"imageLayoutVersion"`
21+
}

0 commit comments

Comments
 (0)