From nobody Sat Nov 15 14:09:48 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1752008038; cv=none; d=zohomail.com; s=zohoarc; b=hBmAFvRx2f5s7i/Tlr501d5CjL1ZU2K0hQ8odVvDqghxu9loj735qcow9iRKBPvlTAFL6xDxFMHl8RIqllIoQC+1P/+A8laAMvZBfW8l839CADWzfsmx1caXSA/WMNaB/D40qleiqskqgUmfl1Zp+/9Ukr2FQ4abryYP53nq9hk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1752008038; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=e7w874XO5+cxv8XLuTTKyS7I663PEUleYooEMgED50Y=; b=ZIh1Ma9VaV/cRxUTRDdKG/oqRx7uRDxBH4kacHG5t0p1oQoef0YdtHCWpKVWt81Kr8TLyrexOC+XCveq7uznA+FrfWSjepAISDzEWaZL3YEzUYShKs/imNMOLLYEjpH0i0Ap8sjOlWbxr2vj2Aerbs16XpoDDe2+lGkd8tjXnEE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1752008038834440.2802248597593; Tue, 8 Jul 2025 13:53:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1uZFAi-0003yF-JD; Tue, 08 Jul 2025 16:44:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uZDma-0003kU-6i for qemu-devel@nongnu.org; Tue, 08 Jul 2025 15:15:27 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uZDmS-0006z3-N1 for qemu-devel@nongnu.org; Tue, 08 Jul 2025 15:15:07 -0400 Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-455-tv3YoOIzN2CgnBSMefVaeQ-1; Tue, 08 Jul 2025 08:56:49 -0400 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EFAF7190FBC2; Tue, 8 Jul 2025 12:56:47 +0000 (UTC) Received: from thuth-p1g4.str.redhat.com (dhcp-192-196.str.redhat.com [10.33.192.196]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C5B6419560B2; Tue, 8 Jul 2025 12:56:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752002101; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e7w874XO5+cxv8XLuTTKyS7I663PEUleYooEMgED50Y=; b=LWhaahGIHStmGMNV9Wd38c4XPc7haojEhr02lpHOcrTLoRtjlzY0M18hZIz94gRMLaXuey uXuQKcMPcpcIRinVNMT3YG7qYTMTg8W0csUK9EwJR3Ta/j/wFqfkFFROfkuE8nJ4TznmgQ VDPreqOizRwtRKht/6W//0apXztw1ZI= X-MC-Unique: tv3YoOIzN2CgnBSMefVaeQ-1 X-Mimecast-MFC-AGG-ID: tv3YoOIzN2CgnBSMefVaeQ_1751979408 From: Thomas Huth To: qemu-devel@nongnu.org, Jared Rossi , Zhuoying Cai Cc: qemu-s390x@nongnu.org, Christian Borntraeger , Eric Farman , Halil Pasic , Matthew Rosato Subject: [PATCH 5/5] tests/functional: Add a test for s390x pxelinux.cfg network booting Date: Tue, 8 Jul 2025 14:56:30 +0200 Message-ID: <20250708125630.58676-6-thuth@redhat.com> In-Reply-To: <20250708125630.58676-1-thuth@redhat.com> References: <20250708125630.58676-1-thuth@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=thuth@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1752008039775116600 Content-Type: text/plain; charset="utf-8" From: Thomas Huth Check the various ways of booting a kernel via pxelinux.cfg file, e.g. by specifying the config file name via the MAC address or the UUID of the guest. Also check whether we can successfully load an alternate kernel via the "loadparm" parameter here and whether the boot menu shows up with "-boot menu=3Don". Signed-off-by: Thomas Huth --- MAINTAINERS | 1 + tests/functional/meson.build | 1 + tests/functional/test_s390x_pxelinux.py | 119 ++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100755 tests/functional/test_s390x_pxelinux.py diff --git a/MAINTAINERS b/MAINTAINERS index 1842c3dd83f..e88ed2c0a97 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1805,6 +1805,7 @@ F: hw/s390x/ipl.* F: pc-bios/s390-ccw/ F: pc-bios/s390-ccw.img F: docs/devel/s390-dasd-ipl.rst +F: tests/functional/test_s390x_pxelinux.py T: git https://github.com/borntraeger/qemu.git s390-next L: qemu-s390x@nongnu.org =20 diff --git a/tests/functional/meson.build b/tests/functional/meson.build index 050c9000b95..1ae5f02fb37 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -281,6 +281,7 @@ tests_rx_system_thorough =3D [ =20 tests_s390x_system_thorough =3D [ 's390x_ccw_virtio', + 's390x_pxelinux', 's390x_replay', 's390x_topology', 's390x_tuxrun', diff --git a/tests/functional/test_s390x_pxelinux.py b/tests/functional/tes= t_s390x_pxelinux.py new file mode 100755 index 00000000000..f83cf9aed03 --- /dev/null +++ b/tests/functional/test_s390x_pxelinux.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Functional test that checks the pxelinux.cfg network booting of a s390x = VM +# (TFTP booting without config file is already tested by the pxe qtest, so +# we don't repeat that here). + +import os +import shutil + +from qemu_test import QemuSystemTest, Asset, wait_for_console_pattern + + +pxelinux_cfg_contents=3D'''# pxelinux.cfg style config file +default Debian +label Nonexisting +kernel kernel.notavailable +initrd initrd.notavailable +label Debian +kernel kernel.debian +initrd initrd.debian +append testoption=3Dteststring +label Fedora +kernel kernel.fedora +''' + +class S390PxeLinux(QemuSystemTest): + + ASSET_DEBIAN_KERNEL =3D Asset( + ('https://snapshot.debian.org/archive/debian/' + '20201126T092837Z/dists/buster/main/installer-s390x/' + '20190702+deb10u6/images/generic/kernel.debian'), + 'd411d17c39ae7ad38d27534376cbe88b68b403c325739364122c2e6f1537e818') + + ASSET_DEBIAN_INITRD =3D Asset( + ('https://snapshot.debian.org/archive/debian/' + '20201126T092837Z/dists/buster/main/installer-s390x/' + '20190702+deb10u6/images/generic/initrd.debian'), + '836bbd0fe6a5ca81274c28c2b063ea315ce1868660866e9b60180c575fef9fd5') + + ASSET_FEDORA_KERNEL =3D Asset( + ('https://archives.fedoraproject.org/pub/archive' + '/fedora-secondary/releases/31/Server/s390x/os' + '/images/kernel.img'), + '480859574f3f44caa6cd35c62d70e1ac0609134e22ce2a954bbed9b110c06e0b') + + def pxelinux_launch(self, pl_name=3D'default', extra_opts=3DNone): + self.require_netdev('user') + self.set_machine('s390-ccw-virtio') + + debian_kernel =3D self.ASSET_DEBIAN_KERNEL.fetch() + debian_initrd =3D self.ASSET_DEBIAN_INITRD.fetch() + fedora_kernel =3D self.ASSET_FEDORA_KERNEL.fetch() + + # Prepare a folder for the TFTP "server": + tftpdir =3D self.scratch_file('tftp') + shutil.rmtree(tftpdir, ignore_errors=3DTrue) # Remove stale stuff + os.mkdir(tftpdir) + shutil.copy(debian_kernel, os.path.join(tftpdir, 'kernel.debian')) + shutil.copy(debian_initrd, os.path.join(tftpdir, 'initrd.debian')) + shutil.copy(fedora_kernel, os.path.join(tftpdir, 'kernel.fedora')) + + pxelinuxdir =3D self.scratch_file('tftp', 'pxelinux.cfg') + os.mkdir(pxelinuxdir) + + cfg_fname =3D self.scratch_file('tftp', 'pxelinux.cfg', pl_name) + with open(cfg_fname, 'w', encoding=3D'utf-8') as f: + f.write(pxelinux_cfg_contents) + + virtio_net_dev =3D 'virtio-net-ccw,netdev=3Dn1,bootindex=3D1' + if extra_opts: + virtio_net_dev +=3D ',' + extra_opts + + self.vm.add_args('-m', '384', + '-netdev', f'user,id=3Dn1,tftp=3D{tftpdir}', + '-device', virtio_net_dev) + self.vm.set_console() + self.vm.launch() + + + def test_default(self): + self.pxelinux_launch() + # The kernel prints its arguments to the console, so we can use + # this to check whether the kernel parameters are correctly handle= d: + wait_for_console_pattern(self, 'testoption=3Dteststring') + # Now also check that we've successfully loaded the initrd: + wait_for_console_pattern(self, 'Unpacking initramfs...') + wait_for_console_pattern(self, 'Run /init as init process') + + def test_mac(self): + self.pxelinux_launch(pl_name=3D'01-02-ca-fe-ba-be-42', + extra_opts=3D'mac=3D02:ca:fe:ba:be:42,loadpar= m=3D3') + wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x= ') + + def test_uuid(self): + # Also add a non-bootable disk to check the fall back to network b= oot: + self.vm.add_args('-blockdev', 'null-co,size=3D65536,node-name=3Dd1= ', + '-device', 'virtio-blk,drive=3Dd1,bootindex=3D0,l= oadparm=3D1', + '-uuid', '550e8400-e29b-11d4-a716-446655441234') + self.pxelinux_launch(pl_name=3D'550e8400-e29b-11d4-a716-4466554412= 34') + wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)') + + def test_ip(self): + self.vm.add_args('-M', 'loadparm=3D3') + self.pxelinux_launch(pl_name=3D'0A00020F') + wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x= ') + + def test_menu(self): + self.vm.add_args('-boot', 'menu=3Don,splash-time=3D10') + self.pxelinux_launch(pl_name=3D'0A00') + wait_for_console_pattern(self, '[1] Nonexisting') + wait_for_console_pattern(self, '[2] Debian') + wait_for_console_pattern(self, '[3] Fedora') + wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)') + + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.50.0