summaryrefslogtreecommitdiff
path: root/test/lib/ansible_test/_internal/cli/environments.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib/ansible_test/_internal/cli/environments.py')
-rw-r--r--test/lib/ansible_test/_internal/cli/environments.py106
1 files changed, 72 insertions, 34 deletions
diff --git a/test/lib/ansible_test/_internal/cli/environments.py b/test/lib/ansible_test/_internal/cli/environments.py
index 3c0230ca1c..1495f8efcd 100644
--- a/test/lib/ansible_test/_internal/cli/environments.py
+++ b/test/lib/ansible_test/_internal/cli/environments.py
@@ -13,6 +13,10 @@ from ..constants import (
SUPPORTED_PYTHON_VERSIONS,
)
+from ..util import (
+ REMOTE_ARCHITECTURES,
+)
+
from ..completion import (
docker_completion,
network_completion,
@@ -53,12 +57,17 @@ from ..config import (
from .completers import (
complete_choices,
+ register_completer,
)
from .converters import (
key_value_type,
)
+from .epilog import (
+ get_epilog,
+)
+
from ..ci import (
get_ci_provider,
)
@@ -98,6 +107,8 @@ def add_environments(
if not get_ci_provider().supports_core_ci_auth():
sections.append('Remote provisioning options have been hidden since no Ansible Core CI API key was found.')
+ sections.append(get_epilog(completer))
+
parser.formatter_class = argparse.RawDescriptionHelpFormatter
parser.epilog = '\n\n'.join(sections)
@@ -169,40 +180,40 @@ def add_composite_environment_options(
if controller_mode == ControllerMode.NO_DELEGATION:
composite_parser.set_defaults(controller=None)
else:
- composite_parser.add_argument(
+ register_completer(composite_parser.add_argument(
'--controller',
metavar='OPT',
action=register_action_type(DelegatedControllerAction if controller_mode == ControllerMode.DELEGATED else OriginControllerAction),
help='configuration for the controller',
- ).completer = completer.completer
+ ), completer.completer)
if target_mode == TargetMode.NO_TARGETS:
composite_parser.set_defaults(targets=[])
elif target_mode == TargetMode.SHELL:
group = composite_parser.add_mutually_exclusive_group()
- group.add_argument(
+ register_completer(group.add_argument(
'--target-posix',
metavar='OPT',
action=register_action_type(PosixSshTargetAction),
help='configuration for the target',
- ).completer = completer.completer
+ ), completer.completer)
suppress = None if get_ci_provider().supports_core_ci_auth() else argparse.SUPPRESS
- group.add_argument(
+ register_completer(group.add_argument(
'--target-windows',
metavar='OPT',
action=WindowsSshTargetAction if suppress else register_action_type(WindowsSshTargetAction),
help=suppress or 'configuration for the target',
- ).completer = completer.completer
+ ), completer.completer)
- group.add_argument(
+ register_completer(group.add_argument(
'--target-network',
metavar='OPT',
action=NetworkSshTargetAction if suppress else register_action_type(NetworkSshTargetAction),
help=suppress or 'configuration for the target',
- ).completer = completer.completer
+ ), completer.completer)
else:
if target_mode.multiple_pythons:
target_option = '--target-python'
@@ -224,12 +235,12 @@ def add_composite_environment_options(
target_action = target_actions[target_mode]
- composite_parser.add_argument(
+ register_completer(composite_parser.add_argument(
target_option,
metavar='OPT',
action=register_action_type(target_action),
help=target_help,
- ).completer = completer.completer
+ ), completer.completer)
return action_types
@@ -240,9 +251,8 @@ def add_legacy_environment_options(
target_mode, # type: TargetMode
):
"""Add legacy options for controlling the test environment."""
- # noinspection PyTypeChecker
- environment = parser.add_argument_group(
- title='environment arguments (mutually exclusive with "composite environment arguments" below)') # type: argparse.ArgumentParser
+ environment: argparse.ArgumentParser = parser.add_argument_group( # type: ignore[assignment] # real type private
+ title='environment arguments (mutually exclusive with "composite environment arguments" below)')
add_environments_python(environment, target_mode)
add_environments_host(environment, controller_mode, target_mode)
@@ -253,6 +263,8 @@ def add_environments_python(
target_mode, # type: TargetMode
): # type: (...) -> None
"""Add environment arguments to control the Python version(s) used."""
+ python_versions: t.Tuple[str, ...]
+
if target_mode.has_python:
python_versions = SUPPORTED_PYTHON_VERSIONS
else:
@@ -278,8 +290,7 @@ def add_environments_host(
target_mode # type: TargetMode
): # type: (...) -> None
"""Add environment arguments for the given host and argument modes."""
- # noinspection PyTypeChecker
- environments_exclusive_group = environments_parser.add_mutually_exclusive_group() # type: argparse.ArgumentParser
+ environments_exclusive_group: argparse.ArgumentParser = environments_parser.add_mutually_exclusive_group() # type: ignore[assignment] # real type private
add_environment_local(environments_exclusive_group)
add_environment_venv(environments_exclusive_group, environments_parser)
@@ -299,28 +310,28 @@ def add_environment_network(
environments_parser, # type: argparse.ArgumentParser
): # type: (...) -> None
"""Add environment arguments for running on a windows host."""
- environments_parser.add_argument(
+ register_completer(environments_parser.add_argument(
'--platform',
metavar='PLATFORM',
action='append',
help='network platform/version',
- ).completer = complete_network_platform
+ ), complete_network_platform)
- environments_parser.add_argument(
+ register_completer(environments_parser.add_argument(
'--platform-collection',
type=key_value_type,
metavar='PLATFORM=COLLECTION',
action='append',
help='collection used to test platform',
- ).completer = complete_network_platform_collection
+ ), complete_network_platform_collection)
- environments_parser.add_argument(
+ register_completer(environments_parser.add_argument(
'--platform-connection',
type=key_value_type,
metavar='PLATFORM=CONNECTION',
action='append',
help='connection used to test platform',
- ).completer = complete_network_platform_connection
+ ), complete_network_platform_connection)
environments_parser.add_argument(
'--inventory',
@@ -333,12 +344,12 @@ def add_environment_windows(
environments_parser, # type: argparse.ArgumentParser
): # type: (...) -> None
"""Add environment arguments for running on a windows host."""
- environments_parser.add_argument(
+ register_completer(environments_parser.add_argument(
'--windows',
metavar='VERSION',
action='append',
help='windows version',
- ).completer = complete_windows
+ ), complete_windows)
environments_parser.add_argument(
'--inventory',
@@ -386,6 +397,8 @@ def add_global_docker(
docker_network=None,
docker_terminate=None,
prime_containers=False,
+ dev_systemd_debug=False,
+ dev_probe_cgroups=None,
)
return
@@ -417,6 +430,24 @@ def add_global_docker(
help='download containers without running tests',
)
+ # Docker support isn't related to ansible-core-ci.
+ # However, ansible-core-ci support is a reasonable indicator that the user may need the `--dev-*` options.
+ suppress = None if get_ci_provider().supports_core_ci_auth() else argparse.SUPPRESS
+
+ parser.add_argument(
+ '--dev-systemd-debug',
+ action='store_true',
+ help=suppress or 'enable systemd debugging in containers',
+ )
+
+ parser.add_argument(
+ '--dev-probe-cgroups',
+ metavar='DIR',
+ nargs='?',
+ const='',
+ help=suppress or 'probe container cgroups, with optional log dir',
+ )
+
def add_environment_docker(
exclusive_parser, # type: argparse.ArgumentParser
@@ -429,13 +460,13 @@ def add_environment_docker(
else:
docker_images = sorted(filter_completion(docker_completion(), controller_only=True))
- exclusive_parser.add_argument(
+ register_completer(exclusive_parser.add_argument(
'--docker',
metavar='IMAGE',
nargs='?',
const='default',
help='run from a docker container',
- ).completer = functools.partial(complete_choices, docker_images)
+ ), functools.partial(complete_choices, docker_images))
environments_parser.add_argument(
'--docker-privileged',
@@ -474,12 +505,12 @@ def add_global_remote(
suppress = None if get_ci_provider().supports_core_ci_auth() else argparse.SUPPRESS
- parser.add_argument(
+ register_completer(parser.add_argument(
'--remote-stage',
metavar='STAGE',
default='prod',
help=suppress or 'remote stage to use: prod, dev',
- ).completer = complete_remote_stage
+ ), complete_remote_stage)
parser.add_argument(
'--remote-endpoint',
@@ -512,11 +543,11 @@ def add_environment_remote(
suppress = None if get_ci_provider().supports_core_ci_auth() else argparse.SUPPRESS
- exclusive_parser.add_argument(
+ register_completer(exclusive_parser.add_argument(
'--remote',
metavar='NAME',
help=suppress or 'run from a remote instance',
- ).completer = functools.partial(complete_choices, remote_platforms)
+ ), functools.partial(complete_choices, remote_platforms))
environments_parser.add_argument(
'--remote-provider',
@@ -525,25 +556,32 @@ def add_environment_remote(
help=suppress or 'remote provider to use: %(choices)s',
)
+ environments_parser.add_argument(
+ '--remote-arch',
+ metavar='ARCH',
+ choices=REMOTE_ARCHITECTURES,
+ help=suppress or 'remote arch to use: %(choices)s',
+ )
+
-def complete_remote_stage(prefix, **_): # type: (str, ...) -> t.List[str]
+def complete_remote_stage(prefix: str, **_) -> t.List[str]:
"""Return a list of supported stages matching the given prefix."""
return [stage for stage in ('prod', 'dev') if stage.startswith(prefix)]
-def complete_windows(prefix, parsed_args, **_): # type: (str, argparse.Namespace, ...) -> t.List[str]
+def complete_windows(prefix: str, parsed_args: argparse.Namespace, **_) -> t.List[str]:
"""Return a list of supported Windows versions matching the given prefix, excluding versions already parsed from the command line."""
return [i for i in get_windows_version_choices() if i.startswith(prefix) and (not parsed_args.windows or i not in parsed_args.windows)]
-def complete_network_platform(prefix, parsed_args, **_): # type: (str, argparse.Namespace, ...) -> t.List[str]
+def complete_network_platform(prefix: str, parsed_args: argparse.Namespace, **_) -> t.List[str]:
"""Return a list of supported network platforms matching the given prefix, excluding platforms already parsed from the command line."""
images = sorted(filter_completion(network_completion()))
return [i for i in images if i.startswith(prefix) and (not parsed_args.platform or i not in parsed_args.platform)]
-def complete_network_platform_collection(prefix, parsed_args, **_): # type: (str, argparse.Namespace, ...) -> t.List[str]
+def complete_network_platform_collection(prefix: str, parsed_args: argparse.Namespace, **_) -> t.List[str]:
"""Return a list of supported network platforms matching the given prefix, excluding collection platforms already parsed from the command line."""
left = prefix.split('=')[0]
images = sorted(set(image.platform for image in filter_completion(network_completion()).values()))
@@ -551,7 +589,7 @@ def complete_network_platform_collection(prefix, parsed_args, **_): # type: (st
return [i + '=' for i in images if i.startswith(left) and (not parsed_args.platform_collection or i not in [x[0] for x in parsed_args.platform_collection])]
-def complete_network_platform_connection(prefix, parsed_args, **_): # type: (str, argparse.Namespace, ...) -> t.List[str]
+def complete_network_platform_connection(prefix: str, parsed_args: argparse.Namespace, **_) -> t.List[str]:
"""Return a list of supported network platforms matching the given prefix, excluding connection platforms already parsed from the command line."""
left = prefix.split('=')[0]
images = sorted(set(image.platform for image in filter_completion(network_completion()).values()))