boot tests: add UEFI PXE netboot testing

Generalize netboot testing and add tests for UEFI PXE netboot.
This commit is contained in:
Nikolay Amiantov 2019-07-15 18:56:53 +03:00
parent 81d35a9d7e
commit a2e8be9fc3

View File

@ -17,46 +17,33 @@ let
]; ];
}).config.system.build.isoImage; }).config.system.build.isoImage;
makeBootTest = name: machineConfig: perlAttrs = params: "{ ${concatStringsSep "," (mapAttrsToList (name: param: "${name} => '${toString param}'") params)} }";
makeTest {
inherit iso;
name = "boot-" + name;
nodes = { };
testScript =
''
my $machine = createMachine({ ${machineConfig}, qemuFlags => '-m 768' });
$machine->start;
$machine->waitForUnit("multi-user.target");
$machine->succeed("nix verify -r --no-trust /run/current-system");
# Test whether the channel got installed correctly. makeBootTest = name: extraConfig:
$machine->succeed("nix-instantiate --dry-run '<nixpkgs>' -A hello"); let
$machine->succeed("nix-env --dry-run -iA nixos.procps"); machineConfig = perlAttrs ({ qemuFlags = "-m 768"; } // extraConfig);
in
makeTest {
inherit iso;
name = "boot-" + name;
nodes = { };
testScript =
''
my $machine = createMachine(${machineConfig});
$machine->start;
$machine->waitForUnit("multi-user.target");
$machine->succeed("nix verify -r --no-trust /run/current-system");
$machine->shutdown; # Test whether the channel got installed correctly.
''; $machine->succeed("nix-instantiate --dry-run '<nixpkgs>' -A hello");
}; $machine->succeed("nix-env --dry-run -iA nixos.procps");
in {
biosCdrom = makeBootTest "bios-cdrom" '' $machine->shutdown;
cdrom => glob("${iso}/iso/*.iso") '';
''; };
biosUsb = makeBootTest "bios-usb" '' makeNetbootTest = name: extraConfig:
usb => glob("${iso}/iso/*.iso") let
'';
uefiCdrom = makeBootTest "uefi-cdrom" ''
cdrom => glob("${iso}/iso/*.iso"),
bios => '${pkgs.OVMF.fd}/FV/OVMF.fd'
'';
uefiUsb = makeBootTest "uefi-usb" ''
usb => glob("${iso}/iso/*.iso"),
bios => '${pkgs.OVMF.fd}/FV/OVMF.fd'
'';
netboot = let
config = (import ../lib/eval-config.nix { config = (import ../lib/eval-config.nix {
inherit system; inherit system;
modules = modules =
@ -65,35 +52,54 @@ in {
{ key = "serial"; } { key = "serial"; }
]; ];
}).config; }).config;
ipxeScriptDir = pkgs.writeTextFile {
name = "ipxeScriptDir";
text = ''
#!ipxe
dhcp
kernel bzImage init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams} console=ttyS0
initrd initrd
boot
'';
destination = "/boot.ipxe";
};
ipxeBootDir = pkgs.symlinkJoin { ipxeBootDir = pkgs.symlinkJoin {
name = "ipxeBootDir"; name = "ipxeBootDir";
paths = [ paths = [
config.system.build.netbootRamdisk config.system.build.netbootRamdisk
config.system.build.kernel config.system.build.kernel
ipxeScriptDir config.system.build.netbootIpxeScript
]; ];
}; };
machineConfig = perlAttrs ({
qemuFlags = "-boot order=n -netdev user,id=net0,tftp=${ipxeBootDir}/,bootfile=netboot.ipxe -m 2000";
} // extraConfig);
in in
makeTest { makeTest {
name = "boot-netboot"; name = "boot-netboot-" + name;
nodes = { }; nodes = { };
testScript = testScript =
'' ''
my $machine = createMachine({ qemuFlags => '-boot order=n -net nic,model=e1000 -net user,tftp=${ipxeBootDir}/,bootfile=boot.ipxe -m 2000M' }); my $machine = createMachine(${machineConfig});
$machine->start; $machine->start;
$machine->waitForUnit("multi-user.target"); $machine->waitForUnit("multi-user.target");
$machine->shutdown; $machine->shutdown;
''; '';
}; };
in {
biosCdrom = makeBootTest "bios-cdrom" {
cdrom = ''glob("${iso}/iso/*.iso")'';
};
biosUsb = makeBootTest "bios-usb" {
usb = ''glob("${iso}/iso/*.iso")'';
};
uefiCdrom = makeBootTest "uefi-cdrom" {
cdrom = ''glob("${iso}/iso/*.iso"'';
bios = ''"${pkgs.OVMF.fd}/FV/OVMF.fd"'';
};
uefiUsb = makeBootTest "uefi-usb" {
usb = ''glob("${iso}/iso/*.iso")'';
bios = ''"${pkgs.OVMF.fd}/FV/OVMF.fd"'';
};
biosNetboot = makeNetbootTest "bios" {};
uefiNetboot = makeNetbootTest "uefi" {
bios = ''"${pkgs.OVMF.fd}/FV/OVMF.fd"'';
# Custom ROM is needed for EFI PXE boot. I failed to understand exactly why, because QEMU should still use iPXE for EFI.
netRomFile = ''"${pkgs.ipxe}/ipxe.efirom"'';
};
} }