diff --git a/docs/cli.md b/docs/cli.md index 1fc06da..fa61f33 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -31,6 +31,15 @@ The CLI expect to find monkeyble configuration file. The file will be searched f - `MONKEYBLE_CONFIG` placed as an environment variable - `monkeyble.yml` from the current directory +### monkeyble_global_extra_vars + +This flag contains a list of extra var files that will be loaded in all test. +```yaml +monkeyble_global_extra_vars: + - "mocks.yml" + - "common_test_input.yml" +``` + ### monkeyble_test_suite The `monkeyble_test_suite` contains a list of Monkeyble test definition. diff --git a/monkeyble/cli/monkeyble.yml b/monkeyble/cli/monkeyble.yml index abc096a..5dfb903 100644 --- a/monkeyble/cli/monkeyble.yml +++ b/monkeyble/cli/monkeyble.yml @@ -1,8 +1,9 @@ +monkeyble_global_extra_vars: + - "../../tests/mocks.yml" monkeyble_test_suite: - playbook: "../../tests/test_playbook.yml" # inventory: "inventory" extra_vars: - - "../../tests/mocks.yml" - "../../tests/monkeyble_scenarios.yml" scenarios: - validate_test_1 diff --git a/monkeyble/cli/monkeyble_cli.py b/monkeyble/cli/monkeyble_cli.py index 881380a..120b8b9 100644 --- a/monkeyble/cli/monkeyble_cli.py +++ b/monkeyble/cli/monkeyble_cli.py @@ -5,6 +5,7 @@ import subprocess import sys import time +from copy import copy from datetime import timedelta import yaml @@ -64,14 +65,18 @@ def run_monkeyble_test(monkeyble_config): if "monkeyble_test_suite" not in monkeyble_config: raise MonkeybleCLIException(message="No 'monkeyble_test_suite' variable defined") list_result = list() + global_extra_vars = list() + if "monkeyble_global_extra_vars" in monkeyble_config: + global_extra_vars.extend(monkeyble_config["monkeyble_global_extra_vars"]) for test_config in monkeyble_config["monkeyble_test_suite"]: + extra_vars = copy(global_extra_vars) Utils.print_info(f"Monkeyble - ansible cmd: {ansible_cmd}") playbook = test_config.get("playbook", None) new_result = MonkeybleResult(playbook) if playbook is None: raise MonkeybleCLIException(message="Missing 'playbook' key in a test") inventory = test_config.get("inventory", None) - extra_vars = test_config.get("extra_vars", None) + extra_vars.extend(test_config.get("extra_vars", [])) scenarios = test_config.get("scenarios", None) if scenarios is None: raise MonkeybleCLIException(message=f"No scenarios for playbook {playbook}") diff --git a/tests/units/test_cli.py b/tests/units/test_cli.py index f31a9ee..e155fd9 100644 --- a/tests/units/test_cli.py +++ b/tests/units/test_cli.py @@ -39,9 +39,10 @@ def test_load_monkeyble_config(self): test_monkeyble_path = str(current_path) + "/test_config/monkeyble.yml" with mock.patch("monkeyble.cli.monkeyble_cli.MONKEYBLE_DEFAULT_CONFIG_PATH", test_monkeyble_path): data = load_monkeyble_config(None) - expected = {'monkeyble_test_suite': [{'playbook': 'test_playbook.yml', + expected = {'monkeyble_global_extra_vars': ['mocks.yml'], + 'monkeyble_test_suite': [{'playbook': 'test_playbook.yml', 'inventory': 'inventory', - 'extra_vars': ['mocks.yml', 'monkeyble_scenarios.yml'], + 'extra_vars': ['monkeyble_scenarios.yml'], 'scenarios': ['validate_test_1', 'validate_test_2']}]} self.assertDictEqual(data, expected) @@ -95,30 +96,42 @@ def test_run_monkeyble_test_no_scenario_defined(self, mock_exit): def test_run_monkeyble_test_run_ansible_called(self): monkeyble_config = { + "monkeyble_global_extra_vars": ['mocks.yml'], "monkeyble_test_suite": [ { - "playbook": "playbook.yml", - "inventory": "my_inventory", + "playbook": "playbook1.yml", + "inventory": "my_inventory1", "extra_vars": ["extra_vars1.yml", "extra_vars2.yml"], "scenarios": ["scenario1", "scenario2"] + }, + { + "playbook": "playbook2.yml", + "inventory": "my_inventory2", + "extra_vars": ["extra_vars3.yml"], + "scenarios": ["scenario3"] } ] } with mock.patch("monkeyble.cli.monkeyble_cli.run_ansible") as mock_run_ansible: run_monkeyble_test(monkeyble_config) - self.assertEqual(mock_run_ansible.call_count, 2) + self.assertEqual(mock_run_ansible.call_count, 3) call_1 = call(MONKEYBLE_DEFAULT_ANSIBLE_CMD, - "playbook.yml", - "my_inventory", - ["extra_vars1.yml", "extra_vars2.yml"], + "playbook1.yml", + "my_inventory1", + ["mocks.yml", "extra_vars1.yml", "extra_vars2.yml"], "scenario1") call_2 = call(MONKEYBLE_DEFAULT_ANSIBLE_CMD, - "playbook.yml", - "my_inventory", - ["extra_vars1.yml", "extra_vars2.yml"], + "playbook1.yml", + "my_inventory1", + ["mocks.yml", "extra_vars1.yml", "extra_vars2.yml"], "scenario2") - mock_run_ansible.assert_has_calls([call_1, call_2]) + call_3 = call(MONKEYBLE_DEFAULT_ANSIBLE_CMD, + "playbook2.yml", + "my_inventory2", + ["mocks.yml", "extra_vars3.yml"], + "scenario3") + mock_run_ansible.assert_has_calls([call_1, call_2, call_3]) @patch("subprocess.Popen") def test_run_ansible(self, mock_subproc_popen): diff --git a/tests/units/test_config/monkeyble.yml b/tests/units/test_config/monkeyble.yml index 9aede6c..85b94a0 100644 --- a/tests/units/test_config/monkeyble.yml +++ b/tests/units/test_config/monkeyble.yml @@ -1,8 +1,9 @@ +monkeyble_global_extra_vars: + - "mocks.yml" monkeyble_test_suite: - playbook: "test_playbook.yml" inventory: "inventory" extra_vars: - - "mocks.yml" - "monkeyble_scenarios.yml" scenarios: - "validate_test_1"