mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-27 23:21:22 -07:00
Merge pull request #9626 from bcoca/minor_template_fixes
fixes to template function
This commit is contained in:
commit
90a6c82d55
5 changed files with 27 additions and 26 deletions
|
@ -723,18 +723,21 @@ class Runner(object):
|
||||||
# strip out any jinja2 template syntax within
|
# strip out any jinja2 template syntax within
|
||||||
# the data returned by the lookup plugin
|
# the data returned by the lookup plugin
|
||||||
items = utils._clean_data_struct(items, from_remote=True)
|
items = utils._clean_data_struct(items, from_remote=True)
|
||||||
if type(items) != list:
|
if items is None:
|
||||||
raise errors.AnsibleError("lookup plugins have to return a list: %r" % items)
|
items = []
|
||||||
|
else:
|
||||||
|
if type(items) != list:
|
||||||
|
raise errors.AnsibleError("lookup plugins have to return a list: %r" % items)
|
||||||
|
|
||||||
if len(items) and utils.is_list_of_strings(items) and self.module_name in [ 'apt', 'yum', 'pkgng', 'zypper' ]:
|
if len(items) and utils.is_list_of_strings(items) and self.module_name in [ 'apt', 'yum', 'pkgng', 'zypper' ]:
|
||||||
# hack for apt, yum, and pkgng so that with_items maps back into a single module call
|
# hack for apt, yum, and pkgng so that with_items maps back into a single module call
|
||||||
use_these_items = []
|
use_these_items = []
|
||||||
for x in items:
|
for x in items:
|
||||||
inject['item'] = x
|
inject['item'] = x
|
||||||
if not self.conditional or utils.check_conditional(self.conditional, self.basedir, inject, fail_on_undefined=self.error_on_undefined_vars):
|
if not self.conditional or utils.check_conditional(self.conditional, self.basedir, inject, fail_on_undefined=self.error_on_undefined_vars):
|
||||||
use_these_items.append(x)
|
use_these_items.append(x)
|
||||||
inject['item'] = ",".join(use_these_items)
|
inject['item'] = ",".join(use_these_items)
|
||||||
items = None
|
items = None
|
||||||
|
|
||||||
def _safe_template_complex_args(args, inject):
|
def _safe_template_complex_args(args, inject):
|
||||||
# Ensure the complex args here are a dictionary, but
|
# Ensure the complex args here are a dictionary, but
|
||||||
|
|
|
@ -50,7 +50,7 @@ class LookupModule(object):
|
||||||
|
|
||||||
if isinstance(term, basestring):
|
if isinstance(term, basestring):
|
||||||
# convert a variable to a list
|
# convert a variable to a list
|
||||||
term2 = utils.listify_lookup_plugin_terms(term, self.basedir, inject)
|
term2 = utils.listify_lookup_plugin_terms(term, self.basedir, inject, fail_on_undefined=False)
|
||||||
# but avoid converting a plain string to a list of one string
|
# but avoid converting a plain string to a list of one string
|
||||||
if term2 != [ term ]:
|
if term2 != [ term ]:
|
||||||
term = term2
|
term = term2
|
||||||
|
|
|
@ -1451,7 +1451,7 @@ def safe_eval(expr, locals={}, include_exceptions=False):
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
|
|
||||||
def listify_lookup_plugin_terms(terms, basedir, inject):
|
def listify_lookup_plugin_terms(terms, basedir, inject, fail_on_undefined=C.DEFAULT_UNDEFINED_VAR_BEHAVIOR):
|
||||||
|
|
||||||
from ansible.utils import template
|
from ansible.utils import template
|
||||||
|
|
||||||
|
@ -1469,7 +1469,7 @@ def listify_lookup_plugin_terms(terms, basedir, inject):
|
||||||
# if not already a list, get ready to evaluate with Jinja2
|
# if not already a list, get ready to evaluate with Jinja2
|
||||||
# not sure why the "/" is in above code :)
|
# not sure why the "/" is in above code :)
|
||||||
try:
|
try:
|
||||||
new_terms = template.template(basedir, terms, inject, convert_bare=True, fail_on_undefined=C.DEFAULT_UNDEFINED_VAR_BEHAVIOR)
|
new_terms = template.template(basedir, "{{%s}}" % terms, inject, convert_bare=True, fail_on_undefined=fail_on_undefined)
|
||||||
if isinstance(new_terms, basestring) and "{{" in new_terms:
|
if isinstance(new_terms, basestring) and "{{" in new_terms:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -100,33 +100,33 @@ def lookup(name, *args, **kwargs):
|
||||||
else:
|
else:
|
||||||
raise errors.AnsibleError("lookup plugin (%s) not found" % name)
|
raise errors.AnsibleError("lookup plugin (%s) not found" % name)
|
||||||
|
|
||||||
def template(basedir, varname, vars, lookup_fatal=True, depth=0, expand_lists=True, convert_bare=False, fail_on_undefined=False, filter_fatal=True):
|
def template(basedir, varname, templatevars, lookup_fatal=True, depth=0, expand_lists=True, convert_bare=False, fail_on_undefined=False, filter_fatal=True):
|
||||||
''' templates a data structure by traversing it and substituting for other data structures '''
|
''' templates a data structure by traversing it and substituting for other data structures '''
|
||||||
from ansible import utils
|
from ansible import utils
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if convert_bare and isinstance(varname, basestring):
|
if convert_bare and isinstance(varname, basestring):
|
||||||
first_part = varname.split(".")[0].split("[")[0]
|
first_part = varname.split(".")[0].split("[")[0]
|
||||||
if first_part in vars and '{{' not in varname and '$' not in varname:
|
if first_part in templatevars and '{{' not in varname and '$' not in varname:
|
||||||
varname = "{{%s}}" % varname
|
varname = "{{%s}}" % varname
|
||||||
|
|
||||||
if isinstance(varname, basestring):
|
if isinstance(varname, basestring):
|
||||||
if '{{' in varname or '{%' in varname:
|
if '{{' in varname or '{%' in varname:
|
||||||
varname = template_from_string(basedir, varname, vars, fail_on_undefined)
|
varname = template_from_string(basedir, varname, templatevars, fail_on_undefined)
|
||||||
|
|
||||||
if (varname.startswith("{") and not varname.startswith("{{")) or varname.startswith("["):
|
if (varname.startswith("{") and not varname.startswith("{{")) or varname.startswith("["):
|
||||||
eval_results = utils.safe_eval(varname, locals=vars, include_exceptions=True)
|
eval_results = utils.safe_eval(varname, locals=templatevars, include_exceptions=True)
|
||||||
if eval_results[1] is None:
|
if eval_results[1] is None:
|
||||||
varname = eval_results[0]
|
varname = eval_results[0]
|
||||||
|
|
||||||
return varname
|
return varname
|
||||||
|
|
||||||
elif isinstance(varname, (list, tuple)):
|
elif isinstance(varname, (list, tuple)):
|
||||||
return [template(basedir, v, vars, lookup_fatal, depth, expand_lists, fail_on_undefined=fail_on_undefined) for v in varname]
|
return [template(basedir, v, templatevars, lookup_fatal, depth, expand_lists, convert_bare, fail_on_undefined, filter_fatal) for v in varname]
|
||||||
elif isinstance(varname, dict):
|
elif isinstance(varname, dict):
|
||||||
d = {}
|
d = {}
|
||||||
for (k, v) in varname.iteritems():
|
for (k, v) in varname.iteritems():
|
||||||
d[k] = template(basedir, v, vars, lookup_fatal, depth, expand_lists, fail_on_undefined=fail_on_undefined)
|
d[k] = template(basedir, v, templatevars, lookup_fatal, depth, expand_lists, convert_bare, fail_on_undefined, filter_fatal)
|
||||||
return d
|
return d
|
||||||
else:
|
else:
|
||||||
return varname
|
return varname
|
||||||
|
|
|
@ -568,10 +568,8 @@ class TestUtils(unittest.TestCase):
|
||||||
basedir = os.path.dirname(__file__)
|
basedir = os.path.dirname(__file__)
|
||||||
|
|
||||||
# Straight lookups
|
# Straight lookups
|
||||||
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict()),
|
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict(things=[])), [])
|
||||||
['things'])
|
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict(things=['one', 'two'])), ['one', 'two'])
|
||||||
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict(things=['one', 'two'])),
|
|
||||||
['one', 'two'])
|
|
||||||
|
|
||||||
# Variable interpolation
|
# Variable interpolation
|
||||||
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict(things=['{{ foo }}', '{{ bar }}'], foo="hello", bar="world")),
|
self.assertEqual(ansible.utils.listify_lookup_plugin_terms('things', basedir, dict(things=['{{ foo }}', '{{ bar }}'], foo="hello", bar="world")),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue