filesystem: start new guided API POST

This commit is contained in:
Dan Bungert 2022-06-28 16:05:44 -06:00
parent 78f23153e5
commit 5d5f9ca49e
4 changed files with 65 additions and 34 deletions

View File

@ -382,6 +382,14 @@ class GuidedChoiceV2:
use_lvm: bool = False use_lvm: bool = False
password: Optional[str] = attr.ib(default=None, repr=False) password: Optional[str] = attr.ib(default=None, repr=False)
@staticmethod
def from_guided_choice(choice: GuidedChoice):
return GuidedChoiceV2(
target=GuidedStorageTargetReformat(disk_id=choice.disk_id),
use_lvm=choice.use_lvm,
password=choice.password,
)
@attr.s(auto_attribs=True) @attr.s(auto_attribs=True)
class GuidedStorageResponseV2: class GuidedStorageResponseV2:

View File

@ -1039,6 +1039,7 @@ class FilesystemModel(object):
self._actions = [] self._actions = []
self.swap = None self.swap = None
self.grub = None self.grub = None
self.guided_configuration = None
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)

View File

@ -192,8 +192,19 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
mount="/", mount="/",
)) ))
def guided(self, choice): def guided(self, choice: GuidedChoiceV2):
disk = self.model._one(id=choice.disk_id) self.model.guided_configuration = choice
if isinstance(choice.target, GuidedStorageTargetReformat):
mode = 'reformat_disk'
elif isinstance(choice.target, GuidedStorageTargetUseGap):
mode = 'use_gap' # FIXME not the correct gap
elif isinstance(choice.target, GuidedStorageTargetResize):
mode = 'resize' # FIXME not actually working
else:
raise Exception(f'Unknown guided target {choice.target}')
disk = self.model._one(id=choice.target.disk_id)
if choice.use_lvm: if choice.use_lvm:
lvm_options = None lvm_options = None
if choice.password is not None: if choice.password is not None:
@ -203,9 +214,9 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
'password': choice.password, 'password': choice.password,
}, },
} }
self.guided_lvm(disk, lvm_options=lvm_options) self.guided_lvm(disk, mode=mode, lvm_options=lvm_options)
else: else:
self.guided_direct(disk) self.guided_direct(disk, mode=mode)
async def _probe_response(self, wait, resp_cls): async def _probe_response(self, wait, resp_cls):
if self._probe_task.task is None or not self._probe_task.task.done(): if self._probe_task.task is None or not self._probe_task.task.done():
@ -289,7 +300,7 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
async def guided_POST(self, data: GuidedChoice) -> StorageResponse: async def guided_POST(self, data: GuidedChoice) -> StorageResponse:
log.debug(data) log.debug(data)
self.guided(data) self.guided(GuidedChoiceV2.from_guided_choice(data))
return self._done_response() return self._done_response()
async def reset_POST(self, context, request) -> StorageResponse: async def reset_POST(self, context, request) -> StorageResponse:
@ -352,7 +363,7 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
async def v2_deprecated_guided_POST(self, data: GuidedChoice) \ async def v2_deprecated_guided_POST(self, data: GuidedChoice) \
-> StorageResponseV2: -> StorageResponseV2:
log.debug(data) log.debug(data)
self.guided(data) self.guided(GuidedChoiceV2.from_guided_choice(data))
return await self.v2_GET() return await self.v2_GET()
async def v2_guided_GET(self) -> GuidedStorageResponseV2: async def v2_guided_GET(self) -> GuidedStorageResponseV2:
@ -379,17 +390,21 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
vals = sizes.calculate_guided_resize( vals = sizes.calculate_guided_resize(
partition.estimated_min_size, partition.size, partition.estimated_min_size, partition.size,
install_min, part_align=part_align) install_min, part_align=part_align)
if vals is not None: if vals is None:
continue
resize = GuidedStorageTargetResize.from_recommendations( resize = GuidedStorageTargetResize.from_recommendations(
partition, vals) partition, vals)
scenarios.append((vals.install_max, resize)) scenarios.append((vals.install_max, resize))
scenarios.sort(reverse=True, key=lambda x: x[0]) scenarios.sort(reverse=True, key=lambda x: x[0])
return GuidedStorageResponseV2(possible=[s[1] for s in scenarios]) return GuidedStorageResponseV2(
configured=self.model.guided_configuration,
possible=[s[1] for s in scenarios])
async def v2_guided_POST(self, data: GuidedChoiceV2) \ async def v2_guided_POST(self, data: GuidedChoiceV2) \
-> GuidedStorageResponseV2: -> GuidedStorageResponseV2:
log.debug(data) log.debug(data)
self.guided(data)
return await self.v2_guided_GET() return await self.v2_guided_GET()
async def v2_reformat_disk_POST(self, data: ReformatDisk) \ async def v2_reformat_disk_POST(self, data: ReformatDisk) \

