From ee9939c54fc176a84cfa22e7cbcbce3244856437 Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:24:33 +0000 Subject: [PATCH] Make k8s_drain work when only one pod is present (#770) (#821) This is a backport of PR #770 as merged into main (4c305e7). SUMMARY Fixes #769 . k8s_drain was not checking if a pod has been deleted when there was only one pod on the node to be drained. The list of pods, pods, was being "popped" before the first iteration of the while loop: pod = pods.pop() while (_elapsed_time() < wait_timeout or wait_timeout == 0) and pods: When pods contains only one element, the while loop is skipped. ISSUE TYPE Bugfix Pull Request COMPONENT NAME k8s_drain --- .../770-fix-k8s-drain-doesnt-wait-for-single-pod.yaml | 2 ++ plugins/modules/k8s_drain.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/770-fix-k8s-drain-doesnt-wait-for-single-pod.yaml diff --git a/changelogs/fragments/770-fix-k8s-drain-doesnt-wait-for-single-pod.yaml b/changelogs/fragments/770-fix-k8s-drain-doesnt-wait-for-single-pod.yaml new file mode 100644 index 00000000..a063d79c --- /dev/null +++ b/changelogs/fragments/770-fix-k8s-drain-doesnt-wait-for-single-pod.yaml @@ -0,0 +1,2 @@ +bugfixes: + - k8s_drain - Fix k8s_drain does not wait for single pod (https://github.com/ansible-collections/kubernetes.core/issues/769). diff --git a/plugins/modules/k8s_drain.py b/plugins/modules/k8s_drain.py index d23c8212..6544553b 100644 --- a/plugins/modules/k8s_drain.py +++ b/plugins/modules/k8s_drain.py @@ -303,10 +303,10 @@ class K8sDrainAnsible(object): return (datetime.now() - start).seconds response = None - pod = pods.pop() + pod = None while (_elapsed_time() < wait_timeout or wait_timeout == 0) and pods: if not pod: - pod = pods.pop() + pod = pods[-1] try: response = self._api_instance.read_namespaced_pod( namespace=pod[0], name=pod[1] @@ -315,6 +315,7 @@ class K8sDrainAnsible(object): "name" ): pod = None + del pods[-1] time.sleep(wait_sleep) except ApiException as exc: if exc.reason != "Not Found": @@ -322,6 +323,7 @@ class K8sDrainAnsible(object): msg="Exception raised: {0}".format(exc.reason) ) pod = None + del pods[-1] except Exception as e: self._module.fail_json(msg="Exception raised: {0}".format(to_native(e))) if not pods: