From 72d2dbcd9fceb2926d8ad0f6fbf6ebb9b14c5af1 Mon Sep 17 00:00:00 2001 From: Sam Hartman Date: Fri, 1 Nov 2024 09:26:55 -0600 Subject: [PATCH] Avoid instantiating config_layout in upper injector hierarchy * Vm was grabbing a ConfigLayout as a dependency. * Unfortunately, MacStore and KvStore were arranging for a ConfigLayout to be associated with base_injector. * But carthage-runner was setting --keep on the layout injector not the base_injector * So VMs were auto-shutting down Fixes: * VM explicitly gets an ConfigLayout from its injector rather than trusting dependency resolution * MacStore and KvStore do the same to avoid polluting the base injector. Thanks @timrcm for noticing that some VMs were disappearing. --- carthage/kvstore.py | 3 ++- carthage/network/mac.py | 3 ++- carthage/vm.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/carthage/kvstore.py b/carthage/kvstore.py index 6c5ffe3a..b3f0d132 100644 --- a/carthage/kvstore.py +++ b/carthage/kvstore.py @@ -36,7 +36,7 @@ __all__ += ['persistent_seed_path'] -@inject_autokwargs(config_layout=ConfigLayout, +@inject_autokwargs(injector=Injector, persistent_seed_path=InjectionKey(persistent_seed_path, _optional=True), ) class KvStore(Injectable): @@ -45,6 +45,7 @@ def __init__( self, store_dir="persistent_assignments", max_size=4*2**30, **kwargs): super().__init__(**kwargs) + self.config_layout = self.injector(ConfigLayout) store_path = Path(store_dir) if not store_path.is_absolute(): store_path = Path(self.config_layout.state_dir)/store_path diff --git a/carthage/network/mac.py b/carthage/network/mac.py index 7234a17b..47fcdf69 100644 --- a/carthage/network/mac.py +++ b/carthage/network/mac.py @@ -27,7 +27,7 @@ def random_mac_addr(): __all__ = ['random_mac_addr'] -@inject_autokwargs(config_layout=ConfigLayout, +@inject_autokwargs( injector=Injector, kvstore=carthage.kvstore.KvStore) class MacStore(Injectable): @@ -39,6 +39,7 @@ class MacStore(Injectable): def __init__(self, **kwargs): from .base import NetworkConfig super().__init__(**kwargs) + self.config_layout = self.injector(ConfigLayout) state_dir = Path(self.config_layout.state_dir) self.path = state_dir / "macs.yml" self.domain = self.kvstore.domain('mac', True) diff --git a/carthage/vm.py b/carthage/vm.py index 557ec7eb..2e9dbe53 100644 --- a/carthage/vm.py +++ b/carthage/vm.py @@ -42,7 +42,6 @@ @inject_autokwargs( - config_layout=ConfigLayout, injector=Injector, image=InjectionKey(vm_image_key, _ready=False), network_config=carthage.network.NetworkConfig @@ -52,6 +51,7 @@ class VM(Machine, SetupTaskMixin): def __init__(self, name, *, console_needed=None, **kwargs): super().__init__(name=name, **kwargs) + self.config_layout = self.injector(ConfigLayout) injector = self.injector config_layout = self.config_layout self.console_needed = console_needed