From 3e83dd48ceffdf1ba57ac90fee96de09a6b54f53 Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Tue, 2 Dec 2008 05:06:21 +0000
Subject: [PATCH] Prevent demotion from candidate based on pool size

In gnt-cluster modify we prevent demotion from the candidate role if
there are not enough master candidates left.

Reviewed-by: imsnah
---
 lib/cmdlib.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index c6850ff2f..1fbbec5c6 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2045,6 +2045,19 @@ class LUSetNodeParams(LogicalUnit):
     """
     force = self.force = self.op.force
 
+    if self.op.master_candidate == False:
+      cp_size = self.cfg.GetClusterInfo().candidate_pool_size
+      node_info = self.cfg.GetAllNodesInfo().values()
+      num_candidates = len([node for node in node_info
+                            if node.master_candidate])
+      if num_candidates <= cp_size:
+        msg = ("Not enough master candidates (desired"
+               " %d, new value will be %d)" % (cp_size, num_candidates-1))
+        if force:
+          self.LogWarning(msg)
+        else:
+          raise errors.OpPrereqError(msg)
+
     return
 
   def Exec(self, feedback_fn):
-- 
GitLab