Commit 149201a7 authored by Michael Schneider's avatar Michael Schneider
Browse files

nixos/test-driver: use log levels

parent 8ff553ed
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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"
+39 −6
Original line number Diff line number Diff line
@@ -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,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
@@ -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,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
@@ -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,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
@@ -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 −0
Original line number Diff line number Diff line
@@ -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 = {