Revision 31624382

b/lib/cmdlib.py
552 552
    raise errors.OpPrereqError(msg, errors.ECODE_INVAL)
553 553

  
554 554

  
555
def _CheckInstanceDown(lu, instance, reason):
556
  """Ensure that an instance is not running."""
557
  if instance.admin_up:
558
    raise errors.OpPrereqError("Instance %s is marked to be up, %s" %
559
                               (instance.name, reason), errors.ECODE_STATE)
560

  
561
  pnode = instance.primary_node
562
  ins_l = lu.rpc.call_instance_list([pnode], [instance.hypervisor])[pnode]
563
  ins_l.Raise("Can't contact node %s for instance information" % pnode,
564
              prereq=True, ecode=errors.ECODE_ENVIRON)
565

  
566
  if instance.name in ins_l.payload:
567
    raise errors.OpPrereqError("Instance %s is running, %s" %
568
                               (instance.name, reason), errors.ECODE_STATE)
569

  
570

  
555 571
def _ExpandItemName(fn, name, kind):
556 572
  """Expand an item name.
557 573

  
......
3730 3746
  _ShutdownInstanceDisks.
3731 3747

  
3732 3748
  """
3733
  pnode = instance.primary_node
3734
  ins_l = lu.rpc.call_instance_list([pnode], [instance.hypervisor])[pnode]
3735
  ins_l.Raise("Can't contact node %s" % pnode)
3736

  
3737
  if instance.name in ins_l.payload:
3738
    raise errors.OpExecError("Instance is running, can't shutdown"
3739
                             " block devices.")
3740

  
3749
  _CheckInstanceDown(lu, instance, "cannot shutdown disks")
3741 3750
  _ShutdownInstanceDisks(lu, instance)
3742 3751

  
3743 3752

  
......
4123 4132
      raise errors.OpPrereqError("Instance '%s' has no disks" %
4124 4133
                                 self.op.instance_name,
4125 4134
                                 errors.ECODE_INVAL)
4126
    if instance.admin_up:
4127
      raise errors.OpPrereqError("Instance '%s' is marked to be up" %
4128
                                 self.op.instance_name,
4129
                                 errors.ECODE_STATE)
4130
    remote_info = self.rpc.call_instance_info(instance.primary_node,
4131
                                              instance.name,
4132
                                              instance.hypervisor)
4133
    remote_info.Raise("Error checking node %s" % instance.primary_node,
4134
                      prereq=True, ecode=errors.ECODE_ENVIRON)
4135
    if remote_info.payload:
4136
      raise errors.OpPrereqError("Instance '%s' is running on the node %s" %
4137
                                 (self.op.instance_name,
4138
                                  instance.primary_node),
4139
                                 errors.ECODE_STATE)
4135
    _CheckInstanceDown(self, instance, "cannot reinstall")
4140 4136

  
4141 4137
    self.op.os_type = getattr(self.op, "os_type", None)
4142 4138
    self.op.force_variant = getattr(self.op, "force_variant", False)
......
4223 4219
    if instance.disk_template == constants.DT_DISKLESS:
4224 4220
      raise errors.OpPrereqError("Instance '%s' has no disks" %
4225 4221
                                 self.op.instance_name, errors.ECODE_INVAL)
4226
    if instance.admin_up:
4227
      raise errors.OpPrereqError("Instance '%s' is marked to be up" %
4228
                                 self.op.instance_name, errors.ECODE_STATE)
4229
    remote_info = self.rpc.call_instance_info(instance.primary_node,
4230
                                              instance.name,
4231
                                              instance.hypervisor)
4232
    remote_info.Raise("Error checking node %s" % instance.primary_node,
4233
                      prereq=True, ecode=errors.ECODE_ENVIRON)
4234
    if remote_info.payload:
4235
      raise errors.OpPrereqError("Instance '%s' is running on the node %s" %
4236
                                 (self.op.instance_name,
4237
                                  instance.primary_node), errors.ECODE_STATE)
4222
    _CheckInstanceDown(self, instance, "cannot recreate disks")
4238 4223

  
4239 4224
    if not self.op.disks:
4240 4225
      self.op.disks = range(len(instance.disks))
......
4289 4274
    instance = self.cfg.GetInstanceInfo(self.op.instance_name)
4290 4275
    assert instance is not None
4291 4276
    _CheckNodeOnline(self, instance.primary_node)
4292

  
4293
    if instance.admin_up:
4294
      raise errors.OpPrereqError("Instance '%s' is marked to be up" %
4295
                                 self.op.instance_name, errors.ECODE_STATE)
4296
    remote_info = self.rpc.call_instance_info(instance.primary_node,
4297
                                              instance.name,
4298
                                              instance.hypervisor)
4299
    remote_info.Raise("Error checking node %s" % instance.primary_node,
4300
                      prereq=True, ecode=errors.ECODE_ENVIRON)
4301
    if remote_info.payload:
4302
      raise errors.OpPrereqError("Instance '%s' is running on the node %s" %
4303
                                 (self.op.instance_name,
4304
                                  instance.primary_node), errors.ECODE_STATE)
4277
    _CheckInstanceDown(self, instance, "cannot rename")
4305 4278
    self.instance = instance
4306 4279

  
4307 4280
    # new name verification
......
8137 8110
      if disk_op == constants.DDM_REMOVE:
8138 8111
        if len(instance.disks) == 1:
8139 8112
          raise errors.OpPrereqError("Cannot remove the last disk of"
8140
                                     " an instance",
8141
                                     errors.ECODE_INVAL)
8142
        ins_l = self.rpc.call_instance_list([pnode], [instance.hypervisor])
8143
        ins_l = ins_l[pnode]
8144
        msg = ins_l.fail_msg
8145
        if msg:
8146
          raise errors.OpPrereqError("Can't contact node %s: %s" %
8147
                                     (pnode, msg), errors.ECODE_ENVIRON)
8148
        if instance.name in ins_l.payload:
8149
          raise errors.OpPrereqError("Instance is running, can't remove"
8150
                                     " disks.", errors.ECODE_STATE)
8113
                                     " an instance", errors.ECODE_INVAL)
8114
        _CheckInstanceDown(self, instance, "cannot remove disks")
8151 8115

  
8152 8116
      if (disk_op == constants.DDM_ADD and
8153 8117
          len(instance.nics) >= constants.MAX_DISKS):

Also available in: Unified diff