----- Original Message -----
From: "Vratislav Podzimek" vpodzime@redhat.com To: anaconda-patches@lists.fedorahosted.org Sent: Wednesday, November 26, 2014 8:37:32 AM Subject: [PATCH 2/2] Update partitions' numbers and names when adding new partition (#1166598)
Adding a new partition may change partitions' order (e.g. adding sda1 after sda2) so we need to handle that correctly.
Signed-off-by: Vratislav Podzimek vpodzime@redhat.com
blivet/devicetree.py | 9 +++++++++ blivet/formats/disklabel.py | 26 ++++++++++++++++++++++++-- python-blivet.spec | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/blivet/devicetree.py b/blivet/devicetree.py index f6cf600..98b1251 100644 --- a/blivet/devicetree.py +++ b/blivet/devicetree.py @@ -26,6 +26,7 @@ import re import shutil import pprint import copy +import itertools
from .errors import CryptoError, DeviceError, DeviceTreeError, DiskLabelCommitError, DMError, FSError, InvalidDiskLabelError, LUKSError, MDRaidError, StorageError from .devices import BTRFSDevice, BTRFSSubVolumeDevice, BTRFSVolumeDevice, BTRFSSnapShotDevice @@ -402,6 +403,14 @@ class DeviceTree(object): newdev.addHook(new=new) self._devices.append(newdev)
# adding a partition may change partedPartition's paths which are
used
# to construct names which thus should be updated
if isinstance(newdev, PartitionDevice):
sibling_parts_lists = [self.getChildren(parent) for parent in
newdev.parents]
Any reason not to make the above lazy, instead of a list?
sibling_parts = itertools.chain(*sibling_parts_lists)
for part in sibling_parts:
part.updateName()
# don't include "req%d" partition names if ((newdev.type != "partition" or not newdev.name.startswith("req")) and
diff --git a/blivet/formats/disklabel.py b/blivet/formats/disklabel.py index c69aa04..590b58c 100644 --- a/blivet/formats/disklabel.py +++ b/blivet/formats/disklabel.py @@ -311,8 +311,30 @@ class DiskLabel(DeviceFormat): geometry=geometry)
constraint = parted.Constraint(exactGeom=geometry)
self.partedDisk.addPartition(partition=new_partition,
constraint=constraint)
# adding a partition the start of which is before some already added
# partition requires change of partitions' order because parted just
# increments the number while partitions are added
if any(part.geometry.start > start for part in
self.partedDisk.partitions):
parts = self.partedDisk.partitions[:]
# first remove all partitions
for part in parts:
self.partedDisk.removePartition(part)
# then add them back sorted together with the new one
parts.append(new_partition)
parts.sort(key=lambda p: p.geometry.start)
for part in parts:
# reset the partition's number so that it gets a new one
when
# added to partedDisk
part.resetNumber()
It feels like it would be better to handle this number resetting within pyparted, probably in Disk.addPartition().
constr = parted.Constraint(exactGeom=part.geometry)
self.partedDisk.addPartition(partition=part,
constraint=constr)
else:
self.partedDisk.addPartition(partition=new_partition,
overall, the above code would be simpler if partitions were always kept sorted by start, and this method could rely on that holding true.
constraint=constraint)
def removePartition(self, partition): """ Remove a partition from the disklabel.
diff --git a/python-blivet.spec b/python-blivet.spec index 3a81c4a..08f5887 100644 --- a/python-blivet.spec +++ b/python-blivet.spec @@ -14,7 +14,7 @@ Source0: http://github.com/dwlehman/blivet/archive/%%7Brealname%7D-%%7Bversion%7D.tar... %define dmver 1.02.17-6 %define pykickstartver 1.99.22 %define partedver 1.8.1 -%define pypartedver 2.5-2 +%define pypartedver 3.10.2 %define pythonpyblockver 0.45 %define e2fsver 1.41.0 %define pythoncryptsetupver 0.1.1 -- 1.9.3
anaconda-patches mailing list anaconda-patches@lists.fedorahosted.org https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
- mulhern