|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |