Fixing role param precedence issues

* Make role param resolution follow the role dependency chain, rather
  than using all roles within the play
* Also move params to be merged in after role vars in general, to match
  our variable precedence rules
* Changes to the way var lookup is done in role helper methods for
  get_vars(), get_inherited_vars(), and get_role_params() to make the
  above possible without trampling on previously merged vars

Fixes #14472
Fixes #14475
This commit is contained in:
James Cammarata 2016-03-20 10:38:18 -04:00
parent 4a00999875
commit 9d2fe2fb2c
2 changed files with 9 additions and 9 deletions

View file

@ -259,31 +259,31 @@ class Role(Base, Become, Conditional, Taggable):
default_vars = combine_vars(default_vars, self._default_vars) default_vars = combine_vars(default_vars, self._default_vars)
return default_vars return default_vars
def get_inherited_vars(self, dep_chain=[], include_params=True): def get_inherited_vars(self, dep_chain=[]):
inherited_vars = dict() inherited_vars = dict()
if dep_chain: if dep_chain:
for parent in dep_chain: for parent in dep_chain:
inherited_vars = combine_vars(inherited_vars, parent._role_vars) inherited_vars = combine_vars(inherited_vars, parent._role_vars)
if include_params:
inherited_vars = combine_vars(inherited_vars, parent._role_params)
return inherited_vars return inherited_vars
def get_role_params(self): def get_role_params(self, dep_chain=[]):
params = {} params = {}
for dep in self.get_all_dependencies(): if dep_chain:
params = combine_vars(params, dep._role_params) for parent in dep_chain:
params = combine_vars(params, parent._role_params)
params = combine_vars(params, self._role_params)
return params return params
def get_vars(self, dep_chain=[], include_params=True): def get_vars(self, dep_chain=[], include_params=True):
all_vars = self.get_inherited_vars(dep_chain, include_params=include_params) all_vars = self.get_inherited_vars(dep_chain)
for dep in self.get_all_dependencies(): for dep in self.get_all_dependencies():
all_vars = combine_vars(all_vars, dep.get_vars(include_params=include_params)) all_vars = combine_vars(all_vars, dep.get_vars(include_params=include_params))
all_vars = combine_vars(all_vars, self._role_vars) all_vars = combine_vars(all_vars, self._role_vars)
if include_params: if include_params:
all_vars = combine_vars(all_vars, self._role_params) all_vars = combine_vars(all_vars, self.get_role_params(dep_chain=dep_chain))
return all_vars return all_vars

View file

@ -308,12 +308,12 @@ class VariableManager:
if not C.DEFAULT_PRIVATE_ROLE_VARS: if not C.DEFAULT_PRIVATE_ROLE_VARS:
for role in play.get_roles(): for role in play.get_roles():
all_vars = combine_vars(all_vars, role.get_role_params())
all_vars = combine_vars(all_vars, role.get_vars(include_params=False)) all_vars = combine_vars(all_vars, role.get_vars(include_params=False))
if task: if task:
if task._role: if task._role:
all_vars = combine_vars(all_vars, task._role.get_vars()) all_vars = combine_vars(all_vars, task._role.get_vars())
all_vars = combine_vars(all_vars, task._role.get_role_params(task._block._dep_chain))
all_vars = combine_vars(all_vars, task.get_vars()) all_vars = combine_vars(all_vars, task.get_vars())
if host: if host: