diff --git a/ceilometer/compute/virt/xenapi/inspector.py b/ceilometer/compute/virt/xenapi/inspector.py index 6a9086495..237ab7f9f 100644 --- a/ceilometer/compute/virt/xenapi/inspector.py +++ b/ceilometer/compute/virt/xenapi/inspector.py @@ -17,6 +17,7 @@ from eventlet import timeout from oslo.config import cfg +from oslo.utils import units try: import XenAPI as api except ImportError: @@ -134,3 +135,13 @@ class XenapiInspector(virt_inspector.Inspector): utils += vcpus_utils.get(str(num)) utils = utils / int(vcpus_number) * 100 return virt_inspector.CPUUtilStats(util=utils) + + def inspect_memory_usage(self, instance, duration=None): + instance_name = util.instance_name(instance) + vm_ref = self._lookup_by_name(instance_name) + metrics_ref = self._call_xenapi("VM.get_metrics", vm_ref) + metrics_rec = self._call_xenapi("VM_metrics.get_record", + metrics_ref) + # Stat provided from XenServer is in B, converting it to MB. + memory = long(metrics_rec['memory_actual']) / units.Mi + return virt_inspector.MemoryUsageStats(usage=memory) diff --git a/ceilometer/tests/compute/virt/xenapi/test_inspector.py b/ceilometer/tests/compute/virt/xenapi/test_inspector.py index fface5635..a244241c4 100644 --- a/ceilometer/tests/compute/virt/xenapi/test_inspector.py +++ b/ceilometer/tests/compute/virt/xenapi/test_inspector.py @@ -74,3 +74,28 @@ class TestXenapiInspection(base.BaseTestCase): side_effect=fake_xenapi_request): cpu_util_stat = self.inspector.inspect_cpu_util(fake_instance) self.assertEqual(fake_stat, cpu_util_stat) + + def test_inspect_memory_usage(self): + fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name', + 'id': 'fake_instance_id'} + fake_stat = virt_inspector.MemoryUsageStats(usage=128) + + def fake_xenapi_request(method, args): + metrics_rec = { + 'memory_actual': '134217728', + } + + if method == 'VM.get_by_name_label': + return ['vm_ref'] + elif method == 'VM.get_metrics': + return 'metrics_ref' + elif method == 'VM_metrics.get_record': + return metrics_rec + else: + return None + + session = self.inspector.session + with mock.patch.object(session, 'xenapi_request', + side_effect=fake_xenapi_request): + memory_stat = self.inspector.inspect_memory_usage(fake_instance) + self.assertEqual(fake_stat, memory_stat)