"""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)