nixos/tests: add test for showing child configuration in grub menu

- Create a child configuration named "Work" with an extra config file.
- Name the default configuration as "Home" :-)
- Once the VM is setup, reboot and verify that it has booted into
default configuration.
- Reboot into the "Work" configuration via grub.
- Verify that we have booted into the "Work" configuration and that
the extra config file is present.

This test works for the simple grub configuration and simple UEFI
Grub configuration. UEFI Systemd is not included in the test.
This commit is contained in:
Venkateswara Rao Mandela 2019-03-07 15:08:28 +05:30
parent b08400a4d2
commit bc68f85326

View File

@ -67,6 +67,7 @@ let
# partitions and filesystems. # partitions and filesystems.
testScriptFun = { bootLoader, createPartitions, grubVersion, grubDevice, grubUseEfi testScriptFun = { bootLoader, createPartitions, grubVersion, grubDevice, grubUseEfi
, grubIdentifier, preBootCommands, extraConfig , grubIdentifier, preBootCommands, extraConfig
, testCloneConfig
}: }:
let let
iface = if grubVersion == 1 then "ide" else "virtio"; iface = if grubVersion == 1 then "ide" else "virtio";
@ -85,6 +86,7 @@ let
in if !isEfi && !(pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) then in if !isEfi && !(pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) then
throw "Non-EFI boot methods are only supported on i686 / x86_64" throw "Non-EFI boot methods are only supported on i686 / x86_64"
else '' else ''
$machine->start; $machine->start;
# Make sure that we get a login prompt etc. # Make sure that we get a login prompt etc.
@ -185,6 +187,43 @@ let
${preBootCommands} ${preBootCommands}
$machine->waitForUnit("network.target"); $machine->waitForUnit("network.target");
$machine->shutdown; $machine->shutdown;
# Tests for validating clone configuration entries in grub menu
${optionalString testCloneConfig ''
# Reboot Machine
$machine = createMachine({ ${hdFlags} qemuFlags => "${qemuFlags}", name => "clone-default-config" });
${preBootCommands}
$machine->waitForUnit("multi-user.target");
# Booted configuration name should be Home
# This is not the name that shows in the grub menu.
# The default configuration is always shown as "Default"
$machine->succeed("cat /run/booted-system/configuration-name >&2");
$machine->succeed("cat /run/booted-system/configuration-name | grep Home");
# We should find **not** a file named /etc/gitconfig
$machine->fail("test -e /etc/gitconfig");
# Set grub to boot the second configuration
$machine->succeed("grub-reboot 1");
$machine->shutdown;
# Reboot Machine
$machine = createMachine({ ${hdFlags} qemuFlags => "${qemuFlags}", name => "clone-alternate-config" });
${preBootCommands}
$machine->waitForUnit("multi-user.target");
# Booted configuration name should be Work
$machine->succeed("cat /run/booted-system/configuration-name >&2");
$machine->succeed("cat /run/booted-system/configuration-name | grep Work");
# We should find a file named /etc/gitconfig
$machine->succeed("test -e /etc/gitconfig");
$machine->shutdown;
''}
''; '';
@ -194,6 +233,7 @@ let
, bootLoader ? "grub" # either "grub" or "systemd-boot" , bootLoader ? "grub" # either "grub" or "systemd-boot"
, grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid", grubUseEfi ? false , grubVersion ? 2, grubDevice ? "/dev/vda", grubIdentifier ? "uuid", grubUseEfi ? false
, enableOCR ? false, meta ? {} , enableOCR ? false, meta ? {}
, testCloneConfig ? false
}: }:
makeTest { makeTest {
inherit enableOCR; inherit enableOCR;
@ -269,7 +309,8 @@ let
testScript = testScriptFun { testScript = testScriptFun {
inherit bootLoader createPartitions preBootCommands inherit bootLoader createPartitions preBootCommands
grubVersion grubDevice grubIdentifier grubUseEfi extraConfig; grubVersion grubDevice grubIdentifier grubUseEfi extraConfig
testCloneConfig;
}; };
}; };
@ -343,6 +384,28 @@ let
bootLoader = "grub"; bootLoader = "grub";
grubUseEfi = true; grubUseEfi = true;
}; };
clone-test-extraconfig = { extraConfig =
''
environment.systemPackages = [ pkgs.grub2 ];
boot.loader.grub.configurationName = "Home";
nesting.clone = [
{
boot.loader.grub.configurationName = lib.mkForce "Work";
environment.etc = {
"gitconfig".text = "
[core]
gitproxy = none for work.com
";
};
}
];
'';
testCloneConfig = true;
};
in { in {
# !!! `parted mkpart' seems to silently create overlapping partitions. # !!! `parted mkpart' seems to silently create overlapping partitions.
@ -352,6 +415,9 @@ in {
# one big filesystem partition. # one big filesystem partition.
simple = makeInstallerTest "simple" simple-test-config; simple = makeInstallerTest "simple" simple-test-config;
# Test cloned configurations with the simple grub configuration
simpleClone = makeInstallerTest "simpleClone" (simple-test-config // clone-test-extraconfig);
# Simple GPT/UEFI configuration using systemd-boot with 3 partitions: ESP, swap & root filesystem # Simple GPT/UEFI configuration using systemd-boot with 3 partitions: ESP, swap & root filesystem
simpleUefiSystemdBoot = makeInstallerTest "simpleUefiSystemdBoot" simpleUefiSystemdBoot = makeInstallerTest "simpleUefiSystemdBoot"
{ createPartitions = { createPartitions =
@ -377,6 +443,9 @@ in {
simpleUefiGrub = makeInstallerTest "simpleUefiGrub" simple-uefi-grub-config; simpleUefiGrub = makeInstallerTest "simpleUefiGrub" simple-uefi-grub-config;
# Test cloned configurations with the uefi grub configuration
simpleUefiGrubClone = makeInstallerTest "simpleUefiGrubClone" (simple-uefi-grub-config // clone-test-extraconfig);
# Same as the previous, but now with a separate /boot partition. # Same as the previous, but now with a separate /boot partition.
separateBoot = makeInstallerTest "separateBoot" separateBoot = makeInstallerTest "separateBoot"
{ createPartitions = { createPartitions =