nixosTests.kexec: reconnect properly after 2nd kexec

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.
This commit is contained in:
Raito Bezarius 2023-05-25 02:24:56 +02:00
parent 85c8cc7ce9
commit 7088e386ff
2 changed files with 14 additions and 2 deletions

View file

@ -514,7 +514,11 @@ class Machine:
return "".join(output_buffer)
def execute(
self, command: str, check_return: bool = True, timeout: Optional[int] = 900
self,
command: str,
check_return: bool = True,
check_output: bool = True,
timeout: Optional[int] = 900,
) -> Tuple[int, str]:
self.run_callbacks()
self.connect()
@ -535,6 +539,9 @@ class Machine:
assert self.shell
self.shell.send(out_command.encode())
if not check_output:
return (-2, "")
# Get the output
output = base64.b64decode(self._next_newline_closed_block_from_shell())

View file

@ -15,6 +15,8 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
environment.systemPackages = [ pkgs.hello ];
imports = [
"${modulesPath}/installer/netboot/netboot-minimal.nix"
"${modulesPath}/testing/test-instrumentation.nix"
"${modulesPath}/profiles/qemu-guest.nix"
];
};
};
@ -35,7 +37,10 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
# 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_return=False)
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" ]')