mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Merge pull request #27192 from smarterclayton/signature_change
Automatic merge from submit-queue Remove EncodeToStream(..., []unversioned.GroupVersion) Was not being used. Is a signature change and is necessary for post 1.3 work on Templates and other objects that nest objects. Extracted from #26044
This commit is contained in:
commit
ba771e7135
@ -51,7 +51,7 @@ func TestUniversalDeserializer(t *testing.T) {
|
|||||||
t.Fatal(mediaType)
|
t.Fatal(mediaType)
|
||||||
}
|
}
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
if err := e.EncodeToStream(expected, buf); err != nil {
|
if err := e.Encode(expected, buf); err != nil {
|
||||||
t.Fatalf("%s: %v", mediaType, err)
|
t.Fatalf("%s: %v", mediaType, err)
|
||||||
}
|
}
|
||||||
obj, _, err := d.Decode(buf.Bytes(), &unversioned.GroupVersionKind{Kind: "Pod", Version: "v1"}, nil)
|
obj, _, err := d.Decode(buf.Bytes(), &unversioned.GroupVersionKind{Kind: "Pod", Version: "v1"}, nil)
|
||||||
|
@ -308,7 +308,7 @@ func TestObjectWatchFraming(t *testing.T) {
|
|||||||
|
|
||||||
// write a single object through the framer and back out
|
// write a single object through the framer and back out
|
||||||
obj := &bytes.Buffer{}
|
obj := &bytes.Buffer{}
|
||||||
if err := s.EncodeToStream(v1secret, obj); err != nil {
|
if err := s.Encode(v1secret, obj); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
out := &bytes.Buffer{}
|
out := &bytes.Buffer{}
|
||||||
@ -330,13 +330,13 @@ func TestObjectWatchFraming(t *testing.T) {
|
|||||||
|
|
||||||
// write a watch event through and back out
|
// write a watch event through and back out
|
||||||
obj = &bytes.Buffer{}
|
obj = &bytes.Buffer{}
|
||||||
if err := embedded.EncodeToStream(v1secret, obj); err != nil {
|
if err := embedded.Encode(v1secret, obj); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
event := &versioned.Event{Type: string(watch.Added)}
|
event := &versioned.Event{Type: string(watch.Added)}
|
||||||
event.Object.Raw = obj.Bytes()
|
event.Object.Raw = obj.Bytes()
|
||||||
obj = &bytes.Buffer{}
|
obj = &bytes.Buffer{}
|
||||||
if err := s.EncodeToStream(event, obj); err != nil {
|
if err := s.Encode(event, obj); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
out = &bytes.Buffer{}
|
out = &bytes.Buffer{}
|
||||||
|
@ -255,9 +255,9 @@ type stripVersionEncoder struct {
|
|||||||
serializer runtime.Serializer
|
serializer runtime.Serializer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c stripVersionEncoder) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (c stripVersionEncoder) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
buf := bytes.NewBuffer([]byte{})
|
buf := bytes.NewBuffer([]byte{})
|
||||||
err := c.encoder.EncodeToStream(obj, buf, overrides...)
|
err := c.encoder.Encode(obj, buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -268,7 +268,7 @@ func (c stripVersionEncoder) EncodeToStream(obj runtime.Object, w io.Writer, ove
|
|||||||
gvk.Group = ""
|
gvk.Group = ""
|
||||||
gvk.Version = ""
|
gvk.Version = ""
|
||||||
roundTrippedObj.GetObjectKind().SetGroupVersionKind(*gvk)
|
roundTrippedObj.GetObjectKind().SetGroupVersionKind(*gvk)
|
||||||
return c.serializer.EncodeToStream(roundTrippedObj, w)
|
return c.serializer.Encode(roundTrippedObj, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
// StripVersionNegotiatedSerializer will return stripVersionEncoder when
|
// StripVersionNegotiatedSerializer will return stripVersionEncoder when
|
||||||
@ -443,7 +443,7 @@ func writeNegotiated(s runtime.NegotiatedSerializer, gv unversioned.GroupVersion
|
|||||||
w.WriteHeader(statusCode)
|
w.WriteHeader(statusCode)
|
||||||
|
|
||||||
encoder := s.EncoderForVersion(serializer, gv)
|
encoder := s.EncoderForVersion(serializer, gv)
|
||||||
if err := encoder.EncodeToStream(object, w); err != nil {
|
if err := encoder.Encode(object, w); err != nil {
|
||||||
errorJSONFatal(err, encoder, w)
|
errorJSONFatal(err, encoder, w)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2372,7 +2372,7 @@ func TestCreateChecksDecode(t *testing.T) {
|
|||||||
client := http.Client{}
|
client := http.Client{}
|
||||||
|
|
||||||
simple := &api.Pod{}
|
simple := &api.Pod{}
|
||||||
data, err := runtime.Encode(codec, simple, testGroupVersion)
|
data, err := runtime.Encode(testCodec, simple)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -2598,7 +2598,7 @@ func TestUpdateChecksDecode(t *testing.T) {
|
|||||||
client := http.Client{}
|
client := http.Client{}
|
||||||
|
|
||||||
simple := &api.Pod{}
|
simple := &api.Pod{}
|
||||||
data, err := runtime.Encode(codec, simple, testGroupVersion)
|
data, err := runtime.Encode(testCodec, simple)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -3293,3 +3293,46 @@ func readBodyOrDie(r io.Reader) []byte {
|
|||||||
}
|
}
|
||||||
return body
|
return body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BenchmarkUpdateProtobuf measures the cost of processing an update on the server in proto
|
||||||
|
func BenchmarkUpdateProtobuf(b *testing.B) {
|
||||||
|
items := benchmarkItems()
|
||||||
|
|
||||||
|
simpleStorage := &SimpleRESTStorage{}
|
||||||
|
handler := handle(map[string]rest.Storage{"simples": simpleStorage})
|
||||||
|
server := httptest.NewServer(handler)
|
||||||
|
defer server.Close()
|
||||||
|
client := http.Client{}
|
||||||
|
|
||||||
|
dest, _ := url.Parse(server.URL)
|
||||||
|
dest.Path = "/" + prefix + "/" + newGroupVersion.Group + "/" + newGroupVersion.Version + "/namespaces/foo/simples/bar"
|
||||||
|
dest.RawQuery = ""
|
||||||
|
|
||||||
|
info, _ := api.Codecs.SerializerForMediaType("application/vnd.kubernetes.protobuf", nil)
|
||||||
|
e := api.Codecs.EncoderForVersion(info.Serializer, newGroupVersion)
|
||||||
|
data, err := runtime.Encode(e, &items[0])
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
b.ResetTimer()
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
request, err := http.NewRequest("PUT", dest.String(), bytes.NewReader(data))
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
request.Header.Set("Accept", "application/vnd.kubernetes.protobuf")
|
||||||
|
request.Header.Set("Content-Type", "application/vnd.kubernetes.protobuf")
|
||||||
|
response, err := client.Do(request)
|
||||||
|
if err != nil {
|
||||||
|
b.Fatalf("unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
if response.StatusCode != http.StatusBadRequest {
|
||||||
|
body, _ := ioutil.ReadAll(response.Body)
|
||||||
|
b.Fatalf("Unexpected response %#v\n%s", response, body)
|
||||||
|
}
|
||||||
|
_, _ = ioutil.ReadAll(response.Body)
|
||||||
|
response.Body.Close()
|
||||||
|
}
|
||||||
|
b.StopTimer()
|
||||||
|
}
|
||||||
|
@ -185,7 +185,7 @@ func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
|
|
||||||
obj := event.Object
|
obj := event.Object
|
||||||
s.fixup(obj)
|
s.fixup(obj)
|
||||||
if err := s.embeddedEncoder.EncodeToStream(obj, buf); err != nil {
|
if err := s.embeddedEncoder.Encode(obj, buf); err != nil {
|
||||||
// unexpected error
|
// unexpected error
|
||||||
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
|
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
|
||||||
return
|
return
|
||||||
@ -235,7 +235,7 @@ func (s *WatchServer) HandleWS(ws *websocket.Conn) {
|
|||||||
}
|
}
|
||||||
obj := event.Object
|
obj := event.Object
|
||||||
s.fixup(obj)
|
s.fixup(obj)
|
||||||
if err := s.embeddedEncoder.EncodeToStream(obj, buf); err != nil {
|
if err := s.embeddedEncoder.Encode(obj, buf); err != nil {
|
||||||
// unexpected error
|
// unexpected error
|
||||||
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
|
utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
|
||||||
return
|
return
|
||||||
@ -248,7 +248,7 @@ func (s *WatchServer) HandleWS(ws *websocket.Conn) {
|
|||||||
|
|
||||||
// the internal event will be versioned by the encoder
|
// the internal event will be versioned by the encoder
|
||||||
*internalEvent = versioned.InternalEvent(event)
|
*internalEvent = versioned.InternalEvent(event)
|
||||||
if err := s.encoder.EncodeToStream(internalEvent, streamBuf); err != nil {
|
if err := s.encoder.Encode(internalEvent, streamBuf); err != nil {
|
||||||
// encoding error
|
// encoding error
|
||||||
utilruntime.HandleError(fmt.Errorf("unable to encode event: %v", err))
|
utilruntime.HandleError(fmt.Errorf("unable to encode event: %v", err))
|
||||||
s.watching.Stop()
|
s.watching.Stop()
|
||||||
|
@ -253,8 +253,8 @@ func (dynamicCodec) Decode(data []byte, gvk *unversioned.GroupVersionKind, obj r
|
|||||||
return obj, gvk, nil
|
return obj, gvk, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dynamicCodec) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (dynamicCodec) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
return runtime.UnstructuredJSONScheme.EncodeToStream(obj, w, overrides...)
|
return runtime.UnstructuredJSONScheme.Encode(obj, w)
|
||||||
}
|
}
|
||||||
|
|
||||||
// paramaterCodec is a codec converts an API object to query
|
// paramaterCodec is a codec converts an API object to query
|
||||||
|
@ -235,7 +235,7 @@ func TestDelete(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
|
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
|
||||||
runtime.UnstructuredJSONScheme.EncodeToStream(statusOK, w)
|
runtime.UnstructuredJSONScheme.Encode(statusOK, w)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error when creating client: %v", err)
|
t.Errorf("unexpected error when creating client: %v", err)
|
||||||
@ -284,7 +284,7 @@ func TestDeleteCollection(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
|
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
|
||||||
runtime.UnstructuredJSONScheme.EncodeToStream(statusOK, w)
|
runtime.UnstructuredJSONScheme.Encode(statusOK, w)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error when creating client: %v", err)
|
t.Errorf("unexpected error when creating client: %v", err)
|
||||||
|
@ -483,10 +483,10 @@ func encodeToJSON(obj *extensions.ThirdPartyResourceData, stream io.Writer) erro
|
|||||||
return encoder.Encode(objMap)
|
return encoder.Encode(objMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *thirdPartyResourceDataEncoder) EncodeToStream(obj runtime.Object, stream io.Writer, overrides ...unversioned.GroupVersion) (err error) {
|
func (t *thirdPartyResourceDataEncoder) Encode(obj runtime.Object, stream io.Writer) (err error) {
|
||||||
switch obj := obj.(type) {
|
switch obj := obj.(type) {
|
||||||
case *versioned.InternalEvent:
|
case *versioned.InternalEvent:
|
||||||
return t.delegate.EncodeToStream(obj, stream, overrides...)
|
return t.delegate.Encode(obj, stream)
|
||||||
case *extensions.ThirdPartyResourceData:
|
case *extensions.ThirdPartyResourceData:
|
||||||
return encodeToJSON(obj, stream)
|
return encodeToJSON(obj, stream)
|
||||||
case *extensions.ThirdPartyResourceDataList:
|
case *extensions.ThirdPartyResourceDataList:
|
||||||
@ -504,7 +504,7 @@ func (t *thirdPartyResourceDataEncoder) EncodeToStream(obj runtime.Object, strea
|
|||||||
fmt.Fprintf(stream, template, t.gvk.Kind+"List", gv.String(), strings.Join(dataStrings, ","))
|
fmt.Fprintf(stream, template, t.gvk.Kind+"List", gv.String(), strings.Join(dataStrings, ","))
|
||||||
return nil
|
return nil
|
||||||
case *unversioned.Status, *unversioned.APIResourceList:
|
case *unversioned.Status, *unversioned.APIResourceList:
|
||||||
return t.delegate.EncodeToStream(obj, stream, overrides...)
|
return t.delegate.Encode(obj, stream)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unexpected object to encode: %#v", obj)
|
return fmt.Errorf("unexpected object to encode: %#v", obj)
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,10 @@ func NewCodec(e Encoder, d Decoder) Codec {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode is a convenience wrapper for encoding to a []byte from an Encoder
|
// Encode is a convenience wrapper for encoding to a []byte from an Encoder
|
||||||
func Encode(e Encoder, obj Object, overrides ...unversioned.GroupVersion) ([]byte, error) {
|
func Encode(e Encoder, obj Object) ([]byte, error) {
|
||||||
// TODO: reuse buffer
|
// TODO: reuse buffer
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
if err := e.EncodeToStream(obj, buf, overrides...); err != nil {
|
if err := e.Encode(obj, buf); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return buf.Bytes(), nil
|
return buf.Bytes(), nil
|
||||||
@ -98,7 +98,7 @@ type NoopEncoder struct {
|
|||||||
|
|
||||||
var _ Serializer = NoopEncoder{}
|
var _ Serializer = NoopEncoder{}
|
||||||
|
|
||||||
func (n NoopEncoder) EncodeToStream(obj Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (n NoopEncoder) Encode(obj Object, w io.Writer) error {
|
||||||
return fmt.Errorf("encoding is not allowed for this codec: %v", reflect.TypeOf(n.Decoder))
|
return fmt.Errorf("encoding is not allowed for this codec: %v", reflect.TypeOf(n.Decoder))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,9 +181,9 @@ func NewBase64Serializer(s Serializer) Serializer {
|
|||||||
return &base64Serializer{s}
|
return &base64Serializer{s}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s base64Serializer) EncodeToStream(obj Object, stream io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (s base64Serializer) Encode(obj Object, stream io.Writer) error {
|
||||||
e := base64.NewEncoder(base64.StdEncoding, stream)
|
e := base64.NewEncoder(base64.StdEncoding, stream)
|
||||||
err := s.Serializer.EncodeToStream(obj, e, overrides...)
|
err := s.Serializer.Encode(obj, e)
|
||||||
e.Close()
|
e.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -113,10 +113,10 @@ func FieldPtr(v reflect.Value, fieldName string, dest interface{}) error {
|
|||||||
|
|
||||||
// EncodeList ensures that each object in an array is converted to a Unknown{} in serialized form.
|
// EncodeList ensures that each object in an array is converted to a Unknown{} in serialized form.
|
||||||
// TODO: accept a content type.
|
// TODO: accept a content type.
|
||||||
func EncodeList(e Encoder, objects []Object, overrides ...unversioned.GroupVersion) error {
|
func EncodeList(e Encoder, objects []Object) error {
|
||||||
var errs []error
|
var errs []error
|
||||||
for i := range objects {
|
for i := range objects {
|
||||||
data, err := Encode(e, objects[i], overrides...)
|
data, err := Encode(e, objects[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
continue
|
continue
|
||||||
|
@ -31,10 +31,9 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Encoder interface {
|
type Encoder interface {
|
||||||
// EncodeToStream writes an object to a stream. Override versions may be provided for each group
|
// Encode writes an object to a stream. Implementations may return errors if the versions are
|
||||||
// that enforce a certain versioning. Implementations may return errors if the versions are incompatible,
|
// incompatible, or if no conversion is defined.
|
||||||
// or if no conversion is defined.
|
Encode(obj Object, w io.Writer) error
|
||||||
EncodeToStream(obj Object, stream io.Writer, overrides ...unversioned.GroupVersion) error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Decoder interface {
|
type Decoder interface {
|
||||||
|
@ -339,7 +339,7 @@ type DirectCodec struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToStream does not do conversion. It sets the gvk during serialization. overrides are ignored.
|
// EncodeToStream does not do conversion. It sets the gvk during serialization. overrides are ignored.
|
||||||
func (c DirectCodec) EncodeToStream(obj runtime.Object, stream io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (c DirectCodec) Encode(obj runtime.Object, stream io.Writer) error {
|
||||||
gvks, _, err := c.ObjectTyper.ObjectKinds(obj)
|
gvks, _, err := c.ObjectTyper.ObjectKinds(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -347,7 +347,7 @@ func (c DirectCodec) EncodeToStream(obj runtime.Object, stream io.Writer, overri
|
|||||||
kind := obj.GetObjectKind()
|
kind := obj.GetObjectKind()
|
||||||
oldGVK := kind.GroupVersionKind()
|
oldGVK := kind.GroupVersionKind()
|
||||||
kind.SetGroupVersionKind(gvks[0])
|
kind.SetGroupVersionKind(gvks[0])
|
||||||
err = c.Serializer.EncodeToStream(obj, stream, overrides...)
|
err = c.Serializer.Encode(obj, stream)
|
||||||
kind.SetGroupVersionKind(oldGVK)
|
kind.SetGroupVersionKind(oldGVK)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -250,31 +250,28 @@ func TestTypes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestVersionedEncoding(t *testing.T) {
|
func TestVersionedEncoding(t *testing.T) {
|
||||||
s, codec := GetTestScheme()
|
s, _ := GetTestScheme()
|
||||||
out, err := runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v2"})
|
cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{}))
|
||||||
|
encoder, _ := cf.SerializerForFileExtension("json")
|
||||||
|
|
||||||
|
codec := cf.CodecForVersions(encoder, nil, []unversioned.GroupVersion{{Version: "v2"}}, nil)
|
||||||
|
out, err := runtime.Encode(codec, &TestType1{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if string(out) != `{"myVersionKey":"v2","myKindKey":"TestType1"}`+"\n" {
|
if string(out) != `{"myVersionKey":"v2","myKindKey":"TestType1"}`+"\n" {
|
||||||
t.Fatal(string(out))
|
t.Fatal(string(out))
|
||||||
}
|
}
|
||||||
_, err = runtime.Encode(codec, &TestType1{}, unversioned.GroupVersion{Version: "v3"})
|
|
||||||
|
codec = cf.CodecForVersions(encoder, nil, []unversioned.GroupVersion{{Version: "v3"}}, nil)
|
||||||
|
_, err = runtime.Encode(codec, &TestType1{})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{}))
|
|
||||||
encoder, _ := cf.SerializerForFileExtension("json")
|
|
||||||
|
|
||||||
// codec that is unversioned uses the target version
|
|
||||||
unversionedCodec := cf.CodecForVersions(encoder, nil, nil, nil)
|
|
||||||
_, err = runtime.Encode(unversionedCodec, &TestType1{}, unversioned.GroupVersion{Version: "v3"})
|
|
||||||
if err == nil || !runtime.IsNotRegisteredError(err) {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// unversioned encode with no versions is written directly to wire
|
// unversioned encode with no versions is written directly to wire
|
||||||
out, err = runtime.Encode(unversionedCodec, &TestType1{})
|
codec = cf.CodecForVersions(encoder, nil, nil, nil)
|
||||||
|
out, err = runtime.Encode(codec, &TestType1{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -426,7 +423,7 @@ func TestDirectCodec(t *testing.T) {
|
|||||||
}
|
}
|
||||||
directEncoder := df.EncoderForVersion(serializer, ignoredGV)
|
directEncoder := df.EncoderForVersion(serializer, ignoredGV)
|
||||||
directDecoder := df.DecoderToVersion(serializer, ignoredGV)
|
directDecoder := df.DecoderToVersion(serializer, ignoredGV)
|
||||||
out, err := runtime.Encode(directEncoder, &ExternalTestType1{}, ignoredGV)
|
out, err := runtime.Encode(directEncoder, &ExternalTestType1{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -159,8 +159,8 @@ func (s *Serializer) Decode(originalData []byte, gvk *unversioned.GroupVersionKi
|
|||||||
return obj, actual, nil
|
return obj, actual, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
|
// Encode serializes the provided object to the given writer.
|
||||||
func (s *Serializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
if s.yaml {
|
if s.yaml {
|
||||||
json, err := json.Marshal(obj)
|
json, err := json.Marshal(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -165,8 +165,8 @@ func (s *Serializer) Decode(originalData []byte, gvk *unversioned.GroupVersionKi
|
|||||||
return unmarshalToObject(s.typer, s.creater, &actual, into, unk.Raw)
|
return unmarshalToObject(s.typer, s.creater, &actual, into, unk.Raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
|
// Encode serializes the provided object to the given writer.
|
||||||
func (s *Serializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
var unk runtime.Unknown
|
var unk runtime.Unknown
|
||||||
kind := obj.GetObjectKind().GroupVersionKind()
|
kind := obj.GetObjectKind().GroupVersionKind()
|
||||||
unk = runtime.Unknown{
|
unk = runtime.Unknown{
|
||||||
@ -388,8 +388,8 @@ func unmarshalToObject(typer runtime.ObjectTyper, creater runtime.ObjectCreater,
|
|||||||
return obj, actual, nil
|
return obj, actual, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToStream serializes the provided object to the given writer. Overrides is ignored.
|
// Encode serializes the provided object to the given writer. Overrides is ignored.
|
||||||
func (s *RawSerializer) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (s *RawSerializer) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
switch t := obj.(type) {
|
switch t := obj.(type) {
|
||||||
case bufferedMarshaller:
|
case bufferedMarshaller:
|
||||||
// this path performs a single allocation during write but requires the caller to implement
|
// this path performs a single allocation during write but requires the caller to implement
|
||||||
|
@ -30,8 +30,8 @@ import (
|
|||||||
// Encoder is a runtime.Encoder on a stream.
|
// Encoder is a runtime.Encoder on a stream.
|
||||||
type Encoder interface {
|
type Encoder interface {
|
||||||
// Encode will write the provided object to the stream or return an error. It obeys the same
|
// Encode will write the provided object to the stream or return an error. It obeys the same
|
||||||
// contract as runtime.Encoder.
|
// contract as runtime.VersionedEncoder.
|
||||||
Encode(obj runtime.Object, overrides ...unversioned.GroupVersion) error
|
Encode(obj runtime.Object) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decoder is a runtime.Decoder from a stream.
|
// Decoder is a runtime.Decoder from a stream.
|
||||||
@ -127,8 +127,8 @@ func NewEncoder(w io.Writer, e runtime.Encoder) Encoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encode writes the provided object to the nested writer.
|
// Encode writes the provided object to the nested writer.
|
||||||
func (e *encoder) Encode(obj runtime.Object, overrides ...unversioned.GroupVersion) error {
|
func (e *encoder) Encode(obj runtime.Object) error {
|
||||||
if err := e.encoder.EncodeToStream(obj, e.buf, overrides...); err != nil {
|
if err := e.encoder.Encode(obj, e.buf); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err := e.writer.Write(e.buf.Bytes())
|
_, err := e.writer.Write(e.buf.Bytes())
|
||||||
|
@ -222,11 +222,11 @@ func (c *codec) Decode(data []byte, defaultGVK *unversioned.GroupVersionKind, in
|
|||||||
return out, gvk, nil
|
return out, gvk, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToStream ensures the provided object is output in the right scheme. If overrides are specified, when
|
// Encode ensures the provided object is output in the appropriate group and version, invoking
|
||||||
// encoding the object the first override that matches the object's group is used. Other overrides are ignored.
|
// conversion if necessary. Unversioned objects (according to the ObjectTyper) are output as is.
|
||||||
func (c *codec) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (c *codec) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
if _, ok := obj.(*runtime.Unknown); ok {
|
if _, ok := obj.(*runtime.Unknown); ok {
|
||||||
return c.encoder.EncodeToStream(obj, w, overrides...)
|
return c.encoder.Encode(obj, w)
|
||||||
}
|
}
|
||||||
gvks, isUnversioned, err := c.typer.ObjectKinds(obj)
|
gvks, isUnversioned, err := c.typer.ObjectKinds(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -234,38 +234,21 @@ func (c *codec) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unv
|
|||||||
}
|
}
|
||||||
gvk := gvks[0]
|
gvk := gvks[0]
|
||||||
|
|
||||||
if (c.encodeVersion == nil && len(overrides) == 0) || isUnversioned {
|
if c.encodeVersion == nil || isUnversioned {
|
||||||
objectKind := obj.GetObjectKind()
|
objectKind := obj.GetObjectKind()
|
||||||
old := objectKind.GroupVersionKind()
|
old := objectKind.GroupVersionKind()
|
||||||
objectKind.SetGroupVersionKind(gvk)
|
objectKind.SetGroupVersionKind(gvk)
|
||||||
err = c.encoder.EncodeToStream(obj, w, overrides...)
|
err = c.encoder.Encode(obj, w)
|
||||||
objectKind.SetGroupVersionKind(old)
|
objectKind.SetGroupVersionKind(old)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
targetGV, ok := c.encodeVersion[gvk.Group]
|
targetGV, ok := c.encodeVersion[gvk.Group]
|
||||||
// use override if provided
|
|
||||||
for i, override := range overrides {
|
|
||||||
if override.Group == gvk.Group {
|
|
||||||
ok = true
|
|
||||||
targetGV = override
|
|
||||||
// swap the position of the override
|
|
||||||
overrides[0], overrides[i] = targetGV, overrides[0]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// attempt a conversion to the sole encode version
|
// attempt a conversion to the sole encode version
|
||||||
if !ok && c.preferredEncodeVersion != nil {
|
if !ok && c.preferredEncodeVersion != nil {
|
||||||
ok = true
|
ok = true
|
||||||
targetGV = c.preferredEncodeVersion[0]
|
targetGV = c.preferredEncodeVersion[0]
|
||||||
if len(overrides) > 0 {
|
|
||||||
// ensure the target override is first
|
|
||||||
overrides = promoteOrPrependGroupVersion(targetGV, overrides)
|
|
||||||
} else {
|
|
||||||
// avoids allocating a new array for each call to EncodeToVersion
|
|
||||||
overrides = c.preferredEncodeVersion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if no fallback is available, error
|
// if no fallback is available, error
|
||||||
@ -285,21 +268,8 @@ func (c *codec) EncodeToStream(obj runtime.Object, w io.Writer, overrides ...unv
|
|||||||
obj = out
|
obj = out
|
||||||
}
|
}
|
||||||
// Conversion is responsible for setting the proper group, version, and kind onto the outgoing object
|
// Conversion is responsible for setting the proper group, version, and kind onto the outgoing object
|
||||||
err = c.encoder.EncodeToStream(obj, w, overrides...)
|
err = c.encoder.Encode(obj, w)
|
||||||
// restore the old GVK, in case conversion returned the same object
|
// restore the old GVK, in case conversion returned the same object
|
||||||
objectKind.SetGroupVersionKind(old)
|
objectKind.SetGroupVersionKind(old)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// promoteOrPrependGroupVersion finds the group version in the provided group versions that has the same group as target.
|
|
||||||
// If the group is found the returned array will have that group version in the first position - if the group is not found
|
|
||||||
// the returned array will have target in the first position.
|
|
||||||
func promoteOrPrependGroupVersion(target unversioned.GroupVersion, gvs []unversioned.GroupVersion) []unversioned.GroupVersion {
|
|
||||||
for i, gv := range gvs {
|
|
||||||
if gv.Group == target.Group {
|
|
||||||
gvs[0], gvs[i] = gvs[i], gvs[0]
|
|
||||||
return gvs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return append([]unversioned.GroupVersion{target}, gvs...)
|
|
||||||
}
|
|
||||||
|
@ -263,7 +263,6 @@ func (c *checkConvertor) ConvertFieldLabel(version, kind, label, value string) (
|
|||||||
type mockSerializer struct {
|
type mockSerializer struct {
|
||||||
err error
|
err error
|
||||||
obj runtime.Object
|
obj runtime.Object
|
||||||
versions []unversioned.GroupVersion
|
|
||||||
|
|
||||||
defaults, actual *unversioned.GroupVersionKind
|
defaults, actual *unversioned.GroupVersionKind
|
||||||
into runtime.Object
|
into runtime.Object
|
||||||
@ -275,9 +274,8 @@ func (s *mockSerializer) Decode(data []byte, defaults *unversioned.GroupVersionK
|
|||||||
return s.obj, s.actual, s.err
|
return s.obj, s.actual, s.err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *mockSerializer) EncodeToStream(obj runtime.Object, w io.Writer, versions ...unversioned.GroupVersion) error {
|
func (s *mockSerializer) Encode(obj runtime.Object, w io.Writer) error {
|
||||||
s.obj = obj
|
s.obj = obj
|
||||||
s.versions = versions
|
|
||||||
return s.err
|
return s.err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ func (s unstructuredJSONScheme) Decode(data []byte, _ *unversioned.GroupVersionK
|
|||||||
return obj, &gvk, nil
|
return obj, &gvk, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (unstructuredJSONScheme) EncodeToStream(obj Object, w io.Writer, overrides ...unversioned.GroupVersion) error {
|
func (unstructuredJSONScheme) Encode(obj Object, w io.Writer) error {
|
||||||
switch t := obj.(type) {
|
switch t := obj.(type) {
|
||||||
case *Unstructured:
|
case *Unstructured:
|
||||||
return json.NewEncoder(w).Encode(t.Object)
|
return json.NewEncoder(w).Encode(t.Object)
|
||||||
|
Loading…
Reference in New Issue
Block a user