From 058a69e6b037c87229d1d28742458e90fc1522cd Mon Sep 17 00:00:00 2001 From: Martin Krizek Date: Thu, 2 Jun 2022 16:18:45 +0200 Subject: [PATCH] Properly send a skipped message for empty templated loop (#77945) Fixes #77934 --- .../77934-empty-loop-template-callback.yml | 2 ++ lib/ansible/plugins/callback/default.py | 12 +++++------ .../callback_default.out.default.stdout | 13 +++++++++++- ...default.out.display_path_on_failure.stdout | 13 +++++++++++- ...llback_default.out.failed_to_stderr.stdout | 13 +++++++++++- .../callback_default.out.hide_ok.stdout | 13 +++++++++++- .../callback_default.out.hide_skipped.stdout | 2 +- ...allback_default.out.hide_skipped_ok.stdout | 2 +- ...back_default.out.result_format_yaml.stdout | 13 +++++++++++- ...ut.result_format_yaml_lossy_verbose.stdout | 20 ++++++++++++++++++- ...ault.out.result_format_yaml_verbose.stdout | 20 ++++++++++++++++++- .../targets/callback_default/test.yml | 17 ++++++++++++++++ 12 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 changelogs/fragments/77934-empty-loop-template-callback.yml diff --git a/changelogs/fragments/77934-empty-loop-template-callback.yml b/changelogs/fragments/77934-empty-loop-template-callback.yml new file mode 100644 index 00000000000..5491c21b558 --- /dev/null +++ b/changelogs/fragments/77934-empty-loop-template-callback.yml @@ -0,0 +1,2 @@ +bugfixes: + - "Properly send a skipped message when a list in a ``loop`` is empty and comes from a template (https://github.com/ansible/ansible/issues/77934)" diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py index c5cc0e77ef5..54ef452f043 100644 --- a/lib/ansible/plugins/callback/default.py +++ b/lib/ansible/plugins/callback/default.py @@ -114,13 +114,13 @@ class CallbackModule(CallbackBase): if self._last_task_banner != result._task._uuid: self._print_task_banner(result._task) - if result._task.loop and 'results' in result._result: + if result._task.loop is not None and 'results' in result._result: self._process_items(result) - else: - msg = "skipping: [%s]" % result._host.get_name() - if self._run_is_verbose(result): - msg += " => %s" % self._dump_results(result._result) - self._display.display(msg, color=C.COLOR_SKIP) + + msg = "skipping: [%s]" % result._host.get_name() + if self._run_is_verbose(result): + msg += " => %s" % self._dump_results(result._result) + self._display.display(msg, color=C.COLOR_SKIP) def v2_runner_on_unreachable(self, result): if self._last_task_banner != result._task._uuid: diff --git a/test/integration/targets/callback_default/callback_default.out.default.stdout b/test/integration/targets/callback_default/callback_default.out.default.stdout index e34b5a4b612..5502b343253 100644 --- a/test/integration/targets/callback_default/callback_default.out.default.stdout +++ b/test/integration/targets/callback_default/callback_default.out.default.stdout @@ -67,6 +67,17 @@ changed: [testhost] TASK [replace] ***************************************************************** ok: [testhost] +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) +skipping: [testhost] => (item=2) +skipping: [testhost] + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] @@ -93,5 +104,5 @@ ok: [testhost] => { } PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.display_path_on_failure.stdout b/test/integration/targets/callback_default/callback_default.out.display_path_on_failure.stdout index d9ffd575537..22f3f513a96 100644 --- a/test/integration/targets/callback_default/callback_default.out.display_path_on_failure.stdout +++ b/test/integration/targets/callback_default/callback_default.out.display_path_on_failure.stdout @@ -70,6 +70,17 @@ changed: [testhost] TASK [replace] ***************************************************************** ok: [testhost] +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) +skipping: [testhost] => (item=2) +skipping: [testhost] + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] @@ -96,5 +107,5 @@ ok: [testhost] => { } PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout index 8e165a41ed5..87af5bec535 100644 --- a/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout +++ b/test/integration/targets/callback_default/callback_default.out.failed_to_stderr.stdout @@ -61,6 +61,17 @@ changed: [testhost] TASK [replace] ***************************************************************** ok: [testhost] +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) +skipping: [testhost] => (item=2) +skipping: [testhost] + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] @@ -87,5 +98,5 @@ ok: [testhost] => { } PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout b/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout index 2b019d312c3..3921f73bcb5 100644 --- a/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout +++ b/test/integration/targets/callback_default/callback_default.out.hide_ok.stdout @@ -53,6 +53,17 @@ TASK [replace] ***************************************************************** changed: [testhost] +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) +skipping: [testhost] => (item=2) +skipping: [testhost] + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] @@ -71,5 +82,5 @@ TASK [Include some tasks] ****************************************************** included: .../test/integration/targets/callback_default/include_me.yml for testhost => (item=1) PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout b/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout index c6cd49135ae..b291869f35f 100644 --- a/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout +++ b/test/integration/targets/callback_default/callback_default.out.hide_skipped.stdout @@ -89,5 +89,5 @@ ok: [testhost] => { } PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout b/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout index 45a5ecf62a9..e3eb9370e32 100644 --- a/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout +++ b/test/integration/targets/callback_default/callback_default.out.hide_skipped_ok.stdout @@ -67,5 +67,5 @@ TASK [Include some tasks] ****************************************************** included: .../test/integration/targets/callback_default/include_me.yml for testhost => (item=1) PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.result_format_yaml.stdout b/test/integration/targets/callback_default/callback_default.out.result_format_yaml.stdout index 5e93b976013..87ddc60e0f9 100644 --- a/test/integration/targets/callback_default/callback_default.out.result_format_yaml.stdout +++ b/test/integration/targets/callback_default/callback_default.out.result_format_yaml.stdout @@ -68,6 +68,17 @@ changed: [testhost] TASK [replace] ***************************************************************** ok: [testhost] +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) +skipping: [testhost] => (item=2) +skipping: [testhost] + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] @@ -93,5 +104,5 @@ ok: [testhost] => item: 1 PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.result_format_yaml_lossy_verbose.stdout b/test/integration/targets/callback_default/callback_default.out.result_format_yaml_lossy_verbose.stdout index 806841b0c5e..71a4ef9ebf6 100644 --- a/test/integration/targets/callback_default/callback_default.out.result_format_yaml_lossy_verbose.stdout +++ b/test/integration/targets/callback_default/callback_default.out.result_format_yaml_lossy_verbose.stdout @@ -188,6 +188,24 @@ ok: [testhost] => msg: 1 replacements made rc: 0 +TASK [debug] ******************************************************************* +skipping: [testhost] => + skipped_reason: No items in the list + +TASK [debug] ******************************************************************* +skipping: [testhost] => + skipped_reason: No items in the list + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) => + ansible_loop_var: item + item: 1 +skipping: [testhost] => (item=2) => + ansible_loop_var: item + item: 2 +skipping: [testhost] => + msg: All items skipped + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] => changed: true @@ -278,5 +296,5 @@ ok: [testhost] => item: 1 PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/callback_default.out.result_format_yaml_verbose.stdout b/test/integration/targets/callback_default/callback_default.out.result_format_yaml_verbose.stdout index b5017d7a713..7a99cc74f70 100644 --- a/test/integration/targets/callback_default/callback_default.out.result_format_yaml_verbose.stdout +++ b/test/integration/targets/callback_default/callback_default.out.result_format_yaml_verbose.stdout @@ -195,6 +195,24 @@ ok: [testhost] => msg: 1 replacements made rc: 0 +TASK [debug] ******************************************************************* +skipping: [testhost] => + skipped_reason: No items in the list + +TASK [debug] ******************************************************************* +skipping: [testhost] => + skipped_reason: No items in the list + +TASK [debug] ******************************************************************* +skipping: [testhost] => (item=1) => + ansible_loop_var: item + item: 1 +skipping: [testhost] => (item=2) => + ansible_loop_var: item + item: 2 +skipping: [testhost] => + msg: All items skipped + RUNNING HANDLER [Test handler 1] *********************************************** changed: [testhost] => changed: true @@ -290,5 +308,5 @@ ok: [testhost] => item: 1 PLAY RECAP ********************************************************************* -testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=1 rescued=1 ignored=2 +testhost : ok=19 changed=11 unreachable=0 failed=0 skipped=4 rescued=1 ignored=2 diff --git a/test/integration/targets/callback_default/test.yml b/test/integration/targets/callback_default/test.yml index a10e8f9dd7d..79cea2798a0 100644 --- a/test/integration/targets/callback_default/test.yml +++ b/test/integration/targets/callback_default/test.yml @@ -78,6 +78,23 @@ diff: true changed_when: false + - debug: + msg: "{{ item }}" + loop: [] + + - debug: + msg: "{{ item }}" + loop: "{{ empty_list }}" + vars: + empty_list: [] + + - debug: + msg: "{{ item }}" + when: False + loop: + - 1 + - 2 + handlers: - name: Test handler 1 command: echo foo