Revision 96431562

b/lib/cmdlib/group.py
28 28
from ganeti import errors
29 29
from ganeti import locking
30 30
from ganeti import objects
31
from ganeti import qlang
32 31
from ganeti import query
33 32
from ganeti import utils
34 33
from ganeti.masterd import iallocator
......
289 288
  FIELDS = query.GROUP_FIELDS
290 289

  
291 290
  def ExpandNames(self, lu):
292
    lu.needed_locks = {}
293

  
294
    self._all_groups = lu.cfg.GetAllNodeGroupsInfo()
295
    self._cluster = lu.cfg.GetClusterInfo()
296
    name_to_uuid = dict((g.name, g.uuid) for g in self._all_groups.values())
297

  
298
    if not self.names:
299
      self.wanted = [name_to_uuid[name]
300
                     for name in utils.NiceSort(name_to_uuid.keys())]
301
    else:
302
      # Accept names to be either names or UUIDs.
303
      missing = []
304
      self.wanted = []
305
      all_uuid = frozenset(self._all_groups.keys())
306

  
307
      for name in self.names:
308
        if name in all_uuid:
309
          self.wanted.append(name)
310
        elif name in name_to_uuid:
311
          self.wanted.append(name_to_uuid[name])
312
        else:
313
          missing.append(name)
314

  
315
      if missing:
316
        raise errors.OpPrereqError("Some groups do not exist: %s" %
317
                                   utils.CommaJoin(missing),
318
                                   errors.ECODE_NOENT)
291
    raise NotImplementedError
319 292

  
320 293
  def DeclareLocks(self, lu, level):
321 294
    pass
322 295

  
323 296
  def _GetQueryData(self, lu):
324
    """Computes the list of node groups and their attributes.
325

  
326
    """
327
    do_nodes = query.GQ_NODE in self.requested_data
328
    do_instances = query.GQ_INST in self.requested_data
329

  
330
    group_to_nodes = None
331
    group_to_instances = None
332

  
333
    # For GQ_NODE, we need to map group->[nodes], and group->[instances] for
334
    # GQ_INST. The former is attainable with just GetAllNodesInfo(), but for the
335
    # latter GetAllInstancesInfo() is not enough, for we have to go through
336
    # instance->node. Hence, we will need to process nodes even if we only need
337
    # instance information.
338
    if do_nodes or do_instances:
339
      all_nodes = lu.cfg.GetAllNodesInfo()
340
      group_to_nodes = dict((uuid, []) for uuid in self.wanted)
341
      node_to_group = {}
342

  
343
      for node in all_nodes.values():
344
        if node.group in group_to_nodes:
345
          group_to_nodes[node.group].append(node.uuid)
346
          node_to_group[node.uuid] = node.group
347

  
348
      if do_instances:
349
        all_instances = lu.cfg.GetAllInstancesInfo()
350
        group_to_instances = dict((uuid, []) for uuid in self.wanted)
351

  
352
        for instance in all_instances.values():
353
          node = instance.primary_node
354
          if node in node_to_group:
355
            group_to_instances[node_to_group[node]].append(instance.uuid)
356

  
357
        if not do_nodes:
358
          # Do not pass on node information if it was not requested.
359
          group_to_nodes = None
360

  
361
    return query.GroupQueryData(self._cluster,
362
                                [self._all_groups[uuid]
363
                                 for uuid in self.wanted],
364
                                group_to_nodes, group_to_instances,
365
                                query.GQ_DISKPARAMS in self.requested_data)
297
    raise NotImplementedError
366 298

  
367 299

  
368 300
class LUGroupQuery(NoHooksLU):
......
372 304
  REQ_BGL = False
373 305

  
374 306
  def CheckArguments(self):
375
    self.gq = GroupQuery(qlang.MakeSimpleFilter("name", self.op.names),
376
                          self.op.output_fields, False)
307
    raise NotImplementedError
377 308

  
378 309
  def ExpandNames(self):
379
    self.gq.ExpandNames(self)
310
    raise NotImplementedError
380 311

  
381 312
  def DeclareLocks(self, level):
382
    self.gq.DeclareLocks(self, level)
313
    raise NotImplementedError
383 314

  
384 315
  def Exec(self, feedback_fn):
385
    return self.gq.OldStyleQuery(self)
316
    raise NotImplementedError
386 317

  
387 318

  
388 319
class LUGroupSetParams(LogicalUnit):
b/lib/cmdlib/query.py
26 26
from ganeti import query
27 27
from ganeti.cmdlib.base import NoHooksLU
28 28
from ganeti.cmdlib.cluster import ClusterQuery
29
from ganeti.cmdlib.group import GroupQuery
30 29
from ganeti.cmdlib.instance_query import InstanceQuery
31 30
from ganeti.cmdlib.misc import ExtStorageQuery
32 31
from ganeti.cmdlib.operating_system import OsQuery
......
36 35
_QUERY_IMPL = {
37 36
  constants.QR_CLUSTER: ClusterQuery,
38 37
  constants.QR_INSTANCE: InstanceQuery,
39
  constants.QR_GROUP: GroupQuery,
40 38
  constants.QR_OS: OsQuery,
41 39
  constants.QR_EXTSTORAGE: ExtStorageQuery,
42 40
  }
b/src/Ganeti/Constants.hs
3338 3338
qrViaOp =
3339 3339
  ConstantUtils.mkSet [qrCluster,
3340 3340
                       qrInstance,
3341
                       qrGroup,
3342 3341
                       qrOs,
3343 3342
                       qrExtstorage]
3344 3343

  
3345 3344
-- | List of resources which can be queried using Local UniX Interface
3346 3345
qrViaLuxi :: FrozenSet String
3347
qrViaLuxi = ConstantUtils.mkSet [qrExport,
3346
qrViaLuxi = ConstantUtils.mkSet [qrGroup,
3347
                                 qrExport,
3348 3348
                                 qrJob,
3349 3349
                                 qrLock,
3350 3350
                                 qrNetwork,

Also available in: Unified diff