From 1c0761dde99910d546612d6f3f0d42419ff2dfbb Mon Sep 17 00:00:00 2001 From: nesitor Date: Wed, 13 Mar 2024 16:48:00 +0100 Subject: [PATCH] Implement default hypervisor options on settings (#573) Problem: The unique way to set the default hypervisor to use is hardcoded on the `models.py` class, so we can't select another one by default. Solution: Implement `INSTANCE_DEFAULT_HYPERVISOR` field on the orchestrator configuration variables. --- src/aleph/vm/conf.py | 9 +++++++++ src/aleph/vm/models.py | 7 +++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/aleph/vm/conf.py b/src/aleph/vm/conf.py index ee7ec99f8..4c44bd6cc 100644 --- a/src/aleph/vm/conf.py +++ b/src/aleph/vm/conf.py @@ -11,6 +11,7 @@ from subprocess import CalledProcessError, check_output from typing import Any, Literal, NewType, Optional, Union +from aleph_message.models.execution.environment import HypervisorType from pydantic import BaseSettings, Field, HttpUrl from pydantic.env_settings import DotenvType, env_file_sentinel from pydantic.typing import StrPath @@ -255,6 +256,10 @@ class Settings(BaseSettings): ALLOCATION_TOKEN_HASH = "151ba92f2eb90bce67e912af2f7a5c17d8654b3d29895b042107ea312a7eebda" ENABLE_QEMU_SUPPORT: bool = Field(default=False) + INSTANCE_DEFAULT_HYPERVISOR: Optional[HypervisorType] = Field( + default=HypervisorType.firecracker, # User Firecracker + description="Default hypervisor to use on running instances, can be Firecracker or QEmu", + ) # Tests on programs @@ -391,6 +396,10 @@ def setup(self): network_interface=self.NETWORK_INTERFACE, ) + if not settings.ENABLE_QEMU_SUPPORT: + # If QEmu is not supported, ignore the setting and use Firecracker by default + settings.INSTANCE_DEFAULT_HYPERVISOR = HypervisorType.firecracker + def display(self) -> str: attributes: dict[str, Any] = {} diff --git a/src/aleph/vm/models.py b/src/aleph/vm/models.py index 4dacc8abf..1a39655da 100644 --- a/src/aleph/vm/models.py +++ b/src/aleph/vm/models.py @@ -105,8 +105,11 @@ def is_instance(self) -> bool: @property def hypervisor(self) -> HypervisorType: - # default to firecracker for retro compat - return self.message.environment.hypervisor or HypervisorType.firecracker + if self.is_program: + return HypervisorType.firecracker + + # Hypervisor setting is only used for instances + return self.message.environment.hypervisor or settings.INSTANCE_DEFAULT_HYPERVISOR @property def becomes_ready(self) -> Callable[[], Coroutine]: