[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC XEN PATCH 09/13] pytest: Generate a rootfs for a guest



From: Anthony PERARD <anthony.perard@xxxxxxxxxx>

Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 automation/pytest/conftest.py        |  6 ++++
 automation/pytest/lib/boot_binary.py | 42 ++++++++++++++++++++++++++++
 automation/pytest/test_boot.py       |  8 ++++++
 3 files changed, 56 insertions(+)
 create mode 100644 automation/pytest/conftest.py

diff --git a/automation/pytest/conftest.py b/automation/pytest/conftest.py
new file mode 100644
index 000000000000..304241ae06ba
--- /dev/null
+++ b/automation/pytest/conftest.py
@@ -0,0 +1,6 @@
+import pytest
+
+
+def pytest_configure(config: pytest.Config) -> None:
+    config.addinivalue_line("markers",
+                            "guest_boot_script: script to run when the guest 
boot")
diff --git a/automation/pytest/lib/boot_binary.py 
b/automation/pytest/lib/boot_binary.py
index 1910d1f88fe6..9e79b1798908 100644
--- a/automation/pytest/lib/boot_binary.py
+++ b/automation/pytest/lib/boot_binary.py
@@ -30,6 +30,7 @@ class BootBinary:
                  static_dns: str | None = None,
                  static_ipv6: str | None = None,
                  boot_script: str | None = None,
+                 guest_boot_script: str | None = None,
                  ) -> None:
         self.vlan_id = vlan_id
         self.pxe_host = pxe_host
@@ -40,6 +41,7 @@ class BootBinary:
         self.static_ipv6 = static_ipv6
         self.ssh_pub_keys = ssh_pub_keys
         self.boot_script = boot_script
+        self.guest_boot_script = guest_boot_script
 
         # Minimal rootfs
         rootfs_path = tmp_path / "rootfs_minimal"
@@ -53,6 +55,12 @@ class BootBinary:
         self.prepare_dom0_rootfs(rootfs_path, xenroot)
         self.rootfs_dom0_dir = rootfs_path
 
+        # Guest kernel + rootfs
+        rootfs_path = tmp_path / "rootfs_domU"
+        rootfs_path.mkdir()
+        self.prepare_guest_rootfs(rootfs_path, xenroot)
+        self.rootfs_guest_dir = rootfs_path
+
 
     def prepare_minimal_rootfs(self, rootfs_path: Path, xenroot: Path) -> None:
         script_pre_xen = dedent(f"""\
@@ -212,8 +220,42 @@ class BootBinary:
 
         self.xen_tools_rootfs = cpio_rootfs
 
+    def prepare_guest_rootfs(self, rootfs_path: Path, xenroot: Path) -> None:
+        etc = rootfs_path / "etc"
+        etc.mkdir()
+
+        local_d_dir = etc / "local.d"
+        local_d_dir.mkdir()
+
+        xen_start_script = local_d_dir / "xen.start"
+        xen_start_script.write_text(dedent(f"""\
+            #!/bin/sh
+            echo 8 > /proc/sys/kernel/printk
+            {self.guest_boot_script}
+            """))
+        xen_start_script.chmod(stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
+
+        (etc / "issue").write_text(dedent("""\
+            domU Welcome to Alpine Linux
+            Kernel \\r on an \\m (\\l)
+
+            """))
+
+        # rootfs archive
+        rootfs = []
+        # Uncompressed first! Then compressed cpio archives!
+        rootfs.append(xenroot / "binaries/rootfs.cpio.gz")
+        cpio_rootfs = xenroot / "binaries/guest-rootfs.cpio.gz"
+        concatenate_cpios(rootfs, cpio_rootfs)
+        cpio_archive_from_dir(rootfs_path, cpio_rootfs)
+
+        self.guest_rootfs = cpio_rootfs
+
     def minimal(self) -> Path:
         return self.minimal_rootfs
 
     def dom0_tools(self) -> Path:
         return self.xen_tools_rootfs
+
+    def guest(self) -> Path:
+        return self.guest_rootfs
diff --git a/automation/pytest/test_boot.py b/automation/pytest/test_boot.py
index 039cc36c1a04..5a7ec43fa52b 100644
--- a/automation/pytest/test_boot.py
+++ b/automation/pytest/test_boot.py
@@ -32,11 +32,17 @@ def prepare_rootfs(tmp_path: Path,
                    xenroot_path: Path,
                    sshkey_for_test: paramiko.pkey.PKey,
                    boot_string: str,
+                   request: pytest.FixtureRequest
                    ) -> BootBinary:
     static_gateway = os.environ['HOST_IP_GATEWAY']
     http_pxe_path = os.environ["PXE_HTTP_PATH"]
 
     boot_script = f"echo Dom0 ready {boot_string}\n"
+    marker = request.node.get_closest_marker("guest_boot_script")
+    if marker:
+        guest_boot_script = marker.args[0]
+    else:
+        guest_boot_script = None
 
     ssh_pub_keys = os.environ['SSH_PUB_KEYS']
     ssh_pub_keys += f"\n{sshkey_for_test.get_name()} 
{sshkey_for_test.get_base64()}\n"
@@ -52,6 +58,7 @@ def prepare_rootfs(tmp_path: Path,
                       static_ipv6=os.environ['HOST_IP6'],
                       ssh_pub_keys=ssh_pub_keys,
                       boot_script=boot_script,
+                      guest_boot_script=guest_boot_script,
                       )
 
 
@@ -61,6 +68,7 @@ def prepare_netboot(prepare_rootfs: BootBinary, xenroot_path: 
Path) -> None:
     rootfs_paths = [
         prepare_rootfs.minimal(),
         prepare_rootfs.dom0_tools(),
+        prepare_rootfs.guest(),
     ]
     netboot.prepare_tftp(xenroot_path, rootfs_paths)
 
-- 
Anthony PERARD




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.