summaryrefslogtreecommitdiffstats
path: root/storage/devices.py
diff options
context:
space:
mode:
Diffstat (limited to 'storage/devices.py')
-rw-r--r--storage/devices.py93
1 files changed, 86 insertions, 7 deletions
diff --git a/storage/devices.py b/storage/devices.py
index 2d6a2942b..bc6b0f8b2 100644
--- a/storage/devices.py
+++ b/storage/devices.py
@@ -104,6 +104,7 @@ from devicelibs import dm
import parted
import _ped
import platform
+import block
from errors import *
from iutil import log_method_call, notify_kernel, numeric_type
@@ -416,7 +417,7 @@ class StorageDevice(Device):
def __init__(self, device, format=None,
size=None, major=None, minor=None,
- sysfsPath='', parents=None, exists=None):
+ sysfsPath='', parents=None, exists=None, serial=None):
""" Create a StorageDevice instance.
Arguments:
@@ -446,6 +447,7 @@ class StorageDevice(Device):
self.minor = numeric_type(minor)
self.sysfsPath = sysfsPath
self.exists = exists
+ self.serial = serial
self.protected = False
@@ -2733,19 +2735,34 @@ class DMRaidArrayDevice(DiskDevice):
# information about it
self._size = self.currentSize
+class _MultipathDeviceNameGenerator:
+ def __init__(self):
+ self.number = 0
+ def get(self):
+ ret = self.number
+ self.number += 1
+ return ret
+_multipathDeviceNameGenerator = _MultipathDeviceNameGenerator()
-class MultipathDevice(DMDevice):
+def generateMultipathDeviceName():
+ number = _multipathDeviceNameGenerator.get()
+ return "mpath%s" % (number, )
+
+class MultipathDevice(DiskDevice):
""" A multipath device """
_type = "dm-multipath"
_packages = ["device-mapper-multipath"]
+ _devDir = "/dev/mapper"
- def __init__(self, name, format=None, size=None,
- exists=None, parents=None, sysfsPath=''):
+ def __init__(self, name, info, format=None, size=None,
+ parents=None, sysfsPath='', initcb=None,
+ initlabel=None):
""" Create a MultipathDevice instance.
Arguments:
name -- the device name (generally a device node's basename)
+ info -- the udev info for this device
Keyword Arguments:
@@ -2753,12 +2770,74 @@ class MultipathDevice(DMDevice):
size -- the device's size
format -- a DeviceFormat instance
parents -- a list of the backing devices (Device instances)
- exists -- indicates whether this is an existing device
+ initcb -- the call back to be used when initiating disk.
+ initlabel -- whether to start with a fresh disklabel
"""
- DMDevice.__init__(self, name, format=format, size=size,
+
+ self._info = info
+ self._isUp = False
+ self._pyBlockMultiPath = None
+ self.setupIdentity()
+ DiskDevice.__init__(self, name, format=format, size=size,
parents=parents, sysfsPath=sysfsPath,
- exists=exists)
+ initcb=initcb, initlabel=initlabel)
+
+ def setupIdentity(self):
+ """ Adds identifying remarks to MultipathDevice object.
+
+ May be overridden by a sub-class for e.g. RDAC handling.
+ """
+ self._serial = self._info['ID_SERIAL_SHORT']
+
+ @property
+ def identity(self):
+ """ Get identity set with setupIdentityFromInfo()
+
+ May be overridden by a sub-class for e.g. RDAC handling.
+ """
+ if not hasattr(self, "_serial"):
+ raise RuntimeError, "setupIdentityFromInfo() has not been called."
+ return self._serial
+
+ @property
+ def status(self):
+ return self._isUp
+
+ @property
+ def wwid(self):
+ serial = self.identity
+ ret = []
+ while serial:
+ ret.append(serial[:2])
+ serial = serial[2:]
+ return ":".join(ret)
+
+ @property
+ def description(self):
+ return "WWID %s" % (self.wwid,)
+
+ def addParent(self, parent):
+ if self.status:
+ self.teardown()
+ self.parents.append(parent)
+ self.setup()
+ else:
+ self.parents.append(parent)
+
+ def setup(self, intf=None):
+ if self.status:
+ self.teardown()
+ self._isUp = True
+ parents = []
+ for p in self.parents:
+ parents.append(p.path)
+ self._pyBlockMultiPath = block.device.MultiPath(*parents)
+ def teardown(self, recursive=None):
+ if not self.status:
+ return
+ self._isUp = False
+ self._pyBlockMultiPath = None
class NoDevice(StorageDevice):
""" A nodev device for nodev filesystems like tmpfs. """