Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a88839a
nixos/nspawn-container: add support for shared directory
kmein Jan 8, 2026
628195b
nixos/virtualisation: correct virtualisation.vlans docstring
kmein Jan 12, 2026
197287d
nixos/test-driver: fix typo
kmein Jan 8, 2026
799cafc
nixos/test-driver: refactor Machine to BaseMachine and QemuMachine
kmein Jan 8, 2026
23f1e63
nixos/test-driver: add support for nspawn containers
kmein Jan 8, 2026
1bbcf46
nixos/tests: add nspawn container bittorrent integration test
kmein Jan 8, 2026
930f45e
nixos/tests: add nspawn container integration test
kmein Jan 8, 2026
7c82198
nixos/test-driver: fix grammar and typos
kmein Jan 12, 2026
0702405
nixos/test-driver: implement container↔VM networking
kmein Jan 12, 2026
d90e24b
nixos/test-driver: deprecate --keep-vm-state in favour of --keep-mach…
kmein Jan 13, 2026
47b08df
nixos/test-driver: deprecate copy_from_vm in favour of copy_from_machine
kmein Jan 13, 2026
898fc1d
nixos/tests: move container integration test to nixos-test-driver.con…
kmein Jan 19, 2026
4cd7413
nixos/test-driver: rename machine properties to machines_{qemu,nspawn}
kmein Jan 27, 2026
1dbb174
nixos/test-driver: improve overlapping machine name warning
kmein Jan 27, 2026
8e0487c
nixos/test-driver: use systemd container interface for SSH backdoor
kmein Jan 28, 2026
0d1a353
nixos/test-driver: provide all machines from read-only allMachines op…
kmein Jan 28, 2026
884c63f
nixos/test-driver: remove superfluous machine methods
kmein Jan 28, 2026
a4fa7a9
nixos/test-driver: stream nspawn container journal
kmein Jan 28, 2026
0e1d359
nixos/test-driver: add machine name to all log output
kmein Jan 28, 2026
2e959ab
nixos/test-driver: do not set -x commands in nspawn containers
kmein Jan 28, 2026
f1d0d7a
nixos/test-driver: document rationale for creating /etc/os-release
kmein Feb 6, 2026
019697d
nixos/test-driver: document implications of sourcing /etc/profile wit…
kmein Feb 6, 2026
af0238c
nixos/virtualisation: assert nspawn container name length
kmein Feb 9, 2026
3acd5ca
nixos/virtualisation: disallow specialisation in nspawn-container
kmein Feb 9, 2026
1846748
nixos/test-driver: remove systemd dependency if no containers are con…
kmein Feb 10, 2026
9988469
nixos/test-driver: show all lines of container journal
kmein Feb 10, 2026
1118384
nixos/test-driver: use long options for journalctl call
kmein Feb 10, 2026
8c8bf9b
nixos/test-driver: required vm_names and container_names
kmein Feb 10, 2026
c4c96a7
nixos/test-driver: wait for READY message from nspawn container
kmein Feb 10, 2026
2038234
nixos/tests: remove firewall configuration
kmein Mar 3, 2026
e4df4c2
nixos/test-driver: disable DHCP in nspawn containers
kmein Mar 3, 2026
3dc77ba
nixos/test-driver: exponential backoff and logging for nspawn startup
kmein Mar 3, 2026
6d466ec
nixos/test-driver: thread-safe polling of nspawn container journal
kmein Mar 3, 2026
d1386a4
nixos/virtualisation: provide actionable advice on VLAN TAP failure
kmein Mar 4, 2026
7f6ea2a
nixos/test-driver: make /etc/hosts resolution VLAN-aware
kmein Mar 4, 2026
8615a25
nixos/test-driver: make /etc/hosts VLAN-aware with primary IP fallback
kmein Mar 10, 2026
01d5f7a
nixos/test-driver: pass containers to tests
kmein Mar 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions nixos/lib/test-driver/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@
qemu_test,
setuptools,
socat,
systemd,
tesseract4,
util-linux,
vde2,

