Revision fb3891d0 lib/cmdlib/__init__.py

b/lib/cmdlib/__init__.py
66 66
from ganeti.cmdlib.base import ResultWithJobs, LogicalUnit, NoHooksLU, \
67 67
  Tasklet, _QueryBase
68 68
from ganeti.cmdlib.common import _ExpandInstanceName, _ExpandItemName, \
69
  _ExpandNodeName
69
  _ExpandNodeName, _ShareAll
70
from ganeti.cmdlib.tags import LUTagsGet, LUTagsSearch, LUTagsSet, LUTagsDel
70 71

  
71 72
import ganeti.masterd.instance # pylint: disable=W0611
72 73

  
......
82 83
  ]))
83 84

  
84 85

  
85
def _ShareAll():
86
  """Returns a dict declaring all lock levels shared.
87

  
88
  """
89
  return dict.fromkeys(locking.LEVELS, 1)
90

  
91

  
92 86
def _AnnotateDiskParams(instance, devs, cfg):
93 87
  """Little helper wrapper to the rpc annotation method.
94 88

  
......
15377 15371
    return ResultWithJobs(jobs)
15378 15372

  
15379 15373

  
15380
class TagsLU(NoHooksLU): # pylint: disable=W0223
15381
  """Generic tags LU.
15382

  
15383
  This is an abstract class which is the parent of all the other tags LUs.
15384

  
15385
  """
15386
  def ExpandNames(self):
15387
    self.group_uuid = None
15388
    self.needed_locks = {}
15389

  
15390
    if self.op.kind == constants.TAG_NODE:
15391
      self.op.name = _ExpandNodeName(self.cfg, self.op.name)
15392
      lock_level = locking.LEVEL_NODE
15393
      lock_name = self.op.name
15394
    elif self.op.kind == constants.TAG_INSTANCE:
15395
      self.op.name = _ExpandInstanceName(self.cfg, self.op.name)
15396
      lock_level = locking.LEVEL_INSTANCE
15397
      lock_name = self.op.name
15398
    elif self.op.kind == constants.TAG_NODEGROUP:
15399
      self.group_uuid = self.cfg.LookupNodeGroup(self.op.name)
15400
      lock_level = locking.LEVEL_NODEGROUP
15401
      lock_name = self.group_uuid
15402
    elif self.op.kind == constants.TAG_NETWORK:
15403
      self.network_uuid = self.cfg.LookupNetwork(self.op.name)
15404
      lock_level = locking.LEVEL_NETWORK
15405
      lock_name = self.network_uuid
15406
    else:
15407
      lock_level = None
15408
      lock_name = None
15409

  
15410
    if lock_level and getattr(self.op, "use_locking", True):
15411
      self.needed_locks[lock_level] = lock_name
15412

  
15413
    # FIXME: Acquire BGL for cluster tag operations (as of this writing it's
15414
    # not possible to acquire the BGL based on opcode parameters)
15415

  
15416
  def CheckPrereq(self):
15417
    """Check prerequisites.
15418

  
15419
    """
15420
    if self.op.kind == constants.TAG_CLUSTER:
15421
      self.target = self.cfg.GetClusterInfo()
15422
    elif self.op.kind == constants.TAG_NODE:
15423
      self.target = self.cfg.GetNodeInfo(self.op.name)
15424
    elif self.op.kind == constants.TAG_INSTANCE:
15425
      self.target = self.cfg.GetInstanceInfo(self.op.name)
15426
    elif self.op.kind == constants.TAG_NODEGROUP:
15427
      self.target = self.cfg.GetNodeGroup(self.group_uuid)
15428
    elif self.op.kind == constants.TAG_NETWORK:
15429
      self.target = self.cfg.GetNetwork(self.network_uuid)
15430
    else:
15431
      raise errors.OpPrereqError("Wrong tag type requested (%s)" %
15432
                                 str(self.op.kind), errors.ECODE_INVAL)
15433

  
15434

  
15435
class LUTagsGet(TagsLU):
15436
  """Returns the tags of a given object.
15437

  
15438
  """
15439
  REQ_BGL = False
15440

  
15441
  def ExpandNames(self):
15442
    TagsLU.ExpandNames(self)
15443

  
15444
    # Share locks as this is only a read operation
15445
    self.share_locks = _ShareAll()
15446

  
15447
  def Exec(self, feedback_fn):
15448
    """Returns the tag list.
