Revision 733a2b6a lib/cmdlib.py
b/lib/cmdlib.py | ||
---|---|---|
434 | 434 |
|
435 | 435 |
@param lu: the LU on behalf of which we make the check |
436 | 436 |
@param node: the node to check |
437 |
@raise errors.OpPrereqError: if the nodes is offline
|
|
437 |
@raise errors.OpPrereqError: if the node is offline |
|
438 | 438 |
|
439 | 439 |
""" |
440 | 440 |
if lu.cfg.GetNodeInfo(node).offline: |
441 | 441 |
raise errors.OpPrereqError("Can't use offline node %s" % node) |
442 | 442 |
|
443 | 443 |
|
444 |
def _CheckNodeNotDrained(lu, node): |
|
445 |
"""Ensure that a given node is not drained. |
|
446 |
|
|
447 |
@param lu: the LU on behalf of which we make the check |
|
448 |
@param node: the node to check |
|
449 |
@raise errors.OpPrereqError: if the node is drained |
|
450 |
|
|
451 |
""" |
|
452 |
if lu.cfg.GetNodeInfo(node).drained: |
|
453 |
raise errors.OpPrereqError("Can't use drained node %s" % node) |
|
454 |
|
|
455 |
|
|
444 | 456 |
def _BuildInstanceHookEnv(name, primary_node, secondary_nodes, os_type, status, |
445 | 457 |
memory, vcpus, nics): |
446 | 458 |
"""Builds instance related env variables for hooks |
... | ... | |
3379 | 3391 |
|
3380 | 3392 |
target_node = secondary_nodes[0] |
3381 | 3393 |
_CheckNodeOnline(self, target_node) |
3394 |
_CheckNodeNotDrained(self, target_node) |
|
3382 | 3395 |
# check memory requirements on the secondary node |
3383 | 3396 |
_CheckNodeFreeMemory(self, target_node, "failing over instance %s" % |
3384 | 3397 |
instance.name, bep[constants.BE_MEMORY], |
... | ... | |
3507 | 3520 |
|
3508 | 3521 |
secondary_nodes = instance.secondary_nodes |
3509 | 3522 |
if not secondary_nodes: |
3510 |
raise errors.ProgrammerError("no secondary node but using "
|
|
3511 |
"drbd8 disk template")
|
|
3523 |
raise errors.ConfigurationError("No secondary node but using"
|
|
3524 |
" drbd8 disk template")
|
|
3512 | 3525 |
|
3513 | 3526 |
i_be = self.cfg.GetClusterInfo().FillBE(instance) |
3514 | 3527 |
|
... | ... | |
3527 | 3540 |
(brlist, target_node)) |
3528 | 3541 |
|
3529 | 3542 |
if not self.op.cleanup: |
3543 |
_CheckNodeNotDrained(self, target_node) |
|
3530 | 3544 |
result = self.rpc.call_instance_migratable(instance.primary_node, |
3531 | 3545 |
instance) |
3532 | 3546 |
msg = result.RemoteFailMsg() |
... | ... | |
4478 | 4492 |
if pnode.offline: |
4479 | 4493 |
raise errors.OpPrereqError("Cannot use offline primary node '%s'" % |
4480 | 4494 |
pnode.name) |
4495 |
if pnode.drained: |
|
4496 |
raise errors.OpPrereqError("Cannot use drained primary node '%s'" % |
|
4497 |
pnode.name) |
|
4481 | 4498 |
|
4482 | 4499 |
self.secondaries = [] |
4483 | 4500 |
|
... | ... | |
4489 | 4506 |
if self.op.snode == pnode.name: |
4490 | 4507 |
raise errors.OpPrereqError("The secondary node cannot be" |
4491 | 4508 |
" the primary node.") |
4492 |
self.secondaries.append(self.op.snode) |
|
4493 | 4509 |
_CheckNodeOnline(self, self.op.snode) |
4510 |
_CheckNodeNotDrained(self, self.op.snode) |
|
4511 |
self.secondaries.append(self.op.snode) |
|
4494 | 4512 |
|
4495 | 4513 |
nodenames = [pnode.name] + self.secondaries |
4496 | 4514 |
|
... | ... | |
4887 | 4905 |
n1 = self.new_node = remote_node |
4888 | 4906 |
n2 = self.oth_node = instance.primary_node |
4889 | 4907 |
self.tgt_node = self.sec_node |
4908 |
_CheckNodeNotDrained(self, remote_node) |
|
4890 | 4909 |
else: |
4891 | 4910 |
raise errors.ProgrammerError("Unhandled disk replace mode") |
4892 | 4911 |
|
... | ... | |
6025 | 6044 |
# This is wrong node name, not a non-locked node |
6026 | 6045 |
raise errors.OpPrereqError("Wrong node name %s" % self.op.target_node) |
6027 | 6046 |
_CheckNodeOnline(self, self.dst_node.name) |
6047 |
_CheckNodeNotDrained(self, self.dst_node.name) |
|
6028 | 6048 |
|
6029 | 6049 |
# instance disk type verification |
6030 | 6050 |
for disk in self.instance.disks: |
Also available in: Unified diff