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
