From 6dd38c2a1019f2c7edf85ca1f2ef42e60a6bdbeb Mon Sep 17 00:00:00 2001 From: James Cammarata Date: Sat, 26 Sep 2015 11:11:55 -0400 Subject: [PATCH] Fix parent attribute lookup to be default Fixes #12526 --- lib/ansible/playbook/base.py | 5 ++- lib/ansible/playbook/block.py | 83 +++++++++++++++++++---------------- lib/ansible/playbook/task.py | 32 ++++++++------ 3 files changed, 67 insertions(+), 53 deletions(-) diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py index bee42e2f3d5..6e0e3b57389 100644 --- a/lib/ansible/playbook/base.py +++ b/lib/ansible/playbook/base.py @@ -105,7 +105,10 @@ class Base: if hasattr(self, method): return getattr(self, method)() - return self._attributes[prop_name] + value = self._attributes[prop_name] + if value is None and hasattr(self, '_get_parent_attribute'): + value = self._get_parent_attribute(prop_name) + return value @staticmethod def _generic_s(prop_name, self, value): diff --git a/lib/ansible/playbook/block.py b/lib/ansible/playbook/block.py index 395f36bf023..3831ed76004 100644 --- a/lib/ansible/playbook/block.py +++ b/lib/ansible/playbook/block.py @@ -271,45 +271,50 @@ class Block(Base, Become, Conditional, Taggable): Generic logic to get the attribute or parent attribute for a block value. ''' - value = self._attributes[attr] - if self._parent_block and (value is None or extend): - parent_value = getattr(self._parent_block, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._task_include and (value is None or extend): - parent_value = getattr(self._task_include, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._role and (value is None or extend): - parent_value = getattr(self._role, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - - if len(self._dep_chain) and (not value or extend): - reverse_dep_chain = self._dep_chain[:] - reverse_dep_chain.reverse() - for dep in reverse_dep_chain: - dep_value = getattr(dep, attr) - if extend: - value = self._extend_value(value, dep_value) - else: - value = dep_value - - if value is not None and not extend: - break - - if self._play and (value is None or extend): - parent_value = getattr(self._play, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value + value = None + try: + value = self._attributes[attr] + + if self._parent_block and (value is None or extend): + parent_value = getattr(self._parent_block, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._task_include and (value is None or extend): + parent_value = getattr(self._task_include, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._role and (value is None or extend): + parent_value = getattr(self._role, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + + if len(self._dep_chain) and (not value or extend): + reverse_dep_chain = self._dep_chain[:] + reverse_dep_chain.reverse() + for dep in reverse_dep_chain: + dep_value = getattr(dep, attr) + if extend: + value = self._extend_value(value, dep_value) + else: + value = dep_value + + if value is not None and not extend: + break + + if self._play and (value is None or extend): + parent_value = getattr(self._play, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + except KeyError: + pass return value diff --git a/lib/ansible/playbook/task.py b/lib/ansible/playbook/task.py index 8f7e1b77156..e706aa18202 100644 --- a/lib/ansible/playbook/task.py +++ b/lib/ansible/playbook/task.py @@ -363,19 +363,25 @@ class Task(Base, Conditional, Taggable, Become): ''' Generic logic to get the attribute or parent attribute for a task value. ''' - value = self._attributes[attr] - if self._block and (value is None or extend): - parent_value = getattr(self._block, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value - if self._task_include and (value is None or extend): - parent_value = getattr(self._task_include, attr) - if extend: - value = self._extend_value(value, parent_value) - else: - value = parent_value + value = None + try: + value = self._attributes[attr] + + if self._block and (value is None or extend): + parent_value = getattr(self._block, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + if self._task_include and (value is None or extend): + parent_value = getattr(self._task_include, attr) + if extend: + value = self._extend_value(value, parent_value) + else: + value = parent_value + except KeyError: + pass + return value def _get_attr_environment(self):