cluster init/modify: set helper without DRBD being enabled
authorHelga Velroyen <helgav@google.com>
Wed, 21 Aug 2013 14:57:10 +0000 (16:57 +0200)
committerHelga Velroyen <helgav@google.com>
Tue, 27 Aug 2013 13:50:30 +0000 (15:50 +0200)
The logic around the DRBD usermode helper so far was that
setting it was only possible when DRDB was not explicitely
disabled. This patches changes it in a way that it is
consistent to how Ganeti handles the volume group name.

Now, the user can specify a DRBD usermode helper independent
of whether or not DRBD is enabled or not. She will however
get a warning when she sets a helper without having DRBD
enabled. The reasoning behind this is that one might want
to configure a helper while not yet having set up DRBD
completely or while having DRBD disabled temporarily without
loosing this piece of configuration.

This change was done earlier in the patch series, because
I wanted to do the refactoring in two steps, first
just transforming the original logic from --no-drbd-storage
to --enabled-disk-templates and if that goes well, adjust
to the more user-friendly behavior.

Signed-off-by: Helga Velroyen <helgav@google.com>
Reviewed-by: Thomas Thrainer <thomasth@google.com>

lib/client/gnt_cluster.py
qa/qa_cluster.py
test/py/ganeti.client.gnt_cluster_unittest.py

index a73a1b7..4d70937 100644 (file)
@@ -114,12 +114,9 @@ def _InitDrbdHelper(opts, enabled_disk_templates):
   """
   drbd_enabled = constants.DT_DRBD8 in enabled_disk_templates
 
-  # This raises an exception due to historical reasons, one might consider
-  # letting the user set a helper without having DRBD enabled.
-  if not drbd_enabled and opts.drbd_helper:
-    raise errors.OpPrereqError(
-        "Enabling the DRBD disk template and setting a drbd usermode helper"
-        " with --drbd-usermode-helper conflict.")
+  if not drbd_enabled and opts.drbd_helper is not None:
+    ToStdout("Note: You specified a DRBD usermode helper, while DRBD storage"
+             " is not enabled.")
 
   if drbd_enabled:
     if opts.drbd_helper is None:
@@ -1044,12 +1041,9 @@ def _GetDrbdHelper(opts, enabled_disk_templates):
   drbd_helper = opts.drbd_helper
   if enabled_disk_templates:
     drbd_enabled = constants.DT_DRBD8 in enabled_disk_templates
-    # This raises an exception for historic reasons. It might be a good idea
-    # to allow users to set a DRBD helper when DRBD storage is not enabled.
     if not drbd_enabled and opts.drbd_helper:
-      raise errors.OpPrereqError(
-          "Setting a DRBD usermode helper when DRBD is not enabled is"
-          " not allowed.")
+      ToStdout("You specified a DRBD usermode helper with "
+               " --drbd-usermode-helper while DRBD is not enabled.")
   return drbd_helper
 
 
index 500155d..192141f 100644 (file)
@@ -621,7 +621,7 @@ def _TestClusterModifyDiskTemplatesDrbdHelper(enabled_disk_templates):
          "--enabled-disk-templates=%s" % constants.DT_PLAIN,
          "--ipolicy-disk-templates=%s" % constants.DT_PLAIN], False),
        (["gnt-cluster", "modify",
-         "--drbd-usermode-helper="], True),
+         "--drbd-usermode-helper="], False),
        (["gnt-cluster", "modify",
          "--drbd-usermode-helper=%s" % drbd_usermode_helper], False),
        (["gnt-cluster", "modify",
index c34432a..288eff5 100755 (executable)
@@ -286,8 +286,8 @@ class InitDrbdHelper(DrbdHelperTestCase):
     opts = mock.Mock()
     self.disableDrbd()
     opts.drbd_helper = "/bin/true"
-    self.assertRaises(errors.OpPrereqError, gnt_cluster._InitDrbdHelper, opts,
-        self.enabled_disk_templates)
+    helper = gnt_cluster._InitDrbdHelper(opts, self.enabled_disk_templates)
+    self.assertEquals(opts.drbd_helper, helper)
 
   def testDrbdHelperNone(self):
     opts = mock.Mock()
@@ -336,8 +336,8 @@ class GetDrbdHelper(DrbdHelperTestCase):
     opts = mock.Mock()
     self.disableDrbd()
     opts.drbd_helper = "/bin/true"
-    self.assertRaises(errors.OpPrereqError, gnt_cluster._GetDrbdHelper, opts,
-        self.enabled_disk_templates)
+    helper = gnt_cluster._GetDrbdHelper(opts, None)
+    self.assertEquals(opts.drbd_helper, helper)
 
   def testDrbdNoHelper(self):
     opts = mock.Mock()