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: