From 8af15f4d30da565907bf5b245ec3b2b41e97e69b Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Wed, 7 Dec 2016 13:16:06 -0800 Subject: [PATCH] let DirectEncoder take a hint of what gvk to set during its construction --- pkg/runtime/serializer/codec_factory.go | 5 +-- .../serializer/versioning/versioning.go | 10 +++++- .../serializer/versioning/versioning_test.go | 32 +++++++++++++++++-- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/pkg/runtime/serializer/codec_factory.go b/pkg/runtime/serializer/codec_factory.go index 990496613e2..a0a42509c4b 100644 --- a/pkg/runtime/serializer/codec_factory.go +++ b/pkg/runtime/serializer/codec_factory.go @@ -220,9 +220,10 @@ type DirectCodecFactory struct { CodecFactory } -// EncoderForVersion returns an encoder that does not do conversion. gv is ignored. -func (f DirectCodecFactory) EncoderForVersion(serializer runtime.Encoder, _ runtime.GroupVersioner) runtime.Encoder { +// EncoderForVersion returns an encoder that does not do conversion. +func (f DirectCodecFactory) EncoderForVersion(serializer runtime.Encoder, version runtime.GroupVersioner) runtime.Encoder { return versioning.DirectEncoder{ + Version: version, Encoder: serializer, ObjectTyper: f.CodecFactory.scheme, } diff --git a/pkg/runtime/serializer/versioning/versioning.go b/pkg/runtime/serializer/versioning/versioning.go index 75259da1167..c6f50053830 100644 --- a/pkg/runtime/serializer/versioning/versioning.go +++ b/pkg/runtime/serializer/versioning/versioning.go @@ -227,6 +227,7 @@ func (c *codec) Encode(obj runtime.Object, w io.Writer) error { // DirectEncoder serializes an object and ensures the GVK is set. type DirectEncoder struct { + Version runtime.GroupVersioner runtime.Encoder runtime.ObjectTyper } @@ -242,7 +243,14 @@ func (e DirectEncoder) Encode(obj runtime.Object, stream io.Writer) error { } kind := obj.GetObjectKind() oldGVK := kind.GroupVersionKind() - kind.SetGroupVersionKind(gvks[0]) + gvk := gvks[0] + if e.Version != nil { + preferredGVK, ok := e.Version.KindForGroupVersionKinds(gvks) + if ok { + gvk = preferredGVK + } + } + kind.SetGroupVersionKind(gvk) err = e.Encoder.Encode(obj, stream) kind.SetGroupVersionKind(oldGVK) return err diff --git a/pkg/runtime/serializer/versioning/versioning_test.go b/pkg/runtime/serializer/versioning/versioning_test.go index 22f79ba5ec1..8737965f115 100644 --- a/pkg/runtime/serializer/versioning/versioning_test.go +++ b/pkg/runtime/serializer/versioning/versioning_test.go @@ -329,8 +329,9 @@ func (c *checkConvertor) ConvertFieldLabel(version, kind, label, value string) ( } type mockSerializer struct { - err error - obj runtime.Object + err error + obj runtime.Object + encodingObjGVK schema.GroupVersionKind defaults, actual *schema.GroupVersionKind into runtime.Object @@ -344,6 +345,7 @@ func (s *mockSerializer) Decode(data []byte, defaults *schema.GroupVersionKind, func (s *mockSerializer) Encode(obj runtime.Object, w io.Writer) error { s.obj = obj + s.encodingObjGVK = obj.GetObjectKind().GroupVersionKind() return s.err } @@ -369,3 +371,29 @@ func (t *mockTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, func (t *mockTyper) Recognizes(_ schema.GroupVersionKind) bool { return true } + +func TestDirectCodecEncode(t *testing.T) { + serializer := mockSerializer{} + typer := mockTyper{ + gvks: []schema.GroupVersionKind{ + { + Group: "wrong_group", + Kind: "some_kind", + }, + { + Group: "expected_group", + Kind: "some_kind", + }, + }, + } + + c := DirectEncoder{ + Version: schema.GroupVersion{Group: "expected_group"}, + Encoder: &serializer, + ObjectTyper: &typer, + } + c.Encode(&testDecodable{}, ioutil.Discard) + if e, a := "expected_group", serializer.encodingObjGVK.Group; e != a { + t.Errorf("expected group to be %v, got %v", e, a) + } +}