From 3b14d40a27ba3ceea418e6c0eb18dd2e9fbef6c6 Mon Sep 17 00:00:00 2001 From: Ildar Svetlov Date: Wed, 13 Jul 2016 16:47:59 +0300 Subject: [PATCH] Retrieval of RBD device information issue Libvirt still doesnt support retrieval of RBD device information. Fix skip "network" type devices and send message to LogWarning. Change-Id: I1b8adb97d6f86c8fbe09a89760c5e1a776639b08 Partial-Bug: #1457440 --- ceilometer/compute/virt/libvirt/inspector.py | 32 +++++++++++-------- .../compute/virt/libvirt/test_inspector.py | 32 +++++++++++++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/ceilometer/compute/virt/libvirt/inspector.py b/ceilometer/compute/virt/libvirt/inspector.py index 6f879c32..7eb2f5ae 100644 --- a/ceilometer/compute/virt/libvirt/inspector.py +++ b/ceilometer/compute/virt/libvirt/inspector.py @@ -22,7 +22,7 @@ import six from ceilometer.compute.pollsters import util from ceilometer.compute.virt import inspector as virt_inspector -from ceilometer.i18n import _ +from ceilometer.i18n import _LW, _ libvirt = None @@ -205,19 +205,25 @@ class LibvirtInspector(virt_inspector.Inspector): def inspect_disk_info(self, instance): domain = self._get_domain_not_shut_off_or_raise(instance) - tree = etree.fromstring(domain.XMLDesc(0)) - for device in filter( - bool, - [target.get("dev") - for target in tree.findall('devices/disk/target')]): - disk = virt_inspector.Disk(device=device) - block_info = domain.blockInfo(device) - info = virt_inspector.DiskInfo(capacity=block_info[0], - allocation=block_info[1], - physical=block_info[2]) - - yield (disk, info) + for disk in tree.findall('devices/disk'): + disk_type = disk.get('type') + if disk_type: + if disk_type == 'network': + LOG.warning( + _LW('Inspection disk usage of network disk ' + '%(instance_uuid)s unsupported by libvirt') % { + 'instance_uuid': instance.id}) + continue + target = disk.find('target') + device = target.get('dev') + if device: + dsk = virt_inspector.Disk(device=device) + block_info = domain.blockInfo(device) + info = virt_inspector.DiskInfo(capacity=block_info[0], + allocation=block_info[1], + physical=block_info[2]) + yield (dsk, info) def inspect_memory_resident(self, instance, duration=None): domain = self._get_domain_not_shut_off_or_raise(instance) diff --git a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py index 16220cfa..7a7c172d 100644 --- a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py +++ b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py @@ -303,6 +303,38 @@ class TestLibvirtInspection(base.BaseTestCase): self.assertEqual(2, info0.allocation) self.assertEqual(3, info0.physical) + def test_inspect_disk_info_network_type(self): + dom_xml = """ + + + + + + + +
+ + + + """ + + with contextlib.ExitStack() as stack: + stack.enter_context(mock.patch.object(self.inspector.connection, + 'lookupByUUIDString', + return_value=self.domain)) + stack.enter_context(mock.patch.object(self.domain, 'XMLDesc', + return_value=dom_xml)) + stack.enter_context(mock.patch.object(self.domain, 'blockInfo', + return_value=(1, 2, 3, + -1))) + stack.enter_context(mock.patch.object(self.domain, 'info', + return_value=(0, 0, 0, + 2, 999999))) + disks = list(self.inspector.inspect_disk_info(self.instance)) + + self.assertEqual(0, len(disks)) + def test_inspect_memory_usage_with_domain_shutoff(self): connection = self.inspector.connection with mock.patch.object(connection, 'lookupByUUIDString',