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

[RFC XEN PATCH 08/13] pytest: Run run-tools-tests over ssh on the test machine



From: Anthony PERARD <anthony.perard@xxxxxxxxxx>

Add a new random ssh public key to the rootfs.

Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
---
 automation/pytest/lib/boot_binary.py |  7 +++++
 automation/pytest/test_boot.py       | 39 ++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/automation/pytest/lib/boot_binary.py 
b/automation/pytest/lib/boot_binary.py
index d8f503ead9f2..1910d1f88fe6 100644
--- a/automation/pytest/lib/boot_binary.py
+++ b/automation/pytest/lib/boot_binary.py
@@ -23,6 +23,7 @@ class BootBinary:
     def __init__(self, tmp_path: Path, xenroot: Path,
                  pxe_host: str,
                  http_pxe_path: str,
+                 ssh_pub_keys: str | None = None,
                  vlan_id: int | None = None,
                  static_ip: str | None = None,
                  static_gateway: str | None = None,
@@ -37,6 +38,7 @@ class BootBinary:
         self.static_gateway = static_gateway
         self.static_dns = static_dns
         self.static_ipv6 = static_ipv6
+        self.ssh_pub_keys = ssh_pub_keys
         self.boot_script = boot_script
 
         # Minimal rootfs
@@ -126,6 +128,11 @@ class BootBinary:
         runlevel_boot_d.mkdir(parents=True)
         (runlevel_boot_d / "networking").symlink_to("/etc/init.d/networking")
 
+        if self.ssh_pub_keys:
+            home_root_ssh = rootfs_path / "root/.ssh"
+            home_root_ssh.mkdir(parents=True)
+            (home_root_ssh / "authorized_keys").write_text(self.ssh_pub_keys)
+
         local_d_dir = rootfs_path / "etc/local.d"
         local_d_dir.mkdir(parents=True)
 
diff --git a/automation/pytest/test_boot.py b/automation/pytest/test_boot.py
index 90d8e00e90d9..039cc36c1a04 100644
--- a/automation/pytest/test_boot.py
+++ b/automation/pytest/test_boot.py
@@ -1,5 +1,6 @@
 import logging
 import os
+import paramiko
 from pathlib import Path
 import pytest
 import random
@@ -16,6 +17,11 @@ def xenroot_path() -> Path:
     return Path("../..").resolve()
 
 
+@pytest.fixture
+def sshkey_for_test() -> paramiko.pkey.PKey:
+    return paramiko.ecdsakey.ECDSAKey.generate()
+
+
 @pytest.fixture
 def boot_string() -> str:
     return ''.join(random.choice(string.ascii_letters) for _ in range(16))
@@ -24,6 +30,7 @@ def boot_string() -> str:
 @pytest.fixture
 def prepare_rootfs(tmp_path: Path,
                    xenroot_path: Path,
+                   sshkey_for_test: paramiko.pkey.PKey,
                    boot_string: str,
                    ) -> BootBinary:
     static_gateway = os.environ['HOST_IP_GATEWAY']
@@ -31,6 +38,9 @@ def prepare_rootfs(tmp_path: Path,
 
     boot_script = f"echo Dom0 ready {boot_string}\n"
 
+    ssh_pub_keys = os.environ['SSH_PUB_KEYS']
+    ssh_pub_keys += f"\n{sshkey_for_test.get_name()} 
{sshkey_for_test.get_base64()}\n"
+
     return BootBinary(tmp_path,
                       xenroot_path,
                       vlan_id=int(os.environ['HOST_IP_VLANID']),
@@ -40,6 +50,7 @@ def prepare_rootfs(tmp_path: Path,
                       static_gateway=static_gateway,
                       static_dns=static_gateway,
                       static_ipv6=os.environ['HOST_IP6'],
+                      ssh_pub_keys=ssh_pub_keys,
                       boot_script=boot_script,
                       )
 
@@ -73,6 +84,7 @@ def machine_on_ipmi(prepare_netboot: None) -> Generator[IPMI]:
 
 @pytest.mark.timeout(600)
 def test_xen_tools_tests(machine_on_ipmi: IPMI,
+                         sshkey_for_test: paramiko.pkey.PKey,
                          boot_string: str,
                          ) -> None:
     expect_string = boot_string
@@ -91,3 +103,30 @@ def test_xen_tools_tests(machine_on_ipmi: IPMI,
         if "Manual reset required ('noreboot' specified)" in line:
             # Test failed, could wait a bit before failing the test.
             logging.error("Xen panic")
+    ssh = paramiko.client.SSHClient()
+    ssh.set_missing_host_key_policy(paramiko.client.WarningPolicy)
+    logging.debug(f"connecting to {os.environ['HOST_IP4'].split('/')[0]}")
+    ssh.connect(os.environ['HOST_IP4'].split('/')[0],
+                username='root',
+                pkey=sshkey_for_test,
+                timeout=10,
+                )
+
+    cmd = '/root/run-tools-tests /usr/lib/xen/tests /tmp/tests-junit.xml'
+    logging.info(f"Exec command: {cmd}")
+    stdin, stdout, stderr = ssh.exec_command(cmd)
+    for output in stdout:
+        logging.debug(output.strip())
+    errormsg = stderr.read()
+    if errormsg:
+        logging.info(f"cmd errro: {errormsg!r}")
+    exit_status = stderr.channel.recv_exit_status()
+    logging.debug(f"exit status: {exit_status}")
+
+    cmd = 'cat /tmp/tests-junit.xml'
+    stdin, stdout, stderr = ssh.exec_command(cmd)
+    junit = stdout.read()
+    logging.debug(f"got junit result: {junit!r}")
+    errormsg = stderr.read()
+    if errormsg:
+        logging.info(f"cmd errro: {errormsg!r}")
-- 
Anthony PERARD




 


Rackspace

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