From: Nicholas Piggin <npiggin@gmail.com>
To: qemu-ppc@nongnu.org
Cc: "Nicholas Piggin" <npiggin@gmail.com>,
"Cleber Rosa" <crosa@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Beraldo Leal" <bleal@redhat.com>,
qemu-devel@nongnu.org
Subject: [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests
Date: Tue, 10 Oct 2023 17:52:31 +1000 [thread overview]
Message-ID: <20231010075238.95646-5-npiggin@gmail.com> (raw)
In-Reply-To: <20231010075238.95646-1-npiggin@gmail.com>
The powernv and pseries machines both provide hypervisor facilities,
which is a large and complicated set of features that don't get much
system testing in CI.
Add a new test case for these which runs QEMU KVM inside the target.
---
tests/avocado/ppc_hv_tests.py | 173 ++++++++++++++++++++++++++++++++++
1 file changed, 173 insertions(+)
create mode 100644 tests/avocado/ppc_hv_tests.py
diff --git a/tests/avocado/ppc_hv_tests.py b/tests/avocado/ppc_hv_tests.py
new file mode 100644
index 0000000000..16aac1d35d
--- /dev/null
+++ b/tests/avocado/ppc_hv_tests.py
@@ -0,0 +1,173 @@
+# Tests that specifically try to exercise hypervisor features of the
+# target machines. powernv supports the Power hypervisor ISA, and
+# pseries supports the nested-HV hypervisor spec.
+#
+# Copyright (c) 2023 IBM Corporation
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+from avocado import skipIf
+from avocado.utils import archive
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import wait_for_console_pattern, exec_command
+import os
+import time
+import subprocess
+
+# Alpine is a light weight distro that supports QEMU. These tests boot
+# that on the machine then run a QEMU guest inside it in KVM mode,
+# that runs the same Alpine distro image.
+# QEMU packages are downloaded and installed on each test. That's not a
+# large download, but it may be more polite to create qcow2 image with
+# QEMU already installed and use that.
+class HypervisorTest(QemuSystemTest):
+
+ timeout = 600
+ KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
+ panic_message = 'Kernel panic - not syncing'
+ good_message = 'VFS: Cannot open root device'
+
+ def extract_from_iso(self, iso, path):
+ """
+ Extracts a file from an iso file into the test workdir
+
+ :param iso: path to the iso file
+ :param path: path within the iso file of the file to be extracted
+ :returns: path of the extracted file
+ """
+ filename = os.path.basename(path)
+
+ cwd = os.getcwd()
+ os.chdir(self.workdir)
+
+ with open(filename, "w") as outfile:
+ cmd = "isoinfo -i %s -R -x %s" % (iso, path)
+ subprocess.run(cmd.split(), stdout=outfile)
+
+ os.chdir(cwd)
+
+ # Return complete path to extracted file. Because callers to
+ # extract_from_iso() specify 'path' with a leading slash, it is
+ # necessary to use os.path.relpath() as otherwise os.path.join()
+ # interprets it as an absolute path and drops the self.workdir part.
+ return os.path.normpath(os.path.join(self.workdir, filename))
+
+ def do_start_alpine(self):
+ iso_url = ('https://dl-cdn.alpinelinux.org/alpine/v3.18/releases/ppc64le/alpine-standard-3.18.4-ppc64le.iso')
+
+ # Alpine use sha256 so I recalculated this myself
+ iso_sha256 = 'c26b8d3e17c2f3f0fed02b4b1296589c2390e6d5548610099af75300edd7b3ff'
+ iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha256,
+ algorithm = "sha256")
+
+ vmlinuz = self.extract_from_iso(iso_path, '/boot/vmlinuz-lts')
+ initramfs = self.extract_from_iso(iso_path, '/boot/initramfs-lts')
+
+ self.vm.set_console()
+ self.vm.add_args("-kernel", vmlinuz)
+ self.vm.add_args("-initrd", initramfs)
+ kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
+ 'console=hvc0')
+ self.require_accelerator("tcg")
+
+ self.vm.add_args("-accel", "tcg,thread=multi")
+ self.vm.add_args("-smp", "4", "-m", "2g")
+ self.vm.add_args("-drive", f"file={iso_path},format=raw,if=none,id=drive0")
+# self.vm.add_args("-drive", f"file={iso_path},format=raw")
+
+ self.vm.launch()
+ wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
+ exec_command(self, 'root')
+ wait_for_console_pattern(self, 'localhost login:')
+ wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
+ exec_command(self, 'setup-alpine -qe')
+ wait_for_console_pattern(self, 'localhost:~#')
+
+ def do_stop_alpine(self):
+ exec_command(self, 'poweroff')
+ wait_for_console_pattern(self, 'alpine:~#')
+ self.vm.wait()
+
+ def do_setup_kvm(self):
+ exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/main > /etc/apk/repositories')
+ wait_for_console_pattern(self, 'alpine:~#')
+ exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/community >> /etc/apk/repositories')
+ wait_for_console_pattern(self, 'alpine:~#')
+ exec_command(self, 'apk update')
+ wait_for_console_pattern(self, 'alpine:~#')
+ exec_command(self, 'apk add qemu-system-ppc64')
+ wait_for_console_pattern(self, 'alpine:~#')
+ exec_command(self, 'modprobe kvm-hv')
+ wait_for_console_pattern(self, 'alpine:~#')
+
+ def do_test_kvm(self, hpt=False):
+ if hpt:
+ append = 'disable_radix'
+ else:
+ append = ''
+ exec_command(self, 'qemu-system-ppc64 -nographic -smp 2 -m 1g '
+ '-machine pseries,x-vof=on,accel=kvm '
+ '-machine cap-cfpc=broken,cap-sbbc=broken,'
+ 'cap-ibs=broken,cap-ccf-assist=off '
+ '-drive file=/dev/nvme0n1,format=raw,readonly=on '
+ '-initrd /media/nvme0n1/boot/initramfs-lts '
+ '-kernel /media/nvme0n1/boot/vmlinuz-lts '
+ '-append \'usbcore.nousb ' + append + '\'')
+ # Alpine 3.18 kernel seems to crash in XHCI USB driver.
+ wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
+ exec_command(self, 'root')
+ wait_for_console_pattern(self, 'localhost login:')
+ wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
+ exec_command(self, 'poweroff >& /dev/null')
+ wait_for_console_pattern(self, 'localhost:~#')
+ wait_for_console_pattern(self, 'reboot: Power down')
+ time.sleep(1)
+ exec_command(self, '') # console has strange issue after qemu exit
+ exec_command(self, 'reset')
+ exec_command(self, 'echo VM finished')
+ wait_for_console_pattern(self, 'VM finished')
+
+ @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+ def test_hv_pseries(self):
+ """
+ :avocado: tags=arch:ppc64
+ :avocado: tags=machine:pseries
+ :avocado: tags=accel:tcg
+ """
+ self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
+ self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")
+ self.do_start_alpine()
+ self.do_setup_kvm()
+ self.do_test_kvm()
+ self.do_stop_alpine()
+
+ @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+ def test_hv_pseries_kvm(self):
+ """
+ :avocado: tags=arch:ppc64
+ :avocado: tags=machine:pseries
+ :avocado: tags=accel:kvm
+ """
+ self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
+ self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")
+ self.do_start_alpine()
+ self.do_setup_kvm()
+ self.do_test_kvm()
+ self.do_stop_alpine()
+
+ @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+ def test_hv_powernv(self):
+ """
+ :avocado: tags=arch:ppc64
+ :avocado: tags=machine:powernv
+ :avocado: tags=accel:tcg
+ """
+ self.vm.add_args('-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234,drive=drive0',
+ '-device', 'e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0',
+ '-netdev', 'user,id=net0,hostfwd=::20022-:22,hostname=alpine')
+ self.do_start_alpine()
+ self.do_setup_kvm()
+ self.do_test_kvm()
+ self.do_test_kvm(True)
+ self.do_stop_alpine()
--
2.42.0
next prev parent reply other threads:[~2023-10-10 7:55 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-10 7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
2023-10-10 7:52 ` [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test Nicholas Piggin
2023-10-10 7:52 ` [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests Nicholas Piggin
2023-10-16 8:40 ` Cédric Le Goater
2023-10-10 7:52 ` [RFC PATCH 03/11] tests/avocado: Add pseries KVM boot_linux test Nicholas Piggin
2023-10-10 7:52 ` Nicholas Piggin [this message]
2023-10-16 6:39 ` [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests Harsh Prateek Bora
2023-10-10 7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
2023-10-10 8:02 ` Philippe Mathieu-Daudé
2023-10-10 12:03 ` Joel Stanley
2023-10-10 20:53 ` Nicholas Piggin
2023-10-16 8:07 ` Cédric Le Goater
2023-10-16 8:32 ` Cédric Le Goater
2023-10-10 7:52 ` [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc Nicholas Piggin
2023-10-10 21:55 ` Warner Losh
2023-10-11 0:36 ` Nicholas Piggin
2023-10-11 4:24 ` Warner Losh
2023-10-11 2:23 ` Nicholas Piggin
2023-10-11 4:25 ` Warner Losh
2023-10-10 7:52 ` [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images Nicholas Piggin
2023-10-10 12:43 ` Alex Bennée
2023-10-10 12:49 ` Philippe Mathieu-Daudé
2023-10-10 21:21 ` Nicholas Piggin
2023-10-10 13:01 ` Daniel P. Berrangé
2023-10-10 21:14 ` Nicholas Piggin
2023-10-10 7:52 ` [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests Nicholas Piggin
2023-10-10 7:58 ` Philippe Mathieu-Daudé
2023-10-11 0:25 ` Nicholas Piggin
2023-10-10 7:52 ` [RFC PATCH 09/11] tests/avocado: Use default CPU for pseries machine Nicholas Piggin
2023-10-10 7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
2023-10-10 12:08 ` Joel Stanley
2023-10-16 8:16 ` Cédric Le Goater
2023-10-10 7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
2023-10-10 12:05 ` Joel Stanley
2023-10-10 20:57 ` Nicholas Piggin
2023-10-16 1:59 ` Joel Stanley
2023-10-16 8:15 ` Cédric Le Goater
2023-10-10 7:59 ` [RFC PATCH 00/11] ppc: avocado test additions and new defaults Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231010075238.95646-5-npiggin@gmail.com \
--to=npiggin@gmail.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=wainersm@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.