diff --git a/main.go b/main.go index 282cffd..61982f9 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "github.com/xeipuuv/gojsonschema" "github.com/yannh/kubeconform/pkg/output" "io" "io/ioutil" @@ -40,7 +41,7 @@ func validateFile(f io.Reader, regs []registry.Registry, k8sVersion string, skip return []validationResult{{err: nil, skipped: true}} } - var schema []byte + var schema *gojsonschema.Schema for _, reg := range regs { downloadSchema := cache.WithCache(reg.DownloadSchema) schema, err = downloadSchema(sig.Kind, sig.Version, k8sVersion) @@ -70,8 +71,6 @@ func (i *arrayFiles) Set(value string) error { return nil } - - func realMain() int { var files, dirs, schemas arrayFiles var skipKinds, k8sVersion, outputFormat string @@ -98,14 +97,14 @@ func realMain() int { log.Fatalf("-output must be text or json") } + splitKinds := strings.Split(skipKinds, ",") + kinds := map[string]bool {} + for _, kind := range splitKinds { + kinds[kind] = true + } filter := func(signature resource.Signature) bool { - kinds := strings.Split(skipKinds, ",") - for _, kind := range kinds { - if signature.Kind == kind { - return true - } - } - return false + isSkipKind, ok := kinds[signature.Kind] + return ok && isSkipKind } registries := []registry.Registry{} diff --git a/pkg/cache/main.go b/pkg/cache/main.go index 9bb8cae..5416a50 100644 --- a/pkg/cache/main.go +++ b/pkg/cache/main.go @@ -2,18 +2,19 @@ package cache import ( "fmt" + "github.com/xeipuuv/gojsonschema" "sync" ) var mu sync.Mutex -var schemas map[string][]byte +var schemas map[string]*gojsonschema.Schema func init () { - schemas = map[string][]byte {} + schemas = map[string]*gojsonschema.Schema{} } -func WithCache(downloadSchema func(string, string, string) ([]byte, error)) (func (string, string, string) ([]byte, error)) { - return func(resourceKind, resourceAPIVersion, k8sVersion string) ([]byte, error) { +func WithCache(downloadSchema func(string, string, string) (*gojsonschema.Schema, error)) (func (string, string, string) (*gojsonschema.Schema, error)) { + return func(resourceKind, resourceAPIVersion, k8sVersion string) (*gojsonschema.Schema, error) { cacheKey := fmt.Sprintf("%s-%s-%s", resourceKind, resourceAPIVersion, k8sVersion) mu.Lock() cachedSchema, ok := schemas[cacheKey]; @@ -23,14 +24,11 @@ func WithCache(downloadSchema func(string, string, string) ([]byte, error)) (fun } schema, err := downloadSchema(resourceKind, resourceAPIVersion, k8sVersion) - if err != nil { - return schema, err - } mu.Lock() schemas[cacheKey] = schema mu.Unlock() - return schema, nil + return schema, err } } \ No newline at end of file diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index ad75a5f..85cefa0 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -1,9 +1,11 @@ package registry +import "github.com/xeipuuv/gojsonschema" + type Manifest struct { Kind, Version string } type Registry interface { - DownloadSchema(resourceKind, resourceAPIVersion, k8sVersion string) ([]byte, error) + DownloadSchema(resourceKind, resourceAPIVersion, k8sVersion string) (*gojsonschema.Schema, error) } diff --git a/pkg/validator/main.go b/pkg/validator/main.go index c506f8f..d998b47 100644 --- a/pkg/validator/main.go +++ b/pkg/validator/main.go @@ -26,15 +26,13 @@ func (f ValidFormat) IsFormat(input interface{}) bool { // gojsonschema.FormatCheckers.Add("int-or-string", ValidFormat{}) // } -func Validate(rawResource []byte, rawSchema []byte) error { - schemaLoader := gojsonschema.NewBytesLoader(rawSchema) - schema, err := gojsonschema.NewSchema(schemaLoader) - if err != nil { - return err +func Validate(rawResource []byte, schema *gojsonschema.Schema) error { + if schema == nil { + return nil } var resource map[string]interface{} - if err = yaml.Unmarshal(rawResource, &resource); err != nil { + if err := yaml.Unmarshal(rawResource, &resource); err != nil { return fmt.Errorf("error unmarshalling resource: %s", err) } resourceLoader := gojsonschema.NewGoLoader(resource)