From 42a7529fb6307c5392832f9de3f17dd9e8baf653 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Wed, 22 Mar 2023 20:40:48 +1300 Subject: [PATCH] use separate AptConfigurers for testing and final config --- subiquity/server/controllers/drivers.py | 2 +- subiquity/server/controllers/mirror.py | 33 ++++++++++--------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/subiquity/server/controllers/drivers.py b/subiquity/server/controllers/drivers.py index 05989a8d..4681c5f9 100644 --- a/subiquity/server/controllers/drivers.py +++ b/subiquity/server/controllers/drivers.py @@ -104,7 +104,7 @@ class DriversController(SubiquityController): self.drivers = [] self.list_drivers_done_event.set() return - apt = self.app.controllers.Mirror.apt_configurer + apt = self.app.controllers.Mirror.final_apt_configurer try: async with apt.overlay() as d: try: diff --git a/subiquity/server/controllers/mirror.py b/subiquity/server/controllers/mirror.py index 00a172ac..a037eea3 100644 --- a/subiquity/server/controllers/mirror.py +++ b/subiquity/server/controllers/mirror.py @@ -20,7 +20,6 @@ from typing import List, Optional import attr -from subiquitycore.async_helpers import SingleInstanceTask from subiquitycore.context import with_context from subiquity.common.apidef import API @@ -33,7 +32,11 @@ from subiquity.common.types import ( MirrorSelectionFallback, ) from subiquity.models.mirror import filter_candidates -from subiquity.server.apt import get_apt_configurer, AptConfigCheckError +from subiquity.server.apt import ( + AptConfigCheckError, + AptConfigurer, + get_apt_configurer, + ) from subiquity.server.controller import SubiquityController from subiquity.server.types import InstallerChannels @@ -137,7 +140,6 @@ class MirrorController(SubiquityController): super().__init__(app) self.geoip_enabled = True self.cc_event = asyncio.Event() - self.configured_event = asyncio.Event() self.source_configured_event = asyncio.Event() self.network_configured_event = asyncio.Event() self.proxy_configured_event = asyncio.Event() @@ -151,9 +153,7 @@ class MirrorController(SubiquityController): (InstallerChannels.CONFIGURED, 'proxy'), self.proxy_configured_event.set) self._apt_config_key = None - self._apply_apt_config_task = SingleInstanceTask( - self._promote_mirror) - self.apt_configurer = None + self.apt_configurer: Optional[AptConfigurer] = None self.mirror_check: Optional[MirrorCheck] = None def load_autoinstall_data(self, data): @@ -281,11 +281,8 @@ class MirrorController(SubiquityController): self.cc_event.set() async def on_source(self): - if self.apt_configurer is not None: - await self.apt_configurer.cleanup() self.apt_configurer = get_apt_configurer( self.app, self.app.controllers.Source.get_handler()) - self._apply_apt_config_task.start_sync() self.source_configured_event.set() def serialize(self): @@ -304,30 +301,26 @@ class MirrorController(SubiquityController): config['geoip'] = self.geoip_enabled return config - async def configured(self): - await super().configured() - self._apply_apt_config_task.start_sync() - self.configured_event.set() - async def _promote_mirror(self): - await asyncio.gather(self.source_configured_event.wait(), - self.configured_event.wait()) if self.model.primary_elected is None: # NOTE: In practice, this should only happen if the mirror was # marked configured using a POST to mark_configured ; which is not # recommended. Clients should do a POST request to /mirror with # null as the body instead. await self.run_mirror_selection_or_fallback(self.context) - await self.apt_configurer.apply_apt_config(self.context, final=True) + await self.final_apt_configurer.apply_apt_config( + self.context, final=True) async def run_mirror_testing(self, output: io.StringIO) -> None: await self.source_configured_event.wait() await self.apt_configurer.apply_apt_config(self.context, final=False) await self.apt_configurer.run_apt_config_check(output) - async def wait_config(self): - await self._apply_apt_config_task.wait() - return self.apt_configurer + async def wait_config(self) -> AptConfigurer: + self.final_apt_configurer = get_apt_configurer( + self.app, self.app.controllers.Source.get_handler()) + await self._promote_mirror() + return self.final_apt_configurer async def GET(self) -> MirrorGet: elected: Optional[str] = None