filesystem: guided creates logicals if in_extended

This commit is contained in:
Dan Bungert 2022-08-05 13:30:30 -06:00
parent 8841807104
commit 60378fc7bf
3 changed files with 72 additions and 19 deletions

View File

@ -78,8 +78,11 @@ class FilesystemManipulator:
delete_format = delete_filesystem delete_format = delete_filesystem
def create_partition(self, device, gap, spec, **kw): def create_partition(self, device, gap, spec, **kw):
flag = kw.pop('flag', None)
if gap.in_extended:
flag = 'logical'
part = self.model.add_partition( part = self.model.add_partition(
device, size=gap.size, offset=gap.offset, **kw) device, size=gap.size, offset=gap.offset, flag=flag, **kw)
self.create_filesystem(part, spec) self.create_filesystem(part, spec)
return part return part

View File

@ -138,7 +138,7 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
"autoinstall config did not create needed bootloader " "autoinstall config did not create needed bootloader "
"partition") "partition")
def setup_disk_for_guided(self, target, mode): def setup_gap_for_guided(self, target, mode):
if isinstance(target, gaps.Gap): if isinstance(target, gaps.Gap):
disk = target.device disk = target.device
gap = target gap = target
@ -150,27 +150,26 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
if DeviceAction.TOGGLE_BOOT in DeviceAction.supported(disk): if DeviceAction.TOGGLE_BOOT in DeviceAction.supported(disk):
self.add_boot_disk(disk) self.add_boot_disk(disk)
if gap is None: if gap is None:
return disk, gaps.largest_gap(disk) return gaps.largest_gap(disk)
else: else:
# find what's left of the gap after adding boot # find what's left of the gap after adding boot
gap = gaps.within(disk, gap) gap = gaps.within(disk, gap)
if gap is None: if gap is None:
raise Exception('failed to locate gap after adding boot') raise Exception('failed to locate gap after adding boot')
return disk, gap return gap
def guided_direct(self, target, mode=None): def guided_direct(self, target, mode=None):
disk, gap = self.setup_disk_for_guided(target, mode) gap = self.setup_gap_for_guided(target, mode)
spec = dict(fstype="ext4", mount="/") self.create_partition(
self.create_partition(device=disk, gap=gap, spec=spec) gap.device, gap, dict(fstype="ext4", mount="/"))
def guided_lvm(self, target, mode=None, lvm_options=None): def guided_lvm(self, target, mode=None, lvm_options=None):
disk, gap = self.setup_disk_for_guided(target, mode) gap = self.setup_gap_for_guided(target, mode)
gap_boot, gap_rest = gap.split(sizes.get_bootfs_size(gap.size)) gap_boot, gap_rest = gap.split(sizes.get_bootfs_size(gap.size))
spec = dict(fstype="ext4", mount='/boot') spec = dict(fstype="ext4", mount='/boot')
self.create_partition(device=disk, gap=gap_boot, spec=spec) device = gap.device
self.create_partition(device, gap_boot, spec)
part = self.create_partition( part = self.create_partition(device, gap_rest, dict(fstype=None))
device=disk, gap=gap_rest, spec=dict(fstype=None))
vg_name = 'ubuntu-vg' vg_name = 'ubuntu-vg'
i = 0 i = 0

View File

