From 742447f8ced7414dbb26142670659d487b038bad Mon Sep 17 00:00:00 2001 From: Matt Freeman Date: Tue, 17 May 2016 09:25:22 +0000 Subject: [PATCH 1/2] include metadata in third party res list output --- pkg/registry/thirdpartyresourcedata/codec.go | 35 +++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/pkg/registry/thirdpartyresourcedata/codec.go b/pkg/registry/thirdpartyresourcedata/codec.go index 758ffd46625..582db39594f 100644 --- a/pkg/registry/thirdpartyresourcedata/codec.go +++ b/pkg/registry/thirdpartyresourcedata/codec.go @@ -451,13 +451,6 @@ func (t *thirdPartyResourceDataDecoder) populateListResource(objIn *extensions.T return nil } -const template = `{ - "kind": "%s", - "apiVersion": "%s", - "metadata": {}, - "items": [ %s ] -}` - type thirdPartyResourceDataEncoder struct { delegate runtime.Encoder gvk unversioned.GroupVersionKind @@ -488,18 +481,36 @@ func (t *thirdPartyResourceDataEncoder) Encode(obj runtime.Object, stream io.Wri case *extensions.ThirdPartyResourceData: return encodeToJSON(obj, stream) case *extensions.ThirdPartyResourceDataList: - // TODO: There must be a better way to do this... - dataStrings := make([]string, len(obj.Items)) + // TODO: There are likely still better ways to do this... + listItems := make([]json.RawMessage, len(obj.Items)) + for ix := range obj.Items { buff := &bytes.Buffer{} err := encodeToJSON(&obj.Items[ix], buff) if err != nil { return err } - dataStrings[ix] = buff.String() + listItems[ix] = json.RawMessage(buff.Bytes()) } - gv := t.gvk.GroupVersion() - fmt.Fprintf(stream, template, t.gvk.Kind+"List", gv.String(), strings.Join(dataStrings, ",")) + + encMap := struct { + Kind string `json:"kind,omitempty"` + Items []json.RawMessage `json:"items"` + Metadata unversioned.ListMeta `json:"metadata,omitempty"` + APIVersion string `json:"apiVersion,omitempty"` + }{ + Kind: t.gvk.Kind + "List", + Items: listItems, + Metadata: obj.ListMeta, + APIVersion: t.gvk.GroupVersion().String(), + } + + encBytes, err := json.Marshal(encMap) + if err != nil { + return err + } + + fmt.Fprint(stream, string(encBytes)) return nil case *versioned.InternalEvent: event := &versioned.Event{} From 8eef335dec97fd5cad68c48ec7c6d562b98189b8 Mon Sep 17 00:00:00 2001 From: Matt Freeman Date: Thu, 26 May 2016 05:07:41 +0000 Subject: [PATCH 2/2] implement code review changes and add basic test --- pkg/registry/thirdpartyresourcedata/codec.go | 4 +- .../thirdpartyresourcedata/codec_test.go | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/pkg/registry/thirdpartyresourcedata/codec.go b/pkg/registry/thirdpartyresourcedata/codec.go index 582db39594f..3eee20eeaf4 100644 --- a/pkg/registry/thirdpartyresourcedata/codec.go +++ b/pkg/registry/thirdpartyresourcedata/codec.go @@ -510,8 +510,8 @@ func (t *thirdPartyResourceDataEncoder) Encode(obj runtime.Object, stream io.Wri return err } - fmt.Fprint(stream, string(encBytes)) - return nil + _, err = stream.Write(encBytes) + return err case *versioned.InternalEvent: event := &versioned.Event{} err := versioned.Convert_versioned_InternalEvent_to_versioned_Event(obj, event, nil) diff --git a/pkg/registry/thirdpartyresourcedata/codec_test.go b/pkg/registry/thirdpartyresourcedata/codec_test.go index 4b79a4bf9c3..98dfbac728f 100644 --- a/pkg/registry/thirdpartyresourcedata/codec_test.go +++ b/pkg/registry/thirdpartyresourcedata/codec_test.go @@ -246,3 +246,41 @@ func TestEncodeToStreamForInternalEvent(t *testing.T) { t.Errorf("unexpected error encoding: %v", err) } } + +func TestThirdPartyResourceDataListEncoding(t *testing.T) { + gv := unversioned.GroupVersion{Group: "stable.foo.faz", Version: "v1"} + gvk := gv.WithKind("Bar") + e := &thirdPartyResourceDataEncoder{delegate: testapi.Extensions.Codec(), gvk: gvk} + subject := &extensions.ThirdPartyResourceDataList{} + + buf := bytes.NewBuffer([]byte{}) + err := e.Encode(subject, buf) + if err != nil { + t.Errorf("encoding unexpected error: %v", err) + } + + targetOutput := struct { + Kind string `json:"kind,omitempty"` + Items []json.RawMessage `json:"items"` + Metadata unversioned.ListMeta `json:"metadata,omitempty"` + APIVersion string `json:"apiVersion,omitempty"` + }{} + err = json.Unmarshal(buf.Bytes(), &targetOutput) + + if err != nil { + t.Errorf("unmarshal unexpected error: %v", err) + } + + if expectedKind := gvk.Kind + "List"; expectedKind != targetOutput.Kind { + t.Errorf("unexpected kind on list got %s expected %s", targetOutput.Kind, expectedKind) + } + + if targetOutput.Metadata != subject.ListMeta { + t.Errorf("metadata mismatch %v != %v", targetOutput.Metadata, subject.ListMeta) + } + + if targetOutput.APIVersion != gv.String() { + t.Errorf("apiversion mismatch %v != %v", targetOutput.APIVersion, gv.String()) + } + +}