From 0538c375e584b78f85bb29eaa2d3a01e48d9d021 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Wed, 8 Dec 2010 18:54:14 +0100
Subject: [PATCH] objects: Add custom de-/serializing code for query responses
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

… and use them in cmdlib.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: RenΓ© Nussbaumer <rn@google.com>
---
 lib/cmdlib.py  | 11 +++--------
 lib/objects.py | 29 +++++++++++++++++++++++++----
 2 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 0f0506488..04cc20bfb 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -550,9 +550,7 @@ class _QueryBase:
     else:
       fdefs = query.Query(cls.FIELDS, fields).GetFields()
 
-    return {
-      "fields": [fdef.ToDict() for fdef in fdefs],
-      }
+    return objects.QueryFieldsResponse(fields=fdefs).ToDict()
 
   def ExpandNames(self, lu):
     """Expand names for this query.
@@ -584,11 +582,8 @@ class _QueryBase:
     """
     data = self._GetQueryData(lu)
 
-    return {
-      "data": self.query.Query(data),
-      "fields": [fdef.ToDict()
-                 for fdef in self.query.GetFields()],
-      }
+    return objects.QueryResponse(data=self.query.Query(data),
+                                 fields=self.query.GetFields()).ToDict()
 
   def OldStyleQuery(self, lu):
     """Collect data and execute query.
diff --git a/lib/objects.py b/lib/objects.py
index 06a8dc2c5..62b749c39 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -1392,6 +1392,29 @@ class QueryFieldDefinition(ConfigObject):
     ]
 
 
+class _QueryResponseBase(ConfigObject):
+  __slots__ = [
+    "fields",
+    ]
+
+  def ToDict(self):
+    """Custom function for serializing.
+
+    """
+    mydict = super(_QueryResponseBase, self).ToDict()
+    mydict["fields"] = self._ContainerToDicts(mydict["fields"])
+    return mydict
+
+  @classmethod
+  def FromDict(cls, val):
+    """Custom function for de-serializing.
+
+    """
+    obj = super(_QueryResponseBase, cls).FromDict(val)
+    obj.fields = cls._ContainerFromDicts(obj.fields, list, QueryFieldDefinition)
+    return obj
+
+
 class QueryRequest(ConfigObject):
   """Object holding a query request.
 
@@ -1403,7 +1426,7 @@ class QueryRequest(ConfigObject):
     ]
 
 
-class QueryResponse(ConfigObject):
+class QueryResponse(_QueryResponseBase):
   """Object holding the response to a query.
 
   @ivar fields: List of L{QueryFieldDefinition} objects
@@ -1411,7 +1434,6 @@ class QueryResponse(ConfigObject):
 
   """
   __slots__ = [
-    "fields",
     "data",
     ]
 
@@ -1426,14 +1448,13 @@ class QueryFieldsRequest(ConfigObject):
     ]
 
 
-class QueryFieldsResponse(ConfigObject):
+class QueryFieldsResponse(_QueryResponseBase):
   """Object holding the response to a query for fields.
 
   @ivar fields: List of L{QueryFieldDefinition} objects
 
   """
   __slots__ = [
-    "fields",
     ]
 
 
-- 
GitLab