diff --git a/pkg/client/kubernetes/base/apiservices.go b/pkg/client/kubernetes/base/apiservices.go index 04973fcecb3..add9679a026 100644 --- a/pkg/client/kubernetes/base/apiservices.go +++ b/pkg/client/kubernetes/base/apiservices.go @@ -32,6 +32,11 @@ func (c *Client) ListAPIServices(opts metav1.ListOptions) (*apiregistrationv1.AP return c.apiServices().List(opts) } +// DeleteAPIService will gracefully delete an APIService with the given . +func (c *Client) DeleteAPIService(name string) error { + return c.apiServices().Delete(name, &defaultDeleteOptions) +} + // DeleteAPIServiceForcefully will forcefully delete an APIService with the given . func (c *Client) DeleteAPIServiceForcefully(name string) error { apiService, err := c.apiServices().Get(name, metav1.GetOptions{}) diff --git a/pkg/client/kubernetes/base/base.go b/pkg/client/kubernetes/base/base.go index dc00415fec4..4d3e3cb54c8 100644 --- a/pkg/client/kubernetes/base/base.go +++ b/pkg/client/kubernetes/base/base.go @@ -49,7 +49,6 @@ func NewForConfig(config *rest.Config) (*Client, error) { restClient: clientset.Discovery().RESTClient(), resourceAPIGroups: map[string][]string{ - APIServices: {"apis", "apiregistration.k8s.io", "v1beta1"}, CronJobs: {"apis", "batch", "v1beta1"}, CustomResourceDefinitions: {"apis", "apiextensions.k8s.io", "v1beta1"}, DaemonSets: {"apis", "apps", "v1"}, diff --git a/pkg/client/kubernetes/base/types.go b/pkg/client/kubernetes/base/types.go index c92cae66a7d..b8f4c5be382 100644 --- a/pkg/client/kubernetes/base/types.go +++ b/pkg/client/kubernetes/base/types.go @@ -68,9 +68,6 @@ const ( // CustomResourceDefinitions is a constant for a Kubernetes resource with the same name. CustomResourceDefinitions = "customresourcedefinitions" - // APIServices is a constant for a Kubernetes resource with the same name. - APIServices = "apiservices" - // DaemonSets is a constant for a Kubernetes resource with the same name. DaemonSets = "daemonsets" diff --git a/pkg/client/kubernetes/types.go b/pkg/client/kubernetes/types.go index a536f3016b3..6406ec89312 100644 --- a/pkg/client/kubernetes/types.go +++ b/pkg/client/kubernetes/types.go @@ -133,6 +133,7 @@ type Client interface { // APIServices ListAPIServices(metav1.ListOptions) (*apiregistrationv1.APIServiceList, error) + DeleteAPIService(name string) error DeleteAPIServiceForcefully(name string) error // Arbitrary manifests diff --git a/pkg/client/kubernetes/v110/v110.go b/pkg/client/kubernetes/v110/v110.go index 1d9d5e62e3c..c594e565c62 100644 --- a/pkg/client/kubernetes/v110/v110.go +++ b/pkg/client/kubernetes/v110/v110.go @@ -32,7 +32,6 @@ func NewForConfig(config *rest.Config) (*Client, error) { // NewFrom creates a new client from the given kubernetesv19.Client. func NewFrom(v19Client *kubernetesv19.Client) *Client { - v19Client.SetResourceAPIGroup(kubernetesbase.APIServices, []string{"apis", "apiregistration.k8s.io", "v1"}) return &Client{Client: v19Client} } diff --git a/pkg/operation/botanist/cleanup.go b/pkg/operation/botanist/cleanup.go index 6c0dc77d783..8f79c5c614f 100644 --- a/pkg/operation/botanist/cleanup.go +++ b/pkg/operation/botanist/cleanup.go @@ -27,20 +27,18 @@ import ( ) var ( - customResourceDefinitionExceptions = map[string]bool{ - "felixconfigurations.crd.projectcalico.org": true, - "bgppeers.crd.projectcalico.org": true, - "bgpconfigurations.crd.projectcalico.org": true, - "ippools.crd.projectcalico.org": true, - "clusterinformations.crd.projectcalico.org": true, - "globalnetworkpolicies.crd.projectcalico.org": true, - "globalnetworksets.crd.projectcalico.org": true, - "networkpolicies.crd.projectcalico.org": true, - "hostendpoints.crd.projectcalico.org": true, - } - exceptions = map[string]map[string]bool{ - kubernetesbase.CustomResourceDefinitions: customResourceDefinitionExceptions, + kubernetesbase.CustomResourceDefinitions: map[string]bool{ + "felixconfigurations.crd.projectcalico.org": true, + "bgppeers.crd.projectcalico.org": true, + "bgpconfigurations.crd.projectcalico.org": true, + "ippools.crd.projectcalico.org": true, + "clusterinformations.crd.projectcalico.org": true, + "globalnetworkpolicies.crd.projectcalico.org": true, + "globalnetworksets.crd.projectcalico.org": true, + "networkpolicies.crd.projectcalico.org": true, + "hostendpoints.crd.projectcalico.org": true, + }, kubernetesbase.DaemonSets: { fmt.Sprintf("%s/calico-node", metav1.NamespaceSystem): true, fmt.Sprintf("%s/kube-proxy", metav1.NamespaceSystem): true, @@ -117,7 +115,7 @@ func (b *Botanist) ForceDeleteCustomResourceDefinitions() error { var result error for _, crd := range crdList.Items { - if omit, ok := customResourceDefinitionExceptions[crd.Name]; !ok || !omit { + if omit, ok := exceptions[kubernetesbase.CustomResourceDefinitions][crd.Name]; !ok || !omit { if err := b.K8sShootClient.DeleteCRDForcefully(crd.Name); err != nil && !apierrors.IsNotFound(err) { result = multierror.Append(result, err) } @@ -129,16 +127,20 @@ func (b *Botanist) ForceDeleteCustomResourceDefinitions() error { // CleanupCustomAPIServices deletes all the custom API services in the Kubernetes cluster. // It will wait until all resources have been cleaned up. func (b *Botanist) CleanupCustomAPIServices() error { - var ( - apiGroups = b.K8sShootClient.GetResourceAPIGroups() - resource = kubernetesbase.APIServices - apiServiceGroupPath = apiGroups[resource] - ) - - if err := b.K8sShootClient.CleanupAPIGroupResources(exceptions, resource, apiServiceGroupPath); err != nil { + apiServiceList, err := b.K8sShootClient.ListAPIServices(metav1.ListOptions{}) + if err != nil { return err } - return b.waitForAPIGroupCleanedUp(apiServiceGroupPath, resource) + + var result error + for _, apiService := range apiServiceList.Items { + if apiService.Spec.Service != nil { + if err := b.K8sShootClient.DeleteAPIService(apiService.Name); err != nil && !apierrors.IsNotFound(err) { + result = multierror.Append(result, err) + } + } + } + return result } // ForceDeleteCustomAPIServices forcefully deletes all custom API services,