diff --git a/ceilometer/compute/virt/xenapi/inspector.py b/ceilometer/compute/virt/xenapi/inspector.py index 9632cba..18ed5d7 100644 --- a/ceilometer/compute/virt/xenapi/inspector.py +++ b/ceilometer/compute/virt/xenapi/inspector.py @@ -160,18 +160,19 @@ class XenapiInspector(virt_inspector.Inspector): if vif_refs: for vif_ref in vif_refs: vif_rec = self._call_xenapi("VIF.get_record", vif_ref) - vif_metrics_ref = self._call_xenapi( - "VIF.get_metrics", vif_ref) - vif_metrics_rec = self._call_xenapi( - "VIF_metrics.get_record", vif_metrics_ref) + + rx_rate = float(self._call_xenapi( + "VM.query_data_source", vm_ref, + "vif_%s_rx" % vif_rec['device'])) + tx_rate = float(self._call_xenapi( + "VM.query_data_source", vm_ref, + "vif_%s_tx" % vif_rec['device'])) interface = virt_inspector.Interface( name=vif_rec['uuid'], mac=vif_rec['MAC'], fref=None, parameters=None) - rx_rate = float(vif_metrics_rec['io_read_kbs']) * units.Ki - tx_rate = float(vif_metrics_rec['io_write_kbs']) * units.Ki stats = virt_inspector.InterfaceRateStats(rx_rate, tx_rate) yield (interface, stats) @@ -182,16 +183,14 @@ class XenapiInspector(virt_inspector.Inspector): if vbd_refs: for vbd_ref in vbd_refs: vbd_rec = self._call_xenapi("VBD.get_record", vbd_ref) - vbd_metrics_ref = self._call_xenapi("VBD.get_metrics", - vbd_ref) - vbd_metrics_rec = self._call_xenapi("VBD_metrics.get_record", - vbd_metrics_ref) disk = virt_inspector.Disk(device=vbd_rec['device']) - # Stats provided from XenServer are in KB/s, - # converting it to B/s. - read_rate = float(vbd_metrics_rec['io_read_kbs']) * units.Ki - write_rate = float(vbd_metrics_rec['io_write_kbs']) * units.Ki + read_rate = float(self._call_xenapi( + "VM.query_data_source", vm_ref, + "vbd_%s_read" % vbd_rec['device'])) + write_rate = float(self._call_xenapi( + "VM.query_data_source", vm_ref, + "vbd_%s_write" % vbd_rec['device'])) disk_rate_info = virt_inspector.DiskRateStats( read_bytes_rate=read_rate, read_requests_rate=0, diff --git a/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py b/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py index caa1c93..7e8f827 100644 --- a/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py +++ b/ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py @@ -142,75 +142,42 @@ class TestXenapiInspection(base.BaseTestCase): fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name', 'id': 'fake_instance_id'} - def fake_xenapi_request(method, args): - vif_rec = { - 'metrics': 'vif_metrics_ref', - 'uuid': 'vif_uuid', - 'MAC': 'vif_mac', - } - - vif_metrics_rec = { - 'io_read_kbs': '1', - 'io_write_kbs': '2', - } - if method == 'VM.get_by_name_label': - return ['vm_ref'] - elif method == 'VM.get_VIFs': - return ['vif_ref'] - elif method == 'VIF.get_record': - return vif_rec - elif method == 'VIF.get_metrics': - return 'vif_metrics_ref' - elif method == 'VIF_metrics.get_record': - return vif_metrics_rec - else: - return None + vif_rec = { + 'metrics': 'vif_metrics_ref', + 'uuid': 'vif_uuid', + 'MAC': 'vif_mac', + 'device': '0', + } + side_effects = [['vm_ref'], ['vif_ref'], vif_rec, 1024.0, 2048.0] session = self.inspector.session with mock.patch.object(session, 'xenapi_request', - side_effect=fake_xenapi_request): + side_effect=side_effects): interfaces = list(self.inspector.inspect_vnic_rates(fake_instance)) self.assertEqual(1, len(interfaces)) vnic0, info0 = interfaces[0] self.assertEqual('vif_uuid', vnic0.name) self.assertEqual('vif_mac', vnic0.mac) - self.assertEqual(1024, info0.rx_bytes_rate) - self.assertEqual(2048, info0.tx_bytes_rate) + self.assertEqual(1024.0, info0.rx_bytes_rate) + self.assertEqual(2048.0, info0.tx_bytes_rate) def test_inspect_disk_rates(self): fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name', 'id': 'fake_instance_id'} - def fake_xenapi_request(method, args): - vbd_rec = { - 'device': 'xvdd' - } - - vbd_metrics_rec = { - 'io_read_kbs': '1', - 'io_write_kbs': '2' - } - if method == 'VM.get_by_name_label': - return ['vm_ref'] - elif method == 'VM.get_VBDs': - return ['vbd_ref'] - elif method == 'VBD.get_record': - return vbd_rec - elif method == 'VBD.get_metrics': - return 'vbd_metrics_ref' - elif method == 'VBD_metrics.get_record': - return vbd_metrics_rec - else: - return None + vbd_rec = { + 'device': 'xvdd' + } + side_effects = [['vm_ref'], ['vbd_ref'], vbd_rec, 1024.0, 2048.0] session = self.inspector.session with mock.patch.object(session, 'xenapi_request', - side_effect=fake_xenapi_request): + side_effect=side_effects): disks = list(self.inspector.inspect_disk_rates(fake_instance)) self.assertEqual(1, len(disks)) disk0, info0 = disks[0] self.assertEqual('xvdd', disk0.device) - self.assertEqual(1024, info0.read_bytes_rate) - self.assertEqual(2048, info0.write_bytes_rate) + self.assertEqual(1024.0, info0.read_bytes_rate) + self.assertEqual(2048.0, info0.write_bytes_rate)