From 7765670c8a80695ae1b7c4e4d3ec6389ba533f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marijan=20Petri=C4=8Devi=C4=87?= Date: Tue, 25 Jan 2022 01:15:16 +0100 Subject: [PATCH] make output_directory an optional parameter --- nixos/lib/test-driver/test_driver/__init__.py | 31 +++++++++++-------- nixos/lib/test-driver/test_driver/driver.py | 3 -- nixos/lib/testing-python.nix | 2 +- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/nixos/lib/test-driver/test_driver/__init__.py b/nixos/lib/test-driver/test_driver/__init__.py index c7f2f9f3ec0..3ee140894a7 100755 --- a/nixos/lib/test-driver/test_driver/__init__.py +++ b/nixos/lib/test-driver/test_driver/__init__.py @@ -33,16 +33,18 @@ class EnvDefault(argparse.Action): setattr(namespace, self.dest, values) -class WriteableDir(argparse.Action): # type: ignore - def __call__(self, parser, namespace, values, option_string=None): # type: ignore - if not values.is_dir(): - raise argparse.ArgumentTypeError("{0} is not a directory".format(values)) - if os.access(values, os.W_OK): - setattr(namespace, self.dest, values) - else: - raise argparse.ArgumentTypeError( - "{0} is not a writeable directory".format(values) - ) +def raise_if_not_writeable_dir(path: Path) -> None: + """Raises an ArgumentTypeError if the given path isn't a writeable directory + Note: We want to fail as early as possible if a directory isn't writeable, + since an executed nixos-test could fail (very late) because of the test-driver + writing in a directory without proper permissions. + """ + if not path.is_dir(): + raise argparse.ArgumentTypeError("{0} is not a directory".format(path)) + if not os.access(path, os.W_OK): + raise argparse.ArgumentTypeError( + "{0} is not a writeable directory".format(path) + ) def main() -> None: @@ -76,10 +78,11 @@ def main() -> None: help="vlans to span by the driver", ) arg_parser.add_argument( - "output_directory", - action=WriteableDir, + "-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""", + default=Path.cwd(), type=Path, ) arg_parser.add_argument( @@ -92,6 +95,8 @@ def main() -> None: args = arg_parser.parse_args() + raise_if_not_writeable_dir(args.output_directory) + if not args.keep_vm_state: rootlog.info("Machine state will be reset. To keep it, pass --keep-vm-state") @@ -99,7 +104,7 @@ def main() -> None: args.start_scripts, args.vlans, args.testscript.read_text(), - args.output_directory, + args.output_directory.resolve(), args.keep_vm_state, ) as driver: if args.interactive: diff --git a/nixos/lib/test-driver/test_driver/driver.py b/nixos/lib/test-driver/test_driver/driver.py index d4f799a1cbf..656e04143c1 100644 --- a/nixos/lib/test-driver/test_driver/driver.py +++ b/nixos/lib/test-driver/test_driver/driver.py @@ -48,11 +48,8 @@ class Driver: keep_vm_state=keep_vm_state, name=cmd.machine_name, tmp_dir=tmp_dir, -<<<<<<< HEAD callbacks=[self.check_polling_conditions], -======= out_dir=self.out_dir, ->>>>>>> 68b2e235272 (nixos/test-driver: use an argument instead of the out env-var) ) for cmd in cmd(start_scripts) ] diff --git a/nixos/lib/testing-python.nix b/nixos/lib/testing-python.nix index 68c8b0eeba0..a6704046813 100644 --- a/nixos/lib/testing-python.nix +++ b/nixos/lib/testing-python.nix @@ -30,7 +30,7 @@ rec { # effectively mute the XMLLogger export LOGFILE=/dev/null - ${driver}/bin/nixos-test-driver $out + ${driver}/bin/nixos-test-driver ''; passthru = driver.passthru // {