137 lines
3.9 KiB
Python
137 lines
3.9 KiB
Python
import os
|
|
import pytest
|
|
import shutil
|
|
|
|
from ansible_runner.interface import run, run_async
|
|
|
|
|
|
def test_run():
|
|
r = run(module='debug', host_pattern='localhost')
|
|
assert r.status == 'successful'
|
|
|
|
|
|
def test_run_async():
|
|
thread, r = run_async(module='debug', host_pattern='localhost')
|
|
thread.join()
|
|
assert r.status == 'successful'
|
|
|
|
|
|
@pytest.fixture
|
|
def printenv_example(test_data_dir):
|
|
private_data_dir = os.path.join(test_data_dir, 'printenv')
|
|
# TODO: remove if main code can handle this for us
|
|
# https://github.com/ansible/ansible-runner/issues/493
|
|
# for now, necessary to prevent errors on re-run
|
|
env_dir = os.path.join(private_data_dir, 'env')
|
|
if os.path.exists(env_dir):
|
|
shutil.rmtree(env_dir)
|
|
return private_data_dir
|
|
|
|
|
|
def get_env_data(res):
|
|
for event in res.events:
|
|
found = bool(
|
|
event['event'] == 'runner_on_ok' and event.get(
|
|
'event_data', {}
|
|
).get('task_action', None) == 'look_at_environment'
|
|
)
|
|
if found:
|
|
return event['event_data']['res']
|
|
else:
|
|
print('output:')
|
|
print(res.stdout.read())
|
|
raise RuntimeError('Count not find look_at_environment task from playbook')
|
|
|
|
|
|
def test_env_accuracy(request, printenv_example):
|
|
os.environ['SET_BEFORE_TEST'] = 'MADE_UP_VALUE'
|
|
|
|
def remove_test_env_var():
|
|
if 'SET_BEFORE_TEST' in os.environ:
|
|
del os.environ['SET_BEFORE_TEST']
|
|
|
|
request.addfinalizer(remove_test_env_var)
|
|
|
|
res = run(
|
|
private_data_dir=printenv_example,
|
|
playbook='get_environment.yml',
|
|
inventory=None,
|
|
envvars={'FROM_TEST': 'FOOBAR'},
|
|
)
|
|
assert res.rc == 0, res.stdout.read()
|
|
|
|
actual_env = get_env_data(res)['environment']
|
|
|
|
assert actual_env == res.config.env
|
|
|
|
|
|
@pytest.mark.serial
|
|
def test_env_accuracy_inside_container(request, printenv_example, container_runtime_installed):
|
|
os.environ['SET_BEFORE_TEST'] = 'MADE_UP_VALUE'
|
|
|
|
def remove_test_env_var():
|
|
if 'SET_BEFORE_TEST' in os.environ:
|
|
del os.environ['SET_BEFORE_TEST']
|
|
|
|
request.addfinalizer(remove_test_env_var)
|
|
|
|
res = run(
|
|
private_data_dir=printenv_example,
|
|
project_dir='/tmp',
|
|
playbook='get_environment.yml',
|
|
inventory=None,
|
|
envvars={'FROM_TEST': 'FOOBAR'},
|
|
settings={
|
|
'process_isolation_executable': container_runtime_installed,
|
|
'process_isolation': True
|
|
}
|
|
)
|
|
assert res.rc == 0, res.stdout.read()
|
|
|
|
env_data = get_env_data(res)
|
|
actual_env = env_data['environment']
|
|
|
|
expected_env = res.config.env.copy()
|
|
|
|
# NOTE: the reported environment for containerized jobs will not account for
|
|
# all environment variables, particularly those set by the entrypoint script
|
|
for key, value in expected_env.items():
|
|
assert key in actual_env
|
|
assert actual_env[key] == value, 'Reported value wrong for {0} env var'.format(key)
|
|
|
|
assert env_data['cwd'] == res.config.cwd
|
|
|
|
|
|
def test_multiple_inventories(test_data_dir):
|
|
private_data_dir = os.path.join(test_data_dir, 'debug')
|
|
|
|
res = run(
|
|
private_data_dir=private_data_dir,
|
|
playbook='debug.yml',
|
|
)
|
|
stdout = res.stdout.read()
|
|
assert res.rc == 0, stdout
|
|
|
|
# providing no inventory should cause <private_data_dir>/inventory
|
|
# to be used, reading both inventories in the directory
|
|
assert 'host_1' in stdout
|
|
assert 'host_2' in stdout
|
|
|
|
|
|
def test_inventory_absolute_path(test_data_dir):
|
|
private_data_dir = os.path.join(test_data_dir, 'debug')
|
|
|
|
res = run(
|
|
private_data_dir=private_data_dir,
|
|
playbook='debug.yml',
|
|
inventory=[
|
|
os.path.join(private_data_dir, 'inventory', 'inv_1'),
|
|
],
|
|
)
|
|
stdout = res.stdout.read()
|
|
assert res.rc == 0, stdout
|
|
|
|
# hosts can be down-selected to one inventory out of those available
|
|
assert 'host_1' in stdout
|
|
assert 'host_2' not in stdout
|