Revision cf26a87a
b/lib/cmdlib.py | ||
---|---|---|
304 | 304 |
else: |
305 | 305 |
assert locking.LEVEL_INSTANCE not in self.needed_locks, \ |
306 | 306 |
"_ExpandAndLockInstance called with instance-level locks set" |
307 |
expanded_name = self.cfg.ExpandInstanceName(self.op.instance_name) |
|
308 |
if expanded_name is None: |
|
309 |
raise errors.OpPrereqError("Instance '%s' not known" % |
|
310 |
self.op.instance_name, errors.ECODE_NOENT) |
|
311 |
self.needed_locks[locking.LEVEL_INSTANCE] = expanded_name |
|
312 |
self.op.instance_name = expanded_name |
|
307 |
self.op.instance_name = _ExpandInstanceName(self.cfg, |
|
308 |
self.op.instance_name) |
|
309 |
self.needed_locks[locking.LEVEL_INSTANCE] = self.op.instance_name |
|
313 | 310 |
|
314 | 311 |
def _LockInstancesNodes(self, primary_only=False): |
315 | 312 |
"""Helper function to declare instances' nodes for locking. |
... | ... | |
444 | 441 |
|
445 | 442 |
wanted = [] |
446 | 443 |
for name in nodes: |
447 |
node = lu.cfg.ExpandNodeName(name) |
|
448 |
if node is None: |
|
449 |
raise errors.OpPrereqError("No such node name '%s'" % name, |
|
450 |
errors.ECODE_NOENT) |
|
444 |
node = _ExpandNodeName(lu.cfg, name) |
|
451 | 445 |
wanted.append(node) |
452 | 446 |
|
453 | 447 |
return utils.NiceSort(wanted) |
... | ... | |
471 | 465 |
errors.ECODE_INVAL) |
472 | 466 |
|
473 | 467 |
if instances: |
474 |
wanted = [] |
|
475 |
|
|
476 |
for name in instances: |
|
477 |
instance = lu.cfg.ExpandInstanceName(name) |
|
478 |
if instance is None: |
|
479 |
raise errors.OpPrereqError("No such instance name '%s'" % name, |
|
480 |
errors.ECODE_NOENT) |
|
481 |
wanted.append(instance) |
|
482 |
|
|
468 |
wanted = [_ExpandInstanceName(lu.cfg, name) for name in instances] |
|
483 | 469 |
else: |
484 | 470 |
wanted = utils.NiceSort(lu.cfg.GetInstanceList()) |
485 | 471 |
return wanted |
... | ... | |
559 | 545 |
errors.ECODE_INVAL) |
560 | 546 |
|
561 | 547 |
|
548 |
def _ExpandItemName(fn, name, kind): |
|
549 |
"""Expand an item name. |
|
550 |
|
|
551 |
@param fn: the function to use for expansion |
|
552 |
@param name: requested item name |
|
553 |
@param kind: text description ('Node' or 'Instance') |
|
554 |
@return: the resolved (full) name |
|
555 |
@raise errors.OpPrereqError: if the item is not found |
|
556 |
|
|
557 |
""" |
|
558 |
full_name = fn(name) |
|
559 |
if full_name is None: |
|
560 |
raise errors.OpPrereqError("%s '%s' not known" % (kind, name), |
|
561 |
errors.ECODE_NOENT) |
|
562 |
return full_name |
|
563 |
|
|
564 |
|
|
565 |
def _ExpandNodeName(cfg, name): |
|
566 |
"""Wrapper over L{_ExpandItemName} for nodes.""" |
|
567 |
return _ExpandItemName(cfg.ExpandNodeName, name, "Node") |
|
568 |
|
|
569 |
|
|
570 |
def _ExpandInstanceName(cfg, name): |
|
571 |
"""Wrapper over L{_ExpandItemName} for instance.""" |
|
572 |
return _ExpandItemName(cfg.ExpandInstanceName, name, "Instance") |
|
573 |
|
|
574 |
|
|
562 | 575 |
def _BuildInstanceHookEnv(name, primary_node, secondary_nodes, os_type, status, |
563 | 576 |
memory, vcpus, nics, disk_template, disks, |
564 | 577 |
bep, hvp, hypervisor_name): |
... | ... | |
1723 | 1736 |
if self.op.instances: |
1724 | 1737 |
self.wanted_names = [] |
1725 | 1738 |
for name in self.op.instances: |
1726 |
full_name = self.cfg.ExpandInstanceName(name) |
|
1727 |
if full_name is None: |
|
1728 |
raise errors.OpPrereqError("Instance '%s' not known" % name, |
|
1729 |
errors.ECODE_NOENT) |
|
1739 |
full_name = _ExpandInstanceName(self.cfg, name) |
|
1730 | 1740 |
self.wanted_names.append(full_name) |
1731 | 1741 |
self.needed_locks = { |
1732 | 1742 |
locking.LEVEL_NODE: [], |
... | ... | |
2447 | 2457 |
Any errors are signaled by raising errors.OpPrereqError. |
2448 | 2458 |
|
2449 | 2459 |
""" |
2450 |
node = self.cfg.GetNodeInfo(self.cfg.ExpandNodeName(self.op.node_name)) |
|
2451 |
if node is None: |
|
2452 |
raise errors.OpPrereqError("Node '%s' is unknown." % self.op.node_name, |
|
2453 |
errors.ECODE_NOENT) |
|
2460 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
2461 |
node = self.cfg.GetNodeInfo(self.op.node_name) |
|
2462 |
assert node is not None |
|
2454 | 2463 |
|
2455 | 2464 |
instance_list = self.cfg.GetInstanceList() |
2456 | 2465 |
|
... | ... | |
2850 | 2859 |
REQ_BGL = False |
2851 | 2860 |
|
2852 | 2861 |
def CheckArguments(self): |
2853 |
node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
2854 |
if node_name is None: |
|
2855 |
raise errors.OpPrereqError("Invalid node name '%s'" % self.op.node_name, |
|
2856 |
errors.ECODE_NOENT) |
|
2857 |
|
|
2858 |
self.op.node_name = node_name |
|
2862 |
self.opnode_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
2859 | 2863 |
|
2860 | 2864 |
storage_type = self.op.storage_type |
2861 | 2865 |
if storage_type not in constants.VALID_STORAGE_TYPES: |
... | ... | |
3129 | 3133 |
REQ_BGL = False |
3130 | 3134 |
|
3131 | 3135 |
def CheckArguments(self): |
3132 |
node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
3133 |
if node_name is None: |
|
3134 |
raise errors.OpPrereqError("Invalid node name '%s'" % self.op.node_name, |
|
3135 |
errors.ECODE_INVAL) |
|
3136 |
self.op.node_name = node_name |
|
3136 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
3137 | 3137 |
_CheckBooleanOpField(self.op, 'master_candidate') |
3138 | 3138 |
_CheckBooleanOpField(self.op, 'offline') |
3139 | 3139 |
_CheckBooleanOpField(self.op, 'drained') |
... | ... | |
3282 | 3282 |
REQ_BGL = False |
3283 | 3283 |
|
3284 | 3284 |
def CheckArguments(self): |
3285 |
node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
3286 |
if node_name is None: |
|
3287 |
raise errors.OpPrereqError("Invalid node name '%s'" % self.op.node_name, |
|
3288 |
errors.ECODE_NOENT) |
|
3289 |
self.op.node_name = node_name |
|
3290 |
if node_name == self.cfg.GetMasterNode() and not self.op.force: |
|
3285 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
3286 |
if self.op.node_name == self.cfg.GetMasterNode() and not self.op.force: |
|
3291 | 3287 |
raise errors.OpPrereqError("The node is the master and the force" |
3292 | 3288 |
" parameter was not set", |
3293 | 3289 |
errors.ECODE_INVAL) |
... | ... | |
3969 | 3965 |
self.op.force_variant = getattr(self.op, "force_variant", False) |
3970 | 3966 |
if self.op.os_type is not None: |
3971 | 3967 |
# OS verification |
3972 |
pnode = self.cfg.GetNodeInfo( |
|
3973 |
self.cfg.ExpandNodeName(instance.primary_node)) |
|
3974 |
if pnode is None: |
|
3975 |
raise errors.OpPrereqError("Primary node '%s' is unknown" % |
|
3976 |
self.op.pnode, errors.ECODE_NOENT) |
|
3977 |
result = self.rpc.call_os_get(pnode.name, self.op.os_type) |
|
3968 |
pnode = _ExpandNodeName(self.cfg, instance.primary_node) |
|
3969 |
result = self.rpc.call_os_get(pnode, self.op.os_type) |
|
3978 | 3970 |
result.Raise("OS '%s' not in supported OS list for primary node %s" % |
3979 |
(self.op.os_type, pnode.name),
|
|
3971 |
(self.op.os_type, pnode), |
|
3980 | 3972 |
prereq=True, ecode=errors.ECODE_INVAL) |
3981 | 3973 |
if not self.op.force_variant: |
3982 | 3974 |
_CheckOSVariant(result.payload, self.op.os_type) |
... | ... | |
4115 | 4107 |
This checks that the instance is in the cluster and is not running. |
4116 | 4108 |
|
4117 | 4109 |
""" |
4118 |
instance = self.cfg.GetInstanceInfo( |
|
4119 |
self.cfg.ExpandInstanceName(self.op.instance_name)) |
|
4120 |
if instance is None: |
|
4121 |
raise errors.OpPrereqError("Instance '%s' not known" % |
|
4122 |
self.op.instance_name, errors.ECODE_NOENT) |
|
4110 |
self.op.instance_name = _ExpandInstanceName(self.cfg, |
|
4111 |
self.op.instance_name) |
|
4112 |
instance = self.cfg.GetInstanceInfo(self.op.instance_name) |
|
4113 |
assert instance is not None |
|
4123 | 4114 |
_CheckNodeOnline(self, instance.primary_node) |
4124 | 4115 |
|
4125 | 4116 |
if instance.admin_up: |
... | ... | |
4780 | 4771 |
|
4781 | 4772 |
def ExpandNames(self): |
4782 | 4773 |
self._ExpandAndLockInstance() |
4783 |
target_node = self.cfg.ExpandNodeName(self.op.target_node) |
|
4784 |
if target_node is None: |
|
4785 |
raise errors.OpPrereqError("Node '%s' not known" % |
|
4786 |
self.op.target_node, errors.ECODE_NOENT) |
|
4774 |
target_node = _ExpandNodeName(self.cfg, self.op.target_node) |
|
4787 | 4775 |
self.op.target_node = target_node |
4788 | 4776 |
self.needed_locks[locking.LEVEL_NODE] = [target_node] |
4789 | 4777 |
self.recalculate_locks[locking.LEVEL_NODE] = constants.LOCKS_APPEND |
... | ... | |
4957 | 4945 |
REQ_BGL = False |
4958 | 4946 |
|
4959 | 4947 |
def ExpandNames(self): |
4960 |
self.op.node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
4961 |
if self.op.node_name is None: |
|
4962 |
raise errors.OpPrereqError("Node '%s' not known" % self.op.node_name, |
|
4963 |
errors.ECODE_NOENT) |
|
4948 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
4964 | 4949 |
|
4965 | 4950 |
self.needed_locks = { |
4966 | 4951 |
locking.LEVEL_NODE: [self.op.node_name], |
... | ... | |
5020 | 5005 |
This checks that the instance is in the cluster. |
5021 | 5006 |
|
5022 | 5007 |
""" |
5023 |
instance = self.cfg.GetInstanceInfo( |
|
5024 |
self.cfg.ExpandInstanceName(self.instance_name)) |
|
5025 |
if instance is None: |
|
5026 |
raise errors.OpPrereqError("Instance '%s' not known" % |
|
5027 |
self.instance_name, errors.ECODE_NOENT) |
|
5008 |
instance_name = _ExpandInstanceName(self.lu.cfg, self.instance_name) |
|
5009 |
instance = self.cfg.GetInstanceInfo(instance_name) |
|
5010 |
assert instance is not None |
|
5028 | 5011 |
|
5029 | 5012 |
if instance.disk_template != constants.DT_DRBD8: |
5030 | 5013 |
raise errors.OpPrereqError("Instance's disk layout is not" |
... | ... | |
5680 | 5663 |
raise errors.OpPrereqError("Cannot do ip checks without a name check", |
5681 | 5664 |
errors.ECODE_INVAL) |
5682 | 5665 |
|
5683 |
def _ExpandNode(self, node): |
|
5684 |
"""Expands and checks one node name. |
|
5685 |
|
|
5686 |
""" |
|
5687 |
node_full = self.cfg.ExpandNodeName(node) |
|
5688 |
if node_full is None: |
|
5689 |
raise errors.OpPrereqError("Unknown node %s" % node, errors.ECODE_NOENT) |
|
5690 |
return node_full |
|
5691 |
|
|
5692 | 5666 |
def ExpandNames(self): |
5693 | 5667 |
"""ExpandNames for CreateInstance. |
5694 | 5668 |
|
... | ... | |
5868 | 5842 |
if self.op.iallocator: |
5869 | 5843 |
self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET |
5870 | 5844 |
else: |
5871 |
self.op.pnode = self._ExpandNode(self.op.pnode)
|
|
5845 |
self.op.pnode = _ExpandNodeName(self.cfg, self.op.pnode)
|
|
5872 | 5846 |
nodelist = [self.op.pnode] |
5873 | 5847 |
if self.op.snode is not None: |
5874 |
self.op.snode = self._ExpandNode(self.op.snode)
|
|
5848 |
self.op.snode = _ExpandNodeName(self.cfg, self.op.snode)
|
|
5875 | 5849 |
nodelist.append(self.op.snode) |
5876 | 5850 |
self.needed_locks[locking.LEVEL_NODE] = nodelist |
5877 | 5851 |
|
... | ... | |
5891 | 5865 |
" path requires a source node option.", |
5892 | 5866 |
errors.ECODE_INVAL) |
5893 | 5867 |
else: |
5894 |
self.op.src_node = src_node = self._ExpandNode(src_node)
|
|
5868 |
self.op.src_node = src_node = _ExpandNodeName(self.cfg, src_node)
|
|
5895 | 5869 |
if self.needed_locks[locking.LEVEL_NODE] is not locking.ALL_SET: |
5896 | 5870 |
self.needed_locks[locking.LEVEL_NODE].append(src_node) |
5897 | 5871 |
if not os.path.isabs(src_path): |
... | ... | |
6372 | 6346 |
self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET |
6373 | 6347 |
|
6374 | 6348 |
elif self.op.remote_node is not None: |
6375 |
remote_node = self.cfg.ExpandNodeName(self.op.remote_node) |
|
6376 |
if remote_node is None: |
|
6377 |
raise errors.OpPrereqError("Node '%s' not known" % |
|
6378 |
self.op.remote_node, errors.ECODE_NOENT) |
|
6379 |
|
|
6349 |
remote_node = _ExpandNodeName(self.cfg, self.op.remote_node) |
|
6380 | 6350 |
self.op.remote_node = remote_node |
6381 | 6351 |
|
6382 | 6352 |
# Warning: do not remove the locking of the new secondary here |
... | ... | |
6447 | 6417 |
self.op.iallocator) |
6448 | 6418 |
|
6449 | 6419 |
def ExpandNames(self): |
6450 |
self.op.node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
6451 |
if self.op.node_name is None: |
|
6452 |
raise errors.OpPrereqError("Node '%s' not known" % self.op.node_name, |
|
6453 |
errors.ECODE_NOENT) |
|
6420 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
6454 | 6421 |
|
6455 | 6422 |
self.needed_locks = {} |
6456 | 6423 |
|
... | ... | |
6459 | 6426 |
self.needed_locks[locking.LEVEL_NODE] = locking.ALL_SET |
6460 | 6427 |
|
6461 | 6428 |
elif self.op.remote_node is not None: |
6462 |
remote_node = self.cfg.ExpandNodeName(self.op.remote_node) |
|
6463 |
if remote_node is None: |
|
6464 |
raise errors.OpPrereqError("Node '%s' not known" % |
|
6465 |
self.op.remote_node, errors.ECODE_NOENT) |
|
6466 |
|
|
6467 |
self.op.remote_node = remote_node |
|
6429 |
self.op.remote_node = _ExpandNodeName(self.cfg, self.op.remote_node) |
|
6468 | 6430 |
|
6469 | 6431 |
# Warning: do not remove the locking of the new secondary here |
6470 | 6432 |
# unless DRBD8.AddChildren is changed to work in parallel; |
6471 | 6433 |
# currently it doesn't since parallel invocations of |
6472 | 6434 |
# FindUnusedMinor will conflict |
6473 |
self.needed_locks[locking.LEVEL_NODE] = [remote_node] |
|
6435 |
self.needed_locks[locking.LEVEL_NODE] = [self.op.remote_node]
|
|
6474 | 6436 |
self.recalculate_locks[locking.LEVEL_NODE] = constants.LOCKS_APPEND |
6475 | 6437 |
|
6476 | 6438 |
else: |
... | ... | |
7199 | 7161 |
REQ_BGL = False |
7200 | 7162 |
|
7201 | 7163 |
def CheckArguments(self): |
7202 |
node_name = self.cfg.ExpandNodeName(self.op.node_name) |
|
7203 |
if node_name is None: |
|
7204 |
raise errors.OpPrereqError("Invalid node name '%s'" % self.op.node_name, |
|
7205 |
errors.ECODE_NOENT) |
|
7206 |
|
|
7207 |
self.op.node_name = node_name |
|
7164 |
self.op.node_name = _ExpandNodeName(self.cfg, self.op.node_name) |
|
7208 | 7165 |
|
7209 | 7166 |
def ExpandNames(self): |
7210 | 7167 |
self.needed_locks = { |
... | ... | |
7373 | 7330 |
if self.op.instances: |
7374 | 7331 |
self.wanted_names = [] |
7375 | 7332 |
for name in self.op.instances: |
7376 |
full_name = self.cfg.ExpandInstanceName(name) |
|
7377 |
if full_name is None: |
|
7378 |
raise errors.OpPrereqError("Instance '%s' not known" % name, |
|
7379 |
errors.ECODE_NOENT) |
|
7333 |
full_name = _ExpandInstanceName(self.cfg, name) |
|
7380 | 7334 |
self.wanted_names.append(full_name) |
7381 | 7335 |
self.needed_locks[locking.LEVEL_INSTANCE] = self.wanted_names |
7382 | 7336 |
else: |
... | ... | |
8148 | 8102 |
"Cannot retrieve locked instance %s" % self.op.instance_name |
8149 | 8103 |
_CheckNodeOnline(self, self.instance.primary_node) |
8150 | 8104 |
|
8151 |
self.dst_node = self.cfg.GetNodeInfo( |
|
8152 |
self.cfg.ExpandNodeName(self.op.target_node)) |
|
8105 |
self.op.target_node = _ExpandNodeName(self.cfg, self.op.target_node) |
|
8106 |
self.dst_node = self.cfg.GetNodeInfo(self.op.target_node) |
|
8107 |
assert self.dst_node is not None |
|
8153 | 8108 |
|
8154 |
if self.dst_node is None: |
|
8155 |
# This is wrong node name, not a non-locked node |
|
8156 |
raise errors.OpPrereqError("Wrong node name %s" % self.op.target_node, |
|
8157 |
errors.ECODE_NOENT) |
|
8158 | 8109 |
_CheckNodeOnline(self, self.dst_node.name) |
8159 | 8110 |
_CheckNodeNotDrained(self, self.dst_node.name) |
8160 | 8111 |
|
... | ... | |
8352 | 8303 |
def ExpandNames(self): |
8353 | 8304 |
self.needed_locks = {} |
8354 | 8305 |
if self.op.kind == constants.TAG_NODE: |
8355 |
name = self.cfg.ExpandNodeName(self.op.name) |
|
8356 |
if name is None: |
|
8357 |
raise errors.OpPrereqError("Invalid node name (%s)" % |
|
8358 |
(self.op.name,), errors.ECODE_NOENT) |
|
8359 |
self.op.name = name |
|
8360 |
self.needed_locks[locking.LEVEL_NODE] = name |
|
8306 |
self.op.name = _ExpandNodeName(self.cfg, self.op.name) |
|
8307 |
self.needed_locks[locking.LEVEL_NODE] = self.op.name |
|
8361 | 8308 |
elif self.op.kind == constants.TAG_INSTANCE: |
8362 |
name = self.cfg.ExpandInstanceName(self.op.name) |
|
8363 |
if name is None: |
|
8364 |
raise errors.OpPrereqError("Invalid instance name (%s)" % |
|
8365 |
(self.op.name,), errors.ECODE_NOENT) |
|
8366 |
self.op.name = name |
|
8367 |
self.needed_locks[locking.LEVEL_INSTANCE] = name |
|
8309 |
self.op.name = _ExpandInstanceName(self.cfg, self.op.name) |
|
8310 |
self.needed_locks[locking.LEVEL_INSTANCE] = self.op.name |
|
8368 | 8311 |
|
8369 | 8312 |
def CheckPrereq(self): |
8370 | 8313 |
"""Check prerequisites. |
... | ... | |
8898 | 8841 |
if not hasattr(self.op, "name"): |
8899 | 8842 |
raise errors.OpPrereqError("Missing attribute 'name' on opcode input", |
8900 | 8843 |
errors.ECODE_INVAL) |
8901 |
fname = self.cfg.ExpandInstanceName(self.op.name) |
|
8902 |
if fname is None: |
|
8903 |
raise errors.OpPrereqError("Instance '%s' not found for relocation" % |
|
8904 |
self.op.name, errors.ECODE_NOENT) |
|
8844 |
fname = _ExpandInstanceName(self.cfg, self.op.name) |
|
8905 | 8845 |
self.op.name = fname |
8906 | 8846 |
self.relocate_from = self.cfg.GetInstanceInfo(fname).secondary_nodes |
8907 | 8847 |
else: |
Also available in: Unified diff