This attribute is used only in the backend and added automatically
during RPC calls. Therefore, it is just declared in Instance,
but omitted during serialization, and it's deserialized only if
it is really present.

This is the same approach as with Instance.secondary_nodes, but in
addition, disks_info's deserialization must be customized, if present.

Signed-off-by: Petr Pudlak <[email protected]>
---
 lib/objects.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/objects.py b/lib/objects.py
index 86933b2..48032c9 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -1204,7 +1204,7 @@ class Instance(TaggableObject):
     if _with_private:
       bo["osparams_private"] = self.osparams_private.Unprivate()
 
-    for attr in "nics", "disks_info":
+    for attr in "nics", :
       alist = bo.get(attr, None)
       if alist:
         nlist = outils.ContainerToDicts(alist)
@@ -1227,7 +1227,13 @@ class Instance(TaggableObject):
       del val["admin_up"]
     obj = super(Instance, cls).FromDict(val)
     obj.nics = outils.ContainerFromDicts(obj.nics, list, NIC)
-    obj.disks_info = outils.ContainerFromDicts(obj.disks_info, list, Disk)
+
+    # attribute 'disks_info' is only present when deserializing from a RPC
+    # call in the backend
+    disks_info = getattr(obj, "disks_info", None)
+    if disks_info:
+      obj.disks_info = outils.ContainerFromDicts(disks_info, list, Disk)
+
     return obj
 
   def UpgradeConfig(self):
-- 
2.0.0.526.g5318336

Reply via email to