From 1b74d98e38b0eb90b0a4c79f225839952f5cfa63 Mon Sep 17 00:00:00 2001 From: Bavneet Singh Date: Tue, 3 Mar 2026 16:06:16 -0800 Subject: [PATCH 1/4] handle 'ResourceGroupNotFound' in connectedk8s delete by skipping ARM deletion --- src/connectedk8s/azext_connectedk8s/custom.py | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/connectedk8s/azext_connectedk8s/custom.py b/src/connectedk8s/azext_connectedk8s/custom.py index d0e399bcbb2..3e60bc527d5 100644 --- a/src/connectedk8s/azext_connectedk8s/custom.py +++ b/src/connectedk8s/azext_connectedk8s/custom.py @@ -1886,8 +1886,20 @@ def delete_connectedk8s( logger.warning("This operation might take a while ...\n") # Check if the cluster is of supported type for deletion - cluster_resource = client.get(resource_group_name, cluster_name) - if (cluster_resource.kind is not None) and ( + cluster_resource = None + try: + cluster_resource = client.get(resource_group_name, cluster_name) + except HttpResponseError as ex: + # If the resource group or cluster resource is not found, proceed with local cleanup + if ex.error and ex.error.code in ("ResourceGroupNotFound", "ResourceNotFound"): + logger.warning( + "Could not find the Azure resource (resource group or cluster may have been deleted). " + "Proceeding with local cleanup." + ) + else: + raise + + if cluster_resource is not None and (cluster_resource.kind is not None) and ( cluster_resource.kind.lower() == consts.Provisioned_Cluster_Kind ): err_msg = ( @@ -1929,9 +1941,10 @@ def delete_connectedk8s( print(f"Step: {utils.get_utctimestring()}: Performing Force Delete") kubectl_client_location = install_kubectl_client() - delete_cc_resource( - client, resource_group_name, cluster_name, no_wait, force=force_delete - ).result() + if cluster_resource is not None: + delete_cc_resource( + client, resource_group_name, cluster_name, no_wait, force=force_delete + ).result() # Explicit CRD Deletion crd_cleanup_force_delete( @@ -1951,9 +1964,10 @@ def delete_connectedk8s( return if not release_namespace: - delete_cc_resource( - client, resource_group_name, cluster_name, no_wait, force=force_delete - ).result() + if cluster_resource is not None: + delete_cc_resource( + client, resource_group_name, cluster_name, no_wait, force=force_delete + ).result() return # Loading config map @@ -2004,9 +2018,10 @@ def delete_connectedk8s( recommendation=reco_str, ) - delete_cc_resource( - client, resource_group_name, cluster_name, no_wait, force=force_delete - ).result() + if cluster_resource is not None: + delete_cc_resource( + client, resource_group_name, cluster_name, no_wait, force=force_delete + ).result() else: telemetry.set_exception( exception="Unable to delete connected cluster", From bb02653bb7d3819b1baa3fa509bd770c7ac135be Mon Sep 17 00:00:00 2001 From: Bavneet Singh Date: Tue, 3 Mar 2026 16:18:22 -0800 Subject: [PATCH 2/4] fix ruff format CI failure --- src/connectedk8s/azext_connectedk8s/custom.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/connectedk8s/azext_connectedk8s/custom.py b/src/connectedk8s/azext_connectedk8s/custom.py index 3e60bc527d5..ed2d1c145e7 100644 --- a/src/connectedk8s/azext_connectedk8s/custom.py +++ b/src/connectedk8s/azext_connectedk8s/custom.py @@ -1899,8 +1899,10 @@ def delete_connectedk8s( else: raise - if cluster_resource is not None and (cluster_resource.kind is not None) and ( - cluster_resource.kind.lower() == consts.Provisioned_Cluster_Kind + if ( + cluster_resource is not None + and (cluster_resource.kind is not None) + and (cluster_resource.kind.lower() == consts.Provisioned_Cluster_Kind) ): err_msg = ( "Deleting a Provisioned Cluster is not supported from the Connected Cluster CLI. Please use the " From 442bebcfe6ad496311cd17e8788a0f6945952320 Mon Sep 17 00:00:00 2001 From: Bavneet Singh Date: Tue, 3 Mar 2026 16:21:19 -0800 Subject: [PATCH 3/4] fix typecheck format CI failure --- src/connectedk8s/azext_connectedk8s/_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connectedk8s/azext_connectedk8s/_utils.py b/src/connectedk8s/azext_connectedk8s/_utils.py index 15547848469..4cd361089c8 100644 --- a/src/connectedk8s/azext_connectedk8s/_utils.py +++ b/src/connectedk8s/azext_connectedk8s/_utils.py @@ -104,11 +104,11 @@ def validate_connect_rp_location(cmd: CLICommand, location: str) -> None: "Failed to fetch resource provider details", ) - for resourceTypes in providerDetails.resource_types: # type: ignore[attr-defined] + for resourceTypes in providerDetails.resource_types or []: # type: ignore[attr-defined] if resourceTypes.resource_type == "connectedClusters": rp_locations = [ location.replace(" ", "").lower() - for location in resourceTypes.locations + for location in (resourceTypes.locations or []) ] if location.lower() not in rp_locations: telemetry.set_exception( From fe9043c69ee395079ff04c76a7a8f8b1964597de Mon Sep 17 00:00:00 2001 From: Bavneet Singh Date: Tue, 3 Mar 2026 16:26:44 -0800 Subject: [PATCH 4/4] remove redundant typecheck comment --- src/connectedk8s/azext_connectedk8s/_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connectedk8s/azext_connectedk8s/_utils.py b/src/connectedk8s/azext_connectedk8s/_utils.py index 4cd361089c8..7c8ab47b4da 100644 --- a/src/connectedk8s/azext_connectedk8s/_utils.py +++ b/src/connectedk8s/azext_connectedk8s/_utils.py @@ -104,7 +104,7 @@ def validate_connect_rp_location(cmd: CLICommand, location: str) -> None: "Failed to fetch resource provider details", ) - for resourceTypes in providerDetails.resource_types or []: # type: ignore[attr-defined] + for resourceTypes in providerDetails.resource_types or []: if resourceTypes.resource_type == "connectedClusters": rp_locations = [ location.replace(" ", "").lower()