1# SPDX-License-Identifier: BSD-3-Clause 2# Copyright(c) 2010-2021 Intel Corporation 3# Copyright(c) 2022 PANTHEON.tech s.r.o. 4# Copyright(c) 2022 University of New Hampshire 5 6import argparse 7import os 8from collections.abc import Callable, Iterable, Sequence 9from dataclasses import dataclass 10from typing import Any, TypeVar 11 12_T = TypeVar("_T") 13 14 15def _env_arg(env_var: str) -> Any: 16 class _EnvironmentArgument(argparse.Action): 17 def __init__( 18 self, 19 option_strings: Sequence[str], 20 dest: str, 21 nargs: str | int | None = None, 22 const: str | None = None, 23 default: str = None, 24 type: Callable[[str], _T | argparse.FileType | None] = None, 25 choices: Iterable[_T] | None = None, 26 required: bool = True, 27 help: str | None = None, 28 metavar: str | tuple[str, ...] | None = None, 29 ) -> None: 30 env_var_value = os.environ.get(env_var) 31 default = env_var_value or default 32 super(_EnvironmentArgument, self).__init__( 33 option_strings, 34 dest, 35 nargs=nargs, 36 const=const, 37 default=default, 38 type=type, 39 choices=choices, 40 required=required, 41 help=help, 42 metavar=metavar, 43 ) 44 45 def __call__( 46 self, 47 parser: argparse.ArgumentParser, 48 namespace: argparse.Namespace, 49 values: Any, 50 option_string: str = None, 51 ) -> None: 52 setattr(namespace, self.dest, values) 53 54 return _EnvironmentArgument 55 56 57@dataclass(slots=True, frozen=True) 58class _Settings: 59 config_file_path: str 60 output_dir: str 61 timeout: float 62 verbose: bool 63 64 65def _get_parser() -> argparse.ArgumentParser: 66 parser = argparse.ArgumentParser(description="DPDK test framework.") 67 68 parser.add_argument( 69 "--config-file", 70 action=_env_arg("DTS_CFG_FILE"), 71 default="conf.yaml", 72 required=False, 73 help="[DTS_CFG_FILE] configuration file that describes the test cases, SUTs " 74 "and targets.", 75 ) 76 77 parser.add_argument( 78 "--output-dir", 79 "--output", 80 action=_env_arg("DTS_OUTPUT_DIR"), 81 default="output", 82 required=False, 83 help="[DTS_OUTPUT_DIR] Output directory where dts logs and results are saved.", 84 ) 85 86 parser.add_argument( 87 "-t", 88 "--timeout", 89 action=_env_arg("DTS_TIMEOUT"), 90 default=15, 91 required=False, 92 help="[DTS_TIMEOUT] The default timeout for all DTS operations except for " 93 "compiling DPDK.", 94 ) 95 96 parser.add_argument( 97 "-v", 98 "--verbose", 99 action=_env_arg("DTS_VERBOSE"), 100 default="N", 101 required=False, 102 help="[DTS_VERBOSE] Set to 'Y' to enable verbose output, logging all messages " 103 "to the console.", 104 ) 105 106 return parser 107 108 109def _get_settings() -> _Settings: 110 parsed_args = _get_parser().parse_args() 111 return _Settings( 112 config_file_path=parsed_args.config_file, 113 output_dir=parsed_args.output_dir, 114 timeout=float(parsed_args.timeout), 115 verbose=(parsed_args.verbose == "Y"), 116 ) 117 118 119SETTINGS: _Settings = _get_settings() 120