Merge pull request #1356 from dbungert/orig-config

filesystem: add orig_config API
This commit is contained in:
Dan Bungert 2022-07-18 17:51:12 -06:00 committed by GitHub
commit 70e6814824
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 5 deletions

View File

@ -258,6 +258,9 @@ class API:
def GET() -> StorageResponseV2: ... def GET() -> StorageResponseV2: ...
def POST() -> StorageResponseV2: ... def POST() -> StorageResponseV2: ...
class orig_config:
def GET() -> StorageResponseV2: ...
class guided: class guided:
def GET() -> GuidedStorageResponseV2: ... def GET() -> GuidedStorageResponseV2: ...
def POST(data: Payload[GuidedChoiceV2]) \ def POST(data: Payload[GuidedChoiceV2]) \

View File

@ -1041,6 +1041,16 @@ class FilesystemModel(object):
self.grub = None self.grub = None
self.guided_configuration = None self.guided_configuration = None
def get_orig_model(self):
# The purpose of this is to be able to answer arbitrary questions about
# the original state. _orig_config plays a similar role, but is
# expressed in terms of curtin actions, which are not what we want to
# use on the V2 storage API.
orig_model = FilesystemModel(self.bootloader)
orig_model.target = self.target
orig_model.load_probe_data(self._probe_data)
return orig_model
def load_server_data(self, status): def load_server_data(self, status):
log.debug('load_server_data %s', status) log.debug('load_server_data %s', status)
self._all_ids = set() self._all_ids = set()

View File

@ -373,19 +373,26 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
for pa in self.model._partition_alignment_data.values())) for pa in self.model._partition_alignment_data.values()))
return sizes.calculate_suggested_install_min(source_min, align) return sizes.calculate_suggested_install_min(source_min, align)
async def v2_GET(self) -> StorageResponseV2: def get_v2_storage_response(self, model):
disks = self.model._all(type='disk') disks = model._all(type='disk')
minsize = self.calculate_suggested_install_min()
return StorageResponseV2( return StorageResponseV2(
disks=[labels.for_client(d) for d in disks], disks=[labels.for_client(d) for d in disks],
need_root=not self.model.is_root_mounted(), need_root=not model.is_root_mounted(),
need_boot=self.model.needs_bootloader_partition(), need_boot=model.needs_bootloader_partition(),
install_minimum_size=self.calculate_suggested_install_min(), install_minimum_size=minsize,
) )
async def v2_GET(self) -> StorageResponseV2:
return self.get_v2_storage_response(self.model)
async def v2_POST(self) -> StorageResponseV2: async def v2_POST(self) -> StorageResponseV2:
await self.configured() await self.configured()
return await self.v2_GET() return await self.v2_GET()
async def v2_orig_config_GET(self) -> StorageResponseV2:
return self.get_v2_storage_response(self.model.get_orig_model())
async def v2_reset_POST(self) -> StorageResponseV2: async def v2_reset_POST(self) -> StorageResponseV2:
log.info("Resetting Filesystem model") log.info("Resetting Filesystem model")
self.model.reset() self.model.reset()

View File

@ -1101,6 +1101,22 @@ class TestPartitionTableEditing(TestAPI):
self.assertEqual(-1, p3['estimated_min_size']) self.assertEqual(-1, p3['estimated_min_size'])
self.assertEqual(2 << 20, p4['estimated_min_size']) self.assertEqual(2 << 20, p4['estimated_min_size'])
@timeout()
async def test_v2_orig_config(self):
cfg = 'examples/win10-along-ubuntu.json'
extra = ['--storage-version', '2']
async with start_server(cfg, extra_args=extra) as inst:
start_resp = await inst.get('/storage/v2')
resp = await inst.get('/storage/v2/guided')
resize = match(resp['possible'],
_type='GuidedStorageTargetResize')[0]
resize['new_size'] = 30 << 30
await inst.post('/storage/v2/guided', {'target': resize})
orig_config = await inst.get('/storage/v2/orig_config')
end_resp = await inst.get('/storage/v2')
self.assertEqual(start_resp, orig_config)
self.assertNotEqual(start_resp, end_resp)
class TestGap(TestAPI): class TestGap(TestAPI):
async def test_blank_disk_is_one_big_gap(self): async def test_blank_disk_is_one_big_gap(self):