From c9b212c5bd9b46c2b8178a5e4aca1752e87a4c02 Mon Sep 17 00:00:00 2001 From: Will Thames Date: Thu, 4 Aug 2016 23:13:33 +0100 Subject: [PATCH] task_result _check_key should handle empty results (#16766) When a task result has an empty results list, the list should be ignored when determining the results of `_check_key`. Here the empty list is treated the same as a non-existent list. This fixes a bug that manifests itself with squashed items - namely the task result contains the correct value for the key, but an empty results list. The empty results list was treated as zero failures when deciding which handler to call - so the task show as a success in the output, but is deemed to have failed when deciding whether to continue. This also demonstrates a mismatch between task result processing and play iteration. A test is also added for this case, but it would not have caught the bug - because the bug is really in the display, and not the success/failure of the task (visually the test is more accurate). Fixes ansible/ansible-modules-core#4214 (cherry picked from commit eb2a3a91a8e2baa59e8d2c7c97085e3be7a11f5a) --- lib/ansible/executor/task_result.py | 2 +- test/integration/roles/test_yum/tasks/yum.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/ansible/executor/task_result.py b/lib/ansible/executor/task_result.py index 457a094b734..f7ba7d092c4 100644 --- a/lib/ansible/executor/task_result.py +++ b/lib/ansible/executor/task_result.py @@ -62,7 +62,7 @@ class TaskResult: return self._check_key('unreachable') def _check_key(self, key): - if 'results' in self._result and self._task.loop: + if self._result.get('results', []) and self._task.loop: flag = False for res in self._result.get('results', []): if isinstance(res, dict): diff --git a/test/integration/roles/test_yum/tasks/yum.yml b/test/integration/roles/test_yum/tasks/yum.yml index f6acbfef775..f285326f5f6 100644 --- a/test/integration/roles/test_yum/tasks/yum.yml +++ b/test/integration/roles/test_yum/tasks/yum.yml @@ -185,3 +185,15 @@ - name: uninstall sos and sharutils yum: name=sos,sharutils state=removed + +- name: install non-existent rpm + yum: name="{{ item }}" + with_items: + - does-not-exist + register: non_existent_rpm + ignore_errors: True + +- name: check non-existent rpm install failed + assert: + that: + - non_existent_rpm|failed