| 
          #!/bin/bash | 
        
        
           | 
          
 | 
        
        
           | 
          source ./hack/utils.sh | 
        
        
           | 
          
 | 
        
        
           | 
          remove-apiservices () { | 
        
        
           | 
            echo "Remove Orphaned Apiservices" | 
        
        
           | 
            for apiservice in `kubectl get apiservices 2>/dev/null | grep "False" | awk '{ print $1; }'`; do | 
        
        
           | 
              if [[ $apiservice =~ "clusterapi.io" ]] || [[ $apiservice =~ "clusterregistry.k8s.io" ]] || [[ $apiservice =~ "mcm.ibm.com" ]] || [[ $apiservice =~ "v1beta1.webhook.certmanager.k8s.io" ]] || [[ $apiservice =~ "hive.openshift.io" ]]; then | 
        
        
           | 
                kubectl delete apiservice $apiservice || true | 
        
        
           | 
              else | 
        
        
           | 
                echo "Skipping apiservice $apiservice" | 
        
        
           | 
              fi | 
        
        
           | 
            done | 
        
        
           | 
            oc delete apiservice v1alpha1.clusterview.open-cluster-management.io v1.clusterview.open-cluster-management.io | 
        
        
           | 
          } | 
        
        
           | 
          
 | 
        
        
           | 
          # Strip out finalizers. This will make orphans! | 
        
        
           | 
          echo "Strip out finalizers" | 
        
        
           | 
          for helmrelease in $(oc get helmreleases.apps.open-cluster-management.io | tail -n +2 | cut -f 1 -d ' '); do oc patch helmreleases.apps.open-cluster-management.io $helmrelease --type json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]' || true; done | 
        
        
           | 
          for mch in $(oc get multiclusterhub | tail -n +2 | cut -f 1 -d ' '); do oc patch multiclusterhub $mch --type json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]' || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          kubectl delete -k ../multiclusterhub/ || true | 
        
        
           | 
          kubectl delete -k ../acm-operator/ || true | 
        
        
           | 
          
 | 
        
        
           | 
          oc project open-cluster-management | 
        
        
           | 
          remove-apiservices | 
        
        
           | 
          
 | 
        
        
           | 
          #remove all open-cluster-management apiservices | 
        
        
           | 
          for apiservice in $(oc get apiservices -o name | grep open-cluster-management.io); do | 
        
        
           | 
            oc delete $apiservice | 
        
        
           | 
          done | 
        
        
           | 
          
 | 
        
        
           | 
          #remove all open-cluster-management webhooks | 
        
        
           | 
          for validatingwebhook in $(oc get validatingwebhookconfigurations -o name | grep open-cluster-management.io); do | 
        
        
           | 
            oc delete $validatingwebhook | 
        
        
           | 
          done | 
        
        
           | 
          
 | 
        
        
           | 
          oc delete ValidatingWebhookConfiguration multiclusterengines.multicluster.openshift.io | 
        
        
           | 
          
 | 
        
        
           | 
          for mutatingwebhook in $(oc get mutatingwebhookconfigurations -o name | grep open-cluster-management.io); do | 
        
        
           | 
            oc delete $mutatingwebhook | 
        
        
           | 
          done | 
        
        
           | 
          
 | 
        
        
           | 
          # cluster deployment cleanup now being done by clean-clusters.sh | 
        
        
           | 
          # for deployment in $(oc get ClusterDeployment --all-namespaces | tail -n +2 | cut -f 1 -d ' '); do echo "Deleting managed cluster $deployment... this may take a few minutes."; oc delete ClusterDeployment $deployment -n $deployment; echo "done."; done | 
        
        
           | 
          for cluster in $(oc get Cluster --all-namespaces --ignore-not-found | tail -n +2 | cut -f 1 -d ' '); do oc delete Cluster $cluster && oc delete namespace $cluster --wait=false --ignore-not-found || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          # Deletes all subscriptions in the system | 
        
        
           | 
          for subscription in $(oc get subscriptions.apps.open-cluster-management.io | tail -n +2 | cut -f 1 -d ' '); do oc delete subscriptions.apps.open-cluster-management.io $subscription --wait=false --ignore-not-found || true; done | 
        
        
           | 
          for helmrelease in $(oc get helmreleases.apps.open-cluster-management.io | tail -n +2 | cut -f 1 -d ' '); do oc patch helmreleases.apps.open-cluster-management.io $helmrelease --type json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]' || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          #Run through twice, first time initiate all the deletes, 2nd time wait. This makes it more likely if the user runs the finalizer patch there will be NO orphans | 
        
        
           | 
          for helmrelease in $(oc get helmreleases.apps.open-cluster-management.io | tail -n +2 | cut -f 1 -d ' '); do oc delete helmreleases.apps.open-cluster-management.io $helmrelease --wait=false --ignore-not-found || true; done | 
        
        
           | 
          for helmrelease in $(oc get helmreleases.apps.open-cluster-management.io | tail -n +2 | cut -f 1 -d ' '); do oc delete helmreleases.apps.open-cluster-management.io $helmrelease --ignore-not-found || true; done | 
        
        
           | 
          for policy in $(oc get policies.policy.mcm.ibm.com | tail -n +2 | cut -f 1 -d ' '); do oc patch policies.policy.mcm.ibm.com $policy --type json -p '[{ "op": "remove", "path": "/metadata/finalizers" }]' || true; oc delete policies.policy.mcm.ibm.com $policy --ignore-not-found || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          for webhook in $(oc get validatingwebhookconfiguration | grep cert-manager | cut -f 1 -d ' '); do oc delete validatingwebhookconfiguration $webhook --ignore-not-found || true; done | 
        
        
           | 
          for configmap in $(oc get configmap  | grep cert-manager | cut -f 1 -d ' '); do oc delete configmap $configmap -n hive --ignore-not-found || true; done | 
        
        
           | 
          for configmap in $(oc get configmap | grep ingress-controller | cut -f 1 -d ' '); do oc delete configmap $configmap -n hive --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep mcm | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep certmanager | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep clusterapi.io | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep clusterregistry.k8s.io | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep multicluster-mongo | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep cert-manager | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep mcm | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep rcm | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep klusterlet | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep managedcluster | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep search | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep configmap-watcher | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep multicluster-mongo | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep cert-manager | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep mcm | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep rcm | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep klusterlet | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep managedcluster | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep search | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrolebinding | grep configmap-watcher | cut -f 1 -d ' '); do oc delete clusterrolebinding $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get serviceaccount | grep search | cut -f 1 -d ' '); do oc delete serviceaccount $role --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep search | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep cert-manager | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep multicloud | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep cert-manager | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep kui | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep search | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep sh.helm.release | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep topology| cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep console-chart | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret | grep aws | cut -f 1 -d ' '); do oc delete Secret $secret --ignore-not-found || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          for crb in $(oc get clusterrolebinding | grep "open-cluster-management:" | cut -f 1 -d ' '); do oc delete clusterrolebinding $crb --ignore-not-found || true; done | 
        
        
           | 
          for cr in $(oc get clusterrole | grep "open-cluster-management:" | cut -f 1 -d ' '); do oc delete clusterrole $cr --ignore-not-found || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          remove-apiservices | 
        
        
           | 
          oc get crd | grep "hive" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get csv | grep "hive" | awk '{ print $1 }' | xargs oc delete csv --wait=false --ignore-not-found || true | 
        
        
           | 
          for deployment in $(oc get deploy -n hive | grep hive | cut -f 1 -d ' '); do oc delete deploy $deployment --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep hive | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep hive | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for rolebinding in $(oc get clusterrolebindings | grep hive | cut -f 1 -d ' '); do oc delete clusterrolebinding $rolebinding --ignore-not-found || true; done | 
        
        
           | 
          for webhook in $(oc get validatingwebhookconfiguration | grep hive | cut -f 1 -d ' '); do oc delete validatingwebhookconfiguration $webhook --ignore-not-found || true; done | 
        
        
           | 
          for configmap in $(oc get configmap -n hive | tail -n +2 | cut -f 1 -d ' '); do oc delete configmap $configmap -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep hive | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep console | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep kui | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep management-ingress | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep multicluster | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep sh.helm.release.v1 | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          for secret in $(oc get Secret -n hive | grep topology | cut -f 1 -d ' '); do oc delete Secret $secret -n hive --ignore-not-found || true; done | 
        
        
           | 
          oc delete namespace hive --wait=false || true | 
        
        
           | 
          
 | 
        
        
           | 
          for deployment in $(oc get Deployments | cut -f 1 -d ' '); do oc delete Deployment $deployment --ignore-not-found || true; done | 
        
        
           | 
          for subscription in $(oc get subscription | cut -f 1 -d ' '); do oc delete subscription $subscription --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep open-cluster-management | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          for role in $(oc get clusterrole | grep multicluster | cut -f 1 -d ' '); do oc delete clusterrole $role --ignore-not-found || true; done | 
        
        
           | 
          oc get csv | grep "multicluster" | awk '{ print $1 }' | xargs oc delete csv --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get csv | grep "multicloud" | awk '{ print $1 }' | xargs oc delete csv --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "open-cluster-management.io" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "acm.io" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          
 | 
        
        
           | 
          oc delete consolelink acm-console-link || true | 
        
        
           | 
          oc delete clusterrole search-collector || true | 
        
        
           | 
          oc delete clusterrolebinding search-collector || true | 
        
        
           | 
          oc delete oauthclient multicloudingress || true | 
        
        
           | 
          
 | 
        
        
           | 
          oc get service | grep "multicluster" | awk '{ print $1 }' | xargs oc delete service --wait=false --ignore-not-found || true | 
        
        
           | 
          for secret in $(oc get Secret -n open-cluster-management | grep multicluster | cut -f 1 -d ' '); do oc delete Secret $secret -n open-cluster-management --ignore-not-found || true; done | 
        
        
           | 
          for configmap in $(oc get configmap -n open-cluster-management | tail -n +2 | cut -f 1 -d ' '); do oc delete configmap $configmap -n open-cluster-management --ignore-not-found || true; done | 
        
        
           | 
          oc get csv | grep "etcd" | awk '{ print $1 }' | xargs oc delete csv --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "etcd" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get scc | grep "multicluster" | awk '{ print $1 }' | xargs oc delete scc --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get scc | grep "multicloud" | awk '{ print $1 }' | xargs oc delete scc --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get scc | grep "kui-proxy" | awk '{ print $1 }' | xargs oc delete scc --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "certmanager" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "mcm" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get crd | grep "ibm" | awk '{ print $1 }' | xargs oc delete crd --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get clusterrole | grep "cert-manager" | awk '{ print $1 }' | xargs oc delete clusterrole --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get clusterrolebinding | grep "cert-manager" | awk '{ print $1 }' | xargs oc delete clusterrolebinding --wait=false --ignore-not-found || true | 
        
        
           | 
          oc get mutatingwebhookconfiguration | grep "cert-manager" | awk '{ print $1 }' | xargs oc delete mutatingwebhookconfiguration --wait=false --ignore-not-found || true | 
        
        
           | 
          
 | 
        
        
           | 
          cd ../ | 
        
        
           | 
          echo DESTROY | ./uninstall.sh || true | 
        
        
           | 
          
 | 
        
        
           | 
          # klusterlet-addon-controller webhook | 
        
        
           | 
          for webhook in $(oc get validatingwebhookconfiguration | grep klusterlet-addon-controller | cut -f 1 -d ' '); do oc delete validatingwebhookconfiguration $webhook --ignore-not-found || true; done | 
        
        
           | 
          
 | 
        
        
           | 
          # cert-manager cert-manager-webhook | 
        
        
           | 
          for webhook in $(oc get validatingwebhookconfiguration | grep cert-manager | cut -f 1 -d ' '); do oc delete validatingwebhookconfiguration $webhook --ignore-not-found || true; done | 
        
        
           | 
          for webhook in $(oc get mutatingwebhookconfiguration | grep "cert-manager" | cut -f 1 -d ' '); do oc delete mutatingwebhookconfiguration $webhook --ignore-not-found || true; done | 
        
        
           | 
          for apiservice in $(oc get apiservice | grep certmanager | cut -f 1 -d ' '); do oc delete apiservice $apiservice --ignore-not-found || true; done | 
        
        
           | 
          oc delete crd certificates.certmanager.k8s.io || true | 
        
        
           | 
          oc delete crd certificaterequests.certmanager.k8s.io || true | 
        
        
           | 
          oc delete crd challenges.certmanager.k8s.io || true | 
        
        
           | 
          oc delete crd clusterissuers.certmanager.k8s.io || true | 
        
        
           | 
          oc delete crd issuers.certmanager.k8s.io || true | 
        
        
           | 
          oc delete crd orders.certmanager.k8s.io || true | 
        
        
           | 
          oc delete clusterrole cert-manager-webhook-requester || true | 
        
        
           | 
          oc delete clusterrolebinding cert-manager-webhook-auth-delegator || true | 
        
        
           | 
          
 | 
        
        
           | 
          # console-chart | 
        
        
           | 
          oc delete consolelink acm-console-link || true | 
        
        
           | 
          oc delete crd userpreferences.console.open-cluster-management.io || true | 
        
        
           | 
          oc delete clusterrole aggregate-clusterimagesets-readonly || true | 
        
        
           | 
          oc delete clusterrolebinding readonly-clusterimagesets || true | 
        
        
           | 
          
 | 
        
        
           | 
          # multicloud-ingress | 
        
        
           | 
          oc delete oauthclient multicloudingress || true | 
        
        
           | 
          
 | 
        
        
           | 
          # rcm | 
        
        
           | 
          # 1.x | 
        
        
           | 
          oc delete crd endpointconfigs.multicloud.ibm.com || true | 
        
        
           | 
          # 2.x | 
        
        
           | 
          oc delete crd klusterletconfigs.agent.open-cluster-management.io || true | 
        
        
           | 
          
 | 
        
        
           | 
          oc delete clusterrole rcm-controller || true | 
        
        
           | 
          oc delete clusterrolebinding rcm-controller || true | 
        
        
           | 
          
 | 
        
        
           | 
          # workaround for https://github.com/stolostron/backlog/issues/2915 | 
        
        
           | 
          oc delete apiservice v1.admission.cluster.open-cluster-management.io v1beta1.proxy.open-cluster-management.io | 
        
        
           | 
          oc delete ValidatingWebhookConfiguration managedclustervalidators.admission.cluster.open-cluster-management.io | 
        
        
           | 
          
 | 
        
        
           | 
          # clean up the `-hub` namespace for 2.x | 
        
        
           | 
          oc delete ns open-cluster-management-hub --wait=false | 
        
        
           | 
          
 | 
        
        
           | 
          # clean up leftover cert-manager resources | 
        
        
           | 
          oc delete rolebinding -n kube-system cert-manager-webhook-webhook-authentication-reader | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          
 | 
        
        
           | 
          # if we are on a managed-cluster let's remove it's stuff too | 
        
        
           | 
          if [ -z "${OPERATOR_NAMESPACE}" ]; then | 
        
        
           | 
          	OPERATOR_NAMESPACE="multicluster-endpoint" | 
        
        
           | 
          fi | 
        
        
           | 
          
 | 
        
        
           | 
          # Delete all endpoints.multicloud.ibm.com | 
        
        
           | 
          kubectl delete endpoints.multicloud.ibm.com -n ${OPERATOR_NAMESPACE}  --all --timeout=60s || true | 
        
        
           | 
          
 | 
        
        
           | 
          # Delete Deployment | 
        
        
           | 
          kubectl delete deployment ibm-multicluster-endpoint-operator -n ${OPERATOR_NAMESPACE} || true | 
        
        
           | 
          
 | 
        
        
           | 
          # Force delete all component CRDs if they still exist | 
        
        
           | 
          component_crds=( | 
        
        
           | 
          	applicationmanagers.multicloud.ibm.com | 
        
        
           | 
          	certpoliciescontroller.multicloud.ibm.com | 
        
        
           | 
          	ciscontrollers.multicloud.ibm.com | 
        
        
           | 
          	connectionmanagers.multicloud.ibm.com | 
        
        
           | 
          	iampoliciescontroller.multicloud.ibm.com | 
        
        
           | 
          	policycontrollers.multicloud.ibm.com | 
        
        
           | 
          	searchcollectors.multicloud.ibm.com | 
        
        
           | 
          	serviceregistries.multicloud.ibm.com | 
        
        
           | 
          	workmanagers.multicloud.ibm.com | 
        
        
           | 
          	endpoints.multicloud.ibm.com | 
        
        
           | 
          	clustermanagers.operator.open-cluster-management.io | 
        
        
           | 
          	multiclusterhubs.operator.open-cluster-management.io | 
        
        
           | 
          	klusterlets.operator.open-cluster-management.io | 
        
        
           | 
          ) | 
        
        
           | 
          
 | 
        
        
           | 
          for crd in "${component_crds[@]}"; do | 
        
        
           | 
          	echo "force delete all CustomResourceDefination ${crd} resources..." | 
        
        
           | 
          	for resource in `kubectl get ${crd} -o name -n ${OPERATOR_NAMESPACE}`; do | 
        
        
           | 
          		echo "attempt to delete ${crd} resource ${resource}..." | 
        
        
           | 
          		kubectl delete ${resource} -n ${OPERATOR_NAMESPACE} --timeout=15s || true | 
        
        
           | 
          		echo "force remove ${crd} resource ${resource}..." | 
        
        
           | 
          		kubectl patch ${resource} -n ${OPERATOR_NAMESPACE} --type="json" -p '[{"op": "remove", "path":"/metadata/finalizers"}]' || true | 
        
        
           | 
          	done | 
        
        
           | 
          	echo "force delete all CustomResourceDefination ${crd} resources..." | 
        
        
           | 
          	kubectl delete crd ${crd} || true | 
        
        
           | 
          done | 
        
        
           | 
          
 | 
        
        
           | 
          kubectl delete namespace ${OPERATOR_NAMESPACE} --wait=false || true | 
        
        
           | 
          
 | 
        
        
           | 
          evict_all_wedged_crd | 
        
        
           | 
          nuke_leaked_namespaces |