Skip to content

Commit c2ed5aa

Browse files
authored
Merge pull request #279 from runcom/validate-all-refs
cmd/oci-image-tool: validate all refs by default
2 parents 2903142 + a480306 commit c2ed5aa

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

cmd/oci-image-tool/validate.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func newValidateCmd(stdout, stderr *log.Logger) *cobra.Command {
6363
)
6464

6565
cmd.Flags().StringSliceVar(
66-
&v.refs, "ref", []string{"v1.0"},
66+
&v.refs, "ref", nil,
6767
`A set of refs pointing to the manifests to be validated. Each reference must be present in the "refs" subdirectory of the image. Only applicable if type is image or imageLayout.`,
6868
)
6969

image/descriptor.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,27 @@ func (d *descriptor) hash() string {
4949
return pts[1]
5050
}
5151

52+
func listReferences(w walker) (map[string]*descriptor, error) {
53+
refs := make(map[string]*descriptor)
54+
55+
if err := w.walk(func(path string, info os.FileInfo, r io.Reader) error {
56+
if info.IsDir() || !strings.HasPrefix(path, "refs") {
57+
return nil
58+
}
59+
60+
var d descriptor
61+
if err := json.NewDecoder(r).Decode(&d); err != nil {
62+
return err
63+
}
64+
refs[info.Name()] = &d
65+
66+
return nil
67+
}); err != nil {
68+
return nil, err
69+
}
70+
return refs, nil
71+
}
72+
5273
func findDescriptor(w walker, name string) (*descriptor, error) {
5374
var d descriptor
5475
dpath := filepath.Join("refs", name)

image/image.go

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package image
1616

1717
import (
1818
"encoding/json"
19+
"fmt"
1920
"log"
2021
"os"
2122
"path/filepath"
@@ -33,7 +34,7 @@ func ValidateLayout(src string, refs []string, out *log.Logger) error {
3334

3435
// Validate walks through the given .tar file and
3536
// validates the manifest pointed to by the given refs
36-
// or returns an error if the validation failed.
37+
//iiii or returns an error if the validation failed.
3738
func Validate(tarFile string, refs []string, out *log.Logger) error {
3839
f, err := os.Open(tarFile)
3940
if err != nil {
@@ -50,17 +51,37 @@ var validRefMediaTypes = []string{
5051
}
5152

5253
func validate(w walker, refs []string, out *log.Logger) error {
53-
for _, r := range refs {
54-
ref, err := findDescriptor(w, r)
55-
if err != nil {
56-
return err
54+
ds, err := listReferences(w)
55+
if err != nil {
56+
return err
57+
}
58+
if len(refs) == 0 && len(ds) == 0 {
59+
// TODO(runcom): ugly, we'll need a better way and library
60+
// to express log levels.
61+
// see https://github.com/opencontainers/image-spec/issues/288
62+
out.Print("WARNING: no descriptors found")
63+
}
64+
65+
if len(refs) == 0 {
66+
for ref := range ds {
67+
refs = append(refs, ref)
68+
}
69+
}
70+
71+
for _, ref := range refs {
72+
d, ok := ds[ref]
73+
if !ok {
74+
// TODO(runcom):
75+
// soften this error to a warning if the user didn't ask for any specific reference
76+
// with --ref but she's just validating the whole image.
77+
return fmt.Errorf("reference %s not found", ref)
5778
}
5879

59-
if err = ref.validate(w, validRefMediaTypes); err != nil {
80+
if err = d.validate(w, validRefMediaTypes); err != nil {
6081
return err
6182
}
6283

63-
m, err := findManifest(w, ref)
84+
m, err := findManifest(w, d)
6485
if err != nil {
6586
return err
6687
}
@@ -69,7 +90,7 @@ func validate(w walker, refs []string, out *log.Logger) error {
6990
return err
7091
}
7192
if out != nil {
72-
out.Printf("reference %q: OK", r)
93+
out.Printf("reference %q: OK", ref)
7394
}
7495
}
7596
return nil

0 commit comments

Comments
 (0)