Instance's 'disks' slot will contain a list of disk UUIDs. Create a new
slot named 'disks_info' which will be annotated with the disk objects'
during the RPC.

Signed-off-by: Ilias Tsitsimpis <[email protected]>
---
 lib/backend.py                 | 14 +++++++-------
 lib/objects.py                 |  4 +++-
 lib/rpc/node.py                |  2 +-
 test/py/ganeti.rpc_unittest.py | 10 +++++-----
 4 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/lib/backend.py b/lib/backend.py
index f277732..aab5160 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -1519,7 +1519,7 @@ def GetInstanceMigratable(instance):
   if iname not in hyper.ListInstances(instance.hvparams):
     _Fail("Instance %s is not running", iname)
 
-  for idx in range(len(instance.disks)):
+  for idx in range(len(instance.disks_info)):
     link_name = _GetBlockDevSymlinkPath(iname, idx)
     if not os.path.islink(link_name):
       logging.warning("Instance %s is missing symlink %s for disk %d",
@@ -1805,7 +1805,7 @@ def _GatherAndLinkBlockDevs(instance):
 
   """
   block_devices = []
-  for idx, disk in enumerate(instance.disks):
+  for idx, disk in enumerate(instance.disks_info):
     device = _RecursiveFindBD(disk)
     if device is None:
       raise errors.BlockDeviceError("Block device '%s' is not set up." %
@@ -1853,7 +1853,7 @@ def StartInstance(instance, startup_paused, reason, 
store_reason=True):
   except errors.BlockDeviceError, err:
     _Fail("Block device error: %s", err, exc=True)
   except errors.HypervisorError, err:
-    _RemoveBlockDevLinks(instance.name, instance.disks)
+    _RemoveBlockDevLinks(instance.name, instance.disks_info)
     _Fail("Hypervisor error: %s", err, exc=True)
 
 
@@ -1929,7 +1929,7 @@ def InstanceShutdown(instance, timeout, reason, 
store_reason=True):
   except errors.HypervisorError, err:
     logging.warning("Failed to execute post-shutdown cleanup step: %s", err)
 
-  _RemoveBlockDevLinks(iname, instance.disks)
+  _RemoveBlockDevLinks(iname, instance.disks_info)
 
 
 def InstanceReboot(instance, reboot_type, shutdown_timeout, reason):
@@ -2040,7 +2040,7 @@ def AcceptInstance(instance, info, target):
     hyper.AcceptInstance(instance, info, target)
   except errors.HypervisorError, err:
     if instance.disk_template in constants.DTS_EXT_MIRROR:
-      _RemoveBlockDevLinks(instance.name, instance.disks)
+      _RemoveBlockDevLinks(instance.name, instance.disks_info)
     _Fail("Failed to accept instance: %s", err, exc=True)
 
 
@@ -3178,13 +3178,13 @@ def OSEnvironment(instance, inst_os, debug=0):
     result["INSTANCE_%s" % attr.upper()] = str(getattr(instance, attr))
 
   result["HYPERVISOR"] = instance.hypervisor
-  result["DISK_COUNT"] = "%d" % len(instance.disks)
+  result["DISK_COUNT"] = "%d" % len(instance.disks_info)
   result["NIC_COUNT"] = "%d" % len(instance.nics)
   result["INSTANCE_SECONDARY_NODES"] = \
       ("%s" % " ".join(instance.secondary_nodes))
 
   # Disks
-  for idx, disk in enumerate(instance.disks):
+  for idx, disk in enumerate(instance.disks_info):
     real_disk = _OpenRealBD(disk)
     result["DISK_%d_PATH" % idx] = real_disk.dev_path
     result["DISK_%d_ACCESS" % idx] = disk.mode
diff --git a/lib/objects.py b/lib/objects.py
index 4281126..49d6e9c 100644
--- a/lib/objects.py
+++ b/lib/objects.py
@@ -1152,6 +1152,7 @@ class Instance(TaggableObject):
     "admin_state",
     "nics",
     "disks",
+    "disks_info",
     "disk_template",
     "disks_active",
     "network_port",
@@ -1193,7 +1194,7 @@ class Instance(TaggableObject):
     if _with_private:
       bo["osparams_private"] = self.osparams_private.Unprivate()
 
-    for attr in "nics", "disks":
+    for attr in "nics", "disks", "disks_info":
       alist = bo.get(attr, None)
       if alist:
         nlist = outils.ContainerToDicts(alist)
@@ -1217,6 +1218,7 @@ class Instance(TaggableObject):
     obj = super(Instance, cls).FromDict(val)
     obj.nics = outils.ContainerFromDicts(obj.nics, list, NIC)
     obj.disks = outils.ContainerFromDicts(obj.disks, list, Disk)
+    obj.disks_info = outils.ContainerFromDicts(obj.disks_info, list, Disk)
     return obj
 
   def UpgradeConfig(self):
diff --git a/lib/rpc/node.py b/lib/rpc/node.py
index af58b61..30431f0 100644
--- a/lib/rpc/node.py
+++ b/lib/rpc/node.py
@@ -886,7 +886,7 @@ class RpcRunner(_RpcClientBase,
     idict["osparams"] = cluster.SimpleFillOS(instance.os, instance.osparams)
     if osp is not None:
       idict["osparams"].update(osp)
-    idict["disks"] = self._DisksDictDP(node, (instance.disks, instance))
+    idict["disks_info"] = self._DisksDictDP(node, (instance.disks, instance))
     for nic in idict["nics"]:
       nic["nicparams"] = objects.FillDict(
         cluster.nicparams[constants.PP_DEFAULT],
diff --git a/test/py/ganeti.rpc_unittest.py b/test/py/ganeti.rpc_unittest.py
index 1fc61e2..82cf05c 100755
--- a/test/py/ganeti.rpc_unittest.py
+++ b/test/py/ganeti.rpc_unittest.py
@@ -887,11 +887,11 @@ class TestRpcRunner(unittest.TestCase):
     self.assertEqual(result["hvparams"][constants.HT_KVM], {
       constants.HV_BOOT_ORDER: "xyz",
       })
-    del result["disks"][0]["ctime"]
-    del result["disks"][0]["mtime"]
-    del result["disks"][1]["ctime"]
-    del result["disks"][1]["mtime"]
-    self.assertEqual(result["disks"], [{
+    del result["disks_info"][0]["ctime"]
+    del result["disks_info"][0]["mtime"]
+    del result["disks_info"][1]["ctime"]
+    del result["disks_info"][1]["mtime"]
+    self.assertEqual(result["disks_info"], [{
       "dev_type": constants.DT_PLAIN,
       "dynamic_params": {},
       "size": 4096,
-- 
1.9.1

Reply via email to