Skip to content
Snippets Groups Projects
Commit c15ed69b authored by Pierre Riteau's avatar Pierre Riteau
Browse files

Support passing multiple Kayobe inventory arguments

Change-Id: I875d73cfe056dc505beffdec9bf348b3dc8bd910
Story: 2002009
Task: 41738
parent 2bc568de
No related branches found
No related tags found
No related merge requests found
...@@ -56,6 +56,7 @@ def add_args(parser): ...@@ -56,6 +56,7 @@ def add_args(parser):
help="set additional variables as key=value or " help="set additional variables as key=value or "
"YAML/JSON") "YAML/JSON")
parser.add_argument("-i", "--inventory", metavar="INVENTORY", parser.add_argument("-i", "--inventory", metavar="INVENTORY",
action="append",
help="specify inventory host path " help="specify inventory host path "
"(default=$%s/inventory or %s/inventory) or " "(default=$%s/inventory or %s/inventory) or "
"comma-separated host list" % "comma-separated host list" %
...@@ -85,13 +86,13 @@ def _get_kayobe_environment_path(parsed_args): ...@@ -85,13 +86,13 @@ def _get_kayobe_environment_path(parsed_args):
return env_path return env_path
def _get_inventory_path(parsed_args, env_path): def _get_inventories_paths(parsed_args, env_path):
"""Return the path to the Kayobe inventory.""" """Return the paths to the Kayobe inventories."""
if parsed_args.inventory: if parsed_args.inventory:
return parsed_args.inventory return parsed_args.inventory
else: else:
return os.path.join(env_path if env_path else parsed_args.config_path, return [os.path.join(env_path if env_path else parsed_args.config_path,
"inventory") "inventory")]
def _validate_args(parsed_args, playbooks): def _validate_args(parsed_args, playbooks):
...@@ -111,12 +112,13 @@ def _validate_args(parsed_args, playbooks): ...@@ -111,12 +112,13 @@ def _validate_args(parsed_args, playbooks):
env_path, result["message"]) env_path, result["message"])
sys.exit(1) sys.exit(1)
inventory = _get_inventory_path(parsed_args, env_path) inventories = _get_inventories_paths(parsed_args, env_path)
result = utils.is_readable_dir(inventory) for inventory in inventories:
if not result["result"]: result = utils.is_readable_dir(inventory)
LOG.error("Kayobe inventory %s is invalid: %s", if not result["result"]:
inventory, result["message"]) LOG.error("Kayobe inventory %s is invalid: %s",
sys.exit(1) inventory, result["message"])
sys.exit(1)
for playbook in playbooks: for playbook in playbooks:
result = utils.is_readable_file(playbook) result = utils.is_readable_file(playbook)
...@@ -158,8 +160,9 @@ def build_args(parsed_args, playbooks, ...@@ -158,8 +160,9 @@ def build_args(parsed_args, playbooks,
cmd += ["--list-tasks"] cmd += ["--list-tasks"]
cmd += vault.build_args(parsed_args, "--vault-password-file") cmd += vault.build_args(parsed_args, "--vault-password-file")
env_path = _get_kayobe_environment_path(parsed_args) env_path = _get_kayobe_environment_path(parsed_args)
inventory = _get_inventory_path(parsed_args, env_path) inventories = _get_inventories_paths(parsed_args, env_path)
cmd += ["--inventory", inventory] for inventory in inventories:
cmd += ["--inventory", inventory]
vars_paths = [parsed_args.config_path] vars_paths = [parsed_args.config_path]
if env_path: if env_path:
vars_paths.append(env_path) vars_paths.append(env_path)
......
...@@ -561,3 +561,29 @@ class TestCase(unittest.TestCase): ...@@ -561,3 +561,29 @@ class TestCase(unittest.TestCase):
self.assertTrue(result) self.assertTrue(result)
mock_is_readable.assert_called_once_with( mock_is_readable.assert_called_once_with(
"/path/to/config/kolla/passwords.yml") "/path/to/config/kolla/passwords.yml")
@mock.patch.object(utils, "run_command")
@mock.patch.object(ansible, "_get_vars_files")
@mock.patch.object(ansible, "_validate_args")
def test_multiple_inventory_args(self, mock_validate, mock_vars, mock_run):
mock_vars.return_value = []
parser = argparse.ArgumentParser()
ansible.add_args(parser)
vault.add_args(parser)
args = [
"--inventory", "/etc/kayobe/inventory",
"--inventory", "/etc/kayobe/environments/foobar/inventory",
]
parsed_args = parser.parse_args(args)
ansible.run_playbooks(parsed_args, ["playbook1.yml", "playbook2.yml"])
expected_cmd = [
"ansible-playbook",
"--inventory", "/etc/kayobe/inventory",
"--inventory", "/etc/kayobe/environments/foobar/inventory",
"playbook1.yml",
"playbook2.yml",
]
expected_env = {"KAYOBE_CONFIG_PATH": "/etc/kayobe"}
mock_run.assert_called_once_with(expected_cmd, check_output=False,
quiet=False, env=expected_env)
mock_vars.assert_called_once_with(["/etc/kayobe"])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment