From bcbb15fcc17feee135254bd8449a92cdce146ecb Mon Sep 17 00:00:00 2001 From: Qubasa Date: Mon, 25 Nov 2024 20:08:45 +0100 Subject: [PATCH] clan-vm-manager: Fix regression --- .../clan_vm_manager/components/executor.py | 18 +++++++++++++++++- .../clan_vm_manager/components/vmobj.py | 8 +++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pkgs/clan-vm-manager/clan_vm_manager/components/executor.py b/pkgs/clan-vm-manager/clan_vm_manager/components/executor.py index 137ff8ff4..350f29135 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/components/executor.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/components/executor.py @@ -1,4 +1,5 @@ import dataclasses +import inspect import logging import multiprocessing as mp import os @@ -7,7 +8,7 @@ import sys import traceback from collections.abc import Callable from pathlib import Path -from typing import Any +from typing import Any, get_type_hints log = logging.getLogger(__name__) @@ -109,6 +110,21 @@ def spawn( if mp.get_start_method(allow_none=True) is None: mp.set_start_method(method="forkserver") + # Validate kwargs against the signature of func + func_signature = inspect.signature(func) + bound_args = func_signature.bind_partial(**kwargs) + bound_args.apply_defaults() # Ensure defaults are applied to missing args + + # Type-check kwargs against func's annotations + type_hints = get_type_hints(func) + for arg_name, arg_value in kwargs.items(): + if arg_name in type_hints: + expected_type = type_hints[arg_name] + if not isinstance(arg_value, expected_type): + msg = f"Argument '{arg_name}' must be of type {expected_type}, but got type {type(arg_value)}" + + raise TypeError(msg) + # Set names proc_name = f"MPExec:{func.__name__}" diff --git a/pkgs/clan-vm-manager/clan_vm_manager/components/vmobj.py b/pkgs/clan-vm-manager/clan_vm_manager/components/vmobj.py index d87e1c867..c7e03e616 100644 --- a/pkgs/clan-vm-manager/clan_vm_manager/components/vmobj.py +++ b/pkgs/clan-vm-manager/clan_vm_manager/components/vmobj.py @@ -17,6 +17,7 @@ from clan_cli.clan_uri import ClanURI from clan_cli.dirs import vm_state_dir from clan_cli.history.add import HistoryEntry from clan_cli.machines.machines import Machine +from clan_cli.vms.inspect import inspect_vm from clan_cli.vms.qemu import QMPWrapper from clan_vm_manager.components.executor import MPProcess, spawn @@ -224,14 +225,15 @@ class VMObject(GObject.Object): return log.info(f"Successfully built VM {self.get_id()}") + vm_config = inspect_vm(machine) + # Start the VM self.vm_process = spawn( on_except=None, out_file=Path(str(self.log_dir.name)) / "vm.log", func=vms.run.run_vm, - vm=self.data.flake.vm, - cachedir=log_dir, - socketdir=log_dir, + vm_config=vm_config, + runtime_config=vms.run.RuntimeConfig(), ) log.debug(f"Started VM {self.get_id()}") GLib.idle_add(self._vm_status_changed_task)