mirror of
https://github.com/qemu/qemu.git
synced 2025-08-17 16:03:30 +00:00

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=on". Reviewed-by: Jared Rossi <jrossi@linux.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com> Message-ID: <20250709083443.41574-6-thuth@redhat.com>
120 lines
4.6 KiB
Python
Executable File
120 lines
4.6 KiB
Python
Executable File
#!/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='''# 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=teststring
|
|
label Fedora
|
|
kernel kernel.fedora
|
|
'''
|
|
|
|
class S390PxeLinux(QemuSystemTest):
|
|
|
|
ASSET_DEBIAN_KERNEL = Asset(
|
|
('https://snapshot.debian.org/archive/debian/'
|
|
'20201126T092837Z/dists/buster/main/installer-s390x/'
|
|
'20190702+deb10u6/images/generic/kernel.debian'),
|
|
'd411d17c39ae7ad38d27534376cbe88b68b403c325739364122c2e6f1537e818')
|
|
|
|
ASSET_DEBIAN_INITRD = Asset(
|
|
('https://snapshot.debian.org/archive/debian/'
|
|
'20201126T092837Z/dists/buster/main/installer-s390x/'
|
|
'20190702+deb10u6/images/generic/initrd.debian'),
|
|
'836bbd0fe6a5ca81274c28c2b063ea315ce1868660866e9b60180c575fef9fd5')
|
|
|
|
ASSET_FEDORA_KERNEL = Asset(
|
|
('https://archives.fedoraproject.org/pub/archive'
|
|
'/fedora-secondary/releases/31/Server/s390x/os'
|
|
'/images/kernel.img'),
|
|
'480859574f3f44caa6cd35c62d70e1ac0609134e22ce2a954bbed9b110c06e0b')
|
|
|
|
def pxelinux_launch(self, pl_name='default', extra_opts=None):
|
|
self.require_netdev('user')
|
|
self.set_machine('s390-ccw-virtio')
|
|
|
|
debian_kernel = self.ASSET_DEBIAN_KERNEL.fetch()
|
|
debian_initrd = self.ASSET_DEBIAN_INITRD.fetch()
|
|
fedora_kernel = self.ASSET_FEDORA_KERNEL.fetch()
|
|
|
|
# Prepare a folder for the TFTP "server":
|
|
tftpdir = self.scratch_file('tftp')
|
|
shutil.rmtree(tftpdir, ignore_errors=True) # 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 = self.scratch_file('tftp', 'pxelinux.cfg')
|
|
os.mkdir(pxelinuxdir)
|
|
|
|
cfg_fname = self.scratch_file('tftp', 'pxelinux.cfg', pl_name)
|
|
with open(cfg_fname, 'w', encoding='utf-8') as f:
|
|
f.write(pxelinux_cfg_contents)
|
|
|
|
virtio_net_dev = 'virtio-net-ccw,netdev=n1,bootindex=1'
|
|
if extra_opts:
|
|
virtio_net_dev += ',' + extra_opts
|
|
|
|
self.vm.add_args('-m', '384',
|
|
'-netdev', f'user,id=n1,tftp={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 handled:
|
|
wait_for_console_pattern(self, 'testoption=teststring')
|
|
# 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='01-02-ca-fe-ba-be-42',
|
|
extra_opts='mac=02:ca:fe:ba:be:42,loadparm=3')
|
|
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 fallback to network boot:
|
|
self.vm.add_args('-blockdev', 'null-co,size=65536,node-name=d1',
|
|
'-device', 'virtio-blk,drive=d1,bootindex=0,loadparm=1',
|
|
'-uuid', '550e8400-e29b-11d4-a716-446655441234')
|
|
self.pxelinux_launch(pl_name='550e8400-e29b-11d4-a716-446655441234')
|
|
wait_for_console_pattern(self, 'Debian 4.19.146-1 (2020-09-17)')
|
|
|
|
def test_ip(self):
|
|
self.vm.add_args('-M', 'loadparm=3')
|
|
self.pxelinux_launch(pl_name='0A00020F')
|
|
wait_for_console_pattern(self, 'Linux version 5.3.7-301.fc31.s390x')
|
|
|
|
def test_menu(self):
|
|
self.vm.add_args('-boot', 'menu=on,splash-time=10')
|
|
self.pxelinux_launch(pl_name='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__ == '__main__':
|
|
QemuSystemTest.main()
|