diff --git a/templates.fif.json b/templates.fif.json index 4ee84ebe..389eb90e 100644 --- a/templates.fif.json +++ b/templates.fif.json @@ -1278,7 +1278,7 @@ "DELAYED_START": "1", "KICKSTART": "1", "NICTYPE": "tap", - "PARALLEL_WITH": "support_server@%ARCH_BASE_MACHINE%", + "PARALLEL_WITH": "pxe_server@%ARCH_BASE_MACHINE%", "PXEBOOT": "once", "ROOT_PASSWORD": "111111", "TEST_TARGET": "COMPOSE", @@ -1781,6 +1781,26 @@ "WORKER_CLASS": "tap" } }, + "pxe_server": { + "profiles": { + "fedora-Server-dvd-iso-aarch64-*-aarch64": 10, + "fedora-Server-dvd-iso-ppc64le-*-ppc64le": 10, + "fedora-Server-dvd-iso-x86_64-*-64bit": 10 + }, + "settings": { + "BOOTFROM": "c", + "HDD_1": "disk_f%CURRREL%_support_5_%ARCH%.img", + "NICTYPE": "tap", + "NUMDISKS": "2", + "PARALLEL_CANCEL_WHOLE_CLUSTER": "0", + "POSTINSTALL": "_pxe_server", + "POST_STATIC": "172.16.2.121 pxe.domain.local", + "ROOT_PASSWORD": "weakpassword", + "TEST_TARGET": "NONE", + "USER_LOGIN": "false", + "WORKER_CLASS": "tap" + } + }, "realmd_join_cockpit": { "profiles": { "fedora-Server-dvd-iso-aarch64-*-aarch64": 30, diff --git a/tests/_boot_to_anaconda.pm b/tests/_boot_to_anaconda.pm index b36290e9..b474a196 100644 --- a/tests/_boot_to_anaconda.pm +++ b/tests/_boot_to_anaconda.pm @@ -13,8 +13,8 @@ sub run { # 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"; + mutex_lock "pxe_server_ready"; + mutex_unlock "pxe_server_ready"; resume_vm; } diff --git a/tests/_pxe_server.pm b/tests/_pxe_server.pm new file mode 100644 index 00000000..7f4219e6 --- /dev/null +++ b/tests/_pxe_server.pm @@ -0,0 +1,106 @@ +use base "installedtest"; +use strict; +use testapi; +use lockapi; +use mmapi; +use utils; + +sub run { + my $self = shift; + # set up PXE server (via dnsmasq) + # 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.ks=file:///ks.cfg 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.ks=file:///ks.cfg\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.ks=file:///ks.cfg\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.ks=file:///ks.cfg\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"; + # get a kickstart to embed in the initramfs, for testing: + # https://fedoraproject.org/wiki/QA:Testcase_Kickstart_File_Path_Ks_Cfg + assert_script_run "curl -o ks.cfg https://jskladan.fedorapeople.org/kickstarts/root-user-crypted-net.ks"; + # tweak the repo config in it + assert_script_run "sed -i -e 's,^url.*,nfs --server 172.16.2.110 --dir /repo --opts nfsvers=4,g' ks.cfg"; + # embed it + assert_script_run "echo ks.cfg | cpio -c -o >> /var/lib/tftpboot/fedora/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"; + + # report ready, wait for children + mutex_create('pxe_server_ready'); + wait_for_children; + # upload logs in case of child failures + $self->post_fail_hook(); +} + +sub test_flags { + return { fatal => 1 }; +} + +1; + +# vim: set sw=4 et: diff --git a/tests/_support_server.pm b/tests/_support_server.pm index 52512c7b..6e09721e 100644 --- a/tests/_support_server.pm +++ b/tests/_support_server.pm @@ -1,97 +1,10 @@ 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.ks=file:///ks.cfg 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.ks=file:///ks.cfg\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.ks=file:///ks.cfg\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.ks=file:///ks.cfg\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"; - # get a kickstart to embed in the initramfs, for testing: - # https://fedoraproject.org/wiki/QA:Testcase_Kickstart_File_Path_Ks_Cfg - assert_script_run "curl -o ks.cfg https://jskladan.fedorapeople.org/kickstarts/root-user-crypted-net.ks"; - # tweak the repo config in it - assert_script_run "sed -i -e 's,^url.*,nfs --server 172.16.2.110 --dir /repo --opts nfsvers=4,g' ks.cfg"; - # embed it - assert_script_run "echo ks.cfg | cpio -c -o >> /var/lib/tftpboot/fedora/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; # disable systemd-resolved, it conflicts with dnsmasq @@ -104,8 +17,6 @@ sub run { ## DNS / DHCP (dnsmasq) # create config assert_script_run "printf 'domain=domain.local\ndhcp-range=172.16.2.150,172.16.2.199\ndhcp-option=option:router,172.16.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";