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