From 723b7a0cf013aec76059aa635223746ed0e7a5c8 Mon Sep 17 00:00:00 2001 From: Arkadiy Date: Tue, 10 Nov 2020 15:41:00 +0200 Subject: [PATCH] delete knative webhooks during KF uninstalling --- pkg/controller/kfdef/kfdef_controller.go | 20 ++++++++++++++++++++ pkg/utils/k8utils.go | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/pkg/controller/kfdef/kfdef_controller.go b/pkg/controller/kfdef/kfdef_controller.go index 0186d25b6..2840c7af2 100644 --- a/pkg/controller/kfdef/kfdef_controller.go +++ b/pkg/controller/kfdef/kfdef_controller.go @@ -287,6 +287,26 @@ func (r *ReconcileKfDef) Reconcile(request reconcile.Request) (reconcile.Result, // Remove this KfDef instance delete(kfdefInstances, strings.Join([]string{instance.GetName(), instance.GetNamespace()}, ".")) + // Knative webhooks need to be deleted manually + knativeWebhooks := map[string][]string{ + "MutatingWebhookConfiguration": { + "webhook.serving.knative.dev", + }, + "ValidatingWebhookConfiguration": { + "config.webhook.serving.knative.dev", + "validation.webhook.serving.knative.dev", + }, + } + knativeWebhookApiVersion := "admissionregistration.k8s.io/v1beta1" + for webhookKind, webhooks := range knativeWebhooks { + for _, webhookName := range webhooks { + err = kfutils.DeleteResourceByNameAndKind(r.client, webhookName, webhookKind, knativeWebhookApiVersion) + } + } + if err != nil { + log.Errorf("Error removing knative webhooks: %v.", err) + } + // Remove finalizer once kfDelete is completed. finalizers.Delete(finalizer) instance.SetFinalizers(finalizers.List()) diff --git a/pkg/utils/k8utils.go b/pkg/utils/k8utils.go index d40f51439..90862d632 100644 --- a/pkg/utils/k8utils.go +++ b/pkg/utils/k8utils.go @@ -594,6 +594,22 @@ func DeleteResource(resourceBytes []byte, kubeclient client.Client, timeout time return nil } +func DeleteResourceByNameAndKind(kubeclient client.Client, name string, kind string, apiVersion string) error { + u := &unstructured.Unstructured{} + u.SetName(name) + u.SetKind(kind) + u.SetAPIVersion(apiVersion) + + log.Infof("Deleting resource %s with kind '%s' in APIVersion '%s'", name, kind, apiVersion) + err := kubeclient.Delete(context.TODO(), u) + if err != nil { + return errors.Wrapf(err, "Failed to delete resource %s with kind '%s' in APIVersion '%s'", + name, kind, apiVersion) + } + + return nil +} + func SplitYAML(resources []byte) ([][]byte, error) { dec := goyaml.NewDecoder(bytes.NewReader(resources))