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