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
