diff --git a/pkg/endpoints/installer.go b/pkg/endpoints/installer.go index 201129292..042bd802f 100644 --- a/pkg/endpoints/installer.go +++ b/pkg/endpoints/installer.go @@ -127,6 +127,9 @@ func ConvertGroupVersionIntoToDiscovery(list []metav1.APIResource) ([]apidiscove apiResourceList = append(apiResourceList, apidiscoveryv2beta1.APIResourceDiscovery{ Resource: split[0], Scope: scope, + // avoid nil panics in v0.26.0-v0.26.3 client-go clients + // see https://github.com/kubernetes/kubernetes/issues/118361 + ResponseKind: &metav1.GroupVersionKind{}, }) parentidx = len(apiResourceList) - 1 parentResources[split[0]] = parentidx @@ -140,6 +143,9 @@ func ConvertGroupVersionIntoToDiscovery(list []metav1.APIResource) ([]apidiscove subresource := apidiscoveryv2beta1.APISubresourceDiscovery{ Subresource: split[1], Verbs: r.Verbs, + // avoid nil panics in v0.26.0-v0.26.3 client-go clients + // see https://github.com/kubernetes/kubernetes/issues/118361 + ResponseKind: &metav1.GroupVersionKind{}, } if r.Kind != "" { subresource.ResponseKind = &metav1.GroupVersionKind{ diff --git a/pkg/endpoints/installer_test.go b/pkg/endpoints/installer_test.go index 68ea6056d..03d06f909 100644 --- a/pkg/endpoints/installer_test.go +++ b/pkg/endpoints/installer_test.go @@ -302,6 +302,8 @@ func TestConvertAPIResourceToDiscovery(t *testing.T) { { Resource: "cronjobs", Scope: apidiscoveryv2beta1.ScopeNamespace, + // populated to avoid nil panics + ResponseKind: &metav1.GroupVersionKind{}, Subresources: []apidiscoveryv2beta1.APISubresourceDiscovery{{ Subresource: "status", ResponseKind: &metav1.GroupVersionKind{ @@ -314,6 +316,32 @@ func TestConvertAPIResourceToDiscovery(t *testing.T) { }, }, }, + { + name: "Test with subresource with missing kind", + resources: []metav1.APIResource{ + { + Name: "cronjobs/status", + Namespaced: true, + Group: "batch", + Version: "v1", + Verbs: []string{"create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"}, + }, + }, + wantAPIResourceDiscovery: []apidiscoveryv2beta1.APIResourceDiscovery{ + { + Resource: "cronjobs", + Scope: apidiscoveryv2beta1.ScopeNamespace, + // populated to avoid nil panics + ResponseKind: &metav1.GroupVersionKind{}, + Subresources: []apidiscoveryv2beta1.APISubresourceDiscovery{{ + Subresource: "status", + // populated to avoid nil panics + ResponseKind: &metav1.GroupVersionKind{}, + Verbs: []string{"create", "delete", "deletecollection", "get", "list", "patch", "update", "watch"}, + }}, + }, + }, + }, { name: "Test with mismatch parent and subresource scope", resources: []metav1.APIResource{