Coverage for lib/ansible/playbook/helpers.py : 55%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com> # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
''' Given a list of mixed task/block data (parsed from YAML), return a list of Block() objects, where implicit blocks are created for each bare Task. '''
# we import here to prevent a circular dependency with imports
raise AnsibleAssertionError('%s should be a list or None but is %s' % (ds, type(ds)))
# Implicit blocks are created by bare tasks listed in a play without # an explicit block statement. If we have two implicit blocks in a row, # squash them down to a single block to save processing time later. # Advance the iterator, so we don't repeat
# Loop both implicit blocks and block_ds as block_ds is the next in the list Block.load( b, play=play, parent_block=parent_block, role=role, task_include=task_include, use_handlers=use_handlers, variable_manager=variable_manager, loader=loader, ) )
''' Given a list of task datastructures (parsed from YAML), return a list of Task() or TaskInclude() objects. '''
# we import here to prevent a circular dependency with imports
raise AnsibleAssertionError('The ds (%s) should be a list but was a %s' % (ds, type(ds)))
AnsibleAssertionError('The ds (%s) should be a dict but was a %s' % (ds, type(ds)))
t = Block.load( task_ds, play=play, parent_block=block, role=role, task_include=task_include, use_handlers=use_handlers, variable_manager=variable_manager, loader=loader, ) task_list.append(t) else:
include_class = HandlerTaskInclude else:
task_ds, block=block, role=role, task_include=None, variable_manager=variable_manager, loader=loader )
# check to see if this include is dynamic or static: # 1. the user has set the 'static' option to false or true # 2. one of the appropriate config options was set is_static = False is_static = True display.deprecated("The use of 'static' has been deprecated. " "Use 'import_tasks' for static inclusion, or 'include_tasks' for dynamic inclusion") is_static = t.static else: (use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or \ (not templar._contains_vars(t.args['_raw_params']) and t.all_parents_static() and not t.loop)
if 'import_tasks' in task_ds: raise AnsibleParserError("You cannot use loops on 'import_tasks' statements. You should use 'include_tasks' instead.", obj=task_ds) else: raise AnsibleParserError("You cannot use 'static' on an include with a loop", obj=task_ds)
# we set a flag to indicate this include was static
# handle relative includes by walking up the list of parent include # tasks and checking the relative result to see if it exists
subdir = 'handlers' parent_include_dir = os.path.dirname(templar.template(parent_include.args.get('_raw_params'))) if cumulative_path is None: cumulative_path = parent_include_dir elif not os.path.isabs(cumulative_path): cumulative_path = os.path.join(parent_include_dir, cumulative_path) include_target = templar.template(t.args['_raw_params']) if t._role: new_basedir = os.path.join(t._role._role_path, subdir, cumulative_path) include_file = loader.path_dwim_relative(new_basedir, subdir, include_target) else: include_file = loader.path_dwim_relative(loader.get_basedir(), cumulative_path, include_target)
if os.path.exists(include_file): found = True break else: parent_include = parent_include._parent
except AnsibleUndefinedVariable as e: raise AnsibleParserError( "Error when evaluating variable in include name: %s.\n\n" "When using static includes, ensure that any variables used in their names are defined in vars/vars_files\n" "or extra-vars passed in from the command line. Static includes cannot use variables from inventory\n" "sources like group or host vars." % t.args['_raw_params'], obj=task_ds, suppress_extended_error=True, orig_exc=e) else: include_file = loader.path_dwim(include_target)
display.warning('file %s is empty and had no tasks to include' % include_file) continue raise AnsibleParserError("included task files must contain a list of tasks", obj=data)
# since we can't send callbacks here, we display a message directly in # the same fashion used by the on_include callback. We also do it here, # because the recursive nature of helper methods means we may be loading # nested includes, and we want the include order printed correctly except AnsibleFileNotFound: if t.static or \ C.DEFAULT_TASK_INCLUDES_STATIC or \ C.DEFAULT_HANDLER_INCLUDES_STATIC and use_handlers: raise display.deprecated( "Included file '%s' not found, however since this include is not " "explicitly marked as 'static: yes', we will try and include it dynamically " "later. In the future, this will be an error unless 'static: no' is used " "on the include task. If you do not want missing includes to be considered " "dynamic, use 'static: yes' on the include or set the global ansible.cfg " "options to make all includes static for tasks and/or handlers" % include_file, version="2.7" ) task_list.append(t) continue
data, play=play, parent_block=None, task_include=ti_copy, role=role, use_handlers=use_handlers, loader=loader, variable_manager=variable_manager, )
# FIXME: remove once 'include' is removed # pop tags out of the include args, if they were specified there, and assign # them to the include. If the include already had tags specified, we raise an # error so that users know not to specify them both ways tags = tags.split(',')
if 'include_tasks' in task_ds or 'import_tasks' in task_ds: raise AnsibleParserError('You cannot specify "tags" inline to the task, it is a task keyword') if len(ti_copy.tags) > 0: raise AnsibleParserError( "Include tasks should not specify tags in more than one way (both via args and directly on the task). " "Mixing styles in which tags are specified is prohibited for whole import hierarchy, not only for single import statement", obj=task_ds, suppress_extended_error=True, ) display.deprecated("You should not specify tags in the include parameters. All tags should be specified using the task-level option", version="2.7") else:
# now we extend the tags on each of the included blocks # END FIXME
# FIXME: handlers shouldn't need this special handling, but do # right now because they don't iterate blocks correctly for b in included_blocks: task_list.extend(b.block) else: else:
ir = IncludeRole.load( task_ds, block=block, role=role, task_include=None, variable_manager=variable_manager, loader=loader, )
# 1. the user has set the 'static' option to false or true # 2. one of the appropriate config options was set is_static = False if 'import_role' in task_ds: is_static = True
elif ir.static is not None: display.deprecated("The use of 'static' for 'include_role' has been deprecated. " "Use 'import_role' for static inclusion, or 'include_role' for dynamic inclusion") is_static = ir.static
if is_static: if ir.loop is not None: if 'import_tasks' in task_ds: raise AnsibleParserError("You cannot use loops on 'import_role' statements. You should use 'include_role' instead.", obj=task_ds) else: raise AnsibleParserError("You cannot use 'static' on an include_role with a loop", obj=task_ds)
# we set a flag to indicate this include was static ir.statically_loaded = True
# template the role name now, if needed all_vars = variable_manager.get_vars(play=play, task=ir) templar = Templar(loader=loader, variables=all_vars) if templar._contains_vars(ir._role_name): ir._role_name = templar.template(ir._role_name)
# uses compiled list from object blocks, _ = ir.get_block_list(variable_manager=variable_manager, loader=loader) t = task_list.extend(blocks) else: # passes task object itself for latter generation of list t = task_list.append(ir) else: t = Handler.load(task_ds, block=block, role=role, task_include=task_include, variable_manager=variable_manager, loader=loader) else:
''' Loads and returns a list of RoleInclude objects from the datastructure list of role definitions '''
# we import here to prevent a circular dependency with imports
raise AnsibleAssertionError('ds (%s) should be a list but was a %s' % (ds, type(ds)))
|