about summary refs log tree commit diff
path: root/nixos/lib
diff options
context:
space:
mode:
authorMichael Raskin <7c6f434c@mail.ru>2019-11-25 00:03:16 +0100
committerMichael Raskin <7c6f434c@mail.ru>2019-11-25 11:35:48 +0100
commitad38a08ecbf19ee6476d4eea855241afca30422c (patch)
treec0e91f38b55482ab4a501c4fbc73992efe6f8992 /nixos/lib
parentef5bc381f969205493897b121ce36ecd7bdc1974 (diff)
downloadnixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar.gz
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar.bz2
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar.lz
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar.xz
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.tar.zst
nixlib-ad38a08ecbf19ee6476d4eea855241afca30422c.zip
test-driver.py: add Machine.copy_from_vm
Diffstat (limited to 'nixos/lib')
-rw-r--r--nixos/lib/test-driver/test-driver.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/nixos/lib/test-driver/test-driver.py b/nixos/lib/test-driver/test-driver.py
index d5e2ca6c6e4e..02c172c4a4d6 100644
--- a/nixos/lib/test-driver/test-driver.py
+++ b/nixos/lib/test-driver/test-driver.py
@@ -16,6 +16,8 @@ import tempfile
 import time
 import unicodedata
 from typing import Tuple, Any, Callable, Dict, Iterator, Optional, List
+import shlex
+import pathlib
 
 CHAR_TO_KEY = {
     "A": "shift-a",
@@ -91,6 +93,10 @@ def eprint(*args: object, **kwargs: Any) -> None:
     print(*args, file=sys.stderr, **kwargs)
 
 
+def make_command(args: list) -> str:
+    return " ".join(map(shlex.quote, (map(str, args))))
+
+
 def create_vlan(vlan_nr: str) -> Tuple[str, str, "subprocess.Popen[bytes]", Any]:
     global log
     log.log("starting VDE switch for network {}".format(vlan_nr))
@@ -524,6 +530,33 @@ class Machine:
             if ret.returncode != 0:
                 raise Exception("Cannot convert screenshot")
 
+    def copy_from_vm(self, source: str, target_dir: str = "") -> None:
+        """Copy a file from the VM (specified by an in-VM source path) to a path
+        relative to `$out`. The file is copied via the `shared_dir` shared among
+        all the VMs (using a temporary directory).
+        """
+        # Compute the source, target, and intermediate shared file names
+        out_dir = pathlib.Path(os.environ.get("out", os.getcwd()))
+        vm_src = pathlib.Path(source)
+        with tempfile.TemporaryDirectory(dir=self.shared_dir) as shared_td:
+            shared_temp = pathlib.Path(shared_td)
+            vm_shared_temp = pathlib.Path("/tmp/xchg") / shared_temp.name
+            vm_intermediate = vm_shared_temp / vm_src.name
+            intermediate = shared_temp / vm_src.name
+            # Copy the file to the shared directory inside VM
+            self.succeed(make_command(["mkdir", "-p", vm_shared_temp]))
+            self.succeed(make_command(["cp", "-r", vm_src, vm_intermediate]))
+            self.succeed("sync")
+            abs_target = out_dir / target_dir / vm_src.name
+            abs_target.parent.mkdir(exist_ok=True, parents=True)
+            # Copy the file from the shared directory outside VM
+            if intermediate.is_dir():
+                shutil.copytree(intermediate, abs_target)
+            else:
+                shutil.copy(intermediate, abs_target)
+        # Make sure the cleanup is synced into VM
+        self.succeed("sync")
+
     def dump_tty_contents(self, tty: str) -> None:
         """Debugging: Dump the contents of the TTY<n>
         """