From 2f51f3ef209cfb84ef50e8e37e2674c5369d1ae8 Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Thu, 15 Aug 2019 17:51:57 -0700 Subject: [PATCH] Add PXE boot test This adds a whole wodge of stuff to support_server to make it act as a PXE server, then adds a new test which boots from PXE and so should hit the PXE server. We use the NFS install repo as that can be relied on to work for a support_server install. Signed-off-by: Adam Williamson --- .../console/bootloader_bios_pxe-20190816.json | 16 ++++ .../console/bootloader_bios_pxe-20190816.png | Bin 0 -> 32011 bytes templates | 62 +++++++++++++ tests/_boot_to_anaconda.pm | 17 +++- tests/_support_server.pm | 86 +++++++++++++++++- 5 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 needles/console/bootloader_bios_pxe-20190816.json create mode 100644 needles/console/bootloader_bios_pxe-20190816.png diff --git a/needles/console/bootloader_bios_pxe-20190816.json b/needles/console/bootloader_bios_pxe-20190816.json new file mode 100644 index 00000000..330e0d4e --- /dev/null +++ b/needles/console/bootloader_bios_pxe-20190816.json @@ -0,0 +1,16 @@ +{ + "area": [ + { + "xpos": 204, + "ypos": 279, + "width": 223, + "height": 20, + "type": "match" + } + ], + "properties": [], + "tags": [ + "bootloader", + "bootloader_bios" + ] +} \ No newline at end of file diff --git a/needles/console/bootloader_bios_pxe-20190816.png b/needles/console/bootloader_bios_pxe-20190816.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc197dd9580fb879f2256fd620fef5addbf25b6 GIT binary patch literal 32011 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 { name => "install_kickstart_nfs" }, }, + { + machine => { name => "64bit" }, + prio => 30, + product => { + arch => "x86_64", + distri => "fedora", + flavor => "universal", + version => "*", + }, + test_suite => { name => "install_pxeboot" }, + }, + { + machine => { name => "uefi" }, + prio => 31, + product => { + arch => "x86_64", + distri => "fedora", + flavor => "universal", + version => "*", + }, + test_suite => { name => "install_pxeboot" }, + }, { machine => { name => "64bit" }, prio => 30, @@ -2861,6 +2883,18 @@ }, test_suite => { name => "install_kickstart_nfs" }, }, + { + group_name => "Fedora PowerPC", + machine => { name => "ppc64le" }, + prio => 30, + product => { + arch => "ppc64le", + distri => "fedora", + flavor => "universal", + version => "*", + }, + test_suite => { name => "install_pxeboot" }, + }, { group_name => "Fedora PowerPC", machine => { name => "ppc64le" }, @@ -3785,6 +3819,18 @@ }, test_suite => { name => "install_kickstart_nfs" }, }, + { + group_name => "Fedora AArch64", + machine => { name => "aarch64" }, + prio => 30, + product => { + arch => "aarch64", + distri => "fedora", + flavor => "universal", + version => "*", + }, + test_suite => { name => "install_pxeboot" }, + }, { group_name => "Fedora AArch64", machine => { name => "aarch64" }, @@ -4348,6 +4394,22 @@ { key => "WORKER_CLASS", value => "tap" }, ], }, + { + name => "install_pxeboot", + settings => [ + # this delays VM boot so we can wait till the PXE server + # is ready + { key => "DELAYED_START", value => "1" }, + # this is to ensure the test never 'accidentally' passes + # by falling back to boot from ISO + { key => "+ISO", value => "" }, + { key => "TEST_TARGET", value => "COMPOSE" }, + { key => "PXEBOOT", value => "once" }, + { key => "PARALLEL_WITH", value => "support_server:%ARCH_BASE_MACHINE%" }, + { key => "NICTYPE", value => "tap" }, + { key => "WORKER_CLASS", value => "tap" }, + ], + }, { name => "install_repository_hd_variation", settings => [ diff --git a/tests/_boot_to_anaconda.pm b/tests/_boot_to_anaconda.pm index a4b04a32..70138754 100644 --- a/tests/_boot_to_anaconda.pm +++ b/tests/_boot_to_anaconda.pm @@ -1,11 +1,22 @@ use base "anacondatest"; use strict; +use lockapi; use testapi; use utils; use anaconda; sub run { my $self = shift; + if (get_var("PXEBOOT")) { + # PXE tests have DELAYED_START set, so VM is not running yet, + # because if we boot immediately PXE will time out waiting for + # DHCP before the support server is ready. So we wait here for + # support server to be ready, then go ahead and start the VM + mutex_lock "support_ready"; + mutex_unlock "support_ready"; + resume_vm; + } + # construct the kernel params. the trick here is to wind up with # spaced params if GRUB or GRUBADD is set, and just spaces if not, # then check if we got all spaces. We wind up with a harmless @@ -36,8 +47,12 @@ sub run { # set mutex wait if necessary my $mutex = get_var("INSTALL_UNLOCK"); + # we need a longer timeout for the PXE boot test + my $timeout = 30; + $timeout = 120 if (get_var("PXEBOOT")); + # call do_bootloader with postinstall=0, the params, and the mutex - do_bootloader(postinstall=>0, params=>$params, mutex=>$mutex); + do_bootloader(postinstall=>0, params=>$params, mutex=>$mutex, timeout=>$timeout); # Read variables for identification tests (see further). my $identification = get_var('IDENTIFICATION'); diff --git a/tests/_support_server.pm b/tests/_support_server.pm index face9a38..6def43ef 100644 --- a/tests/_support_server.pm +++ b/tests/_support_server.pm @@ -1,16 +1,97 @@ use base "installedtest"; use strict; +use anaconda; use testapi; use lockapi; use mmapi; use tapnet; use utils; +sub _pxe_setup { + # set up PXE server (via dnsmasq). Not used for update tests. + # don't get hung up on slow mirrors when DNFing... + repos_mirrorlist; + # create necessary dirs + assert_script_run "mkdir -p /var/lib/tftpboot/fedora"; + # basic tftp config + assert_script_run "printf 'enable-tftp\ntftp-root=/var/lib/tftpboot\ntftp-secure\n' >> /etc/dnsmasq.conf"; + # pxe boot config + # we boot grub directly not shim on aarch64 as shim fails to boot + # with 'Synchronous Exception' + # https://bugzilla.redhat.com/show_bug.cgi?id=1592148 + assert_script_run "printf 'dhcp-match=set:efi-x86_64,option:client-arch,7\ndhcp-match=set:efi-x86_64,option:client-arch,9\ndhcp-match=set:bios,option:client-arch,0\ndhcp-match=set:efi-aarch64,option:client-arch,11\ndhcp-match=set:ppc64,option:client-arch,12\ndhcp-match=set:ppc64,option:client-arch,13\ndhcp-boot=tag:efi-x86_64,\"shim.efi\"\ndhcp-boot=tag:bios,\"pxelinux.0\"\ndhcp-boot=tag:efi-aarch64,\"grubaa64.efi\"\ndhcp-boot=tag:ppc64,\"boot/grub2/powerpc-ieee1275/core.elf\"\n' >> /etc/dnsmasq.conf"; + # install and configure bootloaders + my $ourversion = get_var("CURRREL"); + my $testversion = get_var("RELEASE"); + assert_script_run "mkdir -p /var/tmp/fedora"; + my $arch = get_var("ARCH"); + + if ($arch eq 'x86_64') { + # x86_64: use syslinux for BIOS, grub2 with 'linuxefi' for UEFI + assert_script_run "mkdir -p /var/lib/tftpboot/pxelinux.cfg"; + # install bootloader packages + assert_script_run "dnf -y install syslinux", 120; + assert_script_run "dnf -y --releasever=$ourversion --installroot=/var/tmp/fedora install shim-x64 grub2-efi-x64", 300; + # copy bootloader files to tftp root + assert_script_run "cp /usr/share/syslinux/{pxelinux.0,vesamenu.c32,ldlinux.c32,libcom32.c32,libutil.c32} /var/lib/tftpboot"; + assert_script_run "cp /var/tmp/fedora/boot/efi/EFI/fedora/{shim.efi,grubx64.efi} /var/lib/tftpboot"; + # bootloader configs + # BIOS + assert_script_run "printf 'default vesamenu.c32\nprompt 1\ntimeout 600\n\nlabel linux\n menu label ^Install Fedora 64-bit\n menu default\n kernel fedora/vmlinuz\n append initrd=fedora/initrd.img inst.repo=nfs:nfsvers=4:10.0.2.110:/repo ip=dhcp\nlabel local\n menu label Boot from ^local drive\n localboot 0xffff\n' >> /var/lib/tftpboot/pxelinux.cfg/default"; + # UEFI + assert_script_run "printf 'function load_video {\n insmod efi_gop\n insmod efi_uga\n insmod ieee1275_fb\n insmod vbe\n insmod vga\n insmod video_bochs\n insmod video_cirrus\n}\n\nload_video\nset gfxpayload=keep\ninsmod gzio\n\nmenuentry \"Install Fedora 64-bit\" --class fedora --class gnu-linux --class gnu --class os {\n linuxefi fedora/vmlinuz ip=dhcp inst.repo=nfs:nfsvers=4:10.0.2.110:/repo\n initrdefi fedora/initrd.img\n}' >> /var/lib/tftpboot/grub.cfg"; + # DEBUG DEBUG + upload_logs "/etc/dnsmasq.conf"; + upload_logs "/var/lib/tftpboot/grub.cfg"; + upload_logs "/var/lib/tftpboot/pxelinux.cfg/default"; + } + + elsif ($arch eq 'ppc64le') { + # ppc64le: use grub2 for OFW + # install bootloader tools package + assert_script_run "dnf -y install grub2-tools-extra", 180; + # install a network bootloader to tftp root + assert_script_run "grub2-mknetdir --net-directory=/var/lib/tftpboot"; + # bootloader config + assert_script_run "printf 'set default=0\nset timeout=5\n\nmenuentry \"Install Fedora 64-bit\" --class fedora --class gnu-linux --class gnu --class os {\n linux fedora/vmlinuz ip=dhcp inst.repo=nfs:nfsvers=4:10.0.2.110:/repo\n initrd fedora/initrd.img\n}' >> /var/lib/tftpboot/boot/grub2/grub.cfg"; + # DEBUG DEBUG + upload_logs "/etc/dnsmasq.conf"; + upload_logs "/var/lib/tftpboot/boot/grub2/grub.cfg"; + } + + elsif ($arch eq 'aarch64') { + # aarch64: use grub2 with 'linux' for UEFI + # copy bootloader files to tftp root (we just use the system + # bootloader, no need to install packages) + assert_script_run "cp /boot/efi/EFI/fedora/{shim.efi,grubaa64.efi} /var/lib/tftpboot"; + # bootloader config + assert_script_run "printf 'function load_video {\n insmod efi_gop\n insmod efi_uga\n insmod ieee1275_fb\n insmod vbe\n insmod vga\n insmod video_bochs\n insmod video_cirrus\n}\n\nload_video\nset gfxpayload=keep\ninsmod gzio\n\nmenuentry \"Install Fedora 64-bit\" --class fedora --class gnu-linux --class gnu --class os {\n linux fedora/vmlinuz ip=dhcp inst.repo=nfs:nfsvers=4:10.0.2.110:/repo\n initrd fedora/initrd.img\n}' >> /var/lib/tftpboot/grub.cfg"; + # DEBUG DEBUG + upload_logs "/etc/dnsmasq.conf"; + upload_logs "/var/lib/tftpboot/grub.cfg"; + } + + # download kernel and initramfs + my $location = get_var("LOCATION"); + my $kernpath = "images/pxeboot"; + # for some crazy reason these are in a different place for ppc64 + $kernpath = "ppc/ppc64" if ($arch eq 'ppc64le'); + assert_script_run "curl -o /var/lib/tftpboot/fedora/vmlinuz $location/Everything/${arch}/os/${kernpath}/vmlinuz"; + assert_script_run "curl -o /var/lib/tftpboot/fedora/initrd.img $location/Everything/${arch}/os/${kernpath}/initrd.img"; + # chown root + assert_script_run "chown -R dnsmasq /var/lib/tftpboot"; + assert_script_run "restorecon -vr /var/lib/tftpboot"; + # open firewall ports + assert_script_run "firewall-cmd --add-service=tftp"; +} + sub run { my $self=shift; ## DNS / DHCP (dnsmasq) # create config - assert_script_run "printf 'domain=domain.local\ndhcp-range=10.0.2.112,10.0.2.199\ndhcp-option=option:router,10.0.2.2' > /etc/dnsmasq.conf"; + assert_script_run "printf 'domain=domain.local\ndhcp-range=10.0.2.112,10.0.2.199\ndhcp-option=option:router,10.0.2.2\n' > /etc/dnsmasq.conf"; + # do PXE setup if this is not an update test + _pxe_setup() unless (get_var("ADVISORY_OR_TASK")); # open firewall ports assert_script_run "firewall-cmd --add-service=dhcp"; assert_script_run "firewall-cmd --add-service=dns"; @@ -67,7 +148,8 @@ sub run { # report ready, wait for children mutex_create('support_ready'); wait_for_children; - # TODO we should add systematic data capture to help investigation when children failed. + # upload logs in case of child failures + $self->post_fail_hook(); } sub test_flags {