allow a source to define a snapd_system_label

And fetch information about it from snapd when it is selected.
This commit is contained in:
Michael Hudson-Doyle 2022-10-23 22:15:17 +13:00
parent c8068d7dab
commit 1ef6267b54
4 changed files with 32 additions and 0 deletions

View File

@ -35,6 +35,7 @@ class CatalogEntry:
default: bool = False
locale_support: str = attr.ib(default="locale-only")
preinstalled_langs: typing.List[str] = attr.ib(default=attr.Factory(list))
snapd_system_label: typing.Optional[str] = None
fake_entries = {

View File

@ -79,6 +79,7 @@ from subiquity.models.filesystem import (
from subiquity.server.controller import (
SubiquityController,
)
from subiquity.server.types import InstallerChannels
log = logging.getLogger("subiquity.server.controllers.filesystem")
@ -109,7 +110,12 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
self._probe_once, propagate_errors=False)
self._probe_task = SingleInstanceTask(
self._probe, propagate_errors=False, cancel_restart=False)
self._get_system_task = SingleInstanceTask(self._get_system)
self.supports_resilient_boot = False
self.app.hub.subscribe(
(InstallerChannels.CONFIGURED, 'source'),
self._get_system_task.start_sync)
self._system = None
def load_autoinstall_data(self, data):
log.debug("load_autoinstall_data %s", data)
@ -130,10 +136,19 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
await super().configured()
self.stop_listening_udev()
async def _get_system(self):
label = self.app.base_model.source.current.snapd_system_label
if label is None:
self._system = None
return
self._system = await self.app.snapdapi.v2.systems[label].GET()
log.debug("got system %s", self._system)
@with_context()
async def apply_autoinstall_config(self, context=None):
await self._start_task
await self._probe_task.wait()
await self._get_system_task.wait()
if False in self._errors:
raise self._errors[False][0]
if True in self._errors:
@ -281,6 +296,12 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
return resp_cls(
status=ProbeStatus.FAILED,
error_report=self._errors[True][1].ref())
if self._get_system_task.task is None or \
not self._get_system_task.task.done():
if wait:
await self._get_system_task.wait()
else:
return resp_cls(status=ProbeStatus.PROBING)
return None
def full_probe_error(self):

View File

@ -241,6 +241,7 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
'filesystem': self.fs_probe,
}
self.fsc._probe_task.task = mock.Mock()
self.fsc._get_system_task.task = mock.Mock()
if bootloader == Bootloader.BIOS and ptable != 'msdos' and fix_bios:
make_partition(self.model, self.disk, preserve=True,
flag='bios_grub', size=1 << 20, offset=1 << 20)

View File

@ -243,6 +243,15 @@ async def start_server_factory(factory, *args, **kwargs):
@contextlib.asynccontextmanager
async def start_server(*args, **kwargs):
async with start_server_factory(Server, *args, **kwargs) as instance:
sources = await instance.get('/source')
await instance.post(
'/source', source_id=sources['sources'][0]['id'])
while True:
resp = await instance.get('/storage/v2')
print(resp)
if resp['status'] != 'PROBING':
break
await asyncio.sleep(0.5)
yield instance