xref: /dpdk/dts/framework/settings.py (revision 4b53e9802b6b6040ad5622b1414aaa93d9581d0c)
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