// Visit implements Visitor over a stream. StreamVisitor is able to distinct multiple resources in one stream. func (v *StreamVisitor) Visit(fn VisitorFunc) error { d := yaml.NewYAMLOrJSONDecoder(v.Reader, 4096) for { ext := runtime.RawExtension{} if err := d.Decode(&ext); err != nil { if err == io.EOF { return nil } return err } // TODO: This needs to be able to handle object in other encodings and schemas. ext.Raw = bytes.TrimSpace(ext.Raw) if len(ext.Raw) == 0 || bytes.Equal(ext.Raw, []byte("null")) { continue } if err := ValidateSchema(ext.Raw, v.Schema); err != nil { return fmt.Errorf("error validating %q: %v", v.Source, err) } info, err := v.InfoForData(ext.Raw, v.Source) if err != nil { if fnErr := fn(info, err); fnErr != nil { return fnErr } continue } if err := fn(info, nil); err != nil { return err } } }
// Convert_runtime_Object_To_runtime_RawExtension is conversion function that assumes that the runtime.Object you've embedded is in // the same GroupVersion that your containing type is in. This is signficantly better than simply breaking. // Given an ordered list of preferred external versions for a given encode or conversion call, the behavior of this function could be // made generic, predictable, and controllable. func convert_runtime_Object_To_runtime_RawExtension(in runtime.Object, out *runtime.RawExtension, s conversion.Scope) error { if in == nil { return nil } externalObject, err := internal.Scheme.ConvertToVersion(in, s.Meta().DestVersion) if runtime.IsNotRegisteredError(err) { switch cast := in.(type) { case *runtime.Unknown: out.Raw = cast.Raw return nil case *runtime.Unstructured: bytes, err := runtime.Encode(runtime.UnstructuredJSONScheme, externalObject) if err != nil { return err } out.Raw = bytes return nil } } if err != nil { return err } bytes, err := runtime.Encode(codec, externalObject) if err != nil { return err } out.Raw = bytes out.Object = externalObject return nil }
// Visit implements Visitor over a stream. StreamVisitor is able to distinct multiple resources in one stream. func (v *StreamVisitor) Visit(fn VisitorFunc) error { d := yaml.NewYAMLOrJSONDecoder(v.Reader, 4096) for { ext := runtime.RawExtension{} if err := d.Decode(&ext); err != nil { if err == io.EOF { return nil } return err } ext.RawJSON = bytes.TrimSpace(ext.RawJSON) if len(ext.RawJSON) == 0 || bytes.Equal(ext.RawJSON, []byte("null")) { continue } if err := ValidateSchema(ext.RawJSON, v.Schema); err != nil { return fmt.Errorf("error validating %q: %v", v.Source, err) } info, err := v.InfoForData(ext.RawJSON, v.Source) if err != nil { if v.IgnoreErrors { fmt.Fprintf(os.Stderr, "error: could not read an encoded object: %v\n", err) glog.V(4).Infof("Unreadable: %s", string(ext.RawJSON)) continue } return err } if err := fn(info); err != nil { return err } } }
// Visit implements Visitor over a stream. StreamVisitor is able to distinct multiple resources in one stream. func (v *StreamVisitor) Visit(fn VisitorFunc) error { d := yaml.NewYAMLOrJSONDecoder(v.Reader, 4096) for { ext := runtime.RawExtension{} if err := d.Decode(&ext); err != nil { if err == io.EOF { return nil } return err } ext.RawJSON = bytes.TrimSpace(ext.RawJSON) if len(ext.RawJSON) == 0 || bytes.Equal(ext.RawJSON, []byte("null")) { continue } if err := ValidateSchema(ext.RawJSON, v.Schema); err != nil { return fmt.Errorf("error validating %q: %v", v.Source, err) } info, err := v.InfoForData(ext.RawJSON, v.Source) if err != nil { if fnErr := fn(info, err); fnErr != nil { return fnErr } continue } if err := fn(info, nil); err != nil { return err } } }
// Convert_runtime_Object_To_runtime_RawExtension attempts to convert runtime.Objects to the appropriate target, returning an error // if there is insufficient information on the conversion scope to determine the target version. func Convert_runtime_Object_To_runtime_RawExtension(c runtime.ObjectConvertor, in *runtime.Object, out *runtime.RawExtension, s conversion.Scope) error { if *in == nil { return nil } obj := *in switch obj.(type) { case *runtime.Unknown, *runtime.Unstructured: out.Raw = nil out.Object = obj return nil } switch t := s.Meta().Context.(type) { case runtime.GroupVersioner: converted, err := c.ConvertToVersion(obj, t) if err != nil { return err } out.Raw = nil out.Object = converted default: return fmt.Errorf("unrecognized conversion context for versioning: %#v", t) } return nil }
// Convert_runtime_RawExtension_To_runtime_Object well, this is the reason why there was runtime.Embedded. The `out` here is hopeless. // The caller doesn't know the type ahead of time and that means this method can't communicate the return value. This sucks really badly. // I'm going to set the `in.Object` field can have callers to this function do magic to pull it back out. I'm also going to bitch about it. func Convert_runtime_RawExtension_To_runtime_Object(in *runtime.RawExtension, out runtime.Object, s conversion.Scope) error { if in == nil || len(in.Raw) == 0 || in.Object != nil { return nil } // the scheme knows all available group versions, so its possible to build the decoder properly, but it would require some refactoring srcVersion, err := unversioned.ParseGroupVersion(s.Meta().SrcVersion) if err != nil { return err } decodedObject, err := runtime.Decode(kapi.Codecs.UniversalDecoder(srcVersion), in.Raw) if err != nil { return err } internalObject, err := kapi.Scheme.ConvertToVersion(decodedObject, s.Meta().DestVersion) if err != nil { return err } in.Object = internalObject return nil }
// Convert_runtime_RawExtension_To_runtime_Object well, this is the reason why there was runtime.Embedded. The `out` here is hopeless. // The caller doesn't know the type ahead of time and that means this method can't communicate the return value. This sucks really badly. // I'm going to set the `in.Object` field can have callers to this function do magic to pull it back out. I'm also going to bitch about it. func convert_runtime_RawExtension_To_runtime_Object(in *runtime.RawExtension, out runtime.Object, s conversion.Scope) error { if in == nil || len(in.Raw) == 0 || in.Object != nil { return nil } decodedObject, err := runtime.Decode(codec, in.Raw) if err != nil { in.Object = &runtime.Unknown{Raw: in.Raw} return nil } internalObject, err := internal.Scheme.ConvertToVersion(decodedObject, s.Meta().DestVersion) if err != nil { return err } in.Object = internalObject return nil }
// EncodeNestedRawExtension will encode the object in the RawExtension (if not nil) or // return an error. func EncodeNestedRawExtension(e runtime.Encoder, ext *runtime.RawExtension) error { if ext.Raw != nil || ext.Object == nil { return nil } data, err := runtime.Encode(e, ext.Object) if err != nil { return err } ext.Raw = data return nil }
// Convert_runtime_Object_To_runtime_RawExtension is conversion function that assumes that the runtime.Object you've embedded is in // the same GroupVersion that your containing type is in. This is signficantly better than simply breaking. // Given an ordered list of preferred external versions for a given encode or conversion call, the behavior of this function could be // made generic, predictable, and controllable. func convert_runtime_Object_To_runtime_RawExtension(in runtime.Object, out *runtime.RawExtension, s conversion.Scope) error { if in == nil { return nil } externalObject, err := internal.Scheme.ConvertToVersion(in, s.Meta().DestVersion) if err != nil { return err } bytes, err := runtime.Encode(codec, externalObject) if err != nil { return err } out.RawJSON = bytes out.Object = externalObject return nil }
// Convert_runtime_Object_To_runtime_RawExtension is conversion function that assumes that the runtime.Object you've embedded is in // the same GroupVersion that your containing type is in. This is signficantly better than simply breaking. // Given an ordered list of preferred external versions for a given encode or conversion call, the behavior of this function could be // made generic, predictable, and controllable. func Convert_runtime_Object_To_runtime_RawExtension(in runtime.Object, out *runtime.RawExtension, s conversion.Scope) error { if in == nil { return nil } externalObject, err := kapi.Scheme.ConvertToVersion(in, s.Meta().DestVersion) if err != nil { return err } targetVersion, err := unversioned.ParseGroupVersion(s.Meta().DestVersion) if err != nil { return err } bytes, err := runtime.Encode(kapi.Codecs.LegacyCodec(targetVersion), externalObject) if err != nil { return err } out.Raw = bytes out.Object = externalObject return nil }
// DecodeNestedRawExtensionOrUnknown func DecodeNestedRawExtensionOrUnknown(d runtime.Decoder, ext *runtime.RawExtension) { if ext.Raw == nil || ext.Object != nil { return } obj, gvk, err := d.Decode(ext.Raw, nil, nil) if err != nil { unk := &runtime.Unknown{Raw: ext.Raw} if runtime.IsNotRegisteredError(err) { if _, gvk, err := d.Decode(ext.Raw, nil, unk); err == nil { unk.APIVersion = gvk.GroupVersion().String() unk.Kind = gvk.Kind ext.Object = unk return } } // TODO: record mime-type with the object if gvk != nil { unk.APIVersion = gvk.GroupVersion().String() unk.Kind = gvk.Kind } obj = unk } ext.Object = obj }
// Convert_runtime_RawExtension_To_runtime_Object attempts to convert an incoming object into the // appropriate output type. func Convert_runtime_RawExtension_To_runtime_Object(c runtime.ObjectConvertor, in *runtime.RawExtension, out *runtime.Object, s conversion.Scope) error { if in == nil || in.Object == nil { return nil } switch in.Object.(type) { case *runtime.Unknown, *runtime.Unstructured: *out = in.Object return nil } switch t := s.Meta().Context.(type) { case runtime.GroupVersioner: converted, err := c.ConvertToVersion(in.Object, t) if err != nil { return err } in.Object = converted *out = converted default: return fmt.Errorf("unrecognized conversion context for conversion to internal: %#v (%T)", t, t) } return nil }