filesystem: number partition on creation
This commit is contained in:
parent
5aa3bd3560
commit
40a6ff71d9
|
@ -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),
|
||||
)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
||||
|
|
Loading…
Reference in New Issue