Revision 4b7735f9

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
b/lib/objects.py
707 707
    "enabled_hypervisors",
708 708
    "hvparams",
709 709
    "beparams",
710
    "candidate_pool_size",
710 711
    ]
711 712

  
712 713
  def ToDict(self):
b/lib/opcodes.py
255 255

  
256 256
  """
257 257
  OP_ID = "OP_CLUSTER_SET_PARAMS"
258
  __slots__ = ["vg_name", "enabled_hypervisors", "hvparams", "beparams"]
258
  __slots__ = [
259
    "vg_name",
260
    "enabled_hypervisors",
261
    "hvparams",
262
    "beparams",
263
    "candidate_pool_size",
264
    ]
259 265

  
260 266

  
261 267
# node opcodes
b/scripts/gnt-cluster
238 238
      ToStdout("      %s: %s", item, val)
239 239

  
240 240
  ToStdout("Cluster parameters:")
241
  ToStdout("  - candidate pool size: %s", result["candidate_pool_size"])
242

  
243
  ToStdout("Default instance parameters:")
241 244
  for gr_name, gr_dict in result["beparams"].items():
242 245
    ToStdout("  - %s:", gr_name)
243 246
    for item, val in gr_dict.iteritems():
......
448 451
  """
449 452
  if not (not opts.lvm_storage or opts.vg_name or
450 453
          opts.enabled_hypervisors or opts.hvparams or
451
          opts.beparams):
454
          opts.beparams or opts.candidate_pool_size is not None):
452 455
    ToStderr("Please give at least one of the parameters.")
453 456
    return 1
454 457

  
......
471 474
  op = opcodes.OpSetClusterParams(vg_name=opts.vg_name,
472 475
                                  enabled_hypervisors=hvlist,
473 476
                                  hvparams=hvparams,
474
                                  beparams=beparams)
477
                                  beparams=beparams,
478
                                  candidate_pool_size=opts.candidate_pool_size)
475 479
  SubmitOpCode(op)
476 480
  return 0
477 481

  
......
636 640
              keyval_option("-B", "--backend-parameters", dest="beparams",
637 641
                            type="keyval", default={},
638 642
                            help="Backend parameters"),
643
              make_option("-C", "--candidate-pool-size", default=None,
644
                          help="Set the candidate pool size",
645
                          dest="candidate_pool_size", type="int"),
639 646
              ],
640 647
             "[opts...]",
641 648
             "Alters the parameters of the cluster"),

Also available in: Unified diff