From 7e7aa529d94971e172f741013d10d8002553bffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Baylac-Jacqu=C3=A9?= Date: Thu, 18 Jun 2020 13:23:32 +0200 Subject: [PATCH] test-driver.py: delete VM state directory after test run Keeping the VM state test across several run sometimes lead to subtle and hard to spot errors in practice. We delete the VM state which contains (among other things) the qcow volume. We also introduce a -K (--keep-vm-state) flag making VM state to persist after the test run. This flag makes test-driver.py to match its previous behaviour. --- .../running-nixos-tests-interactively.xml | 9 +++++++-- nixos/doc/manual/release-notes/rl-2009.xml | 6 ++++++ nixos/lib/test-driver/test-driver.py | 20 +++++++++++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/nixos/doc/manual/development/running-nixos-tests-interactively.xml b/nixos/doc/manual/development/running-nixos-tests-interactively.xml index 31216874c706..a11a9382764d 100644 --- a/nixos/doc/manual/development/running-nixos-tests-interactively.xml +++ b/nixos/doc/manual/development/running-nixos-tests-interactively.xml @@ -38,7 +38,12 @@ starting VDE switch for network 1 - The machine state is kept across VM restarts in - /tmp/vm-state-machinename. + You can re-use the VM states coming from a previous run + by setting the --keep-vm-state flag. + +$ ./result/bin/nixos-run-vms --keep-vm-state + + The machine state is stored in the + $TMPDIR/vm-state-machinename directory. diff --git a/nixos/doc/manual/release-notes/rl-2009.xml b/nixos/doc/manual/release-notes/rl-2009.xml index a0a0b2cb40e4..627f1d08edd2 100644 --- a/nixos/doc/manual/release-notes/rl-2009.xml +++ b/nixos/doc/manual/release-notes/rl-2009.xml @@ -656,6 +656,12 @@ systemd.services.nginx.serviceConfig.ReadWritePaths = [ "/var/www" ]; nextcloud18 before upgrading to nextcloud19 since Nextcloud doesn't support upgrades across multiple major versions. + + The nixos-run-vms script now deletes the + previous run machines states on test startup. You can use the + --keep-vm-state flag to match the previous + behaviour and keep the same VM state between different test runs. + diff --git a/nixos/lib/test-driver/test-driver.py b/nixos/lib/test-driver/test-driver.py index e7b05968b079..f454b052dc31 100644 --- a/nixos/lib/test-driver/test-driver.py +++ b/nixos/lib/test-driver/test-driver.py @@ -4,6 +4,7 @@ from queue import Queue, Empty from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List from xml.sax.saxutils import XMLGenerator import _thread +import argparse import atexit import base64 import codecs @@ -751,6 +752,11 @@ class Machine: self.log("QEMU running (pid {})".format(self.pid)) + def cleanup_statedir(self) -> None: + self.log("delete the VM state directory") + if os.path.isfile(self.state_dir): + shutil.rmtree(self.state_dir) + def shutdown(self) -> None: if not self.booted: return @@ -889,6 +895,15 @@ def subtest(name: str) -> Iterator[None]: if __name__ == "__main__": + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument( + "-K", + "--keep-vm-state", + help="re-use a VM state coming from a previous run", + action="store_true", + ) + (cli_args, vm_scripts) = arg_parser.parse_known_args() + log = Logger() vlan_nrs = list(dict.fromkeys(os.environ.get("VLANS", "").split())) @@ -896,8 +911,10 @@ if __name__ == "__main__": for nr, vde_socket, _, _ in vde_sockets: os.environ["QEMU_VDE_SOCKET_{}".format(nr)] = vde_socket - vm_scripts = sys.argv[1:] machines = [create_machine({"startCommand": s}) for s in vm_scripts] + for machine in machines: + if not cli_args.keep_vm_state: + machine.cleanup_statedir() machine_eval = [ "{0} = machines[{1}]".format(m.name, idx) for idx, m in enumerate(machines) ] @@ -911,7 +928,6 @@ if __name__ == "__main__": continue log.log("killing {} (pid {})".format(machine.name, machine.pid)) machine.process.kill() - for _, _, process, _ in vde_sockets: process.terminate() log.close()