[node-patches] Change in ovirt-node[master]: Move multipath device checking to ovirt.node.utils.storage

rbarry at redhat.com rbarry at redhat.com
Mon Oct 7 19:54:08 UTC 2013


Ryan Barry has uploaded a new change for review.

Change subject: Move multipath device checking to ovirt.node.utils.storage
......................................................................

Move multipath device checking to ovirt.node.utils.storage

Move translate_device_name and its essential logic to the new
codebase.

Change-Id: I203d16f75fd9ed3b983cc240d8c9c34fd8189499
Signed-off-by: Ryan Barry <rbarry at redhat.com>
---
M src/ovirt/node/utils/storage.py
M src/ovirtnode/ovirtfunctions.py
M src/ovirtnode/storage.py
3 files changed, 62 insertions(+), 23 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/51/19951/1

diff --git a/src/ovirt/node/utils/storage.py b/src/ovirt/node/utils/storage.py
index a050090..f2fdbce 100644
--- a/src/ovirt/node/utils/storage.py
+++ b/src/ovirt/node/utils/storage.py
@@ -22,6 +22,7 @@
 from ovirt.node import base
 from ovirt.node.utils import process
 from ovirt.node.utils.fs import File
+import re
 import os
 
 
@@ -97,32 +98,65 @@
             name = "/dev/%s" % name.rstrip('0123456789')
         return name
 
+    def translate_device_name(self, _dev):
+        """Discover whether a device can be mapped to a devicemapper name so
+        we can match arbitrary /dev/sd? names, such as flash drives
+        """
+        self.logger.debug("Translating %s")
+        if _dev is None:
+            return False
+        if "/dev/cciss" in _dev:
+            _dev = "/dev/mapper/%s" % process.check_output(["cciss_id", _dev])
+        if not "/dev/mapper" in _dev:
+            if not _dev.startswith("/dev/"):
+                _dev = "/dev/%s" % _dev
+            try:
+                output = [x for x in process.check_output(["multipath", "-ll",
+                          _dev]).split('\n') if re.match(r'.*?dm-[0-9]+',
+                                                         x)][0].strip()
+                _dev = "/dev/mapper/%s" % output.split()[0]
+            except process.CalledProcessError as e:
+                # multipath got a non-zero code.
+                self.logger.exception("Couldn't translate %s: %s" % (_dev,
+                                      e.cmd))
+            except IndexError:
+                self.logger.exception("Translated %s, but didn't find the dm"
+                                      "path" % _dev)
+
+        if not hasattr(self, 'disk_dict'):
+            # Haven't populated yet, do that first
+            self.get_all()
+        info = self.disk_dict[_dev].split(",", 5)
+        device = Device(_dev, *info)
+        return device
+
     def get_all(self):
         """Get all available storage devices attached to this system
         """
         if self._fake_devices:
             return self._fake_devices
-        from ovirtnode.ovirtfunctions import translate_multipath_device
-        dev_names, disk_dict = self._storage.get_udev_devices()
+        self.dev_names, self.disk_dict = self._storage.get_udev_devices()
         devices = {}
-        for _dev in dev_names:
-            dev = translate_multipath_device(_dev)
+        for _dev in self.dev_names:
+            # Can't translate CDROM names
+            if "/dev/sr0" in _dev:
+                continue
+            dev = self.translate_device_name(_dev).path
             self.logger.debug("Checking device %s (%s)" % (dev, _dev))
             if dev in devices:
                 self.logger.warning("Device is already in dict: %s" % dev)
                 continue
-            if dev not in disk_dict:
+            if dev not in self.disk_dict:
                 self.logger.warning("Device in names but not in dict: " +
                                     "%s" % dev)
-                continue
             if dev == self.live_disk_name():
                 self.logger.info("Ignoring device " +
                                  "%s it's the live media" % dev)
                 continue
-            infos = disk_dict[dev].split(",", 5)
+            infos = self.disk_dict[dev].split(",", 5)
             device = Device(dev, *infos)
             device.name = os.path.basename(device.name).replace(" ", "")
-            device.name = translate_multipath_device(device.name)
+            device.name = self.translate_device_name(device.name)
             if device.name in devices:
                 self.logger.debug("Device with same name already " +
                                   "exists: %s" % device.name)
diff --git a/src/ovirtnode/ovirtfunctions.py b/src/ovirtnode/ovirtfunctions.py
index 21363cf..ef38636 100644
--- a/src/ovirtnode/ovirtfunctions.py
+++ b/src/ovirtnode/ovirtfunctions.py
@@ -38,7 +38,7 @@
 import grp
 import pwd
 from ovirt.node.config import defaults
-from ovirt.node.utils import process
+from ovirt.node.utils import process, storage
 import ovirt.node.utils.system as osystem
 
 OVIRT_CONFIG="/config"
@@ -1270,7 +1270,7 @@
 
 # Cleans partition tables
 def wipe_partitions(_drive):
-    drive = translate_multipath_device(_drive)
+    drive = storage.Devices().translate_device_name(_drive).path
     logger.info("Wiping partitions on: %s->%s" % (_drive, drive))
     logger.info("Removing HostVG")
     if os.path.exists("/dev/mapper/HostVG-Swap"):