15449

  
15450
    """
15451
    return list(self.target.GetTags())
15452

  
15453

  
15454
class LUTagsSearch(NoHooksLU):
15455
  """Searches the tags for a given pattern.
15456

  
15457
  """
15458
  REQ_BGL = False
15459

  
15460
  def ExpandNames(self):
15461
    self.needed_locks = {}
15462

  
15463
  def CheckPrereq(self):
15464
    """Check prerequisites.
15465

  
15466
    This checks the pattern passed for validity by compiling it.
15467

  
15468
    """
15469
    try:
15470
      self.re = re.compile(self.op.pattern)
15471
    except re.error, err:
15472
      raise errors.OpPrereqError("Invalid search pattern '%s': %s" %
15473
                                 (self.op.pattern, err), errors.ECODE_INVAL)
15474

  
15475
  def Exec(self, feedback_fn):
15476
    """Returns the tag list.
15477

  
15478
    """
15479
    cfg = self.cfg
15480
    tgts = [("/cluster", cfg.GetClusterInfo())]
15481
    ilist = cfg.GetAllInstancesInfo().values()
15482
    tgts.extend([("/instances/%s" % i.name, i) for i in ilist])
15483
    nlist = cfg.GetAllNodesInfo().values()
15484
    tgts.extend([("/nodes/%s" % n.name, n) for n in nlist])
15485
    tgts.extend(("/nodegroup/%s" % n.name, n)
15486
                for n in cfg.GetAllNodeGroupsInfo().values())
15487
    results = []
15488
    for path, target in tgts:
15489
      for tag in target.GetTags():
15490
        if self.re.search(tag):
15491
          results.append((path, tag))
15492
    return results
15493

  
15494

  
15495
class LUTagsSet(TagsLU):
15496
  """Sets a tag on a given object.
15497

  
15498
  """
15499
  REQ_BGL = False
15500

  
15501
  def CheckPrereq(self):
15502
    """Check prerequisites.
15503

  
15504
    This checks the type and length of the tag name and value.
15505

  
15506
    """
15507
    TagsLU.CheckPrereq(self)
15508
    for tag in self.op.tags:
15509
      objects.TaggableObject.ValidateTag(tag)
15510

  
15511
  def Exec(self, feedback_fn):
15512
    """Sets the tag.
15513

  
15514
    """
15515
    try:
15516
      for tag in self.op.tags:
15517
        self.target.AddTag(tag)
15518
    except errors.TagError, err:
15519
      raise errors.OpExecError("Error while setting tag: %s" % str(err))
15520
    self.cfg.Update(self.target, feedback_fn)
15521

  
15522

  
15523
class LUTagsDel(TagsLU):
15524
  """Delete a list of tags from a given object.
15525

  
15526
  """
15527
  REQ_BGL = False
15528

  
15529
  def CheckPrereq(self):
15530
    """Check prerequisites.
15531

  
15532
    This checks that we have the given tag.
15533

  
15534
    """
15535
    TagsLU.CheckPrereq(self)
15536
    for tag in self.op.tags:
15537
      objects.TaggableObject.ValidateTag(tag)
15538
    del_tags = frozenset(self.op.tags)
15539
    cur_tags = self.target.GetTags()
15540

  
15541
    diff_tags = del_tags - cur_tags
15542
    if diff_tags:
15543
      diff_names = ("'%s'" % i for i in sorted(diff_tags))
15544
      raise errors.OpPrereqError("Tag(s) %s not found" %
15545
                                 (utils.CommaJoin(diff_names), ),
15546
                                 errors.ECODE_NOENT)
15547

  
15548
  def Exec(self, feedback_fn):
15549
    """Remove the tag from the object.
15550

  
15551
    """
15552
    for tag in self.op.tags:
15553
      self.target.RemoveTag(tag)
15554
    self.cfg.Update(self.target, feedback_fn)
15555

  
15556

  
15557 15374
class LUTestDelay(NoHooksLU):
15558 15375
  """Sleep for a specified amount of time.
15559 15376

  

Also available in: Unified diff