Merge pull request #4301 from chrismeyersfsu/tower_modules

Global collections path

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
This commit is contained in:
softwarefactory-project-zuul[bot]
2019-07-17 20:11:25 +00:00
committed by GitHub
6 changed files with 40 additions and 1 deletions

View File

@@ -859,10 +859,16 @@ class BaseTask(object):
''' '''
process_isolation_params = dict() process_isolation_params = dict()
if self.should_use_proot(instance): if self.should_use_proot(instance):
show_paths = self.proot_show_paths + [private_data_dir, cwd] + \
settings.AWX_PROOT_SHOW_PATHS
# Help the user out by including the collections path inside the bubblewrap environment
if getattr(settings, 'AWX_ANSIBLE_COLLECTIONS_PATHS', []):
show_paths.extend(settings.AWX_ANSIBLE_COLLECTIONS_PATHS)
process_isolation_params = { process_isolation_params = {
'process_isolation': True, 'process_isolation': True,
'process_isolation_path': settings.AWX_PROOT_BASE_PATH, 'process_isolation_path': settings.AWX_PROOT_BASE_PATH,
'process_isolation_show_paths': self.proot_show_paths + [private_data_dir, cwd] + settings.AWX_PROOT_SHOW_PATHS, 'process_isolation_show_paths': show_paths,
'process_isolation_hide_paths': [ 'process_isolation_hide_paths': [
settings.AWX_PROOT_BASE_PATH, settings.AWX_PROOT_BASE_PATH,
'/etc/tower', '/etc/tower',
@@ -936,6 +942,11 @@ class BaseTask(object):
if self.should_use_proot(instance): if self.should_use_proot(instance):
env['PROOT_TMP_DIR'] = settings.AWX_PROOT_BASE_PATH env['PROOT_TMP_DIR'] = settings.AWX_PROOT_BASE_PATH
env['AWX_PRIVATE_DATA_DIR'] = private_data_dir env['AWX_PRIVATE_DATA_DIR'] = private_data_dir
if 'ANSIBLE_COLLECTIONS_PATHS' in env:
env['ANSIBLE_COLLECTIONS_PATHS'] += os.pathsep + os.pathsep.join(settings.AWX_ANSIBLE_COLLECTIONS_PATHS)
else:
env['ANSIBLE_COLLECTIONS_PATHS'] = os.pathsep.join(settings.AWX_ANSIBLE_COLLECTIONS_PATHS)
return env return env
def should_use_proot(self, instance): def should_use_proot(self, instance):

View File

@@ -262,6 +262,7 @@ def test_inventory_update_injected_content(this_kind, script_or_plugin, inventor
""" """
private_data_dir = envvars.pop('AWX_PRIVATE_DATA_DIR') private_data_dir = envvars.pop('AWX_PRIVATE_DATA_DIR')
assert envvars.pop('ANSIBLE_INVENTORY_ENABLED') == ('auto' if use_plugin else 'script') assert envvars.pop('ANSIBLE_INVENTORY_ENABLED') == ('auto' if use_plugin else 'script')
assert envvars.pop('ANSIBLE_COLLECTIONS_PATHS') == os.pathsep.join(settings.AWX_ANSIBLE_COLLECTIONS_PATHS)
set_files = bool(os.getenv("MAKE_INVENTORY_REFERENCE_FILES", 'false').lower()[0] not in ['f', '0']) set_files = bool(os.getenv("MAKE_INVENTORY_REFERENCE_FILES", 'false').lower()[0] not in ['f', '0'])
env, content = read_content(private_data_dir, envvars, inventory_update) env, content = read_content(private_data_dir, envvars, inventory_update)
base_dir = os.path.join(DATA, script_or_plugin) base_dir = os.path.join(DATA, script_or_plugin)

View File

@@ -441,6 +441,7 @@ class TestGenericRun():
settings.AWX_PROOT_HIDE_PATHS = ['/AWX_PROOT_HIDE_PATHS1', '/AWX_PROOT_HIDE_PATHS2'] settings.AWX_PROOT_HIDE_PATHS = ['/AWX_PROOT_HIDE_PATHS1', '/AWX_PROOT_HIDE_PATHS2']
settings.ANSIBLE_VENV_PATH = '/ANSIBLE_VENV_PATH' settings.ANSIBLE_VENV_PATH = '/ANSIBLE_VENV_PATH'
settings.AWX_VENV_PATH = '/AWX_VENV_PATH' settings.AWX_VENV_PATH = '/AWX_VENV_PATH'
settings.AWX_ANSIBLE_COLLECTIONS_PATHS = ['/AWX_COLLECTION_PATH1', '/AWX_COLLECTION_PATH2']
process_isolation_params = task.build_params_process_isolation(job, private_data_dir, cwd) process_isolation_params = task.build_params_process_isolation(job, private_data_dir, cwd)
assert True is process_isolation_params['process_isolation'] assert True is process_isolation_params['process_isolation']
@@ -450,6 +451,10 @@ class TestGenericRun():
"The per-job private data dir should be in the list of directories the user can see." "The per-job private data dir should be in the list of directories the user can see."
assert cwd in process_isolation_params['process_isolation_show_paths'], \ assert cwd in process_isolation_params['process_isolation_show_paths'], \
"The current working directory should be in the list of directories the user can see." "The current working directory should be in the list of directories the user can see."
assert '/AWX_COLLECTION_PATH1' in process_isolation_params['process_isolation_show_paths'], \
"AWX global collection directory 1 of 2 should get added to the list of directories the user can see."
assert '/AWX_COLLECTION_PATH2' in process_isolation_params['process_isolation_show_paths'], \
"AWX global collection directory 2 of 2 should get added to the list of directories the user can see."
for p in [settings.AWX_PROOT_BASE_PATH, for p in [settings.AWX_PROOT_BASE_PATH,
'/etc/tower', '/etc/tower',
@@ -509,6 +514,17 @@ class TestGenericRun():
env = task.build_env(job, private_data_dir) env = task.build_env(job, private_data_dir)
assert env['FOO'] == 'BAR' assert env['FOO'] == 'BAR'
def test_awx_task_env_respects_ansible_collections_paths(self, patch_Job, private_data_dir):
job = Job(project=Project(), inventory=Inventory())
task = tasks.RunJob()
task._write_extra_vars_file = mock.Mock()
with mock.patch('awx.main.tasks.settings.AWX_ANSIBLE_COLLECTIONS_PATHS', ['/AWX_COLLECTION_PATH']):
with mock.patch('awx.main.tasks.settings.AWX_TASK_ENV', {'ANSIBLE_COLLECTIONS_PATHS': '/MY_COLLECTION1:/MY_COLLECTION2'}):
env = task.build_env(job, private_data_dir)
assert env['ANSIBLE_COLLECTIONS_PATHS'] == '/MY_COLLECTION1:/MY_COLLECTION2:/AWX_COLLECTION_PATH'
def test_valid_custom_virtualenv(self, patch_Job, private_data_dir): def test_valid_custom_virtualenv(self, patch_Job, private_data_dir):
job = Job(project=Project(), inventory=Inventory()) job = Job(project=Project(), inventory=Inventory())

View File

@@ -1187,6 +1187,9 @@ AWX_REQUEST_PROFILE = False
# Delete temporary directories created to store playbook run-time # Delete temporary directories created to store playbook run-time
AWX_CLEANUP_PATHS = True AWX_CLEANUP_PATHS = True
# Expose collections to Ansible playbooks
AWX_ANSIBLE_COLLECTIONS_PATHS = ['/var/lib/awx/collections']
MIDDLEWARE = [ MIDDLEWARE = [
'awx.main.middleware.TimingMiddleware', 'awx.main.middleware.TimingMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',

View File

@@ -276,3 +276,5 @@ TEST_OPENSTACK_PROJECT = ''
# Azure credentials. # Azure credentials.
TEST_AZURE_USERNAME = '' TEST_AZURE_USERNAME = ''
TEST_AZURE_KEY_DATA = '' TEST_AZURE_KEY_DATA = ''
AWX_ANSIBLE_COLLECTIONS_PATHS = ['/tmp/collections']

6
docs/collections.md Normal file
View File

@@ -0,0 +1,6 @@
## Collections Support
AWX supports Ansible collections by appending the directories specified in `AWX_ANSIBLE_COLLECTIONS_PATHS`
to the environment variable `ANSIBLE_COLLECTIONS_PATHS`. The default value of `AWX_ANSIBLE_COLLECTIONS_PATHS`
contains `/varlib/awx/collections`. It is recommended that place your collections that you wish to call in
your playbooks into this path.