Signed-off-by: Luca Bigliardi <[email protected]>
---
 lib/cmdlib.py  |   38 ++++++++++++++++++++++++++++++++++++++
 lib/opcodes.py |    1 +
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 1960176..dd7d5bd 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2526,6 +2526,7 @@ class LUSetClusterParams(LogicalUnit):
     ("osparams", _TOr(_TDictOf(_TNonEmptyString, _TDict), _TNone)),
     ("enabled_hypervisors",
      _TOr(_TAnd(_TListOf(_TElemOf(constants.HYPER_TYPES)), _TTrue), _TNone)),
+    ("drbd_helper", _TOr(_TString, _TNone)),
     ]
   _OP_DEFS = [
     ("candidate_pool_size", None),
@@ -2535,6 +2536,7 @@ class LUSetClusterParams(LogicalUnit):
     ("hvparams", None),
     ("os_hvp", None),
     ("osparams", None),
+    ("drbd_helper", None),
     ]
   REQ_BGL = False
 
@@ -2598,6 +2600,15 @@ class LUSetClusterParams(LogicalUnit):
                                        " lvm-based instances exist",
                                        errors.ECODE_INVAL)
 
+    if self.op.drbd_helper is not None and not self.op.drbd_helper:
+      instances = self.cfg.GetAllInstancesInfo().values()
+      for inst in instances:
+        for disk in inst.disks:
+          if disk.RecursiveCheckIfLogicalDiskBased(constants.LD_DRBD8):
+            raise errors.OpPrereqError("Cannot disable drbd helper while"
+                                       " drbd-based instances exist",
+                                       errors.ECODE_INVAL)
+
     node_list = self.acquired_locks[locking.LEVEL_NODE]
 
     # if vg_name not None, checks given volume group on all nodes
@@ -2617,6 +2628,24 @@ class LUSetClusterParams(LogicalUnit):
           raise errors.OpPrereqError("Error on node '%s': %s" %
                                      (node, vgstatus), errors.ECODE_ENVIRON)
 
+    if self.op.drbd_helper:
+      # checks given drbd helper on all nodes
+      helpers = self.rpc.call_drbd_helper(node_list)
+      for node in node_list:
+        ninfo = self.cfg.GetNodeInfo(node)
+        if ninfo.offline:
+          self.LogWarning("Not checking drbd helper on offline node %s", node)
+          continue
+        msg = helpers[node].fail_msg
+        if msg:
+          raise errors.OpPrereqError("Error checking drbd helper on node"
+                                     " '%s': %s" % (node, msg),
+                                     errors.ECODE_ENVIRON)
+        node_helper = helpers[node].payload
+        if node_helper != self.op.drbd_helper:
+          raise errors.OpPrereqError("Error on node '%s': drbd helper is %s" %
+                                     (node, node_helper), errors.ECODE_ENVIRON)
+
     self.cluster = cluster = self.cfg.GetClusterInfo()
     # validate params changes
     if self.op.beparams:
@@ -2746,6 +2775,15 @@ class LUSetClusterParams(LogicalUnit):
       else:
         feedback_fn("Cluster LVM configuration already in desired"
                     " state, not changing")
+    if self.op.drbd_helper is not None:
+      new_helper = self.op.drbd_helper
+      if not new_helper:
+        new_helper = None
+      if new_helper != self.cfg.GetDRBDHelper():
+        self.cfg.SetDRBDHelper(new_helper)
+      else:
+        feedback_fn("Cluster DRBD helper already in desired state,"
+                    " not changing")
     if self.op.hvparams:
       self.cluster.hvparams = self.new_hvparams
     if self.op.os_hvp:
diff --git a/lib/opcodes.py b/lib/opcodes.py
index 7a7edd9..ee96b80 100644
--- a/lib/opcodes.py
+++ b/lib/opcodes.py
@@ -299,6 +299,7 @@ class OpSetClusterParams(OpCode):
   OP_ID = "OP_CLUSTER_SET_PARAMS"
   __slots__ = [
     "vg_name",
+    "drbd_helper",
     "enabled_hypervisors",
     "hvparams",
     "os_hvp",
-- 
1.7.1

Reply via email to