Merge pull request #1280 from mwhudson/v2-boot-part-plan
make "can this be a boot partition" use v2 capabilities
This commit is contained in:
commit
800801b7d0
|
@ -25,6 +25,7 @@ python3-distutils-extra
|
||||||
python3-flake8
|
python3-flake8
|
||||||
python3-jsonschema
|
python3-jsonschema
|
||||||
python3-nose
|
python3-nose
|
||||||
|
python3-parameterized
|
||||||
python3-pip
|
python3-pip
|
||||||
python3-pyflakes
|
python3-pyflakes
|
||||||
python3-pytest
|
python3-pytest
|
||||||
|
|
|
@ -156,11 +156,9 @@ def get_boot_device_plan_bios(device) -> Optional[MakeBootDevicePlan]:
|
||||||
attr_plan = SetAttrPlan(device, 'grub_device', True)
|
attr_plan = SetAttrPlan(device, 'grub_device', True)
|
||||||
if device.ptable == 'msdos':
|
if device.ptable == 'msdos':
|
||||||
return attr_plan
|
return attr_plan
|
||||||
if device._has_preexisting_partition():
|
pgs = gaps.parts_and_gaps(device)
|
||||||
if device._partitions[0].flag == "bios_grub":
|
if isinstance(pgs[0], Partition) and pgs[0].flag == "bios_grub":
|
||||||
return attr_plan
|
return attr_plan
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
create_part_plan = CreatePartPlan(
|
create_part_plan = CreatePartPlan(
|
||||||
device=device,
|
device=device,
|
||||||
|
@ -168,30 +166,41 @@ def get_boot_device_plan_bios(device) -> Optional[MakeBootDevicePlan]:
|
||||||
spec=dict(size=sizes.BIOS_GRUB_SIZE_BYTES, fstype=None, mount=None),
|
spec=dict(size=sizes.BIOS_GRUB_SIZE_BYTES, fstype=None, mount=None),
|
||||||
args=dict(flag='bios_grub'))
|
args=dict(flag='bios_grub'))
|
||||||
|
|
||||||
partitions = device.partitions()
|
movable = []
|
||||||
|
|
||||||
if gaps.largest_gap_size(device) >= sizes.BIOS_GRUB_SIZE_BYTES:
|
for pg in pgs:
|
||||||
return MultiStepPlan(plans=[
|
if isinstance(pg, gaps.Gap):
|
||||||
SlidePlan(
|
if pg.size >= sizes.BIOS_GRUB_SIZE_BYTES:
|
||||||
parts=partitions,
|
return MultiStepPlan(plans=[
|
||||||
offset_delta=sizes.BIOS_GRUB_SIZE_BYTES),
|
SlidePlan(
|
||||||
create_part_plan,
|
parts=movable,
|
||||||
attr_plan,
|
offset_delta=sizes.BIOS_GRUB_SIZE_BYTES),
|
||||||
])
|
create_part_plan,
|
||||||
else:
|
attr_plan,
|
||||||
largest_i, largest_part = max(
|
])
|
||||||
enumerate(partitions),
|
else:
|
||||||
key=lambda i_p: i_p[1].size)
|
return None
|
||||||
return MultiStepPlan(plans=[
|
elif pg.preserve:
|
||||||
SlidePlan(
|
break
|
||||||
parts=partitions[:largest_i+1],
|
else:
|
||||||
offset_delta=sizes.BIOS_GRUB_SIZE_BYTES),
|
movable.append(pg)
|
||||||
ResizePlan(
|
|
||||||
part=largest_part,
|
if not movable:
|
||||||
size_delta=-sizes.BIOS_GRUB_SIZE_BYTES),
|
return None
|
||||||
create_part_plan,
|
|
||||||
attr_plan,
|
largest_i, largest_part = max(
|
||||||
])
|
enumerate(movable),
|
||||||
|
key=lambda i_p: i_p[1].size)
|
||||||
|
return MultiStepPlan(plans=[
|
||||||
|
ResizePlan(
|
||||||
|
part=largest_part,
|
||||||
|
size_delta=-sizes.BIOS_GRUB_SIZE_BYTES),
|
||||||
|
SlidePlan(
|
||||||
|
parts=movable[:largest_i+1],
|
||||||
|
offset_delta=sizes.BIOS_GRUB_SIZE_BYTES),
|
||||||
|
create_part_plan,
|
||||||
|
attr_plan,
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
def get_add_part_plan(device, *, spec, args):
|
def get_add_part_plan(device, *, spec, args):
|
||||||
|
@ -205,32 +214,31 @@ def get_add_part_plan(device, *, spec, args):
|
||||||
create_part_plan.offset = gaps.largest_gap(device).offset
|
create_part_plan.offset = gaps.largest_gap(device).offset
|
||||||
return create_part_plan
|
return create_part_plan
|
||||||
else:
|
else:
|
||||||
largest_i, largest_part = max(
|
new_parts = [p for p in partitions if not p.preserve]
|
||||||
enumerate(partitions),
|
if not new_parts:
|
||||||
key=lambda i_p: i_p[1].size)
|
return None
|
||||||
|
largest_part = max(new_parts, key=lambda p: p.size)
|
||||||
if size > largest_part.size // 2:
|
if size > largest_part.size // 2:
|
||||||
return None
|
return None
|
||||||
create_part_plan.offset = largest_part.offset
|
create_part_plan.offset = largest_part.offset
|
||||||
return MultiStepPlan(plans=[
|
return MultiStepPlan(plans=[
|
||||||
SlidePlan(
|
|
||||||
parts=[largest_part],
|
|
||||||
offset_delta=size),
|
|
||||||
ResizePlan(
|
ResizePlan(
|
||||||
part=largest_part,
|
part=largest_part,
|
||||||
size_delta=-size),
|
size_delta=-size),
|
||||||
|
SlidePlan(
|
||||||
|
parts=[largest_part],
|
||||||
|
offset_delta=size),
|
||||||
create_part_plan,
|
create_part_plan,
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
def get_boot_device_plan_uefi(device):
|
def get_boot_device_plan_uefi(device):
|
||||||
if device._has_preexisting_partition():
|
for part in device.partitions():
|
||||||
for part in device.partitions():
|
if is_esp(part):
|
||||||
if is_esp(part):
|
plans = [SetAttrPlan(part, 'grub_device', True)]
|
||||||
plans = [SetAttrPlan(part, 'grub_device', True)]
|
if device._m._mount_for_path('/boot/efi') is None:
|
||||||
if device._m._mount_for_path('/boot/efi') is None:
|
plans.append(MountBootEfiPlan(part))
|
||||||
plans.append(MountBootEfiPlan(part))
|
return MultiStepPlan(plans=plans)
|
||||||
return MultiStepPlan(plans=plans)
|
|
||||||
return None
|
|
||||||
|
|
||||||
spec = dict(size=sizes.get_efi_size(device), fstype='fat32', mount=None)
|
spec = dict(size=sizes.get_efi_size(device), fstype='fat32', mount=None)
|
||||||
if device._m._mount_for_path("/boot/efi") is None:
|
if device._m._mount_for_path("/boot/efi") is None:
|
||||||
|
@ -241,14 +249,12 @@ def get_boot_device_plan_uefi(device):
|
||||||
|
|
||||||
|
|
||||||
def get_boot_device_plan_prep(device):
|
def get_boot_device_plan_prep(device):
|
||||||
if device._has_preexisting_partition():
|
for part in device.partitions():
|
||||||
for part in device.partitions():
|
if part.flag == "prep":
|
||||||
if part.flag == "prep":
|
return MultiStepPlan(plans=[
|
||||||
return MultiStepPlan(plans=[
|
SetAttrPlan(part, 'grub_device', True),
|
||||||
SetAttrPlan(part, 'grub_device', True),
|
SetAttrPlan(part, 'wipe', 'zero')
|
||||||
SetAttrPlan(part, 'wipe', 'zero')
|
])
|
||||||
])
|
|
||||||
return None
|
|
||||||
|
|
||||||
return get_add_part_plan(
|
return get_add_part_plan(
|
||||||
device,
|
device,
|
||||||
|
|
|
@ -18,10 +18,12 @@ import unittest
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
|
|
||||||
|
from parameterized import parameterized
|
||||||
|
|
||||||
from subiquity.common.filesystem.actions import (
|
from subiquity.common.filesystem.actions import (
|
||||||
DeviceAction,
|
DeviceAction,
|
||||||
)
|
)
|
||||||
from subiquity.common.filesystem import gaps, sizes
|
from subiquity.common.filesystem import boot, gaps, sizes
|
||||||
from subiquity.common.filesystem.manipulator import FilesystemManipulator
|
from subiquity.common.filesystem.manipulator import FilesystemManipulator
|
||||||
from subiquity.models.tests.test_filesystem import (
|
from subiquity.models.tests.test_filesystem import (
|
||||||
make_disk,
|
make_disk,
|
||||||
|
@ -35,9 +37,10 @@ from subiquity.models.filesystem import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def make_manipulator(bootloader=None):
|
def make_manipulator(bootloader=None, storage_version=1):
|
||||||
manipulator = FilesystemManipulator()
|
manipulator = FilesystemManipulator()
|
||||||
manipulator.model = make_model(bootloader)
|
manipulator.model = make_model(bootloader)
|
||||||
|
manipulator.model.storage_version = storage_version
|
||||||
manipulator.supports_resilient_boot = True
|
manipulator.supports_resilient_boot = True
|
||||||
return manipulator
|
return manipulator
|
||||||
|
|
||||||
|
@ -125,7 +128,8 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
def assertIsBootDisk(self, manipulator, disk):
|
def assertIsBootDisk(self, manipulator, disk):
|
||||||
if manipulator.model.bootloader == Bootloader.BIOS:
|
if manipulator.model.bootloader == Bootloader.BIOS:
|
||||||
self.assertTrue(disk.grub_device)
|
self.assertTrue(disk.grub_device)
|
||||||
self.assertEqual(disk.partitions()[0].flag, "bios_grub")
|
if disk.ptable == 'gpt':
|
||||||
|
self.assertEqual(disk.partitions()[0].flag, "bios_grub")
|
||||||
elif manipulator.model.bootloader == Bootloader.UEFI:
|
elif manipulator.model.bootloader == Bootloader.UEFI:
|
||||||
for part in disk.partitions():
|
for part in disk.partitions():
|
||||||
if part.flag == "boot" and part.grub_device:
|
if part.flag == "boot" and part.grub_device:
|
||||||
|
@ -306,8 +310,9 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
if new_parts:
|
if new_parts:
|
||||||
self.fail("no assertion about {}".format(new_parts))
|
self.fail("no assertion about {}".format(new_parts))
|
||||||
|
|
||||||
def test_add_boot_BIOS_empty(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.BIOS)
|
def test_add_boot_BIOS_empty(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
|
@ -319,8 +324,9 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
|
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_BIOS_full(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.BIOS)
|
def test_add_boot_BIOS_full(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
part = make_partition(
|
part = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
||||||
|
@ -339,8 +345,9 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
|
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_BIOS_half_full(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.BIOS)
|
def test_add_boot_BIOS_half_full(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
part = make_partition(
|
part = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk)//2)
|
manipulator.model, disk, size=gaps.largest_gap_size(disk)//2)
|
||||||
|
@ -355,7 +362,8 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_BIOS_full_resizes_larger(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
|
def test_add_boot_BIOS_full_resizes_larger(self, version):
|
||||||
manipulator = make_manipulator(Bootloader.BIOS)
|
manipulator = make_manipulator(Bootloader.BIOS)
|
||||||
# 2002MiB so that the space available for partitioning (2000MiB)
|
# 2002MiB so that the space available for partitioning (2000MiB)
|
||||||
# divided by 4 is an whole number of megabytes.
|
# divided by 4 is an whole number of megabytes.
|
||||||
|
@ -379,12 +387,31 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def DONT_test_add_boot_BIOS_preserved(self): # needs v2 partitioning
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.BIOS)
|
def test_no_add_boot_BIOS_preserved_full(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
|
full_size = gaps.largest_gap_size(disk)
|
||||||
|
make_partition(
|
||||||
|
manipulator.model, disk, size=full_size, preserve=True)
|
||||||
|
self.assertFalse(boot.can_be_boot_device(disk))
|
||||||
|
|
||||||
|
def test_no_add_boot_BIOS_preserved_v1(self):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, 1)
|
||||||
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
|
half_size = gaps.largest_gap_size(disk)//2
|
||||||
|
make_partition(
|
||||||
|
manipulator.model, disk, size=half_size, offset=half_size,
|
||||||
|
preserve=True)
|
||||||
|
self.assertFalse(boot.can_be_boot_device(disk))
|
||||||
|
|
||||||
|
def test_add_boot_BIOS_preserved_v2(self):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, 2)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
half_size = gaps.largest_gap_size(disk)//2
|
half_size = gaps.largest_gap_size(disk)//2
|
||||||
part = make_partition(
|
part = make_partition(
|
||||||
manipulator.model, disk, size=half_size, offset=half_size)
|
manipulator.model, disk, size=half_size, offset=half_size,
|
||||||
|
preserve=True)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
Create(
|
Create(
|
||||||
|
@ -393,32 +420,91 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
Unchanged(part=part),
|
Unchanged(part=part),
|
||||||
):
|
):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def _test_add_boot_empty(self, manipulator, disk, size):
|
def test_add_boot_BIOS_new_and_preserved_v2(self):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, 2)
|
||||||
|
# 2002MiB so that the space available for partitioning (2000MiB)
|
||||||
|
# divided by 4 is an whole number of megabytes.
|
||||||
|
disk = make_disk(manipulator.model, preserve=True, size=2002*MiB)
|
||||||
|
avail = gaps.largest_gap_size(disk)
|
||||||
|
p1_new = make_partition(
|
||||||
|
manipulator.model, disk, size=avail//4)
|
||||||
|
p2_preserved = make_partition(
|
||||||
|
manipulator.model, disk, size=3*avail//4, preserve=True)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
Create(
|
Create(
|
||||||
offset=disk.alignment_data().min_start_offset,
|
offset=disk.alignment_data().min_start_offset,
|
||||||
size=size),
|
size=sizes.BIOS_GRUB_SIZE_BYTES),
|
||||||
|
MoveResize(
|
||||||
|
part=p1_new,
|
||||||
|
offset=sizes.BIOS_GRUB_SIZE_BYTES,
|
||||||
|
size=-sizes.BIOS_GRUB_SIZE_BYTES),
|
||||||
|
Unchanged(part=p2_preserved),
|
||||||
):
|
):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_UEFI_empty(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.UEFI)
|
def test_no_add_boot_BIOS_preserved_at_start(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
self._test_add_boot_empty(
|
half_size = gaps.largest_gap_size(disk)//2
|
||||||
manipulator, disk, sizes.get_efi_size(disk))
|
make_partition(
|
||||||
|
manipulator.model, disk, size=half_size,
|
||||||
|
preserve=True)
|
||||||
|
self.assertFalse(boot.can_be_boot_device(disk))
|
||||||
|
|
||||||
def test_add_boot_PREP_empty(self):
|
@parameterized.expand([(1,), (2,)])
|
||||||
manipulator = make_manipulator(Bootloader.PREP)
|
def test_add_boot_BIOS_msdos(self, version):
|
||||||
|
manipulator = make_manipulator(Bootloader.BIOS, version)
|
||||||
|
disk = make_disk(manipulator.model, preserve=True, ptable='msdos')
|
||||||
|
part = make_partition(
|
||||||
|
manipulator.model, disk, size=gaps.largest_gap_size(disk),
|
||||||
|
preserve=True)
|
||||||
|
with self.assertPartitionOperations(
|
||||||
|
disk,
|
||||||
|
Unchanged(part=part),
|
||||||
|
):
|
||||||
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
|
def boot_size_for_disk(self, disk):
|
||||||
|
bl = disk._m.bootloader
|
||||||
|
if bl == Bootloader.UEFI:
|
||||||
|
return sizes.get_efi_size(disk)
|
||||||
|
elif bl == Bootloader.PREP:
|
||||||
|
return sizes.PREP_GRUB_SIZE_BYTES
|
||||||
|
else:
|
||||||
|
self.fail("unexpected bootloader %r" % (bl,))
|
||||||
|
|
||||||
|
ADD_BOOT_PARAMS = [
|
||||||
|
(Bootloader.UEFI, 1),
|
||||||
|
(Bootloader.PREP, 1),
|
||||||
|
(Bootloader.UEFI, 2),
|
||||||
|
(Bootloader.PREP, 2)]
|
||||||
|
|
||||||
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
|
def test_add_boot_empty(self, bl, version):
|
||||||
|
manipulator = make_manipulator(bl, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
self._test_add_boot_empty(
|
with self.assertPartitionOperations(
|
||||||
manipulator, disk, sizes.PREP_GRUB_SIZE_BYTES)
|
disk,
|
||||||
|
Create(
|
||||||
|
offset=disk.alignment_data().min_start_offset,
|
||||||
|
size=self.boot_size_for_disk(disk)),
|
||||||
|
):
|
||||||
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def _test_add_boot_full(self, manipulator, disk, size):
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
|
def test_add_boot_full(self, bl, version):
|
||||||
|
manipulator = make_manipulator(bl, version)
|
||||||
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
part = make_partition(
|
part = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
||||||
|
size = self.boot_size_for_disk(disk)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
Create(
|
Create(
|
||||||
|
@ -432,21 +518,13 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_UEFI_full(self):
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
manipulator = make_manipulator(Bootloader.UEFI)
|
def test_add_boot_half_full(self, bl, version):
|
||||||
|
manipulator = make_manipulator(bl, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
self._test_add_boot_full(
|
|
||||||
manipulator, disk, sizes.get_efi_size(disk))
|
|
||||||
|
|
||||||
def test_add_boot_PREP_full(self):
|
|
||||||
manipulator = make_manipulator(Bootloader.PREP)
|
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
|
||||||
self._test_add_boot_full(
|
|
||||||
manipulator, disk, sizes.PREP_GRUB_SIZE_BYTES)
|
|
||||||
|
|
||||||
def _test_add_boot_half_full(self, manipulator, disk, size):
|
|
||||||
part = make_partition(
|
part = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk)//2)
|
manipulator.model, disk, size=gaps.largest_gap_size(disk)//2)
|
||||||
|
size = self.boot_size_for_disk(disk)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
Unchanged(part=part),
|
Unchanged(part=part),
|
||||||
|
@ -457,23 +535,17 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_UEFI_half_full(self):
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
manipulator = make_manipulator(Bootloader.UEFI)
|
def test_add_boot_full_resizes_larger(self, bl, version):
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
manipulator = make_manipulator(bl, version)
|
||||||
self._test_add_boot_half_full(
|
# 2002MiB so that the space available for partitioning (2000MiB)
|
||||||
manipulator, disk, sizes.get_efi_size(disk))
|
# divided by 4 is an whole number of megabytes.
|
||||||
|
disk = make_disk(manipulator.model, preserve=True, size=2002*MiB)
|
||||||
def test_add_boot_PREP_half_full(self):
|
|
||||||
manipulator = make_manipulator(Bootloader.PREP)
|
|
||||||
disk = make_disk(manipulator.model, preserve=True)
|
|
||||||
self._test_add_boot_half_full(
|
|
||||||
manipulator, disk, sizes.PREP_GRUB_SIZE_BYTES)
|
|
||||||
|
|
||||||
def _test_add_boot_full_resizes_larger(self, manipulator, disk, size):
|
|
||||||
part_smaller = make_partition(
|
part_smaller = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk)//4)
|
manipulator.model, disk, size=gaps.largest_gap_size(disk)//4)
|
||||||
part_larger = make_partition(
|
part_larger = make_partition(
|
||||||
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
manipulator.model, disk, size=gaps.largest_gap_size(disk))
|
||||||
|
size = self.boot_size_for_disk(disk)
|
||||||
with self.assertPartitionOperations(
|
with self.assertPartitionOperations(
|
||||||
disk,
|
disk,
|
||||||
Unchanged(part_smaller),
|
Unchanged(part_smaller),
|
||||||
|
@ -488,21 +560,84 @@ class TestFilesystemManipulator(unittest.TestCase):
|
||||||
manipulator.add_boot_disk(disk)
|
manipulator.add_boot_disk(disk)
|
||||||
self.assertIsBootDisk(manipulator, disk)
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
def test_add_boot_UEFI_full_resizes_larger(self):
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
manipulator = make_manipulator(Bootloader.UEFI)
|
def test_no_add_boot_full_preserved_partition(self, bl, version):
|
||||||
# 2002MiB so that the space available for partitioning (2000MiB)
|
manipulator = make_manipulator(bl, version)
|
||||||
# divided by 4 is an whole number of megabytes.
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
disk = make_disk(manipulator.model, preserve=True, size=2002*MiB)
|
full_size = gaps.largest_gap_size(disk)
|
||||||
self._test_add_boot_full_resizes_larger(
|
make_partition(
|
||||||
manipulator, disk, sizes.get_efi_size(disk))
|
manipulator.model, disk, size=full_size, preserve=True)
|
||||||
|
self.assertFalse(boot.can_be_boot_device(disk))
|
||||||
|
|
||||||
def test_add_boot_PREP_full_resizes_larger(self):
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
manipulator = make_manipulator(Bootloader.PREP)
|
def test_add_boot_half_preserved_partition(self, bl, version):
|
||||||
# 2002MiB so that the space available for partitioning (2000MiB)
|
manipulator = make_manipulator(bl, version)
|
||||||
# divided by 4 is an whole number of megabytes.
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
|
half_size = gaps.largest_gap_size(disk)//2
|
||||||
|
part = make_partition(
|
||||||
|
manipulator.model, disk, size=half_size,
|
||||||
|
preserve=True)
|
||||||
|
size = self.boot_size_for_disk(disk)
|
||||||
|
if version == 1:
|
||||||
|
self.assertFalse(boot.can_be_boot_device(disk))
|
||||||
|
else:
|
||||||
|
with self.assertPartitionOperations(
|
||||||
|
disk,
|
||||||
|
Unchanged(part),
|
||||||
|
Create(
|
||||||
|
offset=part.offset + part.size,
|
||||||
|
size=size),
|
||||||
|
):
|
||||||
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
|
@parameterized.expand([(Bootloader.UEFI,), (Bootloader.PREP,)])
|
||||||
|
def test_add_boot_half_preserved_half_new_partition(self, bl):
|
||||||
|
# This test is v2 only because you can only get into this
|
||||||
|
# situation in a v2 world.
|
||||||
|
manipulator = make_manipulator(bl, 2)
|
||||||
|
disk = make_disk(manipulator.model, preserve=True)
|
||||||
|
half_size = gaps.largest_gap_size(disk)//2
|
||||||
|
old_part = make_partition(
|
||||||
|
manipulator.model, disk, size=half_size)
|
||||||
|
new_part = make_partition(
|
||||||
|
manipulator.model, disk, size=half_size)
|
||||||
|
old_part.preserve = True
|
||||||
|
size = self.boot_size_for_disk(disk)
|
||||||
|
with self.assertPartitionOperations(
|
||||||
|
disk,
|
||||||
|
Unchanged(old_part),
|
||||||
|
Create(
|
||||||
|
offset=new_part.offset,
|
||||||
|
size=size),
|
||||||
|
MoveResize(
|
||||||
|
part=new_part,
|
||||||
|
offset=size,
|
||||||
|
size=-size),
|
||||||
|
):
|
||||||
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
|
@parameterized.expand(ADD_BOOT_PARAMS)
|
||||||
|
def test_add_boot_existing_boot_partition(self, bl, version):
|
||||||
|
manipulator = make_manipulator(bl, version)
|
||||||
disk = make_disk(manipulator.model, preserve=True, size=2002*MiB)
|
disk = make_disk(manipulator.model, preserve=True, size=2002*MiB)
|
||||||
self._test_add_boot_full_resizes_larger(
|
if bl == Bootloader.UEFI:
|
||||||
manipulator, disk, sizes.PREP_GRUB_SIZE_BYTES)
|
flag = 'boot'
|
||||||
|
else:
|
||||||
|
flag = 'prep'
|
||||||
|
boot_part = make_partition(
|
||||||
|
manipulator.model, disk, size=self.boot_size_for_disk(disk),
|
||||||
|
flag=flag)
|
||||||
|
rest_part = make_partition(manipulator.model, disk)
|
||||||
|
boot_part.preserve = rest_part.preserve = True
|
||||||
|
with self.assertPartitionOperations(
|
||||||
|
disk,
|
||||||
|
Unchanged(boot_part),
|
||||||
|
Unchanged(rest_part),
|
||||||
|
):
|
||||||
|
manipulator.add_boot_disk(disk)
|
||||||
|
self.assertIsBootDisk(manipulator, disk)
|
||||||
|
|
||||||
|
|
||||||
class TestReformat(unittest.TestCase):
|
class TestReformat(unittest.TestCase):
|
||||||
|
|
Loading…
Reference in New Issue