Implement zvm inspector helper function - _get_inst_stat

In _get_inst_stat, would check cache data expir or not, then update
cache if needed, at last, return instance data per latest cache.

Change-Id: Iaa499622f1f4e38182a50249f8c63b02e7a36465
This commit is contained in:
Huang Rui 2015-09-17 09:47:27 +08:00
parent 05efac6ac8
commit f4c3964e35
4 changed files with 88 additions and 1 deletions

View File

@ -106,6 +106,28 @@ class ZVMInspector(virt_inspector.Inspector):
if meter in ('cpus', 'memory.usage'):
self._update_inst_cpu_mem_stat(instances)
def _check_expiration_and_update_cache(self, meter):
now = timeutils.utcnow_ts()
if now >= self.cache_expiration:
self._update_cache(meter)
def _get_inst_stat(self, meter, instance):
self._check_expiration_and_update_cache(meter)
inst_name = zvmutils.get_inst_name(instance)
inst_stat = self.cache.get(inst_name)
if inst_stat is None:
userid = (self.instances.get(inst_name) or
zvmutils.get_userid(inst_name))
self._update_cache(meter, {inst_name: userid})
inst_stat = self.cache.get(inst_name)
if inst_stat is None:
raise virt_inspector.InstanceNotFoundException()
else:
return inst_stat
def inspect_cpus(self, instance):
pass

View File

@ -365,3 +365,7 @@ def image_performance_query(zhcp_node, inst_list):
pi_dict[pi['userid']] = pi
return pi_dict
def get_inst_name(instance):
return getattr(instance, 'OS-EXT-SRV-ATTR:instance_name', None)

View File

@ -15,7 +15,9 @@
import mock
from ceilometer.compute.virt import inspector as virt_inspertor
from oslo_config import fixture as fixture_config
from oslo_utils import timeutils
from oslotest import base
from ceilometer_zvm.compute.virt.zvm import inspector as zvm_inspector
@ -85,3 +87,62 @@ class TestZVMInspector(base.BaseTestCase):
inst = {'inst1': 'INST1'}
self.inspector._update_cache('memory.usage', inst)
upd.assert_called_with(inst)
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_update_cache")
def test_check_expiration_and_update_cache(self, udc):
self.inspector._check_expiration_and_update_cache('cpus')
udc.assert_called_once_with('cpus')
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_update_cache")
def test_check_expiration_and_update_cache_no_update(self, udc):
self.inspector.cache_expiration = timeutils.utcnow_ts() + 100
self.inspector._check_expiration_and_update_cache('cpus')
udc.assert_not_called()
@mock.patch.object(zvmutils, 'get_inst_name')
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_check_expiration_and_update_cache")
def test_get_inst_stat(self, check_update, get_name):
get_name.return_value = 'inst1'
self.inspector.cache.set({'guest_cpus': 2, 'nodename': 'inst1'})
inst_stat = self.inspector._get_inst_stat('cpus', {'inst1': 'INST1'})
self.assertEqual(2, inst_stat['guest_cpus'])
check_update.assert_called_once_with('cpus')
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_update_cache")
@mock.patch.object(zvmutils, 'get_userid')
@mock.patch.object(zvmutils, 'get_inst_name')
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_check_expiration_and_update_cache")
def test_get_inst_stat_not_found(self, check_update, get_name,
get_uid, update):
get_name.return_value = 'inst1'
get_uid.return_value = 'INST1'
self.assertRaises(virt_inspertor.InstanceNotFoundException,
self.inspector._get_inst_stat, 'cpus',
{'inst1': 'INST1'})
check_update.assert_called_once_with('cpus')
update.assert_called_once_with('cpus', {'inst1': 'INST1'})
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_update_cache")
@mock.patch.object(zvmutils, 'get_userid')
@mock.patch("ceilometer_zvm.compute.virt.zvm.utils.CacheData.get")
@mock.patch.object(zvmutils, 'get_inst_name')
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_check_expiration_and_update_cache")
def test_get_inst_stat_update_cache(self, check_update, get_name,
cache_get, get_uid, update):
get_name.return_value = 'inst1'
cache_get.side_effect = [None, {'guest_cpus': 2, 'nodename': 'inst1'}]
get_uid.return_value = 'INST1'
inst_stat = self.inspector._get_inst_stat('cpus', {'inst1': 'INST1'})
self.assertEqual(2, inst_stat['guest_cpus'])
check_update.assert_called_once_with('cpus')
update.assert_called_once_with('cpus', {'inst1': 'INST1'})

View File

@ -28,7 +28,7 @@ commands = {posargs}
commands = python setup.py testr --coverage --testr-args='{posargs}'
[flake8]
ignore = E126,E128
ignore = E126,E127,E128
exclude = .venv,.git,.tox,dist,doc,*egg,build
[hacking]