From b91a234e70da304950edae82b554406b640107c6 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 21 Apr 2021 14:03:17 -0400 Subject: [PATCH 1/6] dont rely on vars, task already gives us info --- changelogs/fragments/restore_delegate_label.yml | 2 ++ lib/ansible/plugins/callback/__init__.py | 9 ++++----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 changelogs/fragments/restore_delegate_label.yml diff --git a/changelogs/fragments/restore_delegate_label.yml b/changelogs/fragments/restore_delegate_label.yml new file mode 100644 index 00000000000000..9f9577b83b3935 --- /dev/null +++ b/changelogs/fragments/restore_delegate_label.yml @@ -0,0 +1,2 @@ +bugfixes: + - callbacks, restore displaying delegation to host as host label. diff --git a/lib/ansible/plugins/callback/__init__.py b/lib/ansible/plugins/callback/__init__.py index 229728aa225969..3dd276f0d99121 100644 --- a/lib/ansible/plugins/callback/__init__.py +++ b/lib/ansible/plugins/callback/__init__.py @@ -104,11 +104,10 @@ def host_label(result): """Return label for the hostname (& delegated hostname) of a task result. """ - hostname = result._host.get_name() - delegated_vars = result._result.get('_ansible_delegated_vars', None) - if delegated_vars: - return "%s -> %s" % (hostname, delegated_vars['ansible_host']) - return "%s" % (hostname,) + label = "%s" % result._host.get_name() + if result._task.delegate_to: + label += " -> %s" % result._task.delegate_to + return label def _run_is_verbose(self, result, verbosity=0): return ((self._display.verbosity > verbosity or result._result.get('_ansible_verbose_always', False) is True) From c5effabec2db4f3c279731a50cb65614d6a7c7b2 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 21 Apr 2021 14:09:17 -0400 Subject: [PATCH 2/6] ensure we always display delegation in host label also added parens with ansible_host to show target host vs resolved host --- lib/ansible/plugins/callback/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/ansible/plugins/callback/__init__.py b/lib/ansible/plugins/callback/__init__.py index 3dd276f0d99121..9cb50aa4b8a84a 100644 --- a/lib/ansible/plugins/callback/__init__.py +++ b/lib/ansible/plugins/callback/__init__.py @@ -21,9 +21,7 @@ import difflib import json -import os import sys -import warnings from copy import deepcopy @@ -106,7 +104,12 @@ def host_label(result): """ label = "%s" % result._host.get_name() if result._task.delegate_to: + # show delegated host label += " -> %s" % result._task.delegate_to + # in case we have 'extra resolution' + ahost = result._result.get('_ansible_delegated_vars', {}).get('ansilbe_host', result._task.delegate_to) + if result._task.delegate_to != ahost: + label += "(%s)" % ahost return label def _run_is_verbose(self, result, verbosity=0): From f832685b94a7889f12eaaa2684bdda11e3408ee5 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 21 Apr 2021 14:16:21 -0400 Subject: [PATCH 3/6] delegating to self is not delegating --- lib/ansible/plugins/callback/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ansible/plugins/callback/__init__.py b/lib/ansible/plugins/callback/__init__.py index 9cb50aa4b8a84a..3e41a66bf86b31 100644 --- a/lib/ansible/plugins/callback/__init__.py +++ b/lib/ansible/plugins/callback/__init__.py @@ -103,7 +103,7 @@ def host_label(result): result. """ label = "%s" % result._host.get_name() - if result._task.delegate_to: + if result._task.delegate_to and result._task.delegate_to != result._host.get_name(): # show delegated host label += " -> %s" % result._task.delegate_to # in case we have 'extra resolution' From dc23a0921059bac66a937e73fb860dab38fd16e5 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 21 Apr 2021 14:23:05 -0400 Subject: [PATCH 4/6] typoes --- lib/ansible/plugins/callback/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ansible/plugins/callback/__init__.py b/lib/ansible/plugins/callback/__init__.py index 3e41a66bf86b31..a1adf3b9ee133d 100644 --- a/lib/ansible/plugins/callback/__init__.py +++ b/lib/ansible/plugins/callback/__init__.py @@ -107,7 +107,7 @@ def host_label(result): # show delegated host label += " -> %s" % result._task.delegate_to # in case we have 'extra resolution' - ahost = result._result.get('_ansible_delegated_vars', {}).get('ansilbe_host', result._task.delegate_to) + ahost = result._result.get('_ansible_delegated_vars', {}).get('ansible_host', result._task.delegate_to) if result._task.delegate_to != ahost: label += "(%s)" % ahost return label From ae847f8edccea7689c634202d5bbffcc478582e9 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Wed, 21 Apr 2021 14:52:17 -0400 Subject: [PATCH 5/6] added delegated vars restoration --- lib/ansible/executor/task_executor.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 9a803437facdb5..987ae4dc3d6a1e 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -728,6 +728,11 @@ def _evaluate_failed_when_result(result): for k in plugin_vars: result["_ansible_delegated_vars"][k] = cvars.get(k) + # note: here for callbacks that rely on this info to display delegation + for requireshed in ('ansible_host', 'ansible_port', 'ansible_user', 'ansible_connection'): + if requireshed not in result["_ansible_delegated_vars"] and requireshed in cvars: + result["_ansible_delegated_vars"][requireshed] = cvars.get(requireshed) + # and return display.debug("attempt loop complete, returning result") return result From eaa5bad3c4190249d49bf8236bf1b2d4766a8a43 Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Tue, 27 Apr 2021 16:16:15 -0400 Subject: [PATCH 6/6] tests need mock task with delegate_to --- test/units/plugins/callback/test_callback.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/units/plugins/callback/test_callback.py b/test/units/plugins/callback/test_callback.py index 43b9274baf5e16..c2ffbb4d880b34 100644 --- a/test/units/plugins/callback/test_callback.py +++ b/test/units/plugins/callback/test_callback.py @@ -32,6 +32,10 @@ from ansible.plugins.callback import CallbackBase +mock_task = MagicMock() +mock_task.delegate_to = None + + class TestCallback(unittest.TestCase): # FIXME: This doesn't really test anything... def test_init(self): @@ -50,13 +54,15 @@ def test_display_verbose(self): self.assertIs(cb._display, display_mock) def test_host_label(self): - result = TaskResult(host=Host('host1'), task=None, return_data={}) + result = TaskResult(host=Host('host1'), task=mock_task, return_data={}) + self.assertEquals(CallbackBase.host_label(result), 'host1') def test_host_label_delegated(self): + mock_task.delegate_to = 'host2' result = TaskResult( host=Host('host1'), - task=None, + task=mock_task, return_data={'_ansible_delegated_vars': {'ansible_host': 'host2'}}, ) self.assertEquals(CallbackBase.host_label(result), 'host1 -> host2')