mongo/buildscripts/resmokelib/parser.py
Sean Lyons c48000dc23 SERVER-124993: Add bazel rules for resmoke's multiversion setup (#51648)
GitOrigin-RevId: 385e05b192ae8da36d4de36025ccb8253d906f22
2026-04-22 17:51:48 +00:00

94 lines
3.1 KiB
Python

"""Parser for command line arguments."""
import argparse
import os
import shlex
from buildscripts.resmokelib import configure_resmoke
from buildscripts.resmokelib.discovery import DiscoveryPlugin
from buildscripts.resmokelib.generate_fcv_constants import GenerateFCVConstantsPlugin
from buildscripts.resmokelib.generate_fuzz_config.plugin import GenerateFuzzConfigPlugin
from buildscripts.resmokelib.hang_analyzer import HangAnalyzerPlugin
from buildscripts.resmokelib.hang_analyzer.core_analyzer import CoreAnalyzerPlugin
from buildscripts.resmokelib.multiversion import MultiversionPlugin
from buildscripts.resmokelib.powercycle import PowercyclePlugin
from buildscripts.resmokelib.run import RunPlugin
_PLUGINS = [
RunPlugin(),
CoreAnalyzerPlugin(),
HangAnalyzerPlugin(),
PowercyclePlugin(),
GenerateFCVConstantsPlugin(),
DiscoveryPlugin(),
MultiversionPlugin(),
GenerateFuzzConfigPlugin(),
]
def get_parser(usage=None):
"""Get the resmoke parser."""
parser = argparse.ArgumentParser(usage=usage)
subparsers = parser.add_subparsers(dest="command")
parser.add_argument(
"--configDir",
dest="config_dir",
metavar="CONFIG_DIR",
help="Directory to search for resmoke configuration files",
)
parser.add_argument(
"--jstestsDir",
dest="jstests_dir",
metavar="CONFIG_DIR",
help="Directory to search for jstests files existence while suite validation",
)
parser.add_argument(
"--externalModuleConfig",
dest="external_module_config",
metavar="CONFIG_FILE",
default=os.environ.get("EXTERNAL_MODULE_CONFIG", None),
help="Path to external module configuration YAML file (can also use EXTERNAL_MODULE_CONFIG env var)",
)
parser.add_argument(
"--mongoVersionFile",
dest="mongo_version_file",
help="A YAML file containing the current `mongo_version`.",
)
# Add sub-commands.
for plugin in _PLUGINS:
plugin.add_subcommand(subparsers)
return parser
def parse(sys_args, usage=None) -> tuple[argparse.ArgumentParser, dict]:
"""Parse the CLI args."""
parser = get_parser(usage=usage)
parsed_args = parser.parse_args(sys_args)
return parser, vars(parsed_args)
def parse_command_line(sys_args, usage=None, should_configure_otel=True, **kwargs):
"""Parse the command line arguments passed to resmoke.py and return the subcommand object to execute."""
parser, parsed_args = parse(sys_args, usage)
subcommand = parsed_args["command"]
for plugin in _PLUGINS:
subcommand_obj = plugin.parse(
subcommand, parser, parsed_args, should_configure_otel, **kwargs
)
if subcommand_obj is not None:
return subcommand_obj
raise RuntimeError(f"Resmoke configuration has invalid subcommand: {subcommand}. Try '--help'")
def set_run_options(argstr="", should_configure_otel=True):
"""Populate the config module variables for the 'run' subcommand with the default options."""
parser, parsed_args = parse(["run"] + shlex.split(argstr))
configure_resmoke.validate_and_update_config(parser, parsed_args, should_configure_otel)