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