func getSchemaAndValidate(c schemaClient, data []byte, prefix, groupVersion, cacheDir string) (err error) { var schemaData []byte fullDir, err := substituteUserHome(cacheDir) if err != nil { return err } cacheFile := path.Join(fullDir, prefix, groupVersion, schemaFileName) if len(cacheDir) != 0 { if schemaData, err = ioutil.ReadFile(cacheFile); err != nil && !os.IsNotExist(err) { return err } } if schemaData == nil { schemaData, err = c.Get(). AbsPath("/swaggerapi", prefix, groupVersion). Do(). Raw() if err != nil { return err } if len(cacheDir) != 0 { if err := writeSchemaFile(schemaData, fullDir, cacheFile, prefix, groupVersion); err != nil { return err } } } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } return schema.ValidateBytes(data) }
func loadSchemaForTest() (validation.Schema, error) { pathToSwaggerSpec := "../../../../api/swagger-spec/" + registered.GroupOrDie(api.GroupName).GroupVersion.Version + ".json" data, err := ioutil.ReadFile(pathToSwaggerSpec) if err != nil { return nil, err } return validation.NewSwaggerSchemaFromBytes(data, nil) }
func loadSchemaForTest() (validation.Schema, error) { pathToSwaggerSpec := "../../../../api/swagger-spec/" + testapi.Default.GroupVersion().Version + ".json" data, err := ioutil.ReadFile(pathToSwaggerSpec) if err != nil { return nil, err } return validation.NewSwaggerSchemaFromBytes(data) }
func getSchemaAndValidate(c schemaClient, data []byte, prefix, groupVersion, cacheDir string) (err error) { var schemaData []byte var firstSeen bool fullDir, err := substituteUserHome(cacheDir) if err != nil { return err } cacheFile := path.Join(fullDir, prefix, groupVersion, schemaFileName) if len(cacheDir) != 0 { if schemaData, err = ioutil.ReadFile(cacheFile); err != nil && !os.IsNotExist(err) { return err } } if schemaData == nil { firstSeen = true schemaData, err = downloadSchemaAndStore(c, cacheDir, fullDir, cacheFile, prefix, groupVersion) if err != nil { return err } } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } err = schema.ValidateBytes(data) if _, ok := err.(validation.TypeNotFoundError); ok && !firstSeen { // As a temporay hack, kubectl would re-get the schema if validation // fails for type not found reason. // TODO: runtime-config settings needs to make into the file's name schemaData, err = downloadSchemaAndStore(c, cacheDir, fullDir, cacheFile, prefix, groupVersion) if err != nil { return err } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } return schema.ValidateBytes(data) } return err }
func getSchemaAndValidate(c *client.RESTClient, data []byte, group, version string) error { schemaData, err := c.Get(). AbsPath("/swaggerapi", group, version). Do(). Raw() if err != nil { return err } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } return schema.ValidateBytes(data) }
func (c *clientSwaggerSchema) ValidateBytes(data []byte) error { version, _, err := runtime.UnstructuredJSONScheme.DataVersionAndKind(data) if err != nil { return err } if ok := registered.IsRegisteredAPIVersion(version); !ok { return fmt.Errorf("API version %q isn't supported, only supports API versions %q", version, registered.RegisteredVersions) } schemaData, err := c.c.RESTClient.Get(). AbsPath("/swaggerapi/api", version). Do(). Raw() if err != nil { return err } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } return schema.ValidateBytes(data) }
func getSchemaAndValidate(c schemaClient, data []byte, prefix, groupVersion, cacheDir string) (err error) { var schemaData []byte cacheFile := path.Join(cacheDir, prefix, groupVersion, schemaFileName) if len(cacheDir) != 0 { if schemaData, err = ioutil.ReadFile(cacheFile); err != nil && !os.IsNotExist(err) { return err } } if schemaData == nil { schemaData, err = c.Get(). AbsPath("/swaggerapi", prefix, groupVersion). Do(). Raw() if err != nil { return err } if len(cacheDir) != 0 { if err = os.MkdirAll(path.Join(cacheDir, prefix, groupVersion), 0755); err != nil { return err } tmpFile, err := ioutil.TempFile(cacheDir, "schema") if err != nil { return err } if _, err := io.Copy(tmpFile, bytes.NewBuffer(schemaData)); err != nil { return err } if err := os.Link(tmpFile.Name(), cacheFile); err != nil && !os.IsExist(err) { return err } } } schema, err := validation.NewSwaggerSchemaFromBytes(schemaData) if err != nil { return err } return schema.ValidateBytes(data) }
func TestPerform(t *testing.T) { tests := []struct { name string namespace string reader io.Reader count int swaggerFile string err bool errMessage string }{ { name: "Valid input", namespace: "test", reader: strings.NewReader(guestbookManifest), count: 6, }, { name: "Empty manifests", namespace: "test", reader: strings.NewReader(""), err: true, errMessage: "no objects visited", }, { name: "Invalid schema", namespace: "test", reader: strings.NewReader(testInvalidServiceManifest), swaggerFile: "../../vendor/k8s.io/kubernetes/api/swagger-spec/" + testapi.Default.GroupVersion().Version + ".json", err: true, errMessage: `error validating "": error validating data: expected type int, for field spec.ports[0].port, got string`, }, } for _, tt := range tests { results := []*resource.Info{} fn := func(info *resource.Info) error { results = append(results, info) if info.Namespace != tt.namespace { t.Errorf("%q. expected namespace to be '%s', got %s", tt.name, tt.namespace, info.Namespace) } return nil } f, tf, _, _ := cmdtesting.NewAPIFactory() c := &Client{Factory: f} if tt.swaggerFile != "" { data, err := ioutil.ReadFile(tt.swaggerFile) if err != nil { t.Fatalf("could not read swagger spec: %s", err) } validator, err := validation.NewSwaggerSchemaFromBytes(data, nil) if err != nil { t.Fatalf("could not load swagger spec: %s", err) } tf.Validator = validator } err := perform(c, tt.namespace, tt.reader, fn) if (err != nil) != tt.err { t.Errorf("%q. expected error: %v, got %v", tt.name, tt.err, err) } if err != nil && err.Error() != tt.errMessage { t.Errorf("%q. expected error message: %v, got %v", tt.name, tt.errMessage, err) } if len(results) != tt.count { t.Errorf("%q. expected %d result objects, got %d", tt.name, tt.count, len(results)) } } }