enableNspawn ? false,
enableOCR ? false,
extraPythonPackages ? (_: [ ]),
}:
Expand Down Expand Up @@ -51,8 +54,12 @@ buildPythonApplication {
netpbm
qemu_pkg
socat
util-linux
vde2
]
++ lib.optionals enableNspawn [
systemd
]
++ lib.optionals enableOCR [
imagemagick_light
tesseract4
Expand Down
2 changes: 1 addition & 1 deletion nixos/lib/test-driver/src/extract-docstrings.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def main() -> None:

class_definitions = (node for node in module.body if isinstance(node, ast.ClassDef))

machine_class = next(filter(lambda x: x.name == "Machine", class_definitions))
machine_class = next(filter(lambda x: x.name == "BaseMachine", class_definitions))
assert machine_class is not None

function_definitions = [
Expand Down
95 changes: 77 additions & 18 deletions nixos/lib/test-driver/src/test_driver/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import argparse
import os
import sys
import time
import warnings
from pathlib import Path

import ptpython.ipython
Expand All @@ -16,7 +18,7 @@


class EnvDefault(argparse.Action):
"""An argpars Action that takes values from the specified
"""An argparse Action that takes values from the specified
environment variable as the flags default value.
"""

Expand Down Expand Up @@ -55,9 +57,15 @@ def writeable_dir(arg: str) -> Path:
def main() -> None:
arg_parser = argparse.ArgumentParser(prog="nixos-test-driver")
arg_parser.add_argument(
"-K",
"--keep-vm-state",
help="re-use a VM state coming from a previous run",
help=argparse.SUPPRESS,
dest="keep_machine_state",
action="store_true",
)
arg_parser.add_argument(
"-K",
"--keep-machine-state",
help="re-use a machine state coming from a previous run",
action="store_true",
)
arg_parser.add_argument(
Expand All @@ -71,13 +79,37 @@ def main() -> None:
help="Enable interactive debugging breakpoints for sandboxed runs",
)
arg_parser.add_argument(
"--start-scripts",
metavar="START-SCRIPT",
"--vm-names",
metavar="VM-NAME",
action=EnvDefault,
envvar="startScripts",
envvar="vmNames",
nargs="*",
help="names of participating virtual machines",
)
arg_parser.add_argument(
"--vm-start-scripts",
metavar="VM-START-SCRIPT",
action=EnvDefault,
envvar="vmStartScripts",
nargs="*",
help="start scripts for participating virtual machines",
)
arg_parser.add_argument(
"--container-names",
metavar="CONTAINER-NAME",
action=EnvDefault,
envvar="containerNames",
nargs="*",
help="names of participating containers",
)
arg_parser.add_argument(
"--container-start-scripts",
metavar="CONTAINER-START-SCRIPT",
action=EnvDefault,
envvar="containerStartScripts",
nargs="*",
help="start scripts for participating containers",
)
arg_parser.add_argument(
"--vlans",
metavar="VLAN",
Expand All @@ -97,8 +129,8 @@ def main() -> None:
arg_parser.add_argument(
"-o",
"--output_directory",
help="""The path to the directory where outputs copied from the VM will be placed.
By e.g. Machine.copy_from_vm or Machine.screenshot""",
help="""The path to the directory where outputs copied from the machine will be placed.
By e.g. NspawnMachine.copy_from_machine or QemuMachine.screenshot""",
default=Path.cwd(),
type=writeable_dir,
)
Expand All @@ -122,6 +154,12 @@ def main() -> None:

args = arg_parser.parse_args()

if "--keep-vm-state" in sys.argv:
warnings.warn(
"The flag '--keep-vm-state' is deprecated. Use '--keep-machine-state' instead.",
DeprecationWarning,
)

output_directory = args.output_directory.resolve()
logger = CompositeLogger([TerminalLogger()])

Expand All @@ -131,21 +169,33 @@ def main() -> None:
if args.junit_xml:
logger.add_logger(JunitXMLLogger(output_directory / args.junit_xml))

if not args.keep_vm_state:
logger.info("Machine state will be reset. To keep it, pass --keep-vm-state")
if not args.keep_machine_state:
logger.info(
"Machine state will be reset. To keep it, pass --keep-machine-state"
)

debugger: DebugAbstract = DebugNop()
if args.debug_hook_attach is not None:
debugger = Debug(logger, args.debug_hook_attach)

assert len(args.vm_names) == len(args.vm_start_scripts), (
f"the number of vm names and vm start scripts must be the same: {args.vm_names} vs. {args.vm_start_scripts}"
)
assert len(args.container_names) == len(args.container_start_scripts), (
f"the number of container names and container start scripts must be the same: {args.container_names} vs. {args.container_start_scripts}"
)

with Driver(
args.start_scripts,
args.vlans,
args.testscript.read_text(),
output_directory,
logger,
args.keep_vm_state,
args.global_timeout,
vm_names=args.vm_names,
vm_start_scripts=args.vm_start_scripts,
container_names=args.container_names,
container_start_scripts=args.container_start_scripts,
vlans=args.vlans,
tests=args.testscript.read_text(),
out_dir=output_directory,
logger=logger,
keep_machine_state=args.keep_machine_state,
global_timeout=args.global_timeout,
debug=debugger,
) as driver:
if offset := args.dump_vsocks:
Expand All @@ -170,7 +220,16 @@ def generate_driver_symbols() -> None:
in user's test scripts. That list is then used by pyflakes to lint those
scripts.
"""
d = Driver([], [], "", Path(), CompositeLogger([]))
d = Driver(
vm_names=[],
vm_start_scripts=[],
container_names=[],
container_start_scripts=[],
vlans=[],
tests="",
out_dir=Path(),
logger=CompositeLogger([]),
)
test_symbols = d.test_symbols()
with open("driver-symbols", "w") as fp:
fp.write(",".join(test_symbols.keys()))
Loading
Loading