From 3a4aec2c7ec532a86573f839c452ee547d043a05 Mon Sep 17 00:00:00 2001 From: lassulus Date: Wed, 4 Dec 2024 16:43:59 +0100 Subject: [PATCH 1/5] start_vm: log VM start command --- pkgs/clan-cli/clan_cli/vms/run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/clan-cli/clan_cli/vms/run.py b/pkgs/clan-cli/clan_cli/vms/run.py index a0cb3388c..87a7af53d 100644 --- a/pkgs/clan-cli/clan_cli/vms/run.py +++ b/pkgs/clan-cli/clan_cli/vms/run.py @@ -127,6 +127,7 @@ def start_vm( env = os.environ.copy() env.update(extra_env) cmd = nix_shell(packages, args) + log.debug(f"Starting VM with command: {cmd}") with subprocess.Popen( cmd, env=env, stdout=stdout, stderr=stderr, stdin=stdin ) as process: From b1260749faa50f42dbeec910bbb485ed89e54373 Mon Sep 17 00:00:00 2001 From: lassulus Date: Wed, 4 Dec 2024 16:44:30 +0100 Subject: [PATCH 2/5] qemu_command: disable monitor if non interactive --- pkgs/clan-cli/clan_cli/vms/qemu.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/clan-cli/clan_cli/vms/qemu.py b/pkgs/clan-cli/clan_cli/vms/qemu.py index f18f11e0f..0fd1108cc 100644 --- a/pkgs/clan-cli/clan_cli/vms/qemu.py +++ b/pkgs/clan-cli/clan_cli/vms/qemu.py @@ -151,6 +151,7 @@ def qemu_command( "-serial", "null", "-chardev", "file,id=char0,path=/dev/stdout", "-device", "virtconsole,chardev=char0,nr=0", + "-monitor", "none", ]) vsock_cid = None From 2aa1395f8fcda3510df5726af349fded4ba6ce75 Mon Sep 17 00:00:00 2001 From: lassulus Date: Wed, 4 Dec 2024 16:57:49 +0100 Subject: [PATCH 3/5] spawn_vm: pass stdin --- pkgs/clan-cli/clan_cli/vms/run.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkgs/clan-cli/clan_cli/vms/run.py b/pkgs/clan-cli/clan_cli/vms/run.py index 87a7af53d..18f48e89b 100644 --- a/pkgs/clan-cli/clan_cli/vms/run.py +++ b/pkgs/clan-cli/clan_cli/vms/run.py @@ -292,7 +292,12 @@ def spawn_vm( start_waypipe(qemu_cmd.vsock_cid, f"[{vm.machine_name}] "), start_virtiofsd(virtiofsd_socket), start_vm( - qemu_cmd.args, packages, extra_env, stdout=stdout, stderr=stderr + qemu_cmd.args, + packages, + extra_env, + stdout=stdout, + stderr=stderr, + stdin=stdin, ) as process, ): qemu_vm = QemuVm(machine, process, socketdir) From acb78d4fb8398520dbcac1eaa182910876adae78 Mon Sep 17 00:00:00 2001 From: lassulus Date: Wed, 4 Dec 2024 17:00:52 +0100 Subject: [PATCH 4/5] test_vars_deployment: pass stdin as DEVNULL to vm --- pkgs/clan-cli/tests/test_vars_deployment.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkgs/clan-cli/tests/test_vars_deployment.py b/pkgs/clan-cli/tests/test_vars_deployment.py index 62941e9d8..3f6515c59 100644 --- a/pkgs/clan-cli/tests/test_vars_deployment.py +++ b/pkgs/clan-cli/tests/test_vars_deployment.py @@ -1,4 +1,5 @@ import json +import subprocess from contextlib import ExitStack import pytest @@ -99,8 +100,8 @@ def test_vm_deployment( vm1_config = inspect_vm(machine=Machine("m1_machine", FlakeId(str(flake.path)))) vm2_config = inspect_vm(machine=Machine("m2_machine", FlakeId(str(flake.path)))) with ExitStack() as stack: - vm1 = stack.enter_context(spawn_vm(vm1_config)) - vm2 = stack.enter_context(spawn_vm(vm2_config)) + vm1 = stack.enter_context(spawn_vm(vm1_config, stdin=subprocess.DEVNULL)) + vm2 = stack.enter_context(spawn_vm(vm2_config, stdin=subprocess.DEVNULL)) qga_m1 = stack.enter_context(vm1.qga_connect()) qga_m2 = stack.enter_context(vm2.qga_connect()) # check my_secret is deployed From 8b12578c13c2ac1fe9ddc308b9687d476dc823b0 Mon Sep 17 00:00:00 2001 From: lassulus Date: Wed, 4 Dec 2024 17:01:25 +0100 Subject: [PATCH 5/5] test_vars_deployment: fix race condition with multiple VMs on error case --- pkgs/clan-cli/tests/test_vars_deployment.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/clan-cli/tests/test_vars_deployment.py b/pkgs/clan-cli/tests/test_vars_deployment.py index 3f6515c59..88229028f 100644 --- a/pkgs/clan-cli/tests/test_vars_deployment.py +++ b/pkgs/clan-cli/tests/test_vars_deployment.py @@ -104,6 +104,9 @@ def test_vm_deployment( vm2 = stack.enter_context(spawn_vm(vm2_config, stdin=subprocess.DEVNULL)) qga_m1 = stack.enter_context(vm1.qga_connect()) qga_m2 = stack.enter_context(vm2.qga_connect()) + # run these always succesfull commands to make sure all vms have started before continuing + qga_m1.run(["echo"]) + qga_m2.run(["echo"]) # check my_secret is deployed result = qga_m1.run(["cat", "/run/secrets/vars/m1_generator/my_secret"]) assert result.stdout == "hello\n"