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
|
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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue