From 93b32e6fd37ce8600d598e304b98feb8bcc9e6c7 Mon Sep 17 00:00:00 2001 From: David Boreham Date: Tue, 21 Nov 2023 15:28:01 -0700 Subject: [PATCH] Implement benign delete --- stack_orchestrator/deploy/k8s/cluster_info.py | 5 +- stack_orchestrator/deploy/k8s/deploy_k8s.py | 62 +++++++++++++------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py index ea2b3683..a7426804 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -30,7 +30,6 @@ class ClusterInfo: parsed_pod_yaml_map: Any image_set: Set[str] = set() app_name: str = "test-app" - deployment_name: str = "test-deployment" environment_variables: DeployEnvVars spec: Spec @@ -74,7 +73,7 @@ class ClusterInfo: backend=client.V1IngressBackend( service=client.V1IngressServiceBackend( # TODO: this looks wrong - name=self.deployment_name, + name=f"{self.app_name}-service", # TODO: pull port number from the service port=client.V1ServiceBackendPort(number=80) ) @@ -195,7 +194,7 @@ class ClusterInfo: deployment = client.V1Deployment( api_version="apps/v1", kind="Deployment", - metadata=client.V1ObjectMeta(name=self.deployment_name), + metadata=client.V1ObjectMeta(name=f"{self.app_name}-deployment"), spec=spec, ) return deployment diff --git a/stack_orchestrator/deploy/k8s/deploy_k8s.py b/stack_orchestrator/deploy/k8s/deploy_k8s.py index 07d9e9ec..8e790d10 100644 --- a/stack_orchestrator/deploy/k8s/deploy_k8s.py +++ b/stack_orchestrator/deploy/k8s/deploy_k8s.py @@ -23,6 +23,15 @@ from stack_orchestrator.deploy.k8s.helpers import pods_in_deployment, log_stream from stack_orchestrator.deploy.k8s.cluster_info import ClusterInfo from stack_orchestrator.opts import opts from stack_orchestrator.deploy.deployment_context import DeploymentContext +from stack_orchestrator.util import error_exit + + +def _check_delete_exception(e: client.exceptions.ApiException): + if e.status == 404: + if opts.o.debug: + print("Failed to delete object, continuing") + else: + error_exit(f"k8s api error: {e}") class K8sDeployer(Deployer): @@ -133,42 +142,59 @@ class K8sDeployer(Deployer): for pv in pvs: if opts.o.debug: print(f"Deleting this pv: {pv}") - pv_resp = self.core_api.delete_persistent_volume(name=pv.metadata.name) - if opts.o.debug: - print("PV deleted:") - print(f"{pv_resp}") + try: + pv_resp = self.core_api.delete_persistent_volume(name=pv.metadata.name) + if opts.o.debug: + print("PV deleted:") + print(f"{pv_resp}") + except client.exceptions.ApiException as e: + _check_delete_exception(e) # Figure out the PVCs for this deployment pvcs = self.cluster_info.get_pvcs() for pvc in pvcs: if opts.o.debug: print(f"Deleting this pvc: {pvc}") - pvc_resp = self.core_api.delete_namespaced_persistent_volume_claim(name=pvc.metadata.name, namespace=self.k8s_namespace) - if opts.o.debug: - print("PVCs deleted:") - print(f"{pvc_resp}") + try: + pvc_resp = self.core_api.delete_namespaced_persistent_volume_claim( + name=pvc.metadata.name, namespace=self.k8s_namespace + ) + if opts.o.debug: + print("PVCs deleted:") + print(f"{pvc_resp}") + except client.exceptions.ApiException as e: + _check_delete_exception(e) deployment = self.cluster_info.get_deployment() if opts.o.debug: print(f"Deleting this deployment: {deployment}") - self.apps_api.delete_namespaced_deployment( - name=deployment.metadata.name, namespace=self.k8s_namespace - ) + try: + self.apps_api.delete_namespaced_deployment( + name=deployment.metadata.name, namespace=self.k8s_namespace + ) + except client.exceptions.ApiException as e: + _check_delete_exception(e) service: client.V1Service = self.cluster_info.get_service() if opts.o.debug: print(f"Deleting service: {service}") - self.core_api.delete_namespaced_service( - namespace=self.k8s_namespace, - body=service - ) + try: + self.core_api.delete_namespaced_service( + namespace=self.k8s_namespace, + name=service.metadata.name + ) + except client.exceptions.ApiException as e: + _check_delete_exception(e) # TODO: disable ingress for kind ingress: client.V1Ingress = self.cluster_info.get_ingress() if opts.o.debug: print(f"Deleting this ingress: {ingress}") - self.networking_api.delete_namespaced_ingress( - name=ingress.metadata.name, namespace=self.k8s_namespace - ) + try: + self.networking_api.delete_namespaced_ingress( + name=ingress.metadata.name, namespace=self.k8s_namespace + ) + except client.exceptions.ApiException as e: + _check_delete_exception(e) if self.is_kind(): # Destroy the kind cluster