Revision 3f3ea14c lib/cmdlib/instance.py

b/lib/cmdlib/instance.py
54 54
  CheckNodesFreeDiskPerVG, WipeDisks, WipeOrCleanupDisks, WaitForSync, \
55 55
  IsExclusiveStorageEnabledNodeName, CreateSingleBlockDev, ComputeDisks, \
56 56
  CheckRADOSFreeSpace, ComputeDiskSizePerVG, GenerateDiskTemplate, \
57
  StartInstanceDisks, ShutdownInstanceDisks, AssembleInstanceDisks
57
  StartInstanceDisks, ShutdownInstanceDisks, AssembleInstanceDisks, \
58
  CheckSpindlesExclusiveStorage
58 59
from ganeti.cmdlib.instance_utils import BuildInstanceHookEnvByObject, \
59 60
  GetClusterDomainSecret, BuildInstanceHookEnv, NICListToTuple, \
60 61
  NICToTuple, CheckNodeNotDrained, RemoveInstance, CopyLockList, \
......
1025 1026
    if self.op.disk_template in constants.DTS_INT_MIRROR:
1026 1027
      nodes.append(snode)
1027 1028
    has_es = lambda n: IsExclusiveStorageEnabledNode(self.cfg, n)
1028
    if compat.any(map(has_es, nodes)):
1029
      if not self.op.disk_template in constants.DTS_EXCL_STORAGE:
1030
        raise errors.OpPrereqError("Disk template %s not supported with"
1031
                                   " exclusive storage" % self.op.disk_template,
1032
                                   errors.ECODE_STATE)
1029
    excl_stor = compat.any(map(has_es, nodes))
1030
    if excl_stor and not self.op.disk_template in constants.DTS_EXCL_STORAGE:
1031
      raise errors.OpPrereqError("Disk template %s not supported with"
1032
                                 " exclusive storage" % self.op.disk_template,
1033
                                 errors.ECODE_STATE)
1034
    for disk in self.disks:
1035
      CheckSpindlesExclusiveStorage(disk, excl_stor)
1033 1036

  
1034 1037
    nodenames = [pnode.name] + self.secondaries
1035 1038

  
......
2212 2215
        raise errors.ProgrammerError("Unhandled operation '%s'" % op)
2213 2216

  
2214 2217
  @staticmethod
2215
  def _VerifyDiskModification(op, params):
2218
  def _VerifyDiskModification(op, params, excl_stor):
2216 2219
    """Verifies a disk modification.
2217 2220

  
2218 2221
    """
......
2238 2241
      if name is not None and name.lower() == constants.VALUE_NONE:
2239 2242
        params[constants.IDISK_NAME] = None
2240 2243

  
2244
      CheckSpindlesExclusiveStorage(params, excl_stor)
2245

  
2241 2246
    elif op == constants.DDM_MODIFY:
2242 2247
      if constants.IDISK_SIZE in params:
2243 2248
        raise errors.OpPrereqError("Disk size change not possible, use"
......
2614 2619
    instance = self.instance
2615 2620
    self.diskparams = self.cfg.GetInstanceDiskParams(instance)
2616 2621

  
2622
    excl_stor = compat.any(
2623
      rpc.GetExclusiveStorageForNodeNames(self.cfg, instance.all_nodes).values()
2624
      )
2625

  
2617 2626
    # Check disk modifications. This is done here and not in CheckArguments
2618 2627
    # (as with NICs), because we need to know the instance's disk template
2628
    ver_fn = lambda op, par: self._VerifyDiskModification(op, par, excl_stor)
2619 2629
    if instance.disk_template == constants.DT_EXT:
2620
      self._CheckMods("disk", self.op.disks, {},
2621
                      self._VerifyDiskModification)
2630
      self._CheckMods("disk", self.op.disks, {}, ver_fn)
2622 2631
    else:
2623 2632
      self._CheckMods("disk", self.op.disks, constants.IDISK_PARAMS_TYPES,
2624
                      self._VerifyDiskModification)
2633
                      ver_fn)
2625 2634

  
2626 2635
    self.diskmod = _PrepareContainerMods(self.op.disks, None)
2627 2636

  

Also available in: Unified diff