diff --git a/ceilometer/compute/pollsters.py b/ceilometer/compute/pollsters.py index 810221b40..45d8c71e8 100644 --- a/ceilometer/compute/pollsters.py +++ b/ceilometer/compute/pollsters.py @@ -212,6 +212,12 @@ class NetPollster(plugin.ComputePollster): resource_metadata['instance_type'] = \ instance.flavor['id'] if instance.flavor else None + if vnic_data.fref is not None: + rid = vnic_data.fref + else: + instance_name = _instance_name(instance) + rid = "%s-%s-%s" % (instance_name, instance.id, vnic_data.name) + return counter.Counter( name=name, type=type, @@ -219,7 +225,7 @@ class NetPollster(plugin.ComputePollster): volume=volume, user_id=instance.user_id, project_id=instance.tenant_id, - resource_id=vnic_data.fref, + resource_id=rid, timestamp=timeutils.isotime(), resource_metadata=resource_metadata ) diff --git a/ceilometer/compute/virt/libvirt/inspector.py b/ceilometer/compute/virt/libvirt/inspector.py index f5881659b..5b6d91164 100644 --- a/ceilometer/compute/virt/libvirt/inspector.py +++ b/ceilometer/compute/virt/libvirt/inspector.py @@ -110,7 +110,10 @@ class LibvirtInspector(virt_inspector.Inspector): for iface in tree.findall('devices/interface'): name = iface.find('target').get('dev') mac = iface.find('mac').get('address') - fref = iface.find('filterref').get('filter') + fref = iface.find('filterref') + if fref is not None: + fref = fref.get('filter') + params = dict((p.get('name').lower(), p.get('value')) for p in iface.findall('filterref/parameter')) interface = virt_inspector.Interface(name=name, mac=mac, diff --git a/tests/compute/test_pollsters.py b/tests/compute/test_pollsters.py index 34518546d..1aa5543c8 100644 --- a/tests/compute/test_pollsters.py +++ b/tests/compute/test_pollsters.py @@ -124,7 +124,18 @@ class TestNetPollster(TestPollsterBase): dhcp_server='10.0.0.2')) stats1 = virt_inspector.InterfaceStats(rx_bytes=5L, rx_packets=6L, tx_bytes=7L, tx_packets=8L) - vnics = [(vnic0, stats0), (vnic1, stats1)] + vnic2 = virt_inspector.Interface( + name='vnet2', + fref=None, + mac='fa:18:4e:72:fc:7e', + parameters=dict(ip='192.168.0.4', + projmask='255.255.255.0', + projnet='proj3', + dhcp_server='10.0.0.3')) + stats2 = virt_inspector.InterfaceStats(rx_bytes=9L, rx_packets=10L, + tx_bytes=11L, tx_packets=12L) + + vnics = [(vnic0, stats0), (vnic1, stats1), (vnic2, stats2)] self.inspector.inspect_vnics(self.instance.name).AndReturn(vnics) self.mox.ReplayAll() @@ -136,21 +147,39 @@ class TestNetPollster(TestPollsterBase): self.assertEqual(set([c.name for c in counters]), set(pollster.get_counter_names())) - def _verify_vnic_metering(name, ip, expected_volume): + def _verify_vnic_metering(name, ip, expected_volume, expected_rid): match = [c for c in counters if c.name == name and c.resource_metadata['parameters']['ip'] == ip] self.assertEquals(len(match), 1, 'missing counter %s' % name) self.assertEquals(match[0].volume, expected_volume) self.assertEquals(match[0].type, 'cumulative') + self.assertEquals(match[0].resource_id, expected_rid) - _verify_vnic_metering('network.incoming.bytes', '10.0.0.2', 1L) - _verify_vnic_metering('network.incoming.bytes', '192.168.0.3', 5L) - _verify_vnic_metering('network.outgoing.bytes', '10.0.0.2', 3L) - _verify_vnic_metering('network.outgoing.bytes', '192.168.0.3', 7L) - _verify_vnic_metering('network.incoming.packets', '10.0.0.2', 2L) - _verify_vnic_metering('network.incoming.packets', '192.168.0.3', 6L) - _verify_vnic_metering('network.outgoing.packets', '10.0.0.2', 4L) - _verify_vnic_metering('network.outgoing.packets', '192.168.0.3', 8L) + instance_name_id = "%s-%s" % (self.instance.name, self.instance.id) + _verify_vnic_metering('network.incoming.bytes', '10.0.0.2', 1L, + vnic0.fref) + _verify_vnic_metering('network.incoming.bytes', '192.168.0.3', 5L, + vnic1.fref) + _verify_vnic_metering('network.incoming.bytes', '192.168.0.4', 9L, + "%s-%s" % (instance_name_id, vnic2.name)) + _verify_vnic_metering('network.outgoing.bytes', '10.0.0.2', 3L, + vnic0.fref) + _verify_vnic_metering('network.outgoing.bytes', '192.168.0.3', 7L, + vnic1.fref) + _verify_vnic_metering('network.outgoing.bytes', '192.168.0.4', 11L, + "%s-%s" % (instance_name_id, vnic2.name)) + _verify_vnic_metering('network.incoming.packets', '10.0.0.2', 2L, + vnic0.fref) + _verify_vnic_metering('network.incoming.packets', '192.168.0.3', 6L, + vnic1.fref) + _verify_vnic_metering('network.incoming.packets', '192.168.0.4', 10L, + "%s-%s" % (instance_name_id, vnic2.name)) + _verify_vnic_metering('network.outgoing.packets', '10.0.0.2', 4L, + vnic0.fref) + _verify_vnic_metering('network.outgoing.packets', '192.168.0.3', 8L, + vnic1.fref) + _verify_vnic_metering('network.outgoing.packets', '192.168.0.4', 12L, + "%s-%s" % (instance_name_id, vnic2.name)) class TestCPUPollster(TestPollsterBase): diff --git a/tests/compute/virt/libvirt/test_inspector.py b/tests/compute/virt/libvirt/test_inspector.py index 853cc29f3..778c0f0c2 100644 --- a/tests/compute/virt/libvirt/test_inspector.py +++ b/tests/compute/virt/libvirt/test_inspector.py @@ -73,6 +73,14 @@ class TestLibvirtInspection(test_base.TestCase): + + + + + +
+ """ @@ -82,11 +90,13 @@ class TestLibvirtInspection(test_base.TestCase): 3L, 4L, 0L, 0L)) self.domain.interfaceStats('vnet1').AndReturn((5L, 6L, 0L, 0L, 7L, 8L, 0L, 0L)) + self.domain.interfaceStats('vnet2').AndReturn((9L, 10L, 0L, 0L, + 11L, 12L, 0L, 0L)) self.mox.ReplayAll() interfaces = list(self.inspector.inspect_vnics(self.instance_name)) - self.assertEquals(len(interfaces), 2) + self.assertEquals(len(interfaces), 3) vnic0, info0 = interfaces[0] self.assertEqual(vnic0.name, 'vnet0') self.assertEqual(vnic0.mac, 'fa:16:3e:71:ec:6d') @@ -115,6 +125,16 @@ class TestLibvirtInspection(test_base.TestCase): self.assertEqual(info1.tx_bytes, 7L) self.assertEqual(info1.tx_packets, 8L) + vnic2, info2 = interfaces[2] + self.assertEqual(vnic2.name, 'vnet2') + self.assertEqual(vnic2.mac, 'fa:16:3e:96:33:f0') + self.assertEqual(vnic2.fref, None) + self.assertEqual(vnic2.parameters, dict()) + self.assertEqual(info2.rx_bytes, 9L) + self.assertEqual(info2.rx_packets, 10L) + self.assertEqual(info2.tx_bytes, 11L) + self.assertEqual(info2.tx_packets, 12L) + def test_inspect_disks(self): dom_xml = """