Skip to content

Commit 5c9400d

Browse files
committed
cmd/oci-image-tool: validate all refs by default
Signed-off-by: Antonio Murdaca <[email protected]>
1 parent 9a93cca commit 5c9400d

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-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: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,30 @@ func (d *descriptor) hash() string {
4949
return pts[1]
5050
}
5151

52+
func findDescriptors(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+
if len(refs) == 0 {
71+
return nil, errors.New("no descriptors found")
72+
}
73+
return refs, nil
74+
}
75+
5276
func findDescriptor(w walker, name string) (*descriptor, error) {
5377
var d descriptor
5478
dpath := filepath.Join("refs", name)

image/image.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,31 @@ var validRefMediaTypes = []string{
5050
}
5151

5252
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
53+
ds, err := findDescriptors(w)
54+
if err != nil {
55+
return err
56+
}
57+
// TODO(runcom): this is O(N) but it could be O(1) if refs have been
58+
// map[string]bool coming from the cli package.
59+
// However, I don't think refs could be large enough to impact performance.
60+
inRefs := func(ref string) bool {
61+
for _, r := range refs {
62+
if r == ref {
63+
return true
64+
}
5765
}
58-
59-
if err = ref.validate(w, validRefMediaTypes); err != nil {
66+
return false
67+
}
68+
hasRefs := len(refs) != 0
69+
for ref, d := range ds {
70+
if hasRefs && !inRefs(ref) {
71+
continue
72+
}
73+
if err = d.validate(w, validRefMediaTypes); err != nil {
6074
return err
6175
}
6276

63-
m, err := findManifest(w, ref)
77+
m, err := findManifest(w, d)
6478
if err != nil {
6579
return err
6680
}
@@ -69,7 +83,7 @@ func validate(w walker, refs []string, out *log.Logger) error {
6983
return err
7084
}
7185
if out != nil {
72-
out.Printf("reference %q: OK", r)
86+
out.Printf("reference %q: OK", ref)
7387
}
7488
}
7589
return nil

0 commit comments

Comments
 (0)