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