Merge pull request #123052 from xoe-labs/da-test-vm-innteractive-log-switch

nixos/testing: add interactive serial stdout logs switch and dim them
This commit is contained in:
Robert Hensing 2021-05-20 15:32:54 +02:00 committed by GitHub
commit a37d157601
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 7 deletions

View file

@ -3,6 +3,7 @@ from contextlib import contextmanager, _GeneratorContextManager
from queue import Queue, Empty from queue import Queue, Empty
from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List, Iterable
from xml.sax.saxutils import XMLGenerator from xml.sax.saxutils import XMLGenerator
from colorama import Style
import queue import queue
import io import io
import _thread import _thread
@ -151,6 +152,8 @@ class Logger:
self.xml.startDocument() self.xml.startDocument()
self.xml.startElement("logfile", attrs={}) self.xml.startElement("logfile", attrs={})
self._print_serial_logs = True
def close(self) -> None: def close(self) -> None:
self.xml.endElement("logfile") self.xml.endElement("logfile")
self.xml.endDocument() self.xml.endDocument()
@ -174,15 +177,21 @@ class Logger:
self.drain_log_queue() self.drain_log_queue()
self.log_line(message, attributes) self.log_line(message, attributes)
def enqueue(self, message: Dict[str, str]) -> None: def log_serial(self, message: str, machine: str) -> None:
self.queue.put(message) self.enqueue({"msg": message, "machine": machine, "type": "serial"})
if self._print_serial_logs:
eprint(Style.DIM + "{} # {}".format(machine, message) + Style.RESET_ALL)
def enqueue(self, item: Dict[str, str]) -> None:
self.queue.put(item)
def drain_log_queue(self) -> None: def drain_log_queue(self) -> None:
try: try:
while True: while True:
item = self.queue.get_nowait() item = self.queue.get_nowait()
attributes = {"machine": item["machine"], "type": "serial"} msg = self.sanitise(item["msg"])
self.log_line(self.sanitise(item["msg"]), attributes) del item["msg"]
self.log_line(msg, item)
except Empty: except Empty:
pass pass
@ -327,6 +336,9 @@ class Machine:
def log(self, msg: str) -> None: def log(self, msg: str) -> None:
self.logger.log(msg, {"machine": self.name}) self.logger.log(msg, {"machine": self.name})
def log_serial(self, msg: str) -> None:
self.logger.log_serial(msg, self.name)
def nested(self, msg: str, attrs: Dict[str, str] = {}) -> _GeneratorContextManager: def nested(self, msg: str, attrs: Dict[str, str] = {}) -> _GeneratorContextManager:
my_attrs = {"machine": self.name} my_attrs = {"machine": self.name}
my_attrs.update(attrs) my_attrs.update(attrs)
@ -784,8 +796,7 @@ class Machine:
# Ignore undecodable bytes that may occur in boot menus # Ignore undecodable bytes that may occur in boot menus
line = _line.decode(errors="ignore").replace("\r", "").rstrip() line = _line.decode(errors="ignore").replace("\r", "").rstrip()
self.last_lines.put(line) self.last_lines.put(line)
eprint("{} # {}".format(self.name, line)) self.log_serial(line)
self.logger.enqueue({"msg": line, "machine": self.name})
_thread.start_new_thread(process_serial_output, ()) _thread.start_new_thread(process_serial_output, ())
@ -927,6 +938,16 @@ def run_tests() -> None:
machine.execute("sync") machine.execute("sync")
def serial_stdout_on() -> None:
global log
log._print_serial_logs = True
def serial_stdout_off() -> None:
global log
log._print_serial_logs = False
@contextmanager @contextmanager
def subtest(name: str) -> Iterator[None]: def subtest(name: str) -> Iterator[None]:
with log.nested(name): with log.nested(name):

View file

@ -25,7 +25,7 @@ rec {
name = "nixos-test-driver"; name = "nixos-test-driver";
nativeBuildInputs = [ makeWrapper ]; nativeBuildInputs = [ makeWrapper ];
buildInputs = [ (python3.withPackages (p: [ p.ptpython ])) ]; buildInputs = [ (python3.withPackages (p: [ p.ptpython p.colorama ])) ];
checkInputs = with python3Packages; [ pylint black mypy ]; checkInputs = with python3Packages; [ pylint black mypy ];
dontUnpack = true; dontUnpack = true;