func tryDecodeSinglePod(data []byte, defaultFn defaultFunc) (parsed bool, pod *api.Pod, err error) { // JSON is valid YAML, so this should work for everything. json, err := utilyaml.ToJSON(data) if err != nil { return false, nil, err } obj, err := api.Scheme.Decode(json) if err != nil { return false, pod, err } // Check whether the object could be converted to single pod. if _, ok := obj.(*api.Pod); !ok { err = fmt.Errorf("invalid pod: %+v", obj) return false, pod, err } newPod := obj.(*api.Pod) // Apply default values and validate the pod. if err = defaultFn(newPod); err != nil { return true, pod, err } if errs := validation.ValidatePod(newPod); len(errs) > 0 { err = fmt.Errorf("invalid pod: %v", errs) return true, pod, err } return true, newPod, nil }
func (s *SwaggerSchema) ValidateBytes(data []byte) error { var obj interface{} out, err := yaml.ToJSON(data) if err != nil { return err } data = out if err := json.Unmarshal(data, &obj); err != nil { return err } fields, ok := obj.(map[string]interface{}) if !ok { return fmt.Errorf("error in unmarshaling data %s", string(data)) } apiVersion := fields["apiVersion"] if apiVersion == nil { return fmt.Errorf("apiVersion not set") } kind := fields["kind"] if kind == nil { return fmt.Errorf("kind not set") } allErrs := s.ValidateObject(obj, apiVersion.(string), "", apiVersion.(string)+"."+kind.(string)) if len(allErrs) == 1 { return allErrs[0] } return errors.NewAggregate(allErrs) }
func tryDecodePodList(data []byte, defaultFn defaultFunc) (parsed bool, pods api.PodList, err error) { json, err := utilyaml.ToJSON(data) if err != nil { return false, api.PodList{}, err } obj, err := api.Scheme.Decode(json) if err != nil { return false, pods, err } // Check whether the object could be converted to list of pods. if _, ok := obj.(*api.PodList); !ok { err = fmt.Errorf("invalid pods list: %+v", obj) return false, pods, err } newPods := obj.(*api.PodList) // Apply default values and validate pods. for i := range newPods.Items { newPod := &newPods.Items[i] if err = defaultFn(newPod); err != nil { return true, pods, err } if errs := validation.ValidatePod(newPod); len(errs) > 0 { err = fmt.Errorf("invalid pod: %v", errs) return true, pods, err } } return true, *newPods, err }
func walkJSONFiles(inDir string, fn func(name, path string, data []byte)) error { return filepath.Walk(inDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() && path != inDir { return filepath.SkipDir } file := filepath.Base(path) if ext := filepath.Ext(file); ext == ".json" || ext == ".yaml" { glog.Infof("Testing %s", path) data, err := ioutil.ReadFile(path) if err != nil { return err } name := strings.TrimSuffix(file, ext) if ext == ".yaml" { out, err := yaml.ToJSON(data) if err != nil { return fmt.Errorf("%s: %v", path, err) } data = out } fn(name, path, data) } return nil }) }
// Apply attempts to apply the changes described by Delta onto latest, // returning an error if the changes cannot be applied cleanly. // IsConflicting will be true if the changes overlap, otherwise a // generic error will be returned. func (d *Delta) Apply(latest []byte) ([]byte, error) { base, err := yaml.ToJSON(latest, false) if err != nil { return nil, err } changes, err := jsonpatch.CreateMergePatch(d.original, base) if err != nil { return nil, err } diff1 := make(map[string]interface{}) if err := json.Unmarshal(d.edit, &diff1); err != nil { return nil, err } diff2 := make(map[string]interface{}) if err := json.Unmarshal(changes, &diff2); err != nil { return nil, err } for _, fn := range d.preconditions { if !fn(diff1) || !fn(diff2) { return nil, ErrPreconditionFailed } } glog.V(6).Infof("Testing for conflict between:\n%s\n%s", string(d.edit), string(changes)) if hasConflicts(diff1, diff2) { return nil, ErrConflict } return jsonpatch.MergePatch(base, d.edit) }
// InfoForData creates an Info object for the given data. An error is returned // if any of the decoding or client lookup steps fail. Name and namespace will be // set into Info if the mapping's MetadataAccessor can retrieve them. func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { json, err := yaml.ToJSON(data) if err != nil { return nil, fmt.Errorf("unable to parse %q: %v", source, err) } data = json version, kind, err := m.DataVersionAndKind(data) if err != nil { return nil, fmt.Errorf("unable to get type info from %q: %v", source, err) } mapping, err := m.RESTMapping(kind, version) if err != nil { return nil, fmt.Errorf("unable to recognize %q: %v", source, err) } obj, err := mapping.Codec.Decode(data) if err != nil { return nil, fmt.Errorf("unable to load %q: %v", source, err) } client, err := m.ClientForMapping(mapping) if err != nil { return nil, fmt.Errorf("unable to connect to a server to handle %q: %v", mapping.Resource, err) } name, _ := mapping.MetadataAccessor.Name(obj) namespace, _ := mapping.MetadataAccessor.Namespace(obj) resourceVersion, _ := mapping.MetadataAccessor.ResourceVersion(obj) return &Info{ Mapping: mapping, Client: client, Namespace: namespace, Name: name, Object: obj, ResourceVersion: resourceVersion, }, nil }
func (c yamlCodec) DecodeInto(data []byte, obj Object) error { out, err := yaml.ToJSON(data) if err != nil { return err } data = out return c.Codec.DecodeInto(data, obj) }
func (c yamlCodec) Decode(data []byte) (Object, error) { out, err := yaml.ToJSON(data) if err != nil { return nil, err } data = out return c.Codec.Decode(data) }
// NewDelta accepts two JSON or YAML documents and calculates the difference // between them. It returns a Delta object which can be used to resolve // conflicts against a third version with a common parent, or an error // if either document is in error. func NewDelta(from, to []byte) (*Delta, error) { d := &Delta{} before, err := yaml.ToJSON(from, false) if err != nil { return nil, err } after, err := yaml.ToJSON(to, false) if err != nil { return nil, err } diff, err := jsonpatch.CreateMergePatch(before, after) if err != nil { return nil, err } glog.V(6).Infof("Patch created from:\n%s\n%s\n%s", string(before), string(after), string(diff)) d.original = before d.edit = diff return d, nil }
func TestReadme(t *testing.T) { paths := []string{ "../README.md", "../examples/walkthrough/README.md", "../examples/iscsi/README.md", } for _, path := range paths { data, err := ioutil.ReadFile(path) if err != nil { t.Errorf("Unable to read file %s: %v", path, err) continue } matches := sampleRegexp.FindAllStringSubmatch(string(data), -1) if matches == nil { continue } for _, match := range matches { var content, subtype string for i, name := range sampleRegexp.SubexpNames() { if name == "type" { subtype = match[i] } if name == "content" && match[i] != "" { content = match[i] } } if subtype == "yaml" && subsetRegexp.FindString(content) != "" { t.Logf("skipping (%s): \n%s", subtype, content) continue } //t.Logf("testing (%s): \n%s", subtype, content) expectedType := &api.Pod{} json, err := yaml.ToJSON([]byte(content)) if err != nil { t.Errorf("%s could not be converted to JSON: %v\n%s", path, err, string(content)) } if err := latest.Codec.DecodeInto(json, expectedType); err != nil { t.Errorf("%s did not decode correctly: %v\n%s", path, err, string(content)) continue } if errors := validateObject(expectedType); len(errors) > 0 { t.Errorf("%s did not validate correctly: %v", path, errors) } _, err = latest.Codec.Encode(expectedType) if err != nil { t.Errorf("Could not encode object: %v", err) continue } } } }
func ReadYAMLFile(filename string, obj runtime.Object) error { data, err := ioutil.ReadFile(filename) if err != nil { return err } data, err = kyaml.ToJSON(data) if err != nil { return err } err = Codec.DecodeInto(data, obj) return captureSurroundingJSONForError(fmt.Sprintf("could not load config file %q due to a error: ", filename), data, err) }
func ValidateSchema(data []byte, schema validation.Schema) error { if schema == nil { return nil } data, err := yaml.ToJSON(data) if err != nil { return fmt.Errorf("error converting to YAML: %v", err) } if err := schema.ValidateBytes(data); err != nil { return fmt.Errorf("error validating data: %v", err) } return nil }
// InfoForData creates an Info object for the given data. An error is returned // if any of the decoding or client lookup steps fail. Name and namespace will be // set into Info if the mapping's MetadataAccessor can retrieve them. func (m *Mapper) InfoForData(data []byte, source string) (*Info, error) { json, err := yaml.ToJSON(data) if err != nil { return nil, fmt.Errorf("unable to parse %q: %v", source, err) } data = json version, kind, err := runtime.UnstructuredJSONScheme.DataVersionAndKind(data) if err != nil { return nil, fmt.Errorf("unable to get type info from %q: %v", source, err) } if ok := registered.IsRegisteredAPIVersion(version); !ok { return nil, fmt.Errorf("API version %q in %q isn't supported, only supports API versions %q", version, source, registered.RegisteredVersions) } if kind == "" { return nil, fmt.Errorf("kind not set in %q", source) } mapping, err := m.RESTMapping(kind, version) if err != nil { return nil, fmt.Errorf("unable to recognize %q: %v", source, err) } obj, err := mapping.Codec.Decode(data) if err != nil { return nil, fmt.Errorf("unable to load %q: %v", source, err) } client, err := m.ClientForMapping(mapping) if err != nil { return nil, fmt.Errorf("unable to connect to a server to handle %q: %v", mapping.Resource, err) } name, _ := mapping.MetadataAccessor.Name(obj) namespace, _ := mapping.MetadataAccessor.Namespace(obj) resourceVersion, _ := mapping.MetadataAccessor.ResourceVersion(obj) var versionedObject interface{} if vo, _, _, err := api.Scheme.Raw().DecodeToVersionedObject(data); err == nil { versionedObject = vo } return &Info{ Mapping: mapping, Client: client, Namespace: namespace, Name: name, Source: source, VersionedObject: versionedObject, Object: obj, ResourceVersion: resourceVersion, }, nil }
func (s *SwaggerSchema) ValidateBytes(data []byte) error { var obj interface{} out, err := yaml.ToJSON(data) if err != nil { return err } data = out if err := json.Unmarshal(data, &obj); err != nil { return err } fields, ok := obj.(map[string]interface{}) if !ok { return fmt.Errorf("error in unmarshaling data %s", string(data)) } apiVersion := fields["apiVersion"].(string) kind := fields["kind"].(string) return s.ValidateObject(obj, apiVersion, "", apiVersion+"."+kind) }
// AddObjectsFromPath loads the JSON or YAML file containing Kubernetes API resources // and adds them to the provided ObjectRetriever. func AddObjectsFromPath(path string, o ObjectRetriever) error { data, err := ioutil.ReadFile(path) if err != nil { return err } data, err = yaml.ToJSON(data) if err != nil { return err } obj, err := api.Codec.Decode(data) if err != nil { return err } if err := o.Add(obj); err != nil { return err } return nil }
func TestReadme(t *testing.T) { paths := []struct { file string expectedType []runtime.Object }{ {"../README.md", []runtime.Object{&api.Pod{}}}, {"../docs/user-guide/walkthrough/README.md", []runtime.Object{&api.Pod{}}}, {"../examples/iscsi/README.md", []runtime.Object{&api.Pod{}}}, {"../docs/user-guide/simple-yaml.md", []runtime.Object{&api.Pod{}, &api.ReplicationController{}}}, } for _, path := range paths { data, err := ioutil.ReadFile(path.file) if err != nil { t.Errorf("Unable to read file %s: %v", path, err) continue } matches := sampleRegexp.FindAllStringSubmatch(string(data), -1) if matches == nil { continue } ix := 0 for _, match := range matches { var content, subtype string for i, name := range sampleRegexp.SubexpNames() { if name == "type" { subtype = match[i] } if name == "content" && match[i] != "" { content = match[i] } } if subtype == "yaml" && subsetRegexp.FindString(content) != "" { t.Logf("skipping (%s): \n%s", subtype, content) continue } var expectedType runtime.Object if len(path.expectedType) == 1 { expectedType = path.expectedType[0] } else { expectedType = path.expectedType[ix] ix++ } json, err := yaml.ToJSON([]byte(content)) if err != nil { t.Errorf("%s could not be converted to JSON: %v\n%s", path, err, string(content)) } if err := latest.Codec.DecodeInto(json, expectedType); err != nil { t.Errorf("%s did not decode correctly: %v\n%s", path, err, string(content)) continue } if errors := validateObject(expectedType); len(errors) > 0 { t.Errorf("%s did not validate correctly: %v", path, errors) } _, err = latest.Codec.Encode(expectedType) if err != nil { t.Errorf("Could not encode object: %v", err) continue } } } }