By some miracle, before, it was possible to reconnect to the `node1` without doing any relevant dance. But now we are direct booting (¿), it seems like we need to do the right things. This introduces a `check_output` flag for `execute` because we do not want to steal the messages from the backdoor service as we might execute the kexec too fast compared to when we will reconnect. Therefore, we will let the message in the pipe if needed.
51 lines
1.6 KiB
Nix
51 lines
1.6 KiB
Nix
import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
|
name = "kexec";
|
|
meta = with lib.maintainers; {
|
|
maintainers = [ flokli lassulus ];
|
|
};
|
|
|
|
nodes = {
|
|
node1 = { ... }: {
|
|
virtualisation.vlans = [ ];
|
|
virtualisation.memorySize = 4 * 1024;
|
|
};
|
|
|
|
node2 = { modulesPath, ... }: {
|
|
virtualisation.vlans = [ ];
|
|
environment.systemPackages = [ pkgs.hello ];
|
|
imports = [
|
|
"${modulesPath}/installer/netboot/netboot-minimal.nix"
|
|
"${modulesPath}/testing/test-instrumentation.nix"
|
|
"${modulesPath}/profiles/qemu-guest.nix"
|
|
];
|
|
};
|
|
};
|
|
|
|
testScript = { nodes, ... }: ''
|
|
# Test whether reboot via kexec works.
|
|
node1.wait_for_unit("multi-user.target")
|
|
node1.succeed('kexec --load /run/current-system/kernel --initrd /run/current-system/initrd --command-line "$(</proc/cmdline)"')
|
|
node1.execute("systemctl kexec >&2 &", check_return=False)
|
|
node1.connected = False
|
|
node1.connect()
|
|
node1.wait_for_unit("multi-user.target")
|
|
|
|
# Check if the machine with netboot-minimal.nix profile boots up
|
|
node2.wait_for_unit("multi-user.target")
|
|
node2.shutdown()
|
|
|
|
# Kexec node1 to the toplevel of node2 via the kexec-boot script
|
|
node1.succeed('touch /run/foo')
|
|
node1.fail('hello')
|
|
node1.execute('${nodes.node2.config.system.build.kexecTree}/kexec-boot', check_output=False)
|
|
node1.connected = False
|
|
node1.connect()
|
|
node1.wait_for_unit("multi-user.target")
|
|
node1.succeed('! test -e /run/foo')
|
|
node1.succeed('hello')
|
|
node1.succeed('[ "$(hostname)" = "node2" ]')
|
|
|
|
node1.shutdown()
|
|
'';
|
|
})
|