On 11/8/23 12:53, Juraj Linkeš wrote:
Format according to the Google format and PEP257, with slight
deviations.
Signed-off-by: Juraj Linkeš <juraj.lin...@pantheon.tech>
---
dts/framework/settings.py | 101 +++++++++++++++++++++++++++++++++++++-
1 file changed, 100 insertions(+), 1 deletion(-)
diff --git a/dts/framework/settings.py b/dts/framework/settings.py
index 7f5841d073..787db7c198 100644
--- a/dts/framework/settings.py
+++ b/dts/framework/settings.py
@@ -3,6 +3,70 @@
# Copyright(c) 2022-2023 PANTHEON.tech s.r.o.
# Copyright(c) 2022 University of New Hampshire
+"""Environment variables and command line arguments parsing.
+
+This is a simple module utilizing the built-in argparse module to parse
command line arguments,
+augment them with values from environment variables and make them available
across the framework.
+
+The command line value takes precedence, followed by the environment variable
value,
+followed by the default value defined in this module.
+
+The command line arguments along with the supported environment variables are:
+
+.. option:: --config-file
+.. envvar:: DTS_CFG_FILE
+
+ The path to the YAML test run configuration file.
+
+.. option:: --output-dir, --output
+.. envvar:: DTS_OUTPUT_DIR
+
+ The directory where DTS logs and results are saved.
+
+.. option:: --compile-timeout
+.. envvar:: DTS_COMPILE_TIMEOUT
+
+ The timeout for compiling DPDK.
+
+.. option:: -t, --timeout
+.. envvar:: DTS_TIMEOUT
+
+ The timeout for all DTS operation except for compiling DPDK.
+
+.. option:: -v, --verbose
+.. envvar:: DTS_VERBOSE
+
+ Set to any value to enable logging everything to the console.
+
+.. option:: -s, --skip-setup
+.. envvar:: DTS_SKIP_SETUP
+
+ Set to any value to skip building DPDK.
+
+.. option:: --tarball, --snapshot, --git-ref
+.. envvar:: DTS_DPDK_TARBALL
+
+ The path to a DPDK tarball, git commit ID, tag ID or tree ID to test.
+
+.. option:: --test-cases
+.. envvar:: DTS_TESTCASES
+
+ A comma-separated list of test cases to execute. Unknown test cases will
be silently ignored.
+
+.. option:: --re-run, --re_run
+.. envvar:: DTS_RERUN
+
+ Re-run each test case this many times in case of a failure.
+
+Attributes:
+ SETTINGS: The module level variable storing framework-wide DTS settings.
In the generated doc, "Attributes" doesn't appear. It ends up looking
like SETTINGS is just another environment variable, with no separation
with the above list.
+
+Typical usage example::
+
+ from framework.settings import SETTINGS
+ foo = SETTINGS.foo
+"""
+
import argparse
import os
from collections.abc import Callable, Iterable, Sequence
@@ -16,6 +80,23 @@
def _env_arg(env_var: str) -> Any:
+ """A helper method augmenting the argparse Action with environment variable
> +
+ If the supplied environment variable is defined, then the default value
+ of the argument is modified. This satisfies the priority order of
+ command line argument > environment variable > default value.
+
+ Arguments with no values (flags) should be defined using the const keyword
argument
+ (True or False). When the argument is specified, it will be set to const,
if not specified,
+ the default will be stored (possibly modified by the corresponding
environment variable).
+
+ Other arguments work the same as default argparse arguments, that is using
+ the default 'store' action.
+
+ Returns:
+ The modified argparse.Action.
+ """
+
class _EnvironmentArgument(argparse.Action):
def __init__(
self,
@@ -68,14 +149,28 @@ def __call__(
@dataclass(slots=True)
class Settings:
+ """Default framework-wide user settings.
+
+ The defaults may be modified at the start of the run.
+ """
+
+ #:
config_file_path: Path =
Path(__file__).parent.parent.joinpath("conf.yaml")
+ #:
output_dir: str = "output"
+ #:
timeout: float = 15
+ #:
verbose: bool = False
+ #:
skip_setup: bool = False
+ #:
dpdk_tarball_path: Path | str = "dpdk.tar.xz"
+ #:
compile_timeout: float = 1200
+ #:
test_cases: list[str] = field(default_factory=list)
+ #:
re_run: int = 0
For some reason in the doc, __init__ also appears :
__init__(config_file_path: ~pathlib.Path = PosixPath('/ho...
@@ -169,7 +264,7 @@ def _get_parser() -> argparse.ArgumentParser:
action=_env_arg("DTS_RERUN"),
default=SETTINGS.re_run,
type=int,
- help="[DTS_RERUN] Re-run each test case the specified amount of times "
+ help="[DTS_RERUN] Re-run each test case the specified number of times "
"if a test failure occurs",
)
@@ -177,6 +272,10 @@ def _get_parser() -> argparse.ArgumentParser:
def get_settings() -> Settings:
+ """Create new settings with inputs from the user.
+
+ The inputs are taken from the command line and from environment variables.
+ """
parsed_args = _get_parser().parse_args()
return Settings(
config_file_path=parsed_args.config_file,