From 549071a0f5181e54c14810dc9afc017866e5aa41 Mon Sep 17 00:00:00 2001
From: Luca Bigliardi <shammash@google.com>
Date: Wed, 16 Jun 2010 17:59:20 +0100
Subject: [PATCH] BaseDRBD: provide a way to query usermode_helper parameter

Signed-off-by: Luca Bigliardi <shammash@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 Makefile.am                            |  1 +
 lib/bdev.py                            | 18 ++++++++++++++++++
 test/data/sys_drbd_usermode_helper.txt |  1 +
 test/ganeti.bdev_unittest.py           | 13 +++++++++++++
 4 files changed, 33 insertions(+)
 create mode 100644 test/data/sys_drbd_usermode_helper.txt

diff --git a/Makefile.am b/Makefile.am
index 0769197b0..c0da777fa 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -358,6 +358,7 @@ TEST_FILES = \
 	test/data/proc_drbd8.txt \
 	test/data/proc_drbd80-emptyline.txt \
 	test/data/proc_drbd83.txt \
+	test/data/sys_drbd_usermode_helper.txt \
 	test/import-export_unittest-helper
 
 python_tests = \
diff --git a/lib/bdev.py b/lib/bdev.py
index e941362fa..9b4388780 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):
@@ -902,6 +903,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 000000000..836b5e7b2
--- /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 1e4460500..36dc58564 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)
-- 
GitLab