From e87fe77453bfbe4f46f505d249861e64b9e9a25c Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 15:16:01 -0400 Subject: [PATCH] Update pod deletion conditions for local storage used in a daemon set pod (#1095) (#1128) * Update pod deletion conditions for local storage used in a daemon set pod Refactor pod deletion logic to handle local storage in daemon set pods correctly. * Add bugfix for k8s_drain handling local storage pods Fix logic for handling pods with local storage in k8s_drain. * Refactor filter_pods function for clarity and efficiency * Fix sanity and linter errors --------- (cherry picked from commit b58b2ca70e367c1876e916ab43861d27bb4c96a3) Co-authored-by: Juan Morete Co-authored-by: Bianca Henderson --- ...ain-delete-logic-fixes-for-daemonsets.yaml | 3 +++ plugins/modules/k8s_drain.py | 24 +++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 changelogs/fragments/20260306-k8s_drain-delete-logic-fixes-for-daemonsets.yaml diff --git a/changelogs/fragments/20260306-k8s_drain-delete-logic-fixes-for-daemonsets.yaml b/changelogs/fragments/20260306-k8s_drain-delete-logic-fixes-for-daemonsets.yaml new file mode 100644 index 00000000..cae29ded --- /dev/null +++ b/changelogs/fragments/20260306-k8s_drain-delete-logic-fixes-for-daemonsets.yaml @@ -0,0 +1,3 @@ +--- +bugfixes: + - k8s_drain - Fix logic for handling pods with local storage to correctly check for empty_dir volumes in replicated pods and pods managed by DaemonSets (https://github.com/ansible-collections/kubernetes.core/pull/1095). diff --git a/plugins/modules/k8s_drain.py b/plugins/modules/k8s_drain.py index a0671a25..56f65f52 100644 --- a/plugins/modules/k8s_drain.py +++ b/plugins/modules/k8s_drain.py @@ -214,21 +214,21 @@ def filter_pods(pods, force, ignore_daemonset, delete_emptydir_data): to_delete.append((pod.metadata.namespace, pod.metadata.name)) continue - # Pod with local storage cannot be deleted - if pod.spec.volumes and any(vol.empty_dir for vol in pod.spec.volumes): - localStorage.append((pod.metadata.namespace, pod.metadata.name)) - continue - # Check replicated Pod - owner_ref = pod.metadata.owner_references - if not owner_ref: + owner_ref = pod.metadata.owner_references or [] + has_local_storage = bool( + pod.spec.volumes and any(vol.empty_dir for vol in pod.spec.volumes) + ) + is_daemonset_managed = any(owner.kind == "DaemonSet" for owner in owner_ref) + + if is_daemonset_managed: + daemonSet.append((pod.metadata.namespace, pod.metadata.name)) + elif has_local_storage: + localStorage.append((pod.metadata.namespace, pod.metadata.name)) + elif not owner_ref: unmanaged.append((pod.metadata.namespace, pod.metadata.name)) else: - for owner in owner_ref: - if owner.kind == "DaemonSet": - daemonSet.append((pod.metadata.namespace, pod.metadata.name)) - else: - to_delete.append((pod.metadata.namespace, pod.metadata.name)) + to_delete.append((pod.metadata.namespace, pod.metadata.name)) warnings, errors, info = [], [], [] if unmanaged: