示例#1
0
def test_prepare_inventory_invalid_inventories():
    with pytest.raises(ConfigurationError) as exc:
        rc = InventoryConfig()
        inventories = '/tmp/inventory1'
        rc.prepare_inventory_command('list', inventories=inventories)

    assert "inventories should be of type list" in exc.value.args[0]
示例#2
0
def test_prepare_inventory_invalid_host_action():
    with pytest.raises(ConfigurationError) as exc:
        rc = InventoryConfig()
        inventories = ['/tmp/inventory1', '/tmp/inventory2']
        rc.prepare_inventory_command('host', inventories=inventories)

    assert "Value of host parameter is required when action in 'host'" == exc.value.args[
        0]
示例#3
0
def test_prepare_inventory_invalid_action():
    with pytest.raises(ConfigurationError) as exc:
        rc = InventoryConfig()
        inventories = ['/tmp/inventory1', '/tmp/inventory2']
        rc.prepare_inventory_command('test', inventories=inventories)

    assert "Invalid action test, valid value is one of either graph, host, list" == exc.value.args[
        0]
示例#4
0
def test_prepare_inventory_invalid_graph_response_format():
    with pytest.raises(ConfigurationError) as exc:
        rc = InventoryConfig()
        inventories = ['/tmp/inventory1', '/tmp/inventory2']
        rc.prepare_inventory_command('graph',
                                     inventories=inventories,
                                     response_format='toml')

    assert "'graph' action supports only 'json' response format" == exc.value.args[
        0]
示例#5
0
def test_prepare_inventory_invalid_response_format():
    with pytest.raises(ConfigurationError) as exc:
        rc = InventoryConfig()
        inventories = ['/tmp/inventory1', '/tmp/inventory2']
        rc.prepare_inventory_command('list',
                                     inventories=inventories,
                                     response_format='test')

    assert "Invalid response_format test, valid value is one of either json, yaml, toml" == exc.value.args[
        0]
示例#6
0
def test_prepare_inventory_command():
    rc = InventoryConfig()
    inventories = ['/tmp/inventory1', '/tmp/inventory2']
    rc.prepare_inventory_command('list',
                                 inventories,
                                 response_format='yaml',
                                 playbook_dir='/tmp',
                                 vault_ids='1234',
                                 vault_password_file='/tmp/password')
    expected_command = ['ansible-inventory', '--list', '-i', '/tmp/inventory1', '-i', '/tmp/inventory2', '--yaml', '--playbook-dir'] + \
                       ['/tmp', '--vault-id', '1234', '--vault-password-file', '/tmp/password']
    assert rc.command == expected_command
    assert rc.runner_mode == 'subprocess'
示例#7
0
def test_prepare_config_command_with_containerization(tmpdir,
                                                      container_runtime):
    kwargs = {
        'private_data_dir': tmpdir,
        'process_isolation': True,
        'container_image': 'my_container',
        'process_isolation_executable': container_runtime
    }
    rc = InventoryConfig(**kwargs)
    rc.ident = 'foo'
    inventories = ['/tmp/inventory1', '/tmp/inventory2']
    rc.prepare_inventory_command('list',
                                 inventories,
                                 response_format='yaml',
                                 playbook_dir='/tmp',
                                 vault_ids='1234',
                                 vault_password_file='/tmp/password')

    assert rc.runner_mode == 'subprocess'
    extra_container_args = []
    if container_runtime == 'podman':
        extra_container_args = ['--quiet']
    else:
        extra_container_args = ['--user={os.getuid()}']

    expected_command_start = [container_runtime, 'run', '--rm', '--interactive', '--workdir', '/runner/project'] + \
                             ['-v', '{}/.ssh/:/home/runner/.ssh/'.format(os.environ['HOME'])]
    if container_runtime == 'podman':
        expected_command_start += [
            '--group-add=root', '--userns=keep-id', '--ipc=host'
        ]

    expected_command_start += ['-v', '{}/artifacts:/runner/artifacts:Z'.format(rc.private_data_dir)] + \
        ['-v', '{}:/runner:Z'.format(rc.private_data_dir)] + \
        ['--env-file', '{}/env.list'.format(rc.artifact_dir)] + \
        extra_container_args + \
        ['--name', 'ansible_runner_foo', 'my_container'] + \
        ['ansible-inventory', '--list', '-i', '/tmp/inventory1', '-i', '/tmp/inventory2', '--yaml', '--playbook-dir'] + \
        ['/tmp', '--vault-id', '1234', '--vault-password-file', '/tmp/password']

    for index, element in enumerate(expected_command_start):
        if '--user='******'--user=' in rc.command[index]
        else:
            assert rc.command[index] == element
def test_ansible_inventory_init_defaults(tmp_path, patch_private_data_dir):
    rc = InventoryConfig()

    # Check that the private data dir is placed in our default location with our default prefix
    # and has some extra uniqueness on the end.
    base_private_data_dir = tmp_path.joinpath('.ansible-runner-').as_posix()
    assert rc.private_data_dir.startswith(base_private_data_dir)
    assert len(rc.private_data_dir) > len(base_private_data_dir)

    assert rc.execution_mode == BaseExecutionMode.ANSIBLE_COMMANDS
示例#9
0
def test_invalid_runner_mode_value():
    with pytest.raises(ConfigurationError) as exc:
        InventoryConfig(runner_mode='test')

    assert "Invalid runner mode" in exc.value.args[0]
示例#10
0
def test_ansible_cfg_init_defaults():
    rc = InventoryConfig()
    assert rc.private_data_dir == os.path.abspath(
        os.path.expanduser('~/.ansible-runner'))
    assert rc.execution_mode == BaseExecutionMode.ANSIBLE_COMMANDS
def test_prepare_inventory_command_with_containerization(
        tmp_path, runtime, mocker):
    mocker.patch.dict('os.environ', {'HOME': str(tmp_path)}, clear=True)
    tmp_path.joinpath('.ssh').mkdir()

    kwargs = {
        'private_data_dir': tmp_path,
        'process_isolation': True,
        'container_image': 'my_container',
        'process_isolation_executable': runtime
    }
    rc = InventoryConfig(**kwargs)
    rc.ident = 'foo'
    inventories = ['/tmp/inventory1', '/tmp/inventory2']
    rc.prepare_inventory_command('list',
                                 inventories,
                                 response_format='yaml',
                                 playbook_dir='/tmp',
                                 vault_ids='1234',
                                 vault_password_file='/tmp/password',
                                 output_file='/tmp/inv_out.txt',
                                 export=True)

    assert rc.runner_mode == 'subprocess'
    extra_container_args = []
    if runtime == 'podman':
        extra_container_args = ['--quiet']
    else:
        extra_container_args = [f'--user={os.getuid()}']

    expected_command_start = [
        runtime,
        'run',
        '--rm',
        '--interactive',
        '--workdir',
        '/runner/project',
        '-v',
        '{}/.ssh/:/home/runner/.ssh/'.format(rc.private_data_dir),
        '-v',
        '{}/.ssh/:/root/.ssh/'.format(rc.private_data_dir),
    ]

    if runtime == 'podman':
        expected_command_start.extend(['--group-add=root', '--ipc=host'])

    expected_command_start.extend([
        '-v',
        '{}/artifacts/:/runner/artifacts/:Z'.format(rc.private_data_dir),
        '-v',
        '{}/:/runner/:Z'.format(rc.private_data_dir),
        '--env-file',
        '{}/env.list'.format(rc.artifact_dir),
    ])

    expected_command_start.extend(extra_container_args)

    expected_command_start.extend([
        '--name',
        'ansible_runner_foo',
        'my_container',
        'ansible-inventory',
        '--list',
        '-i',
        '/tmp/inventory1',
        '-i',
        '/tmp/inventory2',
        '--yaml',
        '--playbook-dir',
        '/tmp',
        '--vault-id',
        '1234',
        '--vault-password-file',
        '/tmp/password',
        '--output',
        '/tmp/inv_out.txt',
        '--export',
    ])

    assert expected_command_start == rc.command