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