From c74adb8416f9addc0eef411c2bfb88d4f2275ff8 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Fri, 15 Sep 2023 15:19:27 -0400 Subject: [PATCH] Validate inventory from command line --- src/ansible_runner/__main__.py | 44 ++++++++++++++++++++++---- test/integration/test___main__.py | 22 +++++++++++-- test/integration/test_main.py | 22 ++++++------- test/unit/test__main__.py | 52 +++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 20 deletions(-) create mode 100644 test/unit/test__main__.py diff --git a/src/ansible_runner/__main__.py b/src/ansible_runner/__main__.py index 49705d611..a2c0774a1 100644 --- a/src/ansible_runner/__main__.py +++ b/src/ansible_runner/__main__.py @@ -16,6 +16,8 @@ # specific language governing permissions and limitations # under the License. # +from __future__ import annotations + import ast import threading import traceback @@ -32,6 +34,7 @@ import tempfile from contextlib import contextmanager +from pathlib import Path from uuid import uuid4 import daemon @@ -45,7 +48,6 @@ from ansible_runner.utils.capacity import get_cpu_count, get_mem_in_bytes, ensure_uuid from ansible_runner.utils.importlib_compat import importlib_metadata from ansible_runner.runner import Runner -from ansible_runner.exceptions import AnsibleRunnerException VERSION = importlib_metadata.version("ansible_runner") @@ -437,11 +439,8 @@ def role_manager(vargs): output.debug(f"using playbook file {playbook}") if vargs.get('inventory'): - inventory_file = os.path.join(vargs.get('private_data_dir'), 'inventory', vargs.get('inventory')) - if not os.path.exists(inventory_file): - raise AnsibleRunnerException('location specified by --inventory does not exist') - kwargs.inventory = inventory_file - output.debug(f"using inventory file {inventory_file}") + kwargs.inventory = vargs.get('inventory') + output.debug(f"using inventory file {kwargs.inventory}") roles_path = vargs.get('roles_path') or os.path.join(vargs.get('private_data_dir'), 'roles') roles_path = os.path.abspath(roles_path) @@ -519,6 +518,34 @@ def add_args_to_parser(parser, args): parser.add_argument(*arg[0], **arg[1]) +def valid_inventory(private_data_dir: str, inventory: str) -> str | None: + """ + Validate the --inventory value is an actual file or directory. + + The inventory value from the CLI may only be an existing file. Validate it + exists. Supplied value may be either be relative to