Loading nixos/lib/test-driver/src/test_driver/__init__.py +13 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ from test_driver.driver import Driver from test_driver.logger import ( CompositeLogger, JunitXMLLogger, LogLevel, TerminalLogger, XMLLogger, ) Loading Loading @@ -151,6 +152,15 @@ def main() -> None: help="indicates that the interactive SSH backdoor is active and dumps information about it on start", type=int, ) log_level_map = {level.name.lower(): level for level in LogLevel} arg_parser.add_argument( "--log-level", metavar="LOG_LEVEL", action=EnvDefault, envvar="logLevel", choices=log_level_map, help="Set the log level", ) args = arg_parser.parse_args() Loading @@ -169,6 +179,9 @@ def main() -> None: if args.junit_xml: logger.add_logger(JunitXMLLogger(output_directory / args.junit_xml)) if args.log_level: logger.set_log_level(log_level_map[args.log_level]) if not args.keep_machine_state: logger.info( "Machine state will be reset. To keep it, pass --keep-machine-state" Loading nixos/lib/test-driver/src/test_driver/logger.py +39 −6 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import unicodedata from abc import ABC, abstractmethod from collections.abc import Iterator from contextlib import ExitStack, contextmanager from enum import IntEnum from pathlib import Path from queue import Empty, Queue from typing import Any Loading @@ -17,6 +18,12 @@ from colorama import Fore, Style from junit_xml import TestCase, TestSuite class LogLevel(IntEnum): INFO = 1 WARNING = 2 ERROR = 3 class AbstractLogger(ABC): @abstractmethod def log(self, message: str, attributes: dict[str, str] = {}) -> None: Loading Loading @@ -56,6 +63,10 @@ class AbstractLogger(ABC): def print_serial_logs(self, enable: bool) -> None: pass @abstractmethod def set_log_level(self, level: LogLevel) -> None: pass class JunitXMLLogger(AbstractLogger): class TestCaseState: Loading @@ -71,6 +82,7 @@ class JunitXMLLogger(AbstractLogger): self.currentSubtest = "main" self.outfile: Path = outfile self._print_serial_logs = True self._log_level = LogLevel.INFO atexit.register(self.close) def log(self, message: str, attributes: dict[str, str] = {}) -> None: Loading @@ -92,9 +104,11 @@ class JunitXMLLogger(AbstractLogger): yield def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.tests[self.currentSubtest].stdout += args[0] + os.linesep def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.tests[self.currentSubtest].stdout += args[0] + os.linesep def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -113,6 +127,9 @@ class JunitXMLLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def close(self) -> None: with open(self.outfile, "w") as f: test_cases = [] Loading Loading @@ -180,10 +197,15 @@ class CompositeLogger(AbstractLogger): for logger in self.logger_list: logger.log_serial(message, machine) def set_log_level(self, level: LogLevel) -> None: for logger in self.logger_list: logger.set_log_level(level) class TerminalLogger(AbstractLogger): def __init__(self) -> None: self._print_serial_logs = True self._log_level = LogLevel.INFO def maybe_prefix(self, message: str, attributes: dict[str, str]) -> str: if "machine" in attributes: Loading Loading @@ -216,9 +238,11 @@ class TerminalLogger(AbstractLogger): self.log(f"(finished: {message}, in {toc - tic:.2f} seconds)", attributes) def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.log(*args, **kwargs) def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.log(*args, **kwargs) def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -227,6 +251,9 @@ class TerminalLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def log_serial(self, message: str, machine: str) -> None: if not self._print_serial_logs: return Loading @@ -246,6 +273,7 @@ class XMLLogger(AbstractLogger): self.queue: Queue[dict[str, str]] = Queue() self._print_serial_logs = True self._log_level = LogLevel.INFO self.xml.startDocument() self.xml.startElement("logfile", attrs=AttributesImpl({})) Loading @@ -269,9 +297,11 @@ class XMLLogger(AbstractLogger): self.xml.endElement("line") def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.log(*args, **kwargs) def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.log(*args, **kwargs) def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -287,6 +317,9 @@ class XMLLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def log_serial(self, message: str, machine: str) -> None: if not self._print_serial_logs: return Loading nixos/lib/testing/driver.nix +12 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,7 @@ let --set testScript "$out/test-script" \ --set globalTimeout "${toString config.globalTimeout}" \ --set vlans '${toString vlans}' \ --set logLevel "${config.logLevel}" \ ${lib.escapeShellArgs ( lib.concatMap (arg: [ "--add-flags" Loading Loading @@ -219,6 +220,17 @@ in This may speed up your iteration cycle, unless you're working on the [{option}`testScript`](#test-opt-testScript). ''; }; logLevel = mkOption { description = "Log level for the test driver."; type = types.enum [ "info" "warning" "error" ]; default = "info"; example = "warning"; }; }; config = { Loading Loading
nixos/lib/test-driver/src/test_driver/__init__.py +13 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ from test_driver.driver import Driver from test_driver.logger import ( CompositeLogger, JunitXMLLogger, LogLevel, TerminalLogger, XMLLogger, ) Loading Loading @@ -151,6 +152,15 @@ def main() -> None: help="indicates that the interactive SSH backdoor is active and dumps information about it on start", type=int, ) log_level_map = {level.name.lower(): level for level in LogLevel} arg_parser.add_argument( "--log-level", metavar="LOG_LEVEL", action=EnvDefault, envvar="logLevel", choices=log_level_map, help="Set the log level", ) args = arg_parser.parse_args() Loading @@ -169,6 +179,9 @@ def main() -> None: if args.junit_xml: logger.add_logger(JunitXMLLogger(output_directory / args.junit_xml)) if args.log_level: logger.set_log_level(log_level_map[args.log_level]) if not args.keep_machine_state: logger.info( "Machine state will be reset. To keep it, pass --keep-machine-state" Loading
nixos/lib/test-driver/src/test_driver/logger.py +39 −6 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import unicodedata from abc import ABC, abstractmethod from collections.abc import Iterator from contextlib import ExitStack, contextmanager from enum import IntEnum from pathlib import Path from queue import Empty, Queue from typing import Any Loading @@ -17,6 +18,12 @@ from colorama import Fore, Style from junit_xml import TestCase, TestSuite class LogLevel(IntEnum): INFO = 1 WARNING = 2 ERROR = 3 class AbstractLogger(ABC): @abstractmethod def log(self, message: str, attributes: dict[str, str] = {}) -> None: Loading Loading @@ -56,6 +63,10 @@ class AbstractLogger(ABC): def print_serial_logs(self, enable: bool) -> None: pass @abstractmethod def set_log_level(self, level: LogLevel) -> None: pass class JunitXMLLogger(AbstractLogger): class TestCaseState: Loading @@ -71,6 +82,7 @@ class JunitXMLLogger(AbstractLogger): self.currentSubtest = "main" self.outfile: Path = outfile self._print_serial_logs = True self._log_level = LogLevel.INFO atexit.register(self.close) def log(self, message: str, attributes: dict[str, str] = {}) -> None: Loading @@ -92,9 +104,11 @@ class JunitXMLLogger(AbstractLogger): yield def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.tests[self.currentSubtest].stdout += args[0] + os.linesep def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.tests[self.currentSubtest].stdout += args[0] + os.linesep def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -113,6 +127,9 @@ class JunitXMLLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def close(self) -> None: with open(self.outfile, "w") as f: test_cases = [] Loading Loading @@ -180,10 +197,15 @@ class CompositeLogger(AbstractLogger): for logger in self.logger_list: logger.log_serial(message, machine) def set_log_level(self, level: LogLevel) -> None: for logger in self.logger_list: logger.set_log_level(level) class TerminalLogger(AbstractLogger): def __init__(self) -> None: self._print_serial_logs = True self._log_level = LogLevel.INFO def maybe_prefix(self, message: str, attributes: dict[str, str]) -> str: if "machine" in attributes: Loading Loading @@ -216,9 +238,11 @@ class TerminalLogger(AbstractLogger): self.log(f"(finished: {message}, in {toc - tic:.2f} seconds)", attributes) def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.log(*args, **kwargs) def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.log(*args, **kwargs) def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -227,6 +251,9 @@ class TerminalLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def log_serial(self, message: str, machine: str) -> None: if not self._print_serial_logs: return Loading @@ -246,6 +273,7 @@ class XMLLogger(AbstractLogger): self.queue: Queue[dict[str, str]] = Queue() self._print_serial_logs = True self._log_level = LogLevel.INFO self.xml.startDocument() self.xml.startElement("logfile", attrs=AttributesImpl({})) Loading @@ -269,9 +297,11 @@ class XMLLogger(AbstractLogger): self.xml.endElement("line") def info(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.INFO: self.log(*args, **kwargs) def warning(self, *args, **kwargs) -> None: # type: ignore if self._log_level <= LogLevel.WARNING: self.log(*args, **kwargs) def error(self, *args, **kwargs) -> None: # type: ignore Loading @@ -287,6 +317,9 @@ class XMLLogger(AbstractLogger): def print_serial_logs(self, enable: bool) -> None: self._print_serial_logs = enable def set_log_level(self, level: LogLevel) -> None: self._log_level = level def log_serial(self, message: str, machine: str) -> None: if not self._print_serial_logs: return Loading
nixos/lib/testing/driver.nix +12 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,7 @@ let --set testScript "$out/test-script" \ --set globalTimeout "${toString config.globalTimeout}" \ --set vlans '${toString vlans}' \ --set logLevel "${config.logLevel}" \ ${lib.escapeShellArgs ( lib.concatMap (arg: [ "--add-flags" Loading Loading @@ -219,6 +220,17 @@ in This may speed up your iteration cycle, unless you're working on the [{option}`testScript`](#test-opt-testScript). ''; }; logLevel = mkOption { description = "Log level for the test driver."; type = types.enum [ "info" "warning" "error" ]; default = "info"; example = "warning"; }; }; config = { Loading