cache Schema unmarshalling, cache schema download failures (WIP)

This commit is contained in:
Yann Hamon 2020-05-30 21:40:54 +02:00
parent 87f1a0531e
commit 30a6fe69b1
4 changed files with 22 additions and 25 deletions

14
pkg/cache/main.go vendored
View file

@ -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
}
}

View file

@ -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)
}

View file

@ -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)