Signed-off-by: Luca Bigliardi <[email protected]>
---
 lib/bdev.py                            |   18 ++++++++++++++++++
 test/data/sys_drbd_usermode_helper.txt |    1 +
 test/ganeti.bdev_unittest.py           |   13 +++++++++++++
 3 files changed, 32 insertions(+), 0 deletions(-)
 create mode 100644 test/data/sys_drbd_usermode_helper.txt

diff --git a/lib/bdev.py b/lib/bdev.py
index e941362..9b43887 100644
--- a/lib/bdev.py
+++ b/lib/bdev.py
@@ -825,6 +825,7 @@ class BaseDRBD(BlockDev): # pylint: disable-msg=W0223
   _ST_CONNECTED = "Connected"
 
   _STATUS_FILE = "/proc/drbd"
+  _USERMODE_HELPER_FILE = "/sys/module/drbd/parameters/usermode_helper"
 
   @staticmethod
   def _GetProcData(filename=_STATUS_FILE):
@@ -903,6 +904,23 @@ class BaseDRBD(BlockDev): # pylint: disable-msg=W0223
     return retval
 
   @staticmethod
+  def GetUsermodeHelper(filename=_USERMODE_HELPER_FILE):
+    """Returns DRBD usermode_helper currently set.
+
+    """
+    try:
+      helper = utils.ReadFile(filename).splitlines()[0]
+    except EnvironmentError, err:
+      if err.errno == errno.ENOENT:
+        _ThrowError("The file %s cannot be opened, check if the module"
+                    " is loaded (%s)", filename, str(err))
+      else:
+        _ThrowError("Can't read DRBD helper file %s: %s", filename, str(err))
+    if not helper:
+      _ThrowError("Can't read any data from %s", filename)
+    return helper
+
+  @staticmethod
   def _DevPath(minor):
     """Return the path to a drbd device for a given minor.
 
diff --git a/test/data/sys_drbd_usermode_helper.txt 
b/test/data/sys_drbd_usermode_helper.txt
new file mode 100644
index 0000000..836b5e7
--- /dev/null
+++ b/test/data/sys_drbd_usermode_helper.txt
@@ -0,0 +1 @@
+/bin/true
diff --git a/test/ganeti.bdev_unittest.py b/test/ganeti.bdev_unittest.py
index 1e44605..36dc585 100755
--- a/test/ganeti.bdev_unittest.py
+++ b/test/ganeti.bdev_unittest.py
@@ -143,6 +143,19 @@ class TestDRBD8Status(testutils.GanetiTestCase):
     self.failUnlessRaises(errors.BlockDeviceError,
                           bdev.DRBD8._GetProcData, filename=temp_file)
 
+  def testHelper(self):
+    """Test reading usermode_helper in /sys."""
+    sys_drbd_helper = self._TestDataFilename("sys_drbd_usermode_helper.txt")
+    drbd_helper = bdev.DRBD8.GetUsermodeHelper(filename=sys_drbd_helper)
+    self.failUnlessEqual(drbd_helper, "/bin/true")
+
+  def testHelperIOErrors(self):
+    """Test handling of errors while reading usermode_helper in /sys."""
+    temp_file = self._CreateTempFile()
+    os.unlink(temp_file)
+    self.failUnlessRaises(errors.BlockDeviceError,
+                          bdev.DRBD8.GetUsermodeHelper, filename=temp_file)
+
   def testMinorNotFound(self):
     """Test not-found-minor in /proc"""
     self.failUnless(9 not in self.mass_data)
-- 
1.7.1

Reply via email to