Skip to content

Commit 2e3b937

Browse files
committed
avoid panic when subresource is a list
1 parent b8dcc2c commit 2e3b937

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

staging/src/k8s.io/client-go/dynamic/client_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ func getObject(version, kind, name string) *unstructured.Unstructured {
6464
}
6565
}
6666

67+
func getObjectFromJSON(b []byte) *unstructured.Unstructured {
68+
obj := &unstructured.Unstructured{}
69+
_ = obj.UnmarshalJSON(b) // can ignore parse error because the comparison will fail
70+
return obj
71+
}
72+
6773
func getClientServer(h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) {
6874
srv := httptest.NewServer(http.HandlerFunc(h))
6975
cl, err := NewForConfig(&restclient.Config{
@@ -359,6 +365,15 @@ func TestGet(t *testing.T) {
359365
resp: getJSON("vTest", "srTest", "namespaced_subresource_get"),
360366
want: getObject("vTest", "srTest", "namespaced_subresource_get"),
361367
},
368+
{
369+
resource: "rtest",
370+
subresource: []string{"srtest"},
371+
namespace: "nstest",
372+
name: "namespaced_subresource_get_list",
373+
path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_get_list/srtest",
374+
resp: getListJSON("vTest", "srTest", getJSON("vTest", "srTest", "a1")),
375+
want: getObjectFromJSON(getListJSON("vTest", "srTest", getJSON("vTest", "srTest", "a1"))),
376+
},
362377
}
363378
for _, tc := range tcs {
364379
resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource}

staging/src/k8s.io/client-go/dynamic/simple.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,12 @@ func (c *dynamicResourceClient) Get(ctx context.Context, name string, opts metav
289289
if err != nil {
290290
return nil, err
291291
}
292-
uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes)
292+
obj := &unstructured.Unstructured{}
293+
err = runtime.DecodeInto(unstructured.UnstructuredJSONScheme, retBytes, obj)
293294
if err != nil {
294295
return nil, err
295296
}
296-
return uncastObj.(*unstructured.Unstructured), nil
297+
return obj, nil
297298
}
298299

299300
func (c *dynamicResourceClient) List(ctx context.Context, opts metav1.ListOptions) (*unstructured.UnstructuredList, error) {

0 commit comments

Comments
 (0)