- Move disklabel initialization into a method of DiskDevice.
- Add a new keyword argument, initlabel, to the DiskDevice and
DMRaidArrayDevice constructors.
- Include Storage.protectedPartitions, Storage.reinitializeDisks,
and Storage.clearPartDisks 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 | 6 ++++
storage/devices.py | 41 ++++++++++++++++++++++----------
storage/devicetree.py | 62 ++++++++++++++++++++++++++++++++++++++----------
3 files changed, 83 insertions(+), 26 deletions(-)
diff --git a/storage/__init__.py b/storage/__init__.py
index f0ed7d6..b886dc0 100644
--- a/storage/__init__.py
+++ b/storage/__init__.py
@@ -172,6 +172,9 @@ class Storage(object):
self.devicetree = DeviceTree(intf=self.anaconda.intf,
ignored=self.ignoredDisks,
exclusive=self.exclusiveDisks,
+ clear=self.clearPartDisks,
+ reinitializeDisks=self.reinitializeDisks,
+ protected=self.protectedPartitions,
zeroMbr=self.zeroMbr,
passphrase=self.encryptionPassphrase,
luksDict=self.__luksDevs)
@@ -215,6 +218,9 @@ class Storage(object):
self.devicetree = DeviceTree(intf=self.anaconda.intf,
ignored=self.ignoredDisks,
exclusive=self.exclusiveDisks,
+ clear=self.clearPartDisks,
+ reinitializeDisks=self.reinitializeDisks,
+ protected=self.protectedPartitions,
zeroMbr=self.zeroMbr,
passphrase=self.encryptionPassphrase,
luksDict=self.__luksDevs)
diff --git a/storage/devices.py b/storage/devices.py
index 39578c0..d236d15 100644
--- a/storage/devices.py
+++ b/storage/devices.py
@@ -658,7 +658,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:
@@ -676,6 +676,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.
@@ -686,20 +687,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
@@ -709,6 +714,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 """
@@ -2143,8 +2153,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:
@@ -2159,6 +2170,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:
@@ -2166,7 +2180,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 df5a6ed..66d053e 100644
--- a/storage/devicetree.py
+++ b/storage/devicetree.py
@@ -22,6 +22,7 @@
import os
import block
+import re
from errors import *
from devices import *
@@ -155,15 +156,19 @@ class DeviceTree(object):
except for resize actions.
"""
- def __init__(self, intf=None, ignored=[], exclusive=[],
- zeroMbr=None, passphrase=None, luksDict=None):
+ def __init__(self, intf=None, ignored=[], exclusive=[], clear=[],
+ zeroMbr=None, reinitializeDisks=None, protected=[],
+ passphrase=None, luksDict=None):
# internal data members
self._devices = []
self._actions = []
self.intf = intf
self.exclusiveDisks = exclusive
+ self.clearPartDisks = clear
self.zeroMbr = zeroMbr
+ self.reinitializeDisks = reinitializeDisks
+ self.protectedPartitions = protected
self.__passphrase = passphrase
self.__luksDevs = {}
if luksDict and isinstance(luksDict, dict):
@@ -985,11 +990,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.reinitializeDisks
+
+ 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.addIgnoredDisk(name)
@@ -1162,18 +1181,35 @@ 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:
+ # if the disk contains protected partitions
+ # we will not wipe the disklabel even if
+ # clearpart --initlabel was specified
+ initlabel = self.reinitializeDisks
+ for protected in self.protectedPartitions:
+ disk_name = re.sub(r'p\d+$', protected)
+ if disk_name != protected and \
+ disk_name == rs.name:
+ 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.