Revision 4b7735f9 lib/cmdlib.py

b/lib/cmdlib.py
32 32
import platform
33 33
import logging
34 34
import copy
35
import random
35 36

  
36 37
from ganeti import ssh
37 38
from ganeti import utils
......
1186 1187
  _OP_REQP = []
1187 1188
  REQ_BGL = False
1188 1189

  
1190
  def CheckParameters(self):
1191
    """Check parameters
1192

  
1193
    """
1194
    if not hasattr(self.op, "candidate_pool_size"):
1195
      self.op.candidate_pool_size = None
1196
    if self.op.candidate_pool_size is not None:
1197
      try:
1198
        self.op.candidate_pool_size = int(self.op.candidate_pool_size)
1199
      except ValueError, err:
1200
        raise errors.OpPrereqError("Invalid candidate_pool_size value: %s" %
1201
                                   str(err))
1202
      if self.op.candidate_pool_size < 1:
1203
        raise errors.OpPrereqError("At least one master candidate needed")
1204

  
1189 1205
  def ExpandNames(self):
1190 1206
    # FIXME: in the future maybe other cluster params won't require checking on
1191 1207
    # all nodes to be modified.
......
1284 1300
      self.cluster.enabled_hypervisors = self.op.enabled_hypervisors
1285 1301
    if self.op.beparams:
1286 1302
      self.cluster.beparams[constants.BEGR_DEFAULT] = self.new_beparams
1303
    if self.op.candidate_pool_size is not None:
1304
      self.cluster.candidate_pool_size = self.op.candidate_pool_size
1305

  
1287 1306
    self.cfg.Update(self.cluster)
1288 1307

  
1308
    # we want to update nodes after the cluster so that if any errors
1309
    # happen, we have recorded and saved the cluster info
1310
    if self.op.candidate_pool_size is not None:
1311
      node_info = self.cfg.GetAllNodesInfo().values()
1312
      num_candidates = len([node for node in node_info
1313
                            if node.master_candidate])
1314
      num_nodes = len(node_info)
1315
      if num_candidates < self.op.candidate_pool_size:
1316
        random.shuffle(node_info)
1317
        for node in node_info:
1318
          if num_candidates >= self.op.candidate_pool_size:
1319
            break
1320
          if node.master_candidate:
1321
            continue
1322
          node.master_candidate = True
1323
          self.LogInfo("Promoting node %s to master candidate", node.name)
1324
          self.cfg.Update(node)
1325
          self.context.ReaddNode(node)
1326
          num_candidates += 1
1327
      elif num_candidates > self.op.candidate_pool_size:
1328
        self.LogInfo("Note: more nodes are candidates (%d) than the new value"
1329
                     " of candidate_pool_size (%d)" %
1330
                     (num_candidates, self.op.candidate_pool_size))
1331

  
1289 1332

  
1290 1333
def _WaitForSync(lu, instance, oneshot=False, unlock=False):
1291 1334
  """Sleep and poll for an instance's disk to sync.
......
2058 2101
      "enabled_hypervisors": cluster.enabled_hypervisors,
2059 2102
      "hvparams": cluster.hvparams,
2060 2103
      "beparams": cluster.beparams,
2104
      "candidate_pool_size": cluster.candidate_pool_size,
2061 2105
      }
2062 2106

  
2063 2107
    return result

Also available in: Unified diff