Skip to content

Commit

Permalink
schema: add checkPlatform
Browse files Browse the repository at this point in the history
Signed-off-by: zhouhao <[email protected]>
  • Loading branch information
zhouhao committed Jan 19, 2017
1 parent de440db commit cb59dc4
Showing 1 changed file with 71 additions and 6 deletions.
77 changes: 71 additions & 6 deletions schema/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ import (
// and implements validation against a JSON schema.
type Validator string

type validateDescendantsFunc func(r io.Reader) error
type validateFunc func(r io.Reader) error

var mapValidateDescendants = map[Validator]validateDescendantsFunc{
MediaTypeManifest: validateManifestDescendants,
var mapValidate = map[Validator]validateFunc{
MediaTypeImageConfig: validateConfig,
MediaTypeManifest: validateManifest,
MediaTypeManifestList: validateManifestList,
}

// ValidationError contains all the errors that happened during validation.
Expand All @@ -52,9 +54,9 @@ func (v Validator) Validate(src io.Reader) error {
return errors.Wrap(err, "unable to read the document file")
}

if f, ok := mapValidateDescendants[v]; ok {
if f, ok := mapValidate[v]; ok {
if f == nil {
return fmt.Errorf("internal error: mapValidateDescendents[%q] is nil", v)
return fmt.Errorf("internal error: mapValidate[%q] is nil", v)
}
err = f(bytes.NewReader(buf))
if err != nil {
Expand Down Expand Up @@ -92,7 +94,7 @@ func (v unimplemented) Validate(src io.Reader) error {
return fmt.Errorf("%s: unimplemented", v)
}

func validateManifestDescendants(r io.Reader) error {
func validateManifest(r io.Reader) error {
header := v1.Manifest{}

buf, err := ioutil.ReadAll(r)
Expand All @@ -117,3 +119,66 @@ func validateManifestDescendants(r io.Reader) error {
}
return nil
}

func validateManifestList(r io.Reader) error {
header := v1.ManifestList{}

buf, err := ioutil.ReadAll(r)
if err != nil {
return errors.Wrapf(err, "error reading the io stream")
}

err = json.Unmarshal(buf, &header)
if err != nil {
return errors.Wrap(err, "manifestlist format mismatch")
}

for _, manifest := range header.Manifests {
checkPlatform(manifest.Platform.OS, manifest.Platform.Architecture)
}

return nil
}

func validateConfig(r io.Reader) error {
header := v1.Image{}

buf, err := ioutil.ReadAll(r)
if err != nil {
return errors.Wrapf(err, "error reading the io stream")
}

err = json.Unmarshal(buf, &header)
if err != nil {
return errors.Wrap(err, "config format mismatch")
}

checkPlatform(header.OS, header.Architecture)

return nil
}

func checkPlatform(OS string, Architecture string) {
validCombins := map[string][]string{
"android": {"arm"},
"darwin": {"386", "amd64", "arm", "arm64"},
"dragonfly": {"amd64"},
"freebsd": {"386", "amd64", "arm"},
"linux": {"386", "amd64", "arm", "arm64", "ppc64", "ppc64le", "mips64", "mips64le", "s390x"},
"netbsd": {"386", "amd64", "arm"},
"openbsd": {"386", "amd64", "arm"},
"plan9": {"386", "amd64"},
"solaris": {"amd64"},
"windows": {"386", "amd64"}}
for os, archs := range validCombins {
if os == OS {
for _, arch := range archs {
if arch == Architecture {
break
}
}
fmt.Printf("warning: combination of %q and %q is invalid.", OS, Architecture)
}
}
fmt.Printf("warning: operating system %q of the bundle is not supported yet.", OS)
}

0 comments on commit cb59dc4

Please sign in to comment.