@ -36,6 +36,12 @@ from subiquity.models.tests.test_filesystem import (
) )
bootloaders = [(bl, ) for bl in list(Bootloader)]
bootloaders_and_ptables = [(bl, pt)
for bl in list(Bootloader)
for pt in ('gpt', 'msdos', 'vtoc')]
class TestSubiquityControllerFilesystem(IsolatedAsyncioTestCase): class TestSubiquityControllerFilesystem(IsolatedAsyncioTestCase):
def setUp(self): def setUp(self):
self.app = make_app() self.app = make_app()
@ -74,11 +80,13 @@ class TestGuided(TestCase):
(Bootloader.PREP, 'msdos', None), (Bootloader.PREP, 'msdos', None),
] ]
def _guided_setup(self, bootloader, ptable): def _guided_setup(self, bootloader, ptable, storage_version=None):
self.app = make_app() self.app = make_app()
self.app.opts.bootloader = bootloader.value self.app.opts.bootloader = bootloader.value
self.controller = FilesystemController(self.app) self.controller = FilesystemController(self.app)
self.controller.model = self.model = make_model(bootloader) self.controller.supports_resilient_boot = True
self.model = make_model(bootloader, storage_version)
self.controller.model = self.model
self.model._probe_data = {'blockdev': {}} self.model._probe_data = {'blockdev': {}}
self.d1 = make_disk(self.model, ptable=ptable) self.d1 = make_disk(self.model, ptable=ptable)
@ -122,6 +130,54 @@ class TestGuided(TestCase):
self.assertEqual(None, d1p2.mount) self.assertEqual(None, d1p2.mount)
self.assertIsNone(gaps.largest_gap(self.d1)) self.assertIsNone(gaps.largest_gap(self.d1))
def _guided_side_by_side(self, bl):
self._guided_setup(bl, 'msdos', storage_version=2)
self.controller.add_boot_disk(self.d1)
for p in self.d1._partitions:
p.preserve = True
if bl == Bootloader.UEFI:
# let it pass the is_esp check
self.model._probe_data['blockdev'][p._path()] = {
"ID_PART_ENTRY_TYPE": str(0xef)
}
# create an extended partition,
# and a few other partitions to make it more interesting
g = gaps.largest_gap(self.d1)
make_partition(self.model, self.d1, preserve=True,
size=10 << 30, offset=g.offset)
g = gaps.largest_gap(self.d1)
make_partition(self.model, self.d1, preserve=True,
flag='extended', size=g.size, offset=g.offset)
g = gaps.largest_gap(self.d1)
make_partition(self.model, self.d1, preserve=True,
flag='logical', size=10 << 30, offset=g.offset)
@parameterized.expand(bootloaders)
def test_guided_direct_side_by_side_logical(self, bl):
self._guided_side_by_side(bl)
parts_before = self.d1._partitions.copy()
g = gaps.largest_gap(self.d1)
self.controller.guided_direct(g, mode='use_gap')
parts_after = gaps.parts_and_gaps(self.d1)[:-1]
self.assertEqual(parts_before, parts_after)
p6 = gaps.parts_and_gaps(self.d1)[-1]
self.assertEqual('/', p6.mount)
self.assertEqual('logical', p6.flag)
@parameterized.expand(bootloaders)
def test_guided_lvm_side_by_side_logical(self, bl):
self._guided_side_by_side(bl)
parts_before = self.d1._partitions.copy()
g = gaps.largest_gap(self.d1)
self.controller.guided_lvm(g, mode='use_gap')
parts_after = gaps.parts_and_gaps(self.d1)[:-2]
self.assertEqual(parts_before, parts_after)
p6, p7 = gaps.parts_and_gaps(self.d1)[-2:]
self.assertEqual('/boot', p6.mount)
self.assertEqual('logical', p6.flag)
self.assertEqual(None, p7.mount)
self.assertEqual('logical', p7.flag)
class TestLayout(TestCase): class TestLayout(TestCase):
def setUp(self): def setUp(self):
@ -139,11 +195,6 @@ class TestLayout(TestCase):
self.fsc.validate_layout_mode(mode) self.fsc.validate_layout_mode(mode)
bootloaders_and_ptables = [(bl, pt)
for bl in list(Bootloader)
for pt in ('gpt', 'msdos', 'vtoc')]
class TestGuidedV2(IsolatedAsyncioTestCase): class TestGuidedV2(IsolatedAsyncioTestCase):
def _setup(self, bootloader, ptable, fix_bios=True, **kw): def _setup(self, bootloader, ptable, fix_bios=True, **kw):
self.app = make_app() self.app = make_app()