Ok, I have been really flailing on this one. Enough. Sorry for the noise. In a few minutes I will send a patch that at least covers all of the points I set out to cover and does not crash the installer with a traceback. I have not tested it by running an actual kickstart, but the code has been in use for my normal install testing, meaning it compiles. Dave On Thu, 2009-03-12 at 19:31 -0500, David Lehman wrote: > - Move disklabel initialization into a method of DiskDevice. > - Add a new keyword argument, initlabel, to the DiskDevice and > DMRaidArrayDevice constructors. > - Include Storage.protectedPartitions and Storage.reinitializeDisks > in DeviceTree's constructor argument list. > - Pass the value of reinitializeDisks to the DiskDevice and > DMRaidArrayDevice constructors unless the disk contains protected > partitions or the disk is not in clearPartDisks. > --- > storage/__init__.py | 2 + > storage/devices.py | 41 ++++++++++++++++++++++---------- > storage/devicetree.py | 61 +++++++++++++++++++++++++++++++++++++++--------- > 3 files changed, 79 insertions(+), 25 deletions(-) > > diff --git a/storage/__init__.py b/storage/__init__.py > index f0ed7d6..a52cba1 100644 > --- a/storage/__init__.py > +++ b/storage/__init__.py > @@ -172,6 +172,7 @@ class Storage(object): > self.devicetree = DeviceTree(intf=self.anaconda.intf, > ignored=self.ignoredDisks, > exclusive=self.exclusiveDisks, > + protected=self.protectedPartitions, > zeroMbr=self.zeroMbr, > passphrase=self.encryptionPassphrase, > luksDict=self.__luksDevs) > @@ -216,6 +217,7 @@ class Storage(object): > ignored=self.ignoredDisks, > exclusive=self.exclusiveDisks, > zeroMbr=self.zeroMbr, > + protected=self.protectedPartitions, > passphrase=self.encryptionPassphrase, > luksDict=self.__luksDevs) > self.devicetree.populate() > diff --git a/storage/devices.py b/storage/devices.py > index ae1ad09..aea00ea 100644 > --- a/storage/devices.py > +++ b/storage/devices.py > @@ -639,7 +639,7 @@ class DiskDevice(StorageDevice): > > def __init__(self, device, format=None, > size=None, major=None, minor=None, sysfsPath='', \ > - parents=None, initcb=None): > + parents=None, initcb=None, initlabel=None): > """ Create a DiskDevice instance. > > Arguments: > @@ -657,6 +657,7 @@ class DiskDevice(StorageDevice): > removable -- whether or not this is a removable device > > initcb -- the call back to be used when initiating disk. > + initlabel -- whether to start with a fresh disklabel > > > DiskDevices always exist. > @@ -667,20 +668,24 @@ class DiskDevice(StorageDevice): > > self.partedDevice = None > self.partedDisk = None > + > log.debug("looking up parted Device: %s" % self.path) > self.partedDevice = parted.Device(path=self.path) > if not self.partedDevice: > raise DeviceError("cannot find parted device instance") > + > log.debug("creating parted Disk: %s" % self.path) > - try: > - self.partedDisk = parted.Disk(device=self.partedDevice) > - except _ped.DiskLabelException: > - # if we have a cb function use it. else an error. > - if initcb is not None and initcb(): > - self.partedDisk = parted.freshDisk(device=self.partedDevice, \ > - ty = platform.getPlatform(None).diskType) > - else: > - raise DeviceUserDeniedFormatError("User prefered to not format.") > + if initlabel: > + self.partedDisk = self.freshPartedDisk() > + else: > + try: > + self.partedDisk = parted.Disk(device=self.partedDevice) > + except _ped.DiskLabelException: > + # if we have a cb function use it. else an error. > + if initcb is not None and initcb(): > + self.partedDisk = self.freshPartedDisk() > + else: > + raise DeviceUserDeniedFormatError("User prefered to not format.") > > # We save the actual state of the disk here. Before the first > # modification (addPartition or removePartition) to the partition > @@ -690,6 +695,11 @@ class DiskDevice(StorageDevice): > > self.probe() > > + def freshPartedDisk(self): > + log_method_call(self, self.name) > + labelType = platform.getPlatform(None).diskType > + return parted.freshDisk(device=self.partedDevice, ty=labelType) > + > @property > def size(self): > """ The disk's size in MB """ > @@ -2123,8 +2133,9 @@ class DMRaidArrayDevice(DiskDevice): > _packages = ["dmraid"] > devDir = "/dev/mapper" > > - def __init__(self, name, raidSet=None, level=None, format=None, size=None, > - major=None, minor=None, parents=None, sysfsPath='', initcb=None): > + def __init__(self, name, raidSet=None, level=None, format=None, > + size=None, major=None, minor=None, parents=None, > + sysfsPath='', initcb=None, initlabel=None): > """ Create a DMRaidArrayDevice instance. > > Arguments: > @@ -2139,6 +2150,9 @@ class DMRaidArrayDevice(DiskDevice): > sysfsPath -- sysfs device path > size -- the device's size > format -- a DeviceFormat instance > + > + initcb -- the call back to be used when initiating disk. > + initlabel -- whether to start with a fresh disklabel > """ > if isinstance(parents, list): > for parent in parents: > @@ -2146,7 +2160,8 @@ class DMRaidArrayDevice(DiskDevice): > raise ValueError("parent devices must contain dmraidmember format") > DiskDevice.__init__(self, name, format=format, size=size, > major=major, minor=minor, parents=parents, > - sysfsPath=sysfsPath, initcb=initcb) > + sysfsPath=sysfsPath, initcb=initcb, > + initlabel=initlabel) > > self.formatClass = get_device_format_class("dmraidmember") > if not self.formatClass: > diff --git a/storage/devicetree.py b/storage/devicetree.py > index a2e4f15..512f0df 100644 > --- a/storage/devicetree.py > +++ b/storage/devicetree.py > @@ -156,7 +156,8 @@ class DeviceTree(object): > """ > > def __init__(self, intf=None, ignored=[], exclusive=[], > - zeroMbr=None, passphrase=None, luksDict=None): > + zeroMbr=None, reinitializeDisks=None, protected=[], > + passphrase=None, luksDict=None): > # internal data members > self._devices = [] > self._actions = [] > @@ -165,6 +166,8 @@ class DeviceTree(object): > self.ignoredDisks = ignored > self.exclusiveDisks = exclusive > self.zeroMbr = zeroMbr > + self.reinitializeDisks = reinitializeDisks > + self.protectedPartitions = protected > self.__passphrase = passphrase > self.__luksDevs = {} > if luksDict and isinstance(luksDict, dict): > @@ -977,11 +980,25 @@ class DeviceTree(object): > else: > cb = lambda: questionInitializeDisk(self.intf, name) > > + # if the disk contains protected partitions we will > + # not wipe the disklabel even if clearpart --initlabel > + # was specified > + if not self.clearPartDisks or name in self.clearPartDisks: > + initlabel = self.reinitalizeDisks > + > + for protected in self.protectedPartitions: > + _p = "/sys/%s/%s" % (sysfs_path, protected) > + if os.path.exists(os.path.normpath(_p)): > + initlabel = False > + break > + else: > + initlabel = False > + > device = DiskDevice(name, > major=udev_device_get_major(info), > minor=udev_device_get_minor(info), > sysfsPath=sysfs_path, > - initcb=cb) > + initcb=cb, initlabel=initlabel) > self._addDevice(device) > except DeviceUserDeniedFormatError: #drive not initialized? > self.ignoredDisks.append(name) > @@ -1152,18 +1169,38 @@ class DeviceTree(object): > rs.activate(mknod=True) > > # Create the DMRaidArray > + if self.zeroMbr: > + cb = lambda: True > + else: > + cb = lambda: questionInitializeDisk(self.intf, > + rs.name) > + > + if not self.clearPartDisks or \ > + rs.name in self.clearPartDisks: > + # we'll need the array's sysfs path below > + dm_node = dm.dm_node_from_name(rs.name) > + _sysfs_path = "/class/block/%s" % dm_node > + > + # if the disk contains protected partitions > + # we will not wipe the disklabel even if > + # clearpart --initlabel was specified > + initlabel = self.reinitalizeDisks > + for protected in self.protectedPartitions: > + _p = "/sys/%s/%s" % (_sysfs_path, protected) > + if os.path.exists(os.path.normpath(_p)): > + initlabel = False > + break > + else: > + initlabel = False > + > try: > - if self.zeroMbr: > - cb = lambda: True > - else: > - cb = lambda: questionInitializeDisk(self.intf, > - rs.name) > dm_array = DMRaidArrayDevice(rs.name, > - major=major, minor=minor, > - raidSet=rs, > - level=rs.level, > - parents=[device], > - initcb=cb) > + major=major, minor=minor, > + raidSet=rs, > + level=rs.level, > + parents=[device], > + initcb=cb, > + initlabel=initlabel) > > self._addDevice(dm_array) > # Use the rs's object on the device. _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list