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