Revision 733a2b6a

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