From 52f2cb55871dfb79e56129f84401c32fbfe6b06c Mon Sep 17 00:00:00 2001 From: Ottavia Balducci <62117827+OttaviaB@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:45:47 +0100 Subject: [PATCH] Improve error message for pod disruption budget when draining a node (#798) SUMMARY Closes #797 . The error message "Too Many Requests" is confusing and is changed to a more meaningful message: TASK [Drain node] ************************************************************************* Montag 25 November 2024 09:20:28 +0100 (0:00:00.014) 0:00:00.014 ******* fatal: [host -> localhost]: FAILED! => {"changed": false, "msg": "Failed to delete pod kube-public/draintest-6b84677b99-9jf7m due to: Cannot evict pod as it would violate the pod's disruption budget."} The new task output would allow to deal with a pod disruption budget with the retries/until logic in a more controlled way: --- - hosts: "{{ target }}" serial: 1 gather_facts: false tasks: - name: Drain node kubernetes.core.k8s_drain: kubeconfig: "{{ kubeconfig_path }}" name: "{{ inventory_hostname }}" delete_options: ignore_daemonsets: true delete_emptydir_data: true wait_timeout: 100 disable_eviction: false wait_sleep: 1 delegate_to: localhost retries: 10 delay: 5 until: drain_result is success or 'disruption budget' not in drain_result.msg register: drain_result ISSUE TYPE Feature Pull Request COMPONENT NAME k8s_drain Reviewed-by: Mike Graves --- .../fragments/798-drain-pdb-error-message.yaml | 2 ++ plugins/modules/k8s_drain.py | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/798-drain-pdb-error-message.yaml diff --git a/changelogs/fragments/798-drain-pdb-error-message.yaml b/changelogs/fragments/798-drain-pdb-error-message.yaml new file mode 100644 index 0000000000..61b4a2573e --- /dev/null +++ b/changelogs/fragments/798-drain-pdb-error-message.yaml @@ -0,0 +1,2 @@ +minor_changes: + - k8s_drain - Improve error message for pod disruption budget when draining a node (https://github.com/ansible-collections/kubernetes.core/issues/797). diff --git a/plugins/modules/k8s_drain.py b/plugins/modules/k8s_drain.py index 9d8561e708..6544553b0d 100644 --- a/plugins/modules/k8s_drain.py +++ b/plugins/modules/k8s_drain.py @@ -143,6 +143,7 @@ """ import copy +import json import time import traceback from datetime import datetime @@ -187,6 +188,17 @@ HAS_EVICTION_API = False +def format_dynamic_api_exc(exc): + if exc.body: + if exc.headers and exc.headers.get("Content-Type") == "application/json": + message = json.loads(exc.body).get("message") + if message: + return message + return exc.body + else: + return "%s Reason: %s" % (exc.status, exc.reason) + + def filter_pods(pods, force, ignore_daemonset, delete_emptydir_data): k8s_kind_mirror = "kubernetes.io/config.mirror" daemonSet, unmanaged, mirror, localStorage, to_delete = [], [], [], [], [] @@ -338,7 +350,7 @@ def evict_pods(self, pods): if exc.reason != "Not Found": self._module.fail_json( msg="Failed to delete pod {0}/{1} due to: {2}".format( - namespace, name, exc.reason + namespace, name, to_native(format_dynamic_api_exc(exc)) ) ) except Exception as exc: