コード例 #1
0
ファイル: test_create.py プロジェクト: rjfellman/molecule
def test_vagrant_create(molecule_file):
    c = create.Create([], [])

    try:
        c.execute()
    except SystemExit as f:
        assert f.code == 0
コード例 #2
0
ファイル: test_create.py プロジェクト: robtec/molecule
def test_execute_creates_instances_with_platform_all(
        patched_driver_up, patched_create_templates, patched_remove_inventory,
        patched_create_inventory, molecule_instance):
    command_args = {'platform': 'all'}
    c = create.Create({}, command_args, molecule_instance)
    c.execute()

    patched_driver_up.assert_called_once_with(no_provision=True)
    assert molecule_instance.state.multiple_platforms
コード例 #3
0
ファイル: test_create.py プロジェクト: robtec/molecule
def test_execute_does_not_raise_on_exit(
        patched_driver_up, patched_create_templates, patched_remove_inventory,
        patched_create_inventory, patched_logger_error,
        patched_write_instances_state, molecule_instance):
    patched_driver_up.side_effect = subprocess.CalledProcessError(1, None,
                                                                  None)
    c = create.Create({}, {}, molecule_instance)
    result = c.execute(exit=False)

    assert (1, '') == result
コード例 #4
0
ファイル: test_create.py プロジェクト: corserp/greet
def test_execute_skips_when_instances_already_created(
        patched_logger_warn, command_patched_ansible_create, config_instance):
    config_instance.state.change_state('created', True)
    c = create.Create(config_instance)
    c.execute()

    msg = 'Skipping, instances already created.'
    patched_logger_warn.assert_called_once_with(msg)

    assert not command_patched_ansible_create.called
コード例 #5
0
ファイル: test_create.py プロジェクト: corserp/greet
def test_execute_skips_when_delegated_driver(_patched_create_setup,
                                             patched_logger_warn,
                                             command_patched_ansible_create,
                                             config_instance):
    c = create.Create(config_instance)
    c.execute()

    msg = 'Skipping, instances are delegated.'
    patched_logger_warn.assert_called_once_with(msg)

    assert not command_patched_ansible_create.called
コード例 #6
0
ファイル: test_create.py プロジェクト: jpstroop/molecule
def test_execute_skips_when_manual_driver(
        patched_create_setup, molecule_driver_delegated_section_data,
        patched_logger_warn, patched_ansible_create, config_instance):
    config_instance.merge_dicts(config_instance.config,
                                molecule_driver_delegated_section_data)
    c = create.Create(config_instance)
    c.execute()

    msg = 'Skipping, instances are delegated.'
    patched_logger_warn.assert_called_once_with(msg)

    assert not patched_ansible_create.called
コード例 #7
0
ファイル: test_create.py プロジェクト: robtec/molecule
def test_execute_raises_on_exit(
        patched_driver_up, patched_create_templates, patched_remove_inventory,
        patched_create_inventory, patched_logger_error,
        patched_write_instances_state, molecule_instance):
    patched_driver_up.side_effect = subprocess.CalledProcessError(1, None,
                                                                  None)
    c = create.Create({}, {}, molecule_instance)
    with pytest.raises(SystemExit):
        c.execute()
    msg = "ERROR: Command 'None' returned non-zero exit status 1"
    patched_logger_error.assert_called_with(msg)
    assert not patched_create_inventory.called
    assert not patched_write_instances_state.called
コード例 #8
0
ファイル: test_create.py プロジェクト: robtec/molecule
def test_execute_creates_instances(
        patched_driver_up, patched_create_templates, patched_remove_inventory,
        patched_create_inventory, patched_print_info, molecule_instance):
    c = create.Create({}, {}, molecule_instance)
    result = c.execute()

    patched_remove_inventory.assert_called_once
    patched_create_templates.assert_called_once

    msg = 'Creating instances ...'
    patched_print_info.assert_called_once_with(msg)
    assert molecule_instance.state.created
    patched_driver_up.assert_called_once_with(no_provision=True)
    (None, None) == result
コード例 #9
0
ファイル: test_create.py プロジェクト: jpstroop/molecule
def test_execute(mocker, patched_logger_info, patched_ansible_create,
                 config_instance):
    c = create.Create(config_instance)
    c.execute()

    x = [
        mocker.call("Scenario: 'default'"),
        mocker.call("Action: 'create'"),
    ]
    assert x == patched_logger_info.mock_calls

    assert 'docker' == config_instance.state.driver

    patched_ansible_create.assert_called_once_with()

    assert config_instance.state.created
コード例 #10
0
ファイル: test_create.py プロジェクト: sysgazer/molecule
def test_execute(mocker, patched_create_setup, patched_logger_info,
                 patched_ansible_setup, config_instance):
    c = create.Create(config_instance)
    c.execute()
    x = [
        mocker.call('Scenario: [default]'),
        mocker.call('Provisioner: [ansible]'),
        mocker.call('Driver: [docker]'),
        mocker.call('Playbook: [create.yml]')
    ]

    assert x == patched_logger_info.mock_calls

    assert 'docker' == config_instance.state.driver

    patched_ansible_setup.assert_called_once_with()

    assert config_instance.state.created
コード例 #11
0
def test_execute(
    mocker,
    patched_logger_info,
    command_patched_ansible_create,
    patched_config_validate,
    config_instance,
):
    c = create.Create(config_instance)
    c.execute()

    x = [mocker.call("Scenario: 'default'"), mocker.call("Action: 'create'")]
    assert x == patched_logger_info.mock_calls

    assert "delegated" == config_instance.state.driver

    command_patched_ansible_create.assert_called_once_with()

    assert config_instance.state.created
コード例 #12
0
ファイル: test_create.py プロジェクト: yemo-memeda/molecule
def test_execute(
    mocker,
    patched_logger_info,
    command_patched_ansible_create,
    patched_config_validate,
    config_instance,
):
    c = create.Create(config_instance)
    c.execute()

    assert len(patched_logger_info.mock_calls) == 1
    name, args, kwargs = patched_logger_info.mock_calls[0]
    assert "default" in args
    assert "converge" in args

    assert "delegated" == config_instance.state.driver

    command_patched_ansible_create.assert_called_once_with()

    assert config_instance.state.created
コード例 #13
0
ファイル: converge.py プロジェクト: robtec/molecule
    def execute(self,
                idempotent=False,
                create_instances=True,
                create_inventory=True,
                exit=True,
                hide_errors=True):
        """
        Execute the actions necessary to perform a `molecule converge` and
        return a tuple.

        :param idempotent: An optional flag to perform the converge again, and
         parse the output for idempotence.
        :param create_inventory: An optional flag to toggle inventory creation.
        :param create_instances: An optional flag to toggle instance creation.
        :return: Return a tuple of (`exit status`, `command output`), otherwise
         sys.exit on command failure.
        """
        if self.molecule.state.created:
            create_instances = False

        if self.molecule.state.converged:
            create_inventory = False

        if self.molecule.state.multiple_platforms:
            self.command_args['platform'] = 'all'
        else:
            if ((self.command_args.get('platform') == 'all')
                    and self.molecule.state.created):
                create_instances = True
                create_inventory = True

        if create_instances and not idempotent:
            c = create.Create(self.command_args, self.args, self.molecule)
            c.execute()

        if create_inventory:
            self.molecule.create_inventory_file()

        # Install role dependencies only during `molecule converge`
        if not idempotent and 'requirements_file' in \
            self.molecule.config.config['ansible'] and not \
                self.molecule.state.installed_deps:
            galaxy = ansible_galaxy.AnsibleGalaxy(self.molecule.config.config)
            galaxy.install()
            self.molecule.state.change_state('installed_deps', True)

        ansible = ansible_playbook.AnsiblePlaybook(
            self.molecule.config.config['ansible'],
            self.molecule.driver.ansible_connection_params)

        # Target tags passed in via CLI
        if self.command_args.get('tags'):
            ansible.add_cli_arg('tags', self.command_args.get('tags'))

        if idempotent:
            # Don't log stdout/err
            ansible.remove_cli_arg('_out')
            ansible.remove_cli_arg('_err')
            # Disable color for regexp
            ansible.add_env_arg('ANSIBLE_NOCOLOR', 'true')
            ansible.add_env_arg('ANSIBLE_FORCE_COLOR', 'false')

        ansible.bake()
        if self.args.get('debug'):
            ansible_env = {
                k: v
                for (k, v) in ansible.env.items() if 'ANSIBLE' in k
            }
            other_env = {
                k: v
                for (k, v) in ansible.env.items() if 'ANSIBLE' not in k
            }
            util.print_debug(
                'OTHER ENVIRONMENT',
                yaml.dump(other_env, default_flow_style=False, indent=2))
            util.print_debug(
                'ANSIBLE ENVIRONMENT',
                yaml.dump(ansible_env, default_flow_style=False, indent=2))
            util.print_debug('ANSIBLE PLAYBOOK', str(ansible._ansible))

        util.print_info('Starting Ansible Run ...')
        status, output = ansible.execute(hide_errors=hide_errors)
        if status is not None:
            if exit:
                util.sysexit(status)
            return status, None

        if not self.molecule.state.converged:
            self.molecule.state.change_state('converged', True)

        return None, output
コード例 #14
0
    def execute(self,
                idempotent=False,
                create_instances=True,
                create_inventory=True,
                exit=True,
                hide_errors=True):
        """
        Execute the actions necessary to perform a `molecule converge` and
        return a tuple.

        :param idempotent: An optional flag to perform the converge again, and
         parse the output for idempotence.
        :param create_inventory: An optional flag to toggle inventory creation.
        :param create_instances: An optional flag to toggle instance creation.
        :return: Return a tuple of (`exit status`, `command output`), otherwise
         sys.exit on command failure.
        """
        debug = self.args.get('debug')

        if self.molecule.state.created:
            create_instances = False

        if self.molecule.state.converged:
            create_inventory = False

        if self.molecule.state.multiple_platforms:
            self.command_args['platform'] = 'all'
        else:
            if ((self.command_args.get('platform') == 'all')
                    and self.molecule.state.created):
                create_instances = True
                create_inventory = True

        if create_instances and not idempotent:
            c = create.Create(self.args, self.command_args, self.molecule)
            c.execute()

        if create_inventory:
            self.molecule.create_inventory_file()

        d = dependency.Dependency(self.args, self.command_args, self.molecule)
        d.execute()

        ansible = ansible_playbook.AnsiblePlaybook(
            self.molecule.config.config['ansible'],
            self.molecule.driver.ansible_connection_params,
            raw_ansible_args=self.command_args.get('ansible_args'),
            debug=debug)

        if idempotent:
            # Don't log stdout/err
            ansible.remove_cli_arg('_out')
            ansible.remove_cli_arg('_err')
            # Idempotence task regexp cannot handle diff
            ansible.remove_cli_arg('diff')
            # Disable color for regexp
            ansible.add_env_arg('ANSIBLE_NOCOLOR', 'true')
            ansible.add_env_arg('ANSIBLE_FORCE_COLOR', 'false')

        if debug:
            ansible_env = {
                k: v
                for (k, v) in ansible.env.items() if 'ANSIBLE' in k
            }
            util.print_debug(
                'ANSIBLE ENVIRONMENT',
                yaml.dump(ansible_env, default_flow_style=False, indent=2))

        util.print_info('Starting Ansible Run ...')
        status, output = ansible.execute(hide_errors=hide_errors)
        if status is not None:
            if exit:
                util.sysexit(status)
            return status, None

        if not self.molecule.state.converged:
            self.molecule.state.change_state('converged', True)

        return None, output