From 7968dc4c00fba27f67b00f8dc569ac0660624a88 Mon Sep 17 00:00:00 2001 From: Matt Clay Date: Wed, 14 Aug 2019 15:53:30 -0700 Subject: [PATCH] Load integration config test vars from content. The `test/integration/integration_config.yml` vars file will now be loaded from the content under test and is now optional. The `output_dir` and `win_output_dir` vars are now provided by ansible-test. --- test/integration/integration_config.yml | 3 -- test/lib/ansible_test/_internal/executor.py | 34 +++++++++++++++++-- .../_internal/integration/__init__.py | 26 ++++++++------ test/lib/ansible_test/_internal/payload.py | 2 -- 4 files changed, 47 insertions(+), 18 deletions(-) delete mode 100644 test/integration/integration_config.yml diff --git a/test/integration/integration_config.yml b/test/integration/integration_config.yml deleted file mode 100644 index 6b47a35dc14..00000000000 --- a/test/integration/integration_config.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -win_output_dir: 'C:\ansible_testing' -output_dir: ~/ansible_testing diff --git a/test/lib/ansible_test/_internal/executor.py b/test/lib/ansible_test/_internal/executor.py index 15256b3e8d2..23579ceebe8 100644 --- a/test/lib/ansible_test/_internal/executor.py +++ b/test/lib/ansible_test/_internal/executor.py @@ -129,6 +129,7 @@ from .integration import ( integration_test_environment, integration_test_config_file, setup_common_temp_dir, + VARS_FILE_RELATIVE, ) from .data import ( @@ -817,6 +818,23 @@ def command_integration_filter(args, # type: TIntegrationConfig cloud_init(args, internal_targets) + vars_file_src = os.path.join(data_context().content.root, VARS_FILE_RELATIVE) + + if os.path.exists(vars_file_src): + def integration_config_callback(files): # type: (t.List[t.Tuple[str, str]]) -> None + """ + Add the integration config vars file to the payload file list. + This will preserve the file during delegation even if the file is ignored by source control. + """ + if data_context().content.collection: + working_path = data_context().content.collection.directory + else: + working_path = '' + + files.append((vars_file_src, os.path.join(working_path, VARS_FILE_RELATIVE))) + + data_context().register_payload_callback(integration_config_callback) + if args.delegate: raise Delegate(require=require, exclude=exclude, integration_targets=internal_targets) @@ -1273,9 +1291,17 @@ def command_integration_role(args, target, start_at_task, test_dir, inventory_pa env_config = None + vars_files = [] + variables = dict( + output_dir=test_dir, + ) + if isinstance(args, WindowsIntegrationConfig): hosts = 'windows' gather_facts = False + variables.update(dict( + win_output_dir=r'C:\ansible_testing', + )) elif isinstance(args, NetworkIntegrationConfig): hosts = target.name[:target.name.find('_')] gather_facts = False @@ -1289,12 +1315,14 @@ def command_integration_role(args, target, start_at_task, test_dir, inventory_pa env_config = cloud_environment.get_environment_config() with integration_test_environment(args, target, inventory_path) as test_env: + if os.path.exists(test_env.vars_file): + vars_files.append(os.path.relpath(test_env.vars_file, test_env.integration_dir)) + play = dict( hosts=hosts, gather_facts=gather_facts, - vars_files=[ - os.path.relpath(test_env.vars_file, test_env.integration_dir), - ], + vars_files=vars_files, + vars=variables, roles=[ target.name, ], diff --git a/test/lib/ansible_test/_internal/integration/__init__.py b/test/lib/ansible_test/_internal/integration/__init__.py index f0ae9ed567d..a7054b330e2 100644 --- a/test/lib/ansible_test/_internal/integration/__init__.py +++ b/test/lib/ansible_test/_internal/integration/__init__.py @@ -53,6 +53,9 @@ from ..data import ( data_context, ) +INTEGRATION_DIR_RELATIVE = 'test/integration' +VARS_FILE_RELATIVE = os.path.join(INTEGRATION_DIR_RELATIVE, 'integration_config.yml') + def setup_common_temp_dir(args, path): """ @@ -138,9 +141,7 @@ def integration_test_environment(args, target, inventory_path): :type target: IntegrationTarget :type inventory_path: str """ - vars_file = 'integration_config.yml' - - ansible_config_relative = os.path.join('test', 'integration', '%s.cfg' % args.command) + ansible_config_relative = os.path.join(INTEGRATION_DIR_RELATIVE, '%s.cfg' % args.command) ansible_config_src = os.path.join(data_context().content.root, ansible_config_relative) if not os.path.exists(ansible_config_src): @@ -150,10 +151,10 @@ def integration_test_environment(args, target, inventory_path): if args.no_temp_workdir or 'no/temp_workdir/' in target.aliases: display.warning('Disabling the temp work dir is a temporary debugging feature that may be removed in the future without notice.') - integration_dir = os.path.abspath('test/integration') - inventory_path = os.path.abspath(inventory_path) + integration_dir = os.path.join(data_context().content.root, INTEGRATION_DIR_RELATIVE) + inventory_path = os.path.join(data_context().content.root, inventory_path) ansible_config = ansible_config_src - vars_file = os.path.join(integration_dir, vars_file) + vars_file = os.path.join(data_context().content.root, VARS_FILE_RELATIVE) yield IntegrationEnvironment(integration_dir, inventory_path, ansible_config, vars_file) return @@ -190,19 +191,25 @@ def integration_test_environment(args, target, inventory_path): files_needed = get_files_needed(target_dependencies) - integration_dir = os.path.join(temp_dir, 'test/integration') + integration_dir = os.path.join(temp_dir, INTEGRATION_DIR_RELATIVE) ansible_config = os.path.join(temp_dir, ansible_config_relative) + vars_file_src = os.path.join(data_context().content.root, VARS_FILE_RELATIVE) + vars_file = os.path.join(temp_dir, VARS_FILE_RELATIVE) + file_copies = [ (ansible_config_src, ansible_config), - (os.path.join(ANSIBLE_ROOT, 'test/integration/integration_config.yml'), os.path.join(integration_dir, vars_file)), (os.path.join(ANSIBLE_ROOT, inventory_path), os.path.join(integration_dir, inventory_name)), ] + if os.path.exists(vars_file_src): + file_copies.append((vars_file_src, vars_file)) + file_copies += [(path, os.path.join(temp_dir, path)) for path in files_needed] directory_copies = [ - (os.path.join('test/integration/targets', target.name), os.path.join(integration_dir, 'targets', target.name)) for target in target_dependencies + (os.path.join(INTEGRATION_DIR_RELATIVE, 'targets', target.name), os.path.join(integration_dir, 'targets', target.name)) + for target in target_dependencies ] inventory_dir = os.path.dirname(inventory_path) @@ -236,7 +243,6 @@ def integration_test_environment(args, target, inventory_path): shutil.copy2(file_src, file_dst) inventory_path = os.path.join(integration_dir, inventory_name) - vars_file = os.path.join(integration_dir, vars_file) yield IntegrationEnvironment(integration_dir, inventory_path, ansible_config, vars_file) finally: diff --git a/test/lib/ansible_test/_internal/payload.py b/test/lib/ansible_test/_internal/payload.py index 3adb46f7ef1..4cc9f7b5fa0 100644 --- a/test/lib/ansible_test/_internal/payload.py +++ b/test/lib/ansible_test/_internal/payload.py @@ -81,9 +81,7 @@ def create_payload(args, dst_path): # type: (CommonConfig, str) -> None # these files need to be migrated to the ansible-test data directory hack_files_to_keep = ( - 'test/integration/integration_config.yml', 'test/integration/inventory', - 'test/integration/target-prefixes.network', ) # temporary solution to include files not yet present in the ansible-test data directory