Merge pull request #1759 from ogayot/fix-manual-size

filesystem: store the actual size in bytes alongside the human readable size
This commit is contained in:
Olivier Gayot 2023-08-09 17:27:20 +02:00 committed by GitHub
commit fdbcd402b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 2 deletions

View File

@ -21,6 +21,7 @@ configuration.
"""
import logging
import re
from typing import Optional
from urwid import Text, connect_signal
@ -89,6 +90,7 @@ class FSTypeField(FormField):
class SizeWidget(StringEditor):
def __init__(self, form):
self.form = form
self.accurate_value: Optional[int] = None
super().__init__()
def lost_focus(self):
@ -114,6 +116,9 @@ class SizeWidget(StringEditor):
),
)
)
# This will invoke self.form.clean_size() and it is expected that
# size_str (and therefore self.value) are propertly aligned.
self.accurate_value = self.form.size
else:
aligned_sz = align_up(sz, self.form.alignment)
aligned_sz_str = humanize_size(aligned_sz)
@ -125,6 +130,7 @@ class SizeWidget(StringEditor):
_("Rounded size up to {size}").format(size=aligned_sz_str),
)
)
self.accurate_value = aligned_sz
class SizeField(FormField):

View File

@ -5,7 +5,7 @@ import urwid
from subiquity.client.controllers.filesystem import FilesystemController
from subiquity.common.filesystem import gaps
from subiquity.models.filesystem import dehumanize_size
from subiquity.models.filesystem import MiB, dehumanize_size
from subiquity.models.tests.test_filesystem import make_model_and_disk
from subiquity.ui.views.filesystem.partition import (
FormatEntireStretchy,
@ -58,6 +58,7 @@ class PartitionViewTests(unittest.TestCase):
gap = gaps.Gap(device=disk, offset=1 << 20, size=99 << 30)
view, stretchy = make_partition_view(model, disk, gap=gap)
view_helpers.enter_data(stretchy.form, valid_data)
stretchy.form.size.widget.lost_focus()
view_helpers.click(stretchy.form.done_btn.base_widget)
valid_data["mount"] = "/"
valid_data["size"] = dehumanize_size(valid_data["size"])
@ -77,6 +78,7 @@ class PartitionViewTests(unittest.TestCase):
view, stretchy = make_partition_view(model, disk, partition=partition)
self.assertTrue(stretchy.form.done_btn.enabled)
view_helpers.enter_data(stretchy.form, form_data)
stretchy.form.size.widget.lost_focus()
view_helpers.click(stretchy.form.done_btn.base_widget)
expected_data = {
"size": dehumanize_size(form_data["size"]),
@ -111,6 +113,7 @@ class PartitionViewTests(unittest.TestCase):
self.assertFalse(stretchy.form.size.enabled)
self.assertTrue(stretchy.form.done_btn.enabled)
view_helpers.enter_data(stretchy.form, form_data)
stretchy.form.size.widget.lost_focus()
view_helpers.click(stretchy.form.done_btn.base_widget)
expected_data = {
"fstype": "xfs",
@ -177,6 +180,7 @@ class PartitionViewTests(unittest.TestCase):
self.assertEqual(stretchy.form.mount.value, "/boot/efi")
view_helpers.enter_data(stretchy.form, form_data)
stretchy.form.size.widget.lost_focus()
view_helpers.click(stretchy.form.done_btn.base_widget)
expected_data = {
"size": dehumanize_size(form_data["size"]),
@ -246,3 +250,26 @@ class PartitionViewTests(unittest.TestCase):
model._orig_config = model._render_actions()
view, stretchy = make_format_entire_view(model, disk)
self.assertEqual(stretchy.form.fstype.value, None)
def test_create_partition_unaligned_size(self):
# In LP: #2013201, the user would type in 1.1G and the partition
# created would not be aligned to a MiB boundary.
unaligned_data = {
"size": "1.1G", # Corresponds to 1181116006.4 bytes (not an int)
"fstype": "ext4",
}
valid_data = {
"mount": "/",
"size": 1127 * MiB, # ~1.10058 GiB
"use_swap": False,
"fstype": "ext4",
}
model, disk = make_model_and_disk()
gap = gaps.Gap(device=disk, offset=1 << 20, size=99 << 30)
view, stretchy = make_partition_view(model, disk, gap=gap)
view_helpers.enter_data(stretchy.form, unaligned_data)
stretchy.form.size.widget.lost_focus()
view_helpers.click(stretchy.form.done_btn.base_widget)
view.controller.partition_disk_handler.assert_called_once_with(
stretchy.disk, valid_data, partition=None, gap=gap
)

View File

@ -531,7 +531,11 @@ class Form(object, metaclass=MetaForm):
data = {}
for field in self._fields:
if field.enabled:
data[field.field.name] = field.value
accurate_value = getattr(field.widget, "accurate_value", None)
if accurate_value is not None:
data[field.field.name] = accurate_value
else:
data[field.field.name] = field.value
return data