View File

@ -145,7 +145,7 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
self.app.opts.bootloader = bootloader.value self.app.opts.bootloader = bootloader.value
self.fsc = FilesystemController(app=self.app) self.fsc = FilesystemController(app=self.app)
self.fsc.calculate_suggested_install_min = mock.Mock() self.fsc.calculate_suggested_install_min = mock.Mock()
self.fsc.calculate_suggested_install_min.return_value = 1 << 30 self.fsc.calculate_suggested_install_min.return_value = 10 << 30
self.fsc.model = self.model = make_model(bootloader) self.fsc.model = self.model = make_model(bootloader)
self.model.storage_version = 2 self.model.storage_version = 2
self.fs_probe = {} self.fs_probe = {}
@ -169,11 +169,14 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
p1 = make_partition(self.model, d) p1 = make_partition(self.model, d)
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20} self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20}
resp = await self.fsc.v2_guided_GET() resp = await self.fsc.v2_guided_GET()
[reformat, use_gap, resize] = resp.possible reformat = resp.possible[0]
self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat) self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat)
if bootloader != Bootloader.BIOS:
gap = gaps.largest_gap(d)
self.assertEqual( self.assertEqual(
GuidedStorageTargetUseGap(disk_id=d.id, gap=gaps.largest_gap(d)), GuidedStorageTargetUseGap(disk_id=d.id, gap=gap),
use_gap) resp.possible[1])
resize = resp.possible[2]
self.assertEqual(d.id, resize.disk_id) self.assertEqual(d.id, resize.disk_id)
self.assertEqual(p1.number, resize.partition_number) self.assertEqual(p1.number, resize.partition_number)
self.assertTrue(isinstance(resize, GuidedStorageTargetResize)) self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
@ -185,8 +188,10 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
p1 = make_partition(self.model, d, size=gaps.largest_gap_size(d)) p1 = make_partition(self.model, d, size=gaps.largest_gap_size(d))
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20} self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20}
resp = await self.fsc.v2_guided_GET() resp = await self.fsc.v2_guided_GET()
[reformat, resize] = resp.possible reformat = resp.possible[0]
self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat) self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat)
if bootloader != Bootloader.BIOS:
resize = resp.possible[1]
self.assertEqual(d.id, resize.disk_id) self.assertEqual(d.id, resize.disk_id)
self.assertEqual(p1.number, resize.partition_number) self.assertEqual(p1.number, resize.partition_number)
self.assertTrue(isinstance(resize, GuidedStorageTargetResize)) self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
@ -201,8 +206,10 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 40 << 30} self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 40 << 30}
self.fsc.calculate_suggested_install_min.return_value = 10 << 30 self.fsc.calculate_suggested_install_min.return_value = 10 << 30
resp = await self.fsc.v2_guided_GET() resp = await self.fsc.v2_guided_GET()
[reformat, resize] = resp.possible reformat = resp.possible[0]
self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat) self.assertEqual(GuidedStorageTargetReformat(disk_id=d.id), reformat)
if bootloader != Bootloader.BIOS:
resize = resp.possible[1]
self.assertEqual( self.assertEqual(
GuidedStorageTargetResize( GuidedStorageTargetResize(
disk_id=d.id, disk_id=d.id,