filesystem: sort guided cases on available size

This commit is contained in:
Dan Bungert 2022-06-28 15:05:04 -06:00
parent 2f12610290
commit 78f23153e5
4 changed files with 16 additions and 12 deletions

View File

@ -115,6 +115,7 @@ def calculate_guided_resize(part_min: int, part_size: int, install_min: int,
raw_recommended = math.ceil(resize_window * ratio) + other_min raw_recommended = math.ceil(resize_window * ratio) + other_min
recommended = align_up(raw_recommended, part_align) recommended = align_up(raw_recommended, part_align)
return GuidedResizeValues( return GuidedResizeValues(
install_max=plausible_free_space,
minimum=other_min, recommended=recommended, maximum=other_max) minimum=other_min, recommended=recommended, maximum=other_max)

View File

@ -97,6 +97,7 @@ class TestCalculateGuidedResize(unittest.TestCase):
actual = calculate_guided_resize( actual = calculate_guided_resize(
part_min=8 << 30, part_size=100 << 30, install_min=size) part_min=8 << 30, part_size=100 << 30, install_min=size)
expected = GuidedResizeValues( expected = GuidedResizeValues(
install_max=(100 << 30) - size,
minimum=size, recommended=50 << 30, maximum=(100 << 30) - size) minimum=size, recommended=50 << 30, maximum=(100 << 30) - size)
self.assertEqual(expected, actual) self.assertEqual(expected, actual)
@ -104,6 +105,7 @@ class TestCalculateGuidedResize(unittest.TestCase):
actual = calculate_guided_resize( actual = calculate_guided_resize(
part_min=40 << 30, part_size=240 << 30, install_min=10 << 30) part_min=40 << 30, part_size=240 << 30, install_min=10 << 30)
expected = GuidedResizeValues( expected = GuidedResizeValues(
install_max=190 << 30,
minimum=50 << 30, recommended=200 << 30, maximum=230 << 30) minimum=50 << 30, recommended=200 << 30, maximum=230 << 30)
self.assertEqual(expected, actual) self.assertEqual(expected, actual)

View File

@ -333,6 +333,7 @@ class StorageResponseV2:
@attr.s(auto_attribs=True) @attr.s(auto_attribs=True)
class GuidedResizeValues: class GuidedResizeValues:
install_max: int
minimum: int minimum: int
recommended: int recommended: int
maximum: int maximum: int

View File

@ -360,19 +360,18 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
Results are sorted by the size of the space potentially available to Results are sorted by the size of the space potentially available to
the install.""" the install."""
possible = [] scenarios = []
install_min = self.calculate_suggested_install_min() install_min = self.calculate_suggested_install_min()
for disk in self.get_guided_disks(with_reformatting=True): for disk in self.get_guided_disks(with_reformatting=True):
possible.append(GuidedStorageTargetReformat(disk_id=disk.id)) reformat = GuidedStorageTargetReformat(disk_id=disk.id)
scenarios.append((disk.size, reformat))
for disk in self.get_guided_disks(with_reformatting=False): for disk in self.get_guided_disks(with_reformatting=False):
gap = gaps.largest_gap(disk) gap = gaps.largest_gap(disk)
# FIXME this gap size check can mean that a disk that is if gap is not None and gap.size >= install_min:
# accepted is ignored by use_gap use_gap = GuidedStorageTargetUseGap(disk_id=disk.id, gap=gap)
if gap is not None and gap.size > install_min: scenarios.append((gap.size, use_gap))
possible.append(GuidedStorageTargetUseGap(
disk_id=disk.id, gap=gap))
for disk in self.get_guided_disks(check_boot=False): for disk in self.get_guided_disks(check_boot=False):
part_align = disk.alignment_data().part_align part_align = disk.alignment_data().part_align
@ -381,11 +380,12 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
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 not None:
possible.append( resize = GuidedStorageTargetResize.from_recommendations(
GuidedStorageTargetResize.from_recommendations( partition, vals)
partition, vals)) scenarios.append((vals.install_max, resize))
# FIXME sort at the end
return GuidedStorageResponseV2(possible=possible) scenarios.sort(reverse=True, key=lambda x: x[0])
return GuidedStorageResponseV2(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: