let DirectEncoder take a hint of what gvk to set during its construction

This commit is contained in:
Chao Xu 2016-12-07 13:16:06 -08:00
parent 66f5d07e05
commit 8af15f4d30
3 changed files with 42 additions and 5 deletions

View File

@ -220,9 +220,10 @@ type DirectCodecFactory struct {
CodecFactory CodecFactory
} }
// EncoderForVersion returns an encoder that does not do conversion. gv is ignored. // EncoderForVersion returns an encoder that does not do conversion.
func (f DirectCodecFactory) EncoderForVersion(serializer runtime.Encoder, _ runtime.GroupVersioner) runtime.Encoder { func (f DirectCodecFactory) EncoderForVersion(serializer runtime.Encoder, version runtime.GroupVersioner) runtime.Encoder {
return versioning.DirectEncoder{ return versioning.DirectEncoder{
Version: version,
Encoder: serializer, Encoder: serializer,
ObjectTyper: f.CodecFactory.scheme, ObjectTyper: f.CodecFactory.scheme,
} }

View File

@ -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. // DirectEncoder serializes an object and ensures the GVK is set.
type DirectEncoder struct { type DirectEncoder struct {
Version runtime.GroupVersioner
runtime.Encoder runtime.Encoder
runtime.ObjectTyper runtime.ObjectTyper
} }
@ -242,7 +243,14 @@ func (e DirectEncoder) Encode(obj runtime.Object, stream io.Writer) error {
} }
kind := obj.GetObjectKind() kind := obj.GetObjectKind()
oldGVK := kind.GroupVersionKind() 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) err = e.Encoder.Encode(obj, stream)
kind.SetGroupVersionKind(oldGVK) kind.SetGroupVersionKind(oldGVK)
return err return err

View File

@ -329,8 +329,9 @@ 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
encodingObjGVK schema.GroupVersionKind
defaults, actual *schema.GroupVersionKind defaults, actual *schema.GroupVersionKind
into runtime.Object 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 { func (s *mockSerializer) Encode(obj runtime.Object, w io.Writer) error {
s.obj = obj s.obj = obj
s.encodingObjGVK = obj.GetObjectKind().GroupVersionKind()
return s.err return s.err
} }
@ -369,3 +371,29 @@ func (t *mockTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind,
func (t *mockTyper) Recognizes(_ schema.GroupVersionKind) bool { func (t *mockTyper) Recognizes(_ schema.GroupVersionKind) bool {
return true 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)
}
}