コード例 #1
0
ファイル: test_task_executor.py プロジェクト: ziyerou/ansible
    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()
コード例 #2
0
ファイル: test_task_executor.py プロジェクト: ferhaty/ansible
    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()
コード例 #3
0
    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()
コード例 #4
0
    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
コード例 #5
0
    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()