From 144c6a110df3b835ec0d8b90fb2ae1bdf0e2a2cf Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Fri, 17 May 2019 09:42:36 -0500 Subject: [PATCH 1/3] Whitelist listen as a valid keyword on TaskInclude. Fixes #56580 --- changelogs/fragments/include_tasks_listen.yml | 3 ++ lib/ansible/playbook/task_include.py | 6 +-- .../valid_include_keywords/include_me.yml | 6 +++ .../include_me_listen.yml | 2 + .../include_me_notify.yml | 2 + .../valid_include_keywords/playbook.yml | 40 +++++++++++++++++++ 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/include_tasks_listen.yml create mode 100644 test/integration/targets/include_import/valid_include_keywords/include_me.yml create mode 100644 test/integration/targets/include_import/valid_include_keywords/include_me_listen.yml create mode 100644 test/integration/targets/include_import/valid_include_keywords/include_me_notify.yml create mode 100644 test/integration/targets/include_import/valid_include_keywords/playbook.yml diff --git a/changelogs/fragments/include_tasks_listen.yml b/changelogs/fragments/include_tasks_listen.yml new file mode 100644 index 00000000000000..0072fff5a9dc79 --- /dev/null +++ b/changelogs/fragments/include_tasks_listen.yml @@ -0,0 +1,3 @@ +bugfixes: +- include_tasks - whitelist ``listen`` as a valid keyword + (https://github.com/ansible/ansible/issues/56580) diff --git a/lib/ansible/playbook/task_include.py b/lib/ansible/playbook/task_include.py index 4eb705ae2f5aaf..51ee91e1f5bd44 100644 --- a/lib/ansible/playbook/task_include.py +++ b/lib/ansible/playbook/task_include.py @@ -42,9 +42,9 @@ class TaskInclude(Task): BASE = frozenset(('file', '_raw_params')) # directly assigned OTHER_ARGS = frozenset(('apply',)) # assigned to matching property VALID_ARGS = BASE.union(OTHER_ARGS) # all valid args - VALID_INCLUDE_KEYWORDS = frozenset(('action', 'args', 'debugger', 'ignore_errors', 'loop', 'loop_control', - 'loop_with', 'name', 'no_log', 'register', 'run_once', 'tags', 'vars', - 'when')) + VALID_INCLUDE_KEYWORDS = frozenset(('action', 'args', 'debugger', 'ignore_errors', 'listen', 'loop', + 'loop_control', 'loop_with', 'name', 'no_log', 'register', 'run_once', 'tags', + 'vars', 'when')) # ================================================================================= # ATTRIBUTES diff --git a/test/integration/targets/include_import/valid_include_keywords/include_me.yml b/test/integration/targets/include_import/valid_include_keywords/include_me.yml new file mode 100644 index 00000000000000..ab5c6a9c967c1a --- /dev/null +++ b/test/integration/targets/include_import/valid_include_keywords/include_me.yml @@ -0,0 +1,6 @@ +- debug: + msg: include_me +- assert: + that: + - loopy == 1 + - baz == 'qux' diff --git a/test/integration/targets/include_import/valid_include_keywords/include_me_listen.yml b/test/integration/targets/include_import/valid_include_keywords/include_me_listen.yml new file mode 100644 index 00000000000000..47b424ada1ba98 --- /dev/null +++ b/test/integration/targets/include_import/valid_include_keywords/include_me_listen.yml @@ -0,0 +1,2 @@ +- debug: + msg: listen diff --git a/test/integration/targets/include_import/valid_include_keywords/include_me_notify.yml b/test/integration/targets/include_import/valid_include_keywords/include_me_notify.yml new file mode 100644 index 00000000000000..4501e38047c966 --- /dev/null +++ b/test/integration/targets/include_import/valid_include_keywords/include_me_notify.yml @@ -0,0 +1,2 @@ +- debug: + msg: notify diff --git a/test/integration/targets/include_import/valid_include_keywords/playbook.yml b/test/integration/targets/include_import/valid_include_keywords/playbook.yml new file mode 100644 index 00000000000000..ce3793fcef3b21 --- /dev/null +++ b/test/integration/targets/include_import/valid_include_keywords/playbook.yml @@ -0,0 +1,40 @@ +- hosts: localhost + gather_facts: false + handlers: + - include_tasks: include_me_listen.yml + listen: + - include_me_listen + + - name: Include Me Notify + include_tasks: include_me_notify.yml + + tasks: + - name: Include me + include_tasks: include_me.yml + args: + apply: + tags: + - bar + debugger: ~ + ignore_errors: false + loop: + - 1 + loop_control: + loop_var: loopy + no_log: false + register: this_isnt_useful + run_once: true + tags: + - foo + vars: + baz: qux + when: true + + - command: "true" + notify: + - include_me_listen + + - command: "true" + notify: + - Include Me Notify + From 1466384749f58850af0e0ea00e36a9ae8b6802d8 Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Fri, 17 May 2019 10:03:35 -0500 Subject: [PATCH 2/3] Move 'listen' to HandlerTaskInclude --- lib/ansible/playbook/handler_task_include.py | 2 ++ lib/ansible/playbook/task_include.py | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/ansible/playbook/handler_task_include.py b/lib/ansible/playbook/handler_task_include.py index 6fc7de3f447025..90290f481b4045 100644 --- a/lib/ansible/playbook/handler_task_include.py +++ b/lib/ansible/playbook/handler_task_include.py @@ -26,6 +26,8 @@ class HandlerTaskInclude(Handler, TaskInclude): + VALID_INCLUDE_KEYWORDS = frozenset(('listen',) + tuple(TaskInclude.VALID_INCLUDE_KEYWORDS)) + @staticmethod def load(data, block=None, role=None, task_include=None, variable_manager=None, loader=None): t = HandlerTaskInclude(block=block, role=role, task_include=task_include) diff --git a/lib/ansible/playbook/task_include.py b/lib/ansible/playbook/task_include.py index 51ee91e1f5bd44..365ce30bb65068 100644 --- a/lib/ansible/playbook/task_include.py +++ b/lib/ansible/playbook/task_include.py @@ -42,9 +42,9 @@ class TaskInclude(Task): BASE = frozenset(('file', '_raw_params')) # directly assigned OTHER_ARGS = frozenset(('apply',)) # assigned to matching property VALID_ARGS = BASE.union(OTHER_ARGS) # all valid args - VALID_INCLUDE_KEYWORDS = frozenset(('action', 'args', 'debugger', 'ignore_errors', 'listen', 'loop', - 'loop_control', 'loop_with', 'name', 'no_log', 'register', 'run_once', 'tags', - 'vars', 'when')) + VALID_INCLUDE_KEYWORDS = frozenset(('action', 'args', 'debugger', 'ignore_errors', 'loop', 'loop_control', + 'loop_with', 'name', 'no_log', 'register', 'run_once', 'tags', 'vars', + 'when')) # ================================================================================= # ATTRIBUTES @@ -82,7 +82,7 @@ def load(data, block=None, role=None, task_include=None, variable_manager=None, def preprocess_data(self, ds): ds = super(TaskInclude, self).preprocess_data(ds) - diff = set(ds.keys()).difference(TaskInclude.VALID_INCLUDE_KEYWORDS) + diff = set(ds.keys()).difference(self.VALID_INCLUDE_KEYWORDS) for k in diff: # This check doesn't handle ``include`` as we have no idea at this point if it is static or not if ds[k] is not Sentinel and ds['action'] in ('include_tasks', 'include_role'): From c667a91b5a90697a0f0ff4750021cb7a135fa88b Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Fri, 17 May 2019 12:10:27 -0500 Subject: [PATCH 3/3] Remove trailing newline --- .../targets/include_import/valid_include_keywords/playbook.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/test/integration/targets/include_import/valid_include_keywords/playbook.yml b/test/integration/targets/include_import/valid_include_keywords/playbook.yml index ce3793fcef3b21..a7ddeb4e92b996 100644 --- a/test/integration/targets/include_import/valid_include_keywords/playbook.yml +++ b/test/integration/targets/include_import/valid_include_keywords/playbook.yml @@ -37,4 +37,3 @@ - command: "true" notify: - Include Me Notify -