From 31a5d9954225ecd6fff592a681543cf37e961e13 Mon Sep 17 00:00:00 2001
From: Adeodato Simo <dato@google.com>
Date: Wed, 5 Jan 2011 12:40:51 +0000
Subject: [PATCH] cmdlib.py: convert LUQueryGroups to query2

Signed-off-by: Adeodato Simo <dato@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 lib/cmdlib.py | 119 ++++++++++++++++++++++++--------------------------
 1 file changed, 56 insertions(+), 63 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 107f8152a..a148457f3 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -9920,47 +9920,30 @@ class LUAddGroup(LogicalUnit):
     del self.remove_locks[locking.LEVEL_NODEGROUP]
 
 
-class LUQueryGroups(NoHooksLU):
-  """Logical unit for querying node groups.
+class _GroupQuery(_QueryBase):
 
-  """
-  # pylint: disable-msg=W0142
-  REQ_BGL = False
-  _FIELDS_DYNAMIC = utils.FieldSet()
-  _SIMPLE_FIELDS = ["name", "uuid", "alloc_policy",
-                    "ctime", "mtime", "serial_no"]
-  _FIELDS_STATIC = utils.FieldSet("node_cnt", "node_list", "pinst_cnt",
-                                  "pinst_list", *_SIMPLE_FIELDS)
-
-  def CheckArguments(self):
-    _CheckOutputFields(static=self._FIELDS_STATIC,
-                       dynamic=self._FIELDS_DYNAMIC,
-                       selected=self.op.output_fields)
+  FIELDS = query.GROUP_FIELDS
 
-  def ExpandNames(self):
-    self.needed_locks = {}
-
-  def Exec(self, feedback_fn):
-    """Computes the list of groups and their attributes.
+  def ExpandNames(self, lu):
+    lu.needed_locks = {}
 
-    """
-    all_groups = self.cfg.GetAllNodeGroupsInfo()
-    name_to_uuid = dict((g.name, g.uuid) for g in all_groups.values())
+    self._all_groups = lu.cfg.GetAllNodeGroupsInfo()
+    name_to_uuid = dict((g.name, g.uuid) for g in self._all_groups.values())
 
-    if not self.op.names:
-      sorted_names = utils.NiceSort(name_to_uuid.keys())
-      my_groups = [name_to_uuid[n] for n in sorted_names]
+    if not self.names:
+      self.wanted = [name_to_uuid[name]
+                     for name in utils.NiceSort(name_to_uuid.keys())]
     else:
       # Accept names to be either names or UUIDs.
-      all_uuid = frozenset(all_groups.keys())
-      my_groups = []
       missing = []
+      self.wanted = []
+      all_uuid = frozenset(self._all_groups.keys())
 
-      for name in self.op.names:
+      for name in self.names:
         if name in all_uuid:
-          my_groups.append(name)
+          self.wanted.append(name)
         elif name in name_to_uuid:
-          my_groups.append(name_to_uuid[name])
+          self.wanted.append(name_to_uuid[name])
         else:
           missing.append(name)
 
@@ -9968,18 +9951,27 @@ class LUQueryGroups(NoHooksLU):
         raise errors.OpPrereqError("Some groups do not exist: %s" % missing,
                                    errors.ECODE_NOENT)
 
-    do_nodes = bool(frozenset(["node_cnt", "node_list"]).
-                    intersection(self.op.output_fields))
+  def DeclareLocks(self, lu, level):
+    pass
 
-    do_instances = bool(frozenset(["pinst_cnt", "pinst_list"]).
-                        intersection(self.op.output_fields))
+  def _GetQueryData(self, lu):
+    """Computes the list of node groups and their attributes.
 
-    # We need to map group->[nodes], and group->[instances]. The former is
-    # directly attainable, but the latter we have to do through instance->node,
-    # hence we need to process nodes even if we only need instance information.
+    """
+    do_nodes = query.GQ_NODE in self.requested_data
+    do_instances = query.GQ_INST in self.requested_data
+
+    group_to_nodes = None
+    group_to_instances = None
+
+    # For GQ_NODE, we need to map group->[nodes], and group->[instances] for
+    # GQ_INST. The former is attainable with just GetAllNodesInfo(), but for the
+    # latter GetAllInstancesInfo() is not enough, for we have to go through
+    # instance->node. Hence, we will need to process nodes even if we only need
+    # instance information.
     if do_nodes or do_instances:
-      all_nodes = self.cfg.GetAllNodesInfo()
-      group_to_nodes = dict((all_groups[name].uuid, []) for name in my_groups)
+      all_nodes = lu.cfg.GetAllNodesInfo()
+      group_to_nodes = dict((uuid, []) for uuid in self.wanted)
       node_to_group = {}
 
       for node in all_nodes.values():
@@ -9988,37 +9980,37 @@ class LUQueryGroups(NoHooksLU):
           node_to_group[node.name] = node.group
 
       if do_instances:
-        all_instances = self.cfg.GetAllInstancesInfo()
-        group_to_instances = dict((all_groups[name].uuid, [])
-                                  for name in my_groups)
+        all_instances = lu.cfg.GetAllInstancesInfo()
+        group_to_instances = dict((uuid, []) for uuid in self.wanted)
+
         for instance in all_instances.values():
           node = instance.primary_node
           if node in node_to_group:
             group_to_instances[node_to_group[node]].append(instance.name)
 
-    output = []
+        if not do_nodes:
+          # Do not pass on node information if it was not requested.
+          group_to_nodes = None
 
-    for uuid in my_groups:
-      group = all_groups[uuid]
-      group_output = []
+    return query.GroupQueryData([self._all_groups[uuid]
+                                 for uuid in self.wanted],
+                                group_to_nodes, group_to_instances)
 
-      for field in self.op.output_fields:
-        if field in self._SIMPLE_FIELDS:
-          val = getattr(group, field)
-        elif field == "node_list":
-          val = utils.NiceSort(group_to_nodes[group.uuid])
-        elif field == "node_cnt":
-          val = len(group_to_nodes[group.uuid])
-        elif field == "pinst_list":
-          val = utils.NiceSort(group_to_instances[group.uuid])
-        elif field == "pinst_cnt":
-          val = len(group_to_instances[group.uuid])
-        else:
-          raise errors.ParameterError(field)
-        group_output.append(val)
-      output.append(group_output)
 
-    return output
+class LUQueryGroups(NoHooksLU):
+  """Logical unit for querying node groups.
+
+  """
+  REQ_BGL = False
+
+  def CheckArguments(self):
+    self.gq = _GroupQuery(self.op.names, self.op.output_fields, False)
+
+  def ExpandNames(self):
+    self.gq.ExpandNames(self)
+
+  def Exec(self, feedback_fn):
+    return self.gq.OldStyleQuery(self)
 
 
 class LUSetGroupParams(LogicalUnit):
@@ -11016,6 +11008,7 @@ class LUTestAllocator(NoHooksLU):
 _QUERY_IMPL = {
   constants.QR_INSTANCE: _InstanceQuery,
   constants.QR_NODE: _NodeQuery,
+  constants.QR_GROUP: _GroupQuery,
   }
 
 
-- 
GitLab