diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 3b95fd37aa3cd2d3dde8a3f9901a965e7ed9dcff..f59f5b3f46afb7c97608daef731bd1333d8d6137 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -2100,6 +2100,9 @@ class LUSetNodeParams(LogicalUnit): force = self.force = self.op.force if self.op.master_candidate == False: + if self.op.node_name == self.cfg.GetMasterNode(): + raise errors.OpPrereqError("The master node has to be a" + " master candidate") cp_size = self.cfg.GetClusterInfo().candidate_pool_size node_info = self.cfg.GetAllNodesInfo().values() num_candidates = len([node for node in node_info @@ -2129,7 +2132,8 @@ class LUSetNodeParams(LogicalUnit): # this will trigger configuration file update, if needed self.cfg.Update(node) # this will trigger job queue propagation or cleanup - self.context.ReaddNode(node) + if self.op.node_name != self.cfg.GetMasterNode(): + self.context.ReaddNode(node) return result diff --git a/lib/config.py b/lib/config.py index 9d04231d37d192453e91619401b31a9e4d49ed20..67c5e06bb56777f1990b8fa806c48db36e9041e6 100644 --- a/lib/config.py +++ b/lib/config.py @@ -272,14 +272,17 @@ class ConfigWriter: result.append("Highest used port mismatch, saved %s, computed %s" % (data.cluster.highest_used_port, keys[-1])) + if not data.nodes[data.cluster.master_node].master_candidate: + result.append("Master node is not a master candidate") + cp_size = data.cluster.candidate_pool_size num_c = 0 for node in data.nodes.values(): if node.master_candidate: num_c += 1 - if cp_size > num_c: - result.append("Not enough master candidates: actual %d, desired %d" % - (num_c, cp_size)) + if cp_size > num_c and num_c < len(data.nodes): + result.append("Not enough master candidates: actual %d, desired %d," + " %d total nodes" % (num_c, cp_size, len(data.nodes))) return result