nixos/test-driver: use log levels

This commit is contained in:
Michael Schneider
2026-02-18 13:35:44 +02:00
parent 8ff553edaa
commit 149201a7e3
3 changed files with 64 additions and 6 deletions
@@ -12,6 +12,7 @@ from test_driver.driver import Driver
from test_driver.logger import (
CompositeLogger,
JunitXMLLogger,
LogLevel,
TerminalLogger,
XMLLogger,
)
@@ -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()
@@ -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"
@@ -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
@@ -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:
@@ -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:
@@ -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:
@@ -92,10 +104,12 @@ class JunitXMLLogger(AbstractLogger):
yield
def info(self, *args, **kwargs) -> None: # type: ignore
self.tests[self.currentSubtest].stdout += args[0] + os.linesep
if self._log_level <= LogLevel.INFO:
self.tests[self.currentSubtest].stdout += args[0] + os.linesep
def warning(self, *args, **kwargs) -> None: # type: ignore
self.tests[self.currentSubtest].stdout += args[0] + os.linesep
if self._log_level <= LogLevel.WARNING:
self.tests[self.currentSubtest].stdout += args[0] + os.linesep
def error(self, *args, **kwargs) -> None: # type: ignore
self.tests[self.currentSubtest].stderr += args[0] + os.linesep
@@ -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 = []
@@ -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:
@@ -216,10 +238,12 @@ class TerminalLogger(AbstractLogger):
self.log(f"(finished: {message}, in {toc - tic:.2f} seconds)", attributes)
def info(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
if self._log_level <= LogLevel.INFO:
self.log(*args, **kwargs)
def warning(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
if self._log_level <= LogLevel.WARNING:
self.log(*args, **kwargs)
def error(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
@@ -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
@@ -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({}))
@@ -269,10 +297,12 @@ class XMLLogger(AbstractLogger):
self.xml.endElement("line")
def info(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
if self._log_level <= LogLevel.INFO:
self.log(*args, **kwargs)
def warning(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
if self._log_level <= LogLevel.WARNING:
self.log(*args, **kwargs)
def error(self, *args, **kwargs) -> None: # type: ignore
self.log(*args, **kwargs)
@@ -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
+12
View File
@@ -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"
@@ -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 = {