From e2dec91460497df97e020414854f0484d0dfb704 Mon Sep 17 00:00:00 2001 From: Mike Graves Date: Mon, 2 May 2022 11:43:19 -0400 Subject: [PATCH] k8s - fix issue when try to delete resources using label_selectors option (#434) (#444) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [backport/2.3] k8s - fix issue when try to delete resources using label_selectors op… Depends-On: #446 k8s - fix issue when try to delete resources using label_selectors SUMMARY The kubernetes dynamic client has label_selector parameter for the delete method, however based on the documentation of REST API we cannot delete resources using labelSelector option, this fix update the way the resources are deleted. The list of resources are deleted one after another like in the kubectl go client. Fixes #428 ISSUE TYPE Bugfix Pull Request Reviewed-by: Abhijeet Kasurde (cherry picked from commit f2f4b66) --- ...4-fix-k8s-delete-using-label_selector.yaml | 3 ++ plugins/module_utils/common.py | 15 ++++++- .../targets/k8s_delete/tasks/main.yml | 45 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/434-fix-k8s-delete-using-label_selector.yaml diff --git a/changelogs/fragments/434-fix-k8s-delete-using-label_selector.yaml b/changelogs/fragments/434-fix-k8s-delete-using-label_selector.yaml new file mode 100644 index 00000000..d4c619bd --- /dev/null +++ b/changelogs/fragments/434-fix-k8s-delete-using-label_selector.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - k8s - fix the issue when trying to delete resources using label_selectors options (https://github.com/ansible-collections/kubernetes.core/issues/433). diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index 6a860c8b..08838a9f 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -995,6 +995,7 @@ class K8sAnsibleMixin(object): if self.check_mode and not self.supports_dry_run: return result else: + params = {"namespace": namespace} if delete_options: body = { "apiVersion": "v1", @@ -1005,8 +1006,18 @@ class K8sAnsibleMixin(object): if self.check_mode: params["dry_run"] = "All" try: - k8s_obj = resource.delete(**params) - result["result"] = k8s_obj.to_dict() + if existing.kind.endswith("List"): + result["result"] = [] + for item in existing.items: + origin_name = item.metadata.name + params["name"] = origin_name + k8s_obj = resource.delete(**params) + result["result"].append(k8s_obj.to_dict()) + else: + origin_name = existing.metadata.name + params["name"] = origin_name + k8s_obj = resource.delete(**params) + result["result"] = k8s_obj.to_dict() except DynamicApiError as exc: msg = "Failed to delete object: {0}".format(exc.body) if continue_on_error: diff --git a/tests/integration/targets/k8s_delete/tasks/main.yml b/tests/integration/targets/k8s_delete/tasks/main.yml index f3dafd78..88edf59b 100644 --- a/tests/integration/targets/k8s_delete/tasks/main.yml +++ b/tests/integration/targets/k8s_delete/tasks/main.yml @@ -76,6 +76,51 @@ that: - not pods_delete.resources + # test deletion using label selector + - name: Deploy load balancer + k8s: + namespace: "{{ test_namespace }}" + definition: + apiVersion: v1 + kind: Service + metadata: + labels: + test: deletion + name: "deletion-svc-{{ item }}" + spec: + ports: + - port: 5000 + targetPort: 5000 + selector: + test: deletion + type: LoadBalancer + with_items: + - "01" + - "02" + - "03" + + - name: Delete services using label selector + kubernetes.core.k8s: + api_version: v1 + namespace: "{{ test_namespace }}" + kind: Service + state: absent + label_selectors: + - test=deletion + + - name: list services using label selector + k8s_info: + kind: Service + namespace: "{{ test_namespace }}" + label_selectors: + - test=deletion + register: _result + + - name: Validate that all services were deleted + assert: + that: + - _result.resources | length == 0 + always: - name: Remove namespace k8s: