diff --git a/subiquity/common/filesystem/actions.py b/subiquity/common/filesystem/actions.py index 6c55fd24..e1274d0f 100644 --- a/subiquity/common/filesystem/actions.py +++ b/subiquity/common/filesystem/actions.py @@ -304,7 +304,7 @@ def _can_delete_raid_vg(device): "Cannot delete {devicelabel} as partition {partnum} is part " "of the {cdtype} {cdname}.").format( devicelabel=labels.label(device), - partnum=p._number, + partnum=p.number, cdtype=labels.desc(cd), cdname=labels.label(cd), ) diff --git a/subiquity/common/filesystem/labels.py b/subiquity/common/filesystem/labels.py index 742f7f33..f7a7fe6b 100644 --- a/subiquity/common/filesystem/labels.py +++ b/subiquity/common/filesystem/labels.py @@ -181,10 +181,10 @@ def _label_partition(partition, *, short=False): else: p = "" if short: - return p + _("partition {number}").format(number=partition._number) + return p + _("partition {number}").format(number=partition.number) else: return p + _("partition {number} of {device}").format( - number=partition._number, device=label(partition.device)) + number=partition.number, device=label(partition.device)) @label.register(gaps.Gap) @@ -309,7 +309,7 @@ def _for_client_disk(disk, *, min_size=0): def _for_client_partition(partition, *, min_size=0): return types.Partition( size=partition.size, - number=partition._number, + number=partition.number, wipe=partition.wipe, preserve=partition.preserve, grub_device=partition.grub_device, diff --git a/subiquity/models/filesystem.py b/subiquity/models/filesystem.py index 746bf7ee..b28230a0 100644 --- a/subiquity/models/filesystem.py +++ b/subiquity/models/filesystem.py @@ -115,9 +115,18 @@ def fsobj__repr(obj): return "{}({})".format(type(obj).__name__, ", ".join(args)) +def _do_post_inits(obj): + for fn in obj._post_inits: + fn(obj) + + def fsobj(typ): def wrapper(c): - c.__attrs_post_init__ = _set_backlinks + c.__attrs_post_init__ = _do_post_inits + c._post_inits = [_set_backlinks] + class_post_init = getattr(c, '__post_init__', None) + if class_post_init is not None: + c._post_inits.append(class_post_init) c.type = attributes.const(typ) c.id = attr.ib(default=None) c._m = attr.ib(repr=None, default=None) @@ -675,6 +684,15 @@ class Partition(_Formattable): resize = attr.ib(default=None) partition_type = attr.ib(default=None) + def __post_init__(self): + if self.number is not None: + return + used_nums = {part.number for part in self.device._partitions + if part.number is not None} + possible_nums = {i for i in range(1, len(self.device._partitions) + 1)} + unused_nums = sorted(list(possible_nums - used_nums)) + self.number = unused_nums.pop(0) + def available(self): if self.flag in ['bios_grub', 'prep'] or self.grub_device: return False @@ -684,24 +702,8 @@ class Partition(_Formattable): return True return self._fs._available() - def serialize_number(self): - return {'number': self._number} - - @property - def _number(self): - if self.number is not None: - return self.number - used_nums = {part.number for part in self.device._partitions - if part.number is not None} - possible_nums = {i for i in range(1, len(self.device._partitions) + 1)} - unused_nums = sorted(list(possible_nums - used_nums)) - for part in self.device._partitions: - if part.number is None: - part.number = unused_nums.pop(0) - return self.number - def _path(self): - return partition_kname(self.device.path, self._number) + return partition_kname(self.device.path, self.number) @property def boot(self): @@ -1267,7 +1269,7 @@ class FilesystemModel(object): if obj.type == "partition": ensure_partitions(obj.device) for p in obj.device.partitions(): - if p._number < obj._number and p.id not in emitted_ids: + if p.number < obj.number and p.id not in emitted_ids: return False for dep in dependencies(obj): if dep.id not in emitted_ids: diff --git a/subiquity/models/tests/test_filesystem.py b/subiquity/models/tests/test_filesystem.py index 50bf248b..519c57ed 100644 --- a/subiquity/models/tests/test_filesystem.py +++ b/subiquity/models/tests/test_filesystem.py @@ -176,12 +176,6 @@ def make_partition(model, device=None, *, preserve=False, size=None, offset = gap.offset partition = Partition(m=model, device=device, size=size, offset=offset, preserve=preserve, **kw) - if preserve: - number = kw.get('number') - if number is not None: - partition.number = number - else: - partition.number = len(device._partitions) model._actions.append(partition) return partition @@ -704,9 +698,9 @@ class TestPartitionNumbering(unittest.TestCase): p1 = make_partition(m, d1) p2 = make_partition(m, d1) p3 = make_partition(m, d1) - self.assertEqual(1, p1._number) - self.assertEqual(2, p2._number) - self.assertEqual(3, p3._number) + self.assertEqual(1, p1.number) + self.assertEqual(2, p2.number) + self.assertEqual(3, p3.number) def test_p1_preserved(self): m = make_model() @@ -715,11 +709,11 @@ class TestPartitionNumbering(unittest.TestCase): p1 = make_partition(m, d1, preserve=True, number=1) p2 = make_partition(m, d1) p3 = make_partition(m, d1) - self.assertEqual(1, p1._number) + self.assertEqual(1, p1.number) self.assertEqual(True, p1.preserve) - self.assertEqual(2, p2._number) + self.assertEqual(2, p2.number) self.assertEqual(False, p2.preserve) - self.assertEqual(3, p3._number) + self.assertEqual(3, p3.number) self.assertEqual(False, p3.preserve) def test_p2_preserved(self): @@ -729,23 +723,9 @@ class TestPartitionNumbering(unittest.TestCase): p2 = make_partition(m, d1, preserve=True, number=2) p1 = make_partition(m, d1) p3 = make_partition(m, d1) - self.assertEqual(1, p1._number) - self.assertEqual(False, p1.preserve) - self.assertEqual(2, p2._number) - self.assertEqual(True, p2.preserve) - self.assertEqual(3, p3._number) - self.assertEqual(False, p3.preserve) - - def test_trigger_part_num_allocation_for_disk(self): - m = make_model() - d1 = make_disk(m, ptable='gpt') - p1 = make_partition(m, d1) - p2 = make_partition(m, d1) - p3 = make_partition(m, d1) - self.assertIsNone(p1.number) - self.assertIsNone(p2.number) - self.assertIsNone(p3.number) - self.assertEqual(3, p3._number) self.assertEqual(1, p1.number) + self.assertEqual(False, p1.preserve) self.assertEqual(2, p2.number) + self.assertEqual(True, p2.preserve) self.assertEqual(3, p3.number) + self.assertEqual(False, p3.preserve) diff --git a/subiquity/server/controllers/filesystem.py b/subiquity/server/controllers/filesystem.py index 0e00abec..af77bd97 100644 --- a/subiquity/server/controllers/filesystem.py +++ b/subiquity/server/controllers/filesystem.py @@ -310,7 +310,7 @@ class FilesystemController(SubiquityController, FilesystemManipulator): def get_partition(self, disk, number): for p in disk.partitions(): - if p._number == number: + if p.number == number: return p raise ValueError(f'Partition {number} on {disk.id} not found')