Add option to prepend inherited attributes when extending values
Fixes #18483
This commit is contained in:
parent
11465134fa
commit
435ca620b2
4 changed files with 16 additions and 11 deletions
|
@ -482,7 +482,7 @@ class Base(with_metaclass(BaseMeta, object)):
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
raise AnsibleParserError("Invalid variable name in vars specified for %s: %s" % (self.__class__.__name__, e), obj=ds)
|
raise AnsibleParserError("Invalid variable name in vars specified for %s: %s" % (self.__class__.__name__, e), obj=ds)
|
||||||
|
|
||||||
def _extend_value(self, value, new_value):
|
def _extend_value(self, value, new_value, prepend=False):
|
||||||
'''
|
'''
|
||||||
Will extend the value given with new_value (and will turn both
|
Will extend the value given with new_value (and will turn both
|
||||||
into lists if they are not so already). The values are run through
|
into lists if they are not so already). The values are run through
|
||||||
|
@ -494,7 +494,12 @@ class Base(with_metaclass(BaseMeta, object)):
|
||||||
if not isinstance(new_value, list):
|
if not isinstance(new_value, list):
|
||||||
new_value = [ new_value ]
|
new_value = [ new_value ]
|
||||||
|
|
||||||
return [i for i,_ in itertools.groupby(value + new_value) if i is not None]
|
if prepend:
|
||||||
|
combined = new_value + value
|
||||||
|
else:
|
||||||
|
combined = value + new_value
|
||||||
|
|
||||||
|
return [i for i,_ in itertools.groupby(combined) if i is not None]
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -273,7 +273,7 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
def _get_attr_environment(self):
|
def _get_attr_environment(self):
|
||||||
return self._get_parent_attribute('environment', extend=True)
|
return self._get_parent_attribute('environment', extend=True)
|
||||||
|
|
||||||
def _get_parent_attribute(self, attr, extend=False):
|
def _get_parent_attribute(self, attr, extend=False, prepend=False):
|
||||||
'''
|
'''
|
||||||
Generic logic to get the attribute or parent attribute for a block value.
|
Generic logic to get the attribute or parent attribute for a block value.
|
||||||
'''
|
'''
|
||||||
|
@ -286,7 +286,7 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
try:
|
try:
|
||||||
parent_value = getattr(self._parent, attr, None)
|
parent_value = getattr(self._parent, attr, None)
|
||||||
if extend:
|
if extend:
|
||||||
value = self._extend_value(value, parent_value)
|
value = self._extend_value(value, parent_value, prepend)
|
||||||
else:
|
else:
|
||||||
value = parent_value
|
value = parent_value
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
@ -295,7 +295,7 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
try:
|
try:
|
||||||
parent_value = getattr(self._role, attr, None)
|
parent_value = getattr(self._role, attr, None)
|
||||||
if extend:
|
if extend:
|
||||||
value = self._extend_value(value, parent_value)
|
value = self._extend_value(value, parent_value, prepend)
|
||||||
else:
|
else:
|
||||||
value = parent_value
|
value = parent_value
|
||||||
|
|
||||||
|
@ -305,7 +305,7 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
for dep in dep_chain:
|
for dep in dep_chain:
|
||||||
dep_value = getattr(dep, attr, None)
|
dep_value = getattr(dep, attr, None)
|
||||||
if extend:
|
if extend:
|
||||||
value = self._extend_value(value, dep_value)
|
value = self._extend_value(value, dep_value, prepend)
|
||||||
else:
|
else:
|
||||||
value = dep_value
|
value = dep_value
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
try:
|
try:
|
||||||
parent_value = getattr(self._play, attr, None)
|
parent_value = getattr(self._play, attr, None)
|
||||||
if extend:
|
if extend:
|
||||||
value = self._extend_value(value, parent_value)
|
value = self._extend_value(value, parent_value, prepend)
|
||||||
else:
|
else:
|
||||||
value = parent_value
|
value = parent_value
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
|
@ -59,7 +59,7 @@ class Conditional:
|
||||||
if when is None:
|
if when is None:
|
||||||
when = []
|
when = []
|
||||||
if hasattr(self, '_get_parent_attribute'):
|
if hasattr(self, '_get_parent_attribute'):
|
||||||
when = self._get_parent_attribute('when', extend=True)
|
when = self._get_parent_attribute('when', extend=True, prepend=True)
|
||||||
return when
|
return when
|
||||||
|
|
||||||
def evaluate_conditional(self, templar, all_vars):
|
def evaluate_conditional(self, templar, all_vars):
|
||||||
|
@ -130,5 +130,5 @@ class Conditional:
|
||||||
elif "is defined" in original:
|
elif "is defined" in original:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
raise AnsibleError("error while evaluating conditional (%s): %s" % (original, e))
|
raise AnsibleUndefinedVariable("error while evaluating conditional (%s): %s" % (original, e))
|
||||||
|
|
||||||
|
|
|
@ -388,7 +388,7 @@ class Task(Base, Conditional, Taggable, Become):
|
||||||
if self._parent:
|
if self._parent:
|
||||||
self._parent.set_loader(loader)
|
self._parent.set_loader(loader)
|
||||||
|
|
||||||
def _get_parent_attribute(self, attr, extend=False):
|
def _get_parent_attribute(self, attr, extend=False, prepend=False):
|
||||||
'''
|
'''
|
||||||
Generic logic to get the attribute or parent attribute for a task value.
|
Generic logic to get the attribute or parent attribute for a task value.
|
||||||
'''
|
'''
|
||||||
|
@ -399,7 +399,7 @@ class Task(Base, Conditional, Taggable, Become):
|
||||||
if self._parent and (value is None or extend):
|
if self._parent and (value is None or extend):
|
||||||
parent_value = getattr(self._parent, attr, None)
|
parent_value = getattr(self._parent, attr, None)
|
||||||
if extend:
|
if extend:
|
||||||
value = self._extend_value(value, parent_value)
|
value = self._extend_value(value, parent_value, prepend)
|
||||||
else:
|
else:
|
||||||
value = parent_value
|
value = parent_value
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
Loading…
Reference in a new issue