From 7b2cd2b4229809c0c388042b40d5c80e85988680 Mon Sep 17 00:00:00 2001
From: Luca Bigliardi <shammash@google.com>
Date: Mon, 28 Jun 2010 17:03:21 +0100
Subject: [PATCH] Check and set drbd helper in set params LU

Signed-off-by: Luca Bigliardi <shammash@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/cmdlib.py  | 34 ++++++++++++++++++++++++++++++++++
 lib/opcodes.py |  1 +
 2 files changed, 35 insertions(+)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index a071193f4..2ed2186f3 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2561,6 +2561,7 @@ class LUSetClusterParams(LogicalUnit):
     ("remove_uids", None, _NoType),
     ("maintain_node_health", None, _TMaybeBool),
     ("nicparams", None, _TOr(_TDict, _TNone)),
+    ("drbd_helper", None, _TOr(_TString, _TNone)),
     ]
   REQ_BGL = False
 
@@ -2608,6 +2609,12 @@ class LUSetClusterParams(LogicalUnit):
         raise errors.OpPrereqError("Cannot disable lvm storage while lvm-based"
                                    " instances exist", errors.ECODE_INVAL)
 
+    if self.op.drbd_helper is not None and not self.op.drbd_helper:
+      if self.cfg.HasAnyDiskOfType(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
@@ -2627,6 +2634,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.LogInfo("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:
@@ -2756,6 +2781,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 c2cc5cf9c..0f530f31a 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",
-- 
GitLab