From 19e5eb153689a6d66d55a467be2c232c1b1d7dfa Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Wed, 3 Jul 2013 17:01:08 -0400 Subject: [PATCH] Update compute vnic pollster to use cache Use the pollster cache to store the VNIC info for an instance. Eventually the single pollster will be broken up into separate pollsters that all use the cache. blueprint one-meter-per-plugin Change-Id: I8d9af0006d280f26ea768db97608074c5cfc9457 Signed-off-by: Doug Hellmann --- ceilometer/compute/pollsters.py | 17 ++++++++++++++++- tests/compute/test_pollsters.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/ceilometer/compute/pollsters.py b/ceilometer/compute/pollsters.py index ae185a281..62fd36cf2 100644 --- a/ceilometer/compute/pollsters.py +++ b/ceilometer/compute/pollsters.py @@ -275,11 +275,26 @@ class NetPollster(plugin.ComputePollster): 'network.outgoing.bytes', 'network.outgoing.packets'] + CACHE_KEY_VNIC = 'vnics' + + def _get_vnics_for_instance(self, cache, inspector, instance_name): + i_cache = cache.setdefault(self.CACHE_KEY_VNIC, {}) + if instance_name not in i_cache: + i_cache[instance_name] = list( + inspector.inspect_vnics(instance_name) + ) + return i_cache[instance_name] + def get_counters(self, manager, cache, instance): instance_name = _instance_name(instance) self.LOG.info('checking instance %s', instance.id) try: - for vnic, info in manager.inspector.inspect_vnics(instance_name): + vnics = self._get_vnics_for_instance( + cache, + manager.inspector, + instance_name, + ) + for vnic, info in vnics: self.LOG.info(self.NET_USAGE_MESSAGE, instance_name, vnic.name, info.rx_bytes, info.tx_bytes) yield self.make_vnic_counter(instance, diff --git a/tests/compute/test_pollsters.py b/tests/compute/test_pollsters.py index 1e22a7a8d..ae5fba27a 100644 --- a/tests/compute/test_pollsters.py +++ b/tests/compute/test_pollsters.py @@ -219,6 +219,34 @@ class TestNetPollster(TestPollsterBase): _verify_vnic_metering('network.outgoing.packets', '192.168.0.4', 12L, "%s-%s" % (instance_name_id, vnic2.name)) + @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock()) + def test_get_counters_cache(self): + vnic0 = virt_inspector.Interface( + name='vnet0', + fref='fa163e71ec6e', + mac='fa:16:3e:71:ec:6d', + parameters=dict(ip='10.0.0.2', + projmask='255.255.255.0', + projnet='proj1', + dhcp_server='10.0.0.1')) + stats0 = virt_inspector.InterfaceStats(rx_bytes=1L, rx_packets=2L, + tx_bytes=3L, tx_packets=4L) + vnics = [(vnic0, stats0)] + + self.mox.ReplayAll() + + mgr = manager.AgentManager() + pollster = pollsters.NetPollster() + cache = { + pollster.CACHE_KEY_VNIC: { + self.instance.name: vnics, + }, + } + counters = list(pollster.get_counters(mgr, cache, self.instance)) + assert counters + # We should have one of each counter for one vnic + self.assertEqual(len(counters), 4) + class TestCPUPollster(TestPollsterBase):