From 028eb81befaa74423c2c6f444c197f54d4dbe53a Mon Sep 17 00:00:00 2001 From: Ottavia Balducci <62117827+OttaviaB@users.noreply.github.com> Date: Fri, 1 Nov 2024 15:22:27 +0100 Subject: [PATCH] Make k8s_drain work when only one pod is present (#770) 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 Reviewed-by: Mike Graves (cherry picked from commit 4c305e73f0a5785752de0af5189acd4dd537e198) --- .../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 0000000000..a063d79c81 --- /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 d23c8212a8..6544553b0d 100644 --- a/plugins/modules/k8s_drain.py +++ b/plugins/modules/k8s_drain.py @@ -303,10 +303,10 @@ def _elapsed_time(): 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 @@ def _elapsed_time(): "name" ): pod = None + del pods[-1] time.sleep(wait_sleep) except ApiException as exc: if exc.reason != "Not Found": @@ -322,6 +323,7 @@ def _elapsed_time(): 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: