Merge pull request #26012 from sitepod/third-party-resource-list-json-fix

Automatic merge from submit-queue

include metadata in third party resource list serialization

Third party resource listing does not include important metadata such as resourceVersion and apiVersion. This commit includes the missing metadata and also replaces the string templating with an anonymous struct.
This commit is contained in:
k8s-merge-robot 2016-07-19 04:00:34 -07:00 committed by GitHub
commit 1026eecc9d
2 changed files with 62 additions and 13 deletions

View File

@ -472,13 +472,6 @@ func (t *thirdPartyResourceDataDecoder) populateListResource(objIn *extensions.T
return nil return nil
} }
const template = `{
"kind": "%s",
"apiVersion": "%s",
"metadata": {},
"items": [ %s ]
}`
type thirdPartyResourceDataEncoder struct { type thirdPartyResourceDataEncoder struct {
delegate runtime.Encoder delegate runtime.Encoder
gvk unversioned.GroupVersionKind gvk unversioned.GroupVersionKind
@ -509,19 +502,37 @@ func (t *thirdPartyResourceDataEncoder) Encode(obj runtime.Object, stream io.Wri
case *extensions.ThirdPartyResourceData: case *extensions.ThirdPartyResourceData:
return encodeToJSON(obj, stream) return encodeToJSON(obj, stream)
case *extensions.ThirdPartyResourceDataList: case *extensions.ThirdPartyResourceDataList:
// TODO: There must be a better way to do this... // TODO: There are likely still better ways to do this...
dataStrings := make([]string, len(obj.Items)) listItems := make([]json.RawMessage, len(obj.Items))
for ix := range obj.Items { for ix := range obj.Items {
buff := &bytes.Buffer{} buff := &bytes.Buffer{}
err := encodeToJSON(&obj.Items[ix], buff) err := encodeToJSON(&obj.Items[ix], buff)
if err != nil { if err != nil {
return err 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 {
return nil 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
}
_, err = stream.Write(encBytes)
return err
case *versioned.InternalEvent: case *versioned.InternalEvent:
event := &versioned.Event{} event := &versioned.Event{}
err := versioned.Convert_versioned_InternalEvent_to_versioned_Event(obj, event, nil) err := versioned.Convert_versioned_InternalEvent_to_versioned_Event(obj, event, nil)

View File

@ -246,3 +246,41 @@ func TestEncodeToStreamForInternalEvent(t *testing.T) {
t.Errorf("unexpected error encoding: %v", err) 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())
}
}