diff --git a/src/ovirtnode/storage.py b/src/ovirtnode/storage.py
index 635ded5..9f3aa4b 100644
--- a/src/ovirtnode/storage.py
+++ b/src/ovirtnode/storage.py
@@ -18,6 +18,7 @@
 # also available at http://www.gnu.org/copyleft/gpl.html.
 
 import ovirtnode.ovirtfunctions as _functions
+from ovirt.node.utils import storage
 import os
 import sys
 import time
@@ -61,7 +62,8 @@
                 init = _functions.OVIRT_VARS["OVIRT_INIT"].strip(",").split(",")
                 for disk in init:
                     skip = False
-                    translated_disk = _functions.translate_multipath_device(disk)
+                    translated_disk = storage.Devices().translate_device_name(
+                            disk).path
                     if disk_count < 1:
                         self.ROOTDRIVE = translated_disk
                         if len(init) == 1:
@@ -75,15 +77,16 @@
                         if not skip:
                             self.HOSTVGDRIVE += "%s," % translated_disk
             else:
-                self.ROOTDRIVE = _functions.translate_multipath_device(
-                                    _functions.OVIRT_VARS["OVIRT_INIT"])
-                self.HOSTVGDRIVE = _functions.translate_multipath_device(
-                                    _functions.OVIRT_VARS["OVIRT_INIT"])
+                self.ROOTDRIVE = storage.Devices().translate_device_name(
+                                    _functions.OVIRT_VARS["OVIRT_INIT"]).path
+                self.HOSTVGDRIVE = storage.Devices().translate_device_name(
+                                    _functions.OVIRT_VARS["OVIRT_INIT"]).path
             if _functions.is_iscsi_install():
                 logger.info(self.BOOTDRIVE)
                 logger.info(self.ROOTDRIVE)
-                self.BOOTDRIVE = _functions.translate_multipath_device( \
-                                                                self.ROOTDRIVE)
+                self.BOOTDRIVE = storage.Devices().translate_device_name( \
+                                                                self.ROOTDRIVE
+                                                                ).path
         if "OVIRT_OVERCOMMIT" in OVIRT_VARS:
             self.overcommit = OVIRT_VARS["OVIRT_OVERCOMMIT"]
         if "OVIRT_VOL_SWAP_SIZE" in OVIRT_VARS:
@@ -125,7 +128,7 @@
         if "OVIRT_INIT_APP" in OVIRT_VARS:
             if self.SWAP2_SIZE != 0 or self.DATA2_SIZE != 0:
                 for drv in _functions.OVIRT_VARS["OVIRT_INIT_APP"].split(","):
-                    DRIVE = _functions.translate_multipath_device(drv)
+                    DRIVE = storage.Devices().translate_device_name(drv).path
                     self.APPVGDRIVE.append(DRIVE)
         else:
             if self.SWAP2_SIZE != 0 or self.DATA2_SIZE != 0:
@@ -140,7 +143,7 @@
         if self.ROOTDRIVE:
             hostvg_drives.append(self.ROOTDRIVE)
         # Translate to DM name as APPVG is using it
-        hostvg_drives = [_functions.translate_multipath_device(drv)
+        hostvg_drives = [storage.Devices().translate_device_name(drv).path
                          for drv in hostvg_drives]
         return Storage._xcheck_vgs(hostvg_drives, self.APPVGDRIVE)
 
@@ -389,7 +392,8 @@
             if (not device.get_property("ID_CDROM") and
                     not "/dev/dm-" in dev_name and
                     not "/dev/loop" in dev_name and size_failed == 0):
-                dev_name = _functions.translate_multipath_device(dev_name)
+                dev_name = storage.Devices().translate_device_name(
+                        dev_name).path
                 busmap = { \
                     "usb": "USB Device          ", \
                     "ata": "Local / FibreChannel", \
@@ -413,7 +417,7 @@
         logger.info("Creating LVM partition")
         self.physical_vols = []
         for drv in self.HOSTVGDRIVE.strip(",").split(","):
-            drv = _functions.translate_multipath_device(drv)
+            drv = storage.Devices().translate_device_name(drv).path
             if drv != "":
                 if self.ROOTDRIVE == drv and not _functions.is_iscsi_install():
                     self.reread_partitions(self.ROOTDRIVE)
@@ -823,8 +827,9 @@
                               str(partbootbackup) + "\"")
             _functions.system("ln -snf \"" + partbootbackup +
                    "\" /dev/disk/by-label/BootBackup")
-            self.ISCSIDRIVE = _functions.translate_multipath_device(
-                               _functions.OVIRT_VARS["OVIRT_ISCSI_INIT"])
+            self.ISCSIDRIVE = storage.Devices().translate_device_name(
+                               _functions.OVIRT_VARS["OVIRT_ISCSI_INIT"]
+                               ).path
             logger.debug(self.ISCSIDRIVE)
             if self.create_iscsiroot():
                 logger.info("iSCSI Root Partitions Created")


-- 
To view, visit http://gerrit.ovirt.org/19951
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I203d16f75fd9ed3b983cc240d8c9c34fd8189499
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-node
Gerrit-Branch: master
Gerrit-Owner: Ryan Barry <rbarry at redhat.com>



More information about the node-patches mailing list