def test_task_executor_execute(self): fake_loader = DictDataLoader({}) mock_host = MagicMock() mock_task = MagicMock() mock_task.args = dict() mock_task.retries = 0 mock_task.delay = -1 mock_task.register = 'foo' mock_task.until = None mock_task.changed_when = None mock_task.failed_when = None mock_task.post_validate.return_value = None mock_conn_info = MagicMock() mock_conn_info.post_validate.return_value = None mock_conn_info.update_vars.return_value = None mock_connection = MagicMock() mock_connection.set_host_overrides.return_value = None mock_connection._connect.return_value = None mock_action = MagicMock() shared_loader = None new_stdin = None job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX") te = TaskExecutor( host = mock_host, task = mock_task, job_vars = job_vars, connection_info = mock_conn_info, new_stdin = new_stdin, loader = fake_loader, shared_loader_obj = shared_loader, ) te._get_connection = MagicMock(return_value=mock_connection) te._get_action_handler = MagicMock(return_value=mock_action) mock_action.run.return_value = dict(ansible_facts=dict()) res = te._execute() mock_task.changed_when = "1 == 1" res = te._execute() mock_task.changed_when = None mock_task.failed_when = "1 == 1" res = te._execute() mock_task.failed_when = None mock_task.evaluate_conditional.return_value = False res = te._execute() mock_task.evaluate_conditional.return_value = True mock_task.args = dict(_raw_params='foo.yml', a='foo', b='bar') mock_task.action = 'include' res = te._execute()
def test_task_executor_execute(self): fake_loader = DictDataLoader({}) mock_host = MagicMock() mock_task = MagicMock() mock_task.args = dict() mock_task.retries = 0 mock_task.delay = -1 mock_task.register = "foo" mock_task.until = None mock_task.changed_when = None mock_task.failed_when = None mock_task.post_validate.return_value = None mock_conn_info = MagicMock() mock_conn_info.post_validate.return_value = None mock_conn_info.update_vars.return_value = None mock_connection = MagicMock() mock_connection.set_host_overrides.return_value = None mock_connection._connect.return_value = None mock_action = MagicMock() shared_loader = None new_stdin = None job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX") te = TaskExecutor( host=mock_host, task=mock_task, job_vars=job_vars, connection_info=mock_conn_info, new_stdin=new_stdin, loader=fake_loader, shared_loader_obj=shared_loader, ) te._get_connection = MagicMock(return_value=mock_connection) te._get_action_handler = MagicMock(return_value=mock_action) mock_action.run.return_value = dict(ansible_facts=dict()) res = te._execute() mock_task.changed_when = "1 == 1" res = te._execute() mock_task.changed_when = None mock_task.failed_when = "1 == 1" res = te._execute() mock_task.failed_when = None mock_task.evaluate_conditional.return_value = False res = te._execute() mock_task.evaluate_conditional.return_value = True mock_task.args = dict(_raw_params="foo.yml", a="foo", b="bar") mock_task.action = "include" res = te._execute()
def test_task_executor_execute(self): fake_loader = DictDataLoader({}) mock_host = MagicMock() mock_task = MagicMock() mock_task.args = dict() mock_task.retries = 0 mock_task.delay = -1 mock_task.register = 'foo' mock_task.until = None mock_task.changed_when = None mock_task.failed_when = None mock_task.post_validate.return_value = None # mock_task.async cannot be left unset, because on Python 3 MagicMock() # > 0 raises a TypeError There are two reasons for using the value 1 # here: on Python 2 comparing MagicMock() > 0 returns True, and the # other reason is that if I specify 0 here, the test fails. ;) mock_task. async = 1 mock_play_context = MagicMock() mock_play_context.post_validate.return_value = None mock_play_context.update_vars.return_value = None mock_connection = MagicMock() mock_connection.set_host_overrides.return_value = None mock_connection._connect.return_value = None mock_action = MagicMock() shared_loader = None new_stdin = None job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX") te = TaskExecutor( host=mock_host, task=mock_task, job_vars=job_vars, play_context=mock_play_context, new_stdin=new_stdin, loader=fake_loader, shared_loader_obj=shared_loader, ) te._get_connection = MagicMock(return_value=mock_connection) te._get_action_handler = MagicMock(return_value=mock_action) mock_action.run.return_value = dict(ansible_facts=dict()) res = te._execute() mock_task.changed_when = "1 == 1" res = te._execute() mock_task.changed_when = None mock_task.failed_when = "1 == 1" res = te._execute() mock_task.failed_when = None mock_task.evaluate_conditional.return_value = False res = te._execute() mock_task.evaluate_conditional.return_value = True mock_task.args = dict(_raw_params='foo.yml', a='foo', b='bar') mock_task.action = 'include' res = te._execute()
def __execute_module(self, module_name=None, module_args=None, persist_files=False, delete_remote_tmp=None, wrap_async=False, run_on_ca_host=False, ignore_changed=False, ignore_failed=False): if run_on_ca_host: host = InventoryManager(DataLoader(), context.CLIARGS['inventory']).get_host( self._var("ca_host")) task = self._task.copy() task_data = self._var("ca_host_options") task_data.update({ 'name': "mgssl ca_host task: {0}".format(module_name), 'action': module_name, 'args': module_args, 'delegate_to': self._var("ca_host") }) task.load_data(task_data) task_vars = self._task_vars.copy() task_vars.update(self._task.get_variable_manager().get_vars( host=host, task=task)) executor_result = TaskExecutor(host, task, task_vars, self._play_context, None, self._loader, self._shared_loader_obj, None) # Dirty fix for mitogen compatibility # Mitogen somehow puts a task global connection binding object in each connection that gets created # during the lifetime of a task. That usually happens on the beginning of a task, but here, we create # a new task executor within a task and that also creates a new connection for local running tasks. # After execution the connections get closed, but the close function also closes and removes the parent # tasks binding object. Now all future connections will fail. # # Solution: Overwrite the close method and only call the necessary close methods except the one that closes # the binding object if self._is_mitogen: get_connection_method = executor_result._get_connection def get_connection(cvars, templar): c = get_connection_method(cvars, templar) c.close = lambda: (c._put_connection(), None) return c executor_result._get_connection = get_connection ret = executor_result.run() # Reset the close method if self._is_mitogen: executor_result._get_connection = get_connection_method else: if self._shared_loader_obj.action_loader.has_plugin( module_name, None): task = self._task.copy() task.load_data({ 'action': module_name, 'args': module_args, }) handler = self._shared_loader_obj.action_loader.get( module_name, task=task, connection=self._connection, play_context=self._play_context. set_task_and_variable_override(task, {}, self._templar), loader=self._loader, templar=self._templar, shared_loader_obj=self._shared_loader_obj, collection_list=None) ret = handler.run(None, self._task_vars) else: ret = self._execute_module(module_name, module_args, None, self._task_vars, persist_files, delete_remote_tmp, wrap_async) self._check_result(module_name, run_on_ca_host, ret, ignore_changed, ignore_failed) return ret
def test_task_executor_execute(self): fake_loader = DictDataLoader({}) mock_host = MagicMock() mock_task = MagicMock() mock_task.args = dict() mock_task.retries = 0 mock_task.delay = -1 mock_task.register = 'foo' mock_task.until = None mock_task.changed_when = None mock_task.failed_when = None mock_task.post_validate.return_value = None # mock_task.async cannot be left unset, because on Python 3 MagicMock() # > 0 raises a TypeError There are two reasons for using the value 1 # here: on Python 2 comparing MagicMock() > 0 returns True, and the # other reason is that if I specify 0 here, the test fails. ;) mock_task.async = 1 mock_play_context = MagicMock() mock_play_context.post_validate.return_value = None mock_play_context.update_vars.return_value = None mock_connection = MagicMock() mock_connection.set_host_overrides.return_value = None mock_connection._connect.return_value = None mock_action = MagicMock() shared_loader = None new_stdin = None job_vars = dict(omit="XXXXXXXXXXXXXXXXXXX") te = TaskExecutor( host = mock_host, task = mock_task, job_vars = job_vars, play_context = mock_play_context, new_stdin = new_stdin, loader = fake_loader, shared_loader_obj = shared_loader, ) te._get_connection = MagicMock(return_value=mock_connection) te._get_action_handler = MagicMock(return_value=mock_action) mock_action.run.return_value = dict(ansible_facts=dict()) res = te._execute() mock_task.changed_when = "1 == 1" res = te._execute() mock_task.changed_when = None mock_task.failed_when = "1 == 1" res = te._execute() mock_task.failed_when = None mock_task.evaluate_conditional.return_value = False res = te._execute() mock_task.evaluate_conditional.return_value = True mock_task.args = dict(_raw_params='foo.yml', a='foo', b='bar') mock_task.action = 'include' res = te._execute()