From 5e0f3e144b8a6359cbe38ef4c18343c955b69bcb Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Tue, 11 Oct 2016 07:34:43 +0200 Subject: [PATCH] fix perf when libvirt is >=2.0.0 and <2.3.0 Closes-bug: #1632207 Change-Id: I311e612035a86981ad315872eade0e107ad87e07 (cherry picked from commit f86dbd880478d5476bde2fce1f560d1ff8ac0018) --- ceilometer/compute/virt/libvirt/inspector.py | 5 ++++- .../unit/compute/virt/libvirt/test_inspector.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ceilometer/compute/virt/libvirt/inspector.py b/ceilometer/compute/virt/libvirt/inspector.py index f662da1c..a70be68e 100644 --- a/ceilometer/compute/virt/libvirt/inspector.py +++ b/ceilometer/compute/virt/libvirt/inspector.py @@ -291,7 +291,10 @@ class LibvirtInspector(virt_inspector.Inspector): instructions=perf["perf.instructions"], cache_references=perf["perf.cache_references"], cache_misses=perf["perf.cache_misses"]) - except AttributeError as e: + # NOTE(sileht): KeyError if for libvirt >=2.0.0,<2.3.0, the perf + # subsystem ws existing but not these attributes + # https://github.com/libvirt/libvirt/commit/bae660869de0612bee2a740083fb494c27e3f80c + except (AttributeError, KeyError) as e: msg = _LE('Perf is not supported by current version of libvirt, ' 'and failed to inspect perf events of ' '%(instance_uuid)s, can not get info from libvirt: ' diff --git a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py index 0705c6c5..041dcb62 100644 --- a/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py +++ b/ceilometer/tests/unit/compute/virt/libvirt/test_inspector.py @@ -404,6 +404,20 @@ class TestLibvirtInspection(base.BaseTestCase): self.assertEqual(74184, pe.cache_references) self.assertEqual(16737, pe.cache_misses) + def test_inspect_perf_events_libvirt_less_than_2_3_0(self): + fake_stats = [({}, {})] + connection = self.inspector.connection + with mock.patch.object(connection, 'lookupByUUIDString', + return_value=self.domain): + with mock.patch.object(self.domain, 'info', + return_value=(0, 0, 51200, + 2, 999999)): + with mock.patch.object(connection, 'domainListGetStats', + return_value=fake_stats): + self.assertRaises(virt_inspector.NoDataException, + self.inspector.inspect_perf_events, + self.instance) + class TestLibvirtInspectionWithError(base.BaseTestCase):