Merge "XenAPI support: Changes for cpu_util"
This commit is contained in:
commit
2fc70c3e8d
@ -22,6 +22,7 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
api = None
|
api = None
|
||||||
|
|
||||||
|
from ceilometer.compute.pollsters import util
|
||||||
from ceilometer.compute.virt import inspector as virt_inspector
|
from ceilometer.compute.virt import inspector as virt_inspector
|
||||||
from ceilometer.openstack.common.gettextutils import _
|
from ceilometer.openstack.common.gettextutils import _
|
||||||
|
|
||||||
@ -96,6 +97,18 @@ class XenapiInspector(virt_inspector.Inspector):
|
|||||||
for vm_ref in vms.keys():
|
for vm_ref in vms.keys():
|
||||||
yield vm_ref, vms[vm_ref]
|
yield vm_ref, vms[vm_ref]
|
||||||
|
|
||||||
|
def _lookup_by_name(self, instance_name):
|
||||||
|
vm_refs = self._call_xenapi("VM.get_by_name_label", instance_name)
|
||||||
|
n = len(vm_refs)
|
||||||
|
if n == 0:
|
||||||
|
raise virt_inspector.InstanceNotFoundException(
|
||||||
|
_('VM %s not found in XenServer') % instance_name)
|
||||||
|
elif n > 1:
|
||||||
|
raise XenapiException(
|
||||||
|
_('Multiple VM %s found in XenServer') % instance_name)
|
||||||
|
else:
|
||||||
|
return vm_refs[0]
|
||||||
|
|
||||||
def inspect_instances(self):
|
def inspect_instances(self):
|
||||||
for vm_ref, vm_rec in self._list_vms():
|
for vm_ref, vm_rec in self._list_vms():
|
||||||
name = vm_rec['name_label']
|
name = vm_rec['name_label']
|
||||||
@ -103,3 +116,21 @@ class XenapiInspector(virt_inspector.Inspector):
|
|||||||
uuid = other_config.get('nova_uuid')
|
uuid = other_config.get('nova_uuid')
|
||||||
if uuid:
|
if uuid:
|
||||||
yield virt_inspector.Instance(name, uuid)
|
yield virt_inspector.Instance(name, uuid)
|
||||||
|
|
||||||
|
def inspect_cpu_util(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)
|
||||||
|
vcpus_number = metrics_rec['VCPUs_number']
|
||||||
|
vcpus_utils = metrics_rec['VCPUs_utilisation']
|
||||||
|
if len(vcpus_utils) == 0:
|
||||||
|
msg = _("Could not get VM %s CPU Utilization") % instance_name
|
||||||
|
raise XenapiException(msg)
|
||||||
|
|
||||||
|
utils = 0.0
|
||||||
|
for num in range(int(vcpus_number)):
|
||||||
|
utils += vcpus_utils.get(str(num))
|
||||||
|
utils = utils / int(vcpus_number) * 100
|
||||||
|
return virt_inspector.CPUUtilStats(util=utils)
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
import mock
|
import mock
|
||||||
from oslotest import base
|
from oslotest import base
|
||||||
|
|
||||||
|
from ceilometer.compute.virt import inspector as virt_inspector
|
||||||
from ceilometer.compute.virt.xenapi import inspector as xenapi_inspector
|
from ceilometer.compute.virt.xenapi import inspector as xenapi_inspector
|
||||||
|
|
||||||
|
|
||||||
@ -46,3 +47,30 @@ class TestXenapiInspection(base.BaseTestCase):
|
|||||||
inspected_instance = inspected_instances[0]
|
inspected_instance = inspected_instances[0]
|
||||||
self.assertEqual('fake_name', inspected_instance.name)
|
self.assertEqual('fake_name', inspected_instance.name)
|
||||||
self.assertEqual('fake_uuid', inspected_instance.UUID)
|
self.assertEqual('fake_uuid', inspected_instance.UUID)
|
||||||
|
|
||||||
|
def test_inspect_cpu_util(self):
|
||||||
|
fake_instance = {'OS-EXT-SRV-ATTR:instance_name': 'fake_instance_name',
|
||||||
|
'id': 'fake_instance_id'}
|
||||||
|
fake_stat = virt_inspector.CPUUtilStats(util=40)
|
||||||
|
|
||||||
|
def fake_xenapi_request(method, args):
|
||||||
|
metrics_rec = {
|
||||||
|
'memory_actual': '536870912',
|
||||||
|
'VCPUs_number': '1',
|
||||||
|
'VCPUs_utilisation': {'0': 0.4, }
|
||||||
|
}
|
||||||
|
|
||||||
|
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):
|
||||||
|
cpu_util_stat = self.inspector.inspect_cpu_util(fake_instance)
|
||||||
|
self.assertEqual(fake_stat, cpu_util_stat)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user