mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
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:
commit
1026eecc9d
@ -472,13 +472,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
|
||||
@ -509,19 +502,37 @@ 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, ","))
|
||||
return nil
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
_, err = stream.Write(encBytes)
|
||||
return err
|
||||
case *versioned.InternalEvent:
|
||||
event := &versioned.Event{}
|
||||
err := versioned.Convert_versioned_InternalEvent_to_versioned_Event(obj, event, nil)
|
||||
|
@ -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())
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user