filesystem: start new guided API POST
This commit is contained in:
parent
78f23153e5
commit
5d5f9ca49e
|
@ -382,6 +382,14 @@ class GuidedChoiceV2:
|
|||
use_lvm: bool = 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)
|
||||
class GuidedStorageResponseV2:
|
||||
|
|
|
@ -1039,6 +1039,7 @@ class FilesystemModel(object):
|
|||
self._actions = []
|
||||
self.swap = None
|
||||
self.grub = None
|
||||
self.guided_configuration = None
|
||||
|
||||
def load_server_data(self, status):
|
||||
log.debug('load_server_data %s', status)
|
||||
|
|
|
@ -192,8 +192,19 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
|
|||
mount="/",
|
||||
))
|
||||
|
||||
def guided(self, choice):
|
||||
disk = self.model._one(id=choice.disk_id)
|
||||
def guided(self, choice: GuidedChoiceV2):
|
||||
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:
|
||||
lvm_options = None
|
||||
if choice.password is not None:
|
||||
|
@ -203,9 +214,9 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
|
|||
'password': choice.password,
|
||||
},
|
||||
}
|
||||
self.guided_lvm(disk, lvm_options=lvm_options)
|
||||
self.guided_lvm(disk, mode=mode, lvm_options=lvm_options)
|
||||
else:
|
||||
self.guided_direct(disk)
|
||||
self.guided_direct(disk, mode=mode)
|
||||
|
||||
async def _probe_response(self, wait, resp_cls):
|
||||
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:
|
||||
log.debug(data)
|
||||
self.guided(data)
|
||||
self.guided(GuidedChoiceV2.from_guided_choice(data))
|
||||
return self._done_response()
|
||||
|
||||
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) \
|
||||
-> StorageResponseV2:
|
||||
log.debug(data)
|
||||
self.guided(data)
|
||||
self.guided(GuidedChoiceV2.from_guided_choice(data))
|
||||
return await self.v2_GET()
|
||||
|
||||
async def v2_guided_GET(self) -> GuidedStorageResponseV2:
|
||||
|
@ -379,17 +390,21 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
|
|||
vals = sizes.calculate_guided_resize(
|
||||
partition.estimated_min_size, partition.size,
|
||||
install_min, part_align=part_align)
|
||||
if vals is not None:
|
||||
resize = GuidedStorageTargetResize.from_recommendations(
|
||||
partition, vals)
|
||||
scenarios.append((vals.install_max, resize))
|
||||
if vals is None:
|
||||
continue
|
||||
resize = GuidedStorageTargetResize.from_recommendations(
|
||||
partition, vals)
|
||||
scenarios.append((vals.install_max, resize))
|
||||
|
||||
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) \
|
||||
-> GuidedStorageResponseV2:
|
||||
log.debug(data)
|
||||
self.guided(data)
|
||||
return await self.v2_guided_GET()
|
||||
|
||||
async def v2_reformat_disk_POST(self, data: ReformatDisk) \
|
||||
|
|
|
@ -145,7 +145,7 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
|
|||
self.app.opts.bootloader = bootloader.value
|
||||
self.fsc = FilesystemController(app=self.app)
|
||||
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.model.storage_version = 2
|
||||
self.fs_probe = {}
|
||||
|
@ -169,14 +169,17 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
|
|||
p1 = make_partition(self.model, d)
|
||||
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20}
|
||||
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(
|
||||
GuidedStorageTargetUseGap(disk_id=d.id, gap=gaps.largest_gap(d)),
|
||||
use_gap)
|
||||
self.assertEqual(d.id, resize.disk_id)
|
||||
self.assertEqual(p1.number, resize.partition_number)
|
||||
self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
|
||||
if bootloader != Bootloader.BIOS:
|
||||
gap = gaps.largest_gap(d)
|
||||
self.assertEqual(
|
||||
GuidedStorageTargetUseGap(disk_id=d.id, gap=gap),
|
||||
resp.possible[1])
|
||||
resize = resp.possible[2]
|
||||
self.assertEqual(d.id, resize.disk_id)
|
||||
self.assertEqual(p1.number, resize.partition_number)
|
||||
self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
|
||||
|
||||
@parameterized.expand(bootloaders)
|
||||
async def test_used_full_disk(self, bootloader):
|
||||
|
@ -185,11 +188,13 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
|
|||
p1 = make_partition(self.model, d, size=gaps.largest_gap_size(d))
|
||||
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 1 << 20}
|
||||
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(d.id, resize.disk_id)
|
||||
self.assertEqual(p1.number, resize.partition_number)
|
||||
self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
|
||||
if bootloader != Bootloader.BIOS:
|
||||
resize = resp.possible[1]
|
||||
self.assertEqual(d.id, resize.disk_id)
|
||||
self.assertEqual(p1.number, resize.partition_number)
|
||||
self.assertTrue(isinstance(resize, GuidedStorageTargetResize))
|
||||
|
||||
@parameterized.expand(bootloaders)
|
||||
async def test_weighted_split(self, bootloader):
|
||||
|
@ -201,15 +206,17 @@ class TestGuidedV2(IsolatedAsyncioTestCase):
|
|||
self.fs_probe[p1._path()] = {'ESTIMATED_MIN_SIZE': 40 << 30}
|
||||
self.fsc.calculate_suggested_install_min.return_value = 10 << 30
|
||||
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(
|
||||
GuidedStorageTargetResize(
|
||||
disk_id=d.id,
|
||||
partition_number=p1.number,
|
||||
new_size=200 << 30,
|
||||
minimum=50 << 30,
|
||||
recommended=200 << 30,
|
||||
maximum=230 << 30,
|
||||
),
|
||||
resize)
|
||||
if bootloader != Bootloader.BIOS:
|
||||
resize = resp.possible[1]
|
||||
self.assertEqual(
|
||||
GuidedStorageTargetResize(
|
||||
disk_id=d.id,
|
||||
partition_number=p1.number,
|
||||
new_size=200 << 30,
|
||||
minimum=50 << 30,
|
||||
recommended=200 << 30,
|
||||
maximum=230 << 30,
|
||||
),
|
||||
resize)
|
||||
|
|
Loading…
Reference in New Issue