zvm inspector can not get instance data in shutdown stat

There's no performance data return from zvm management tool if the
virtual machine in shutdown stat.

In current implementation, InstanceNotFoundException would be
raised in this case.

With this change integrated, zvm inspector will check instance's
power_state at first, then try to get the data.

Also did some change to ignore invalid data format exception that
in case of all virtual machines on the compute node are in shutdow
state.

Change-Id: I02b69adc6e818a69d1e6887a3344f6bf0b344aa7
This commit is contained in:
Huang Rui 2016-01-13 15:11:57 +08:00
parent a2f452b5ee
commit dddf5f281b
4 changed files with 29 additions and 15 deletions

View File

@ -14,6 +14,7 @@
from ceilometer.compute.virt import inspector as virt_inspector
from ceilometer.i18n import _
from oslo_config import cfg
from oslo_log import log
from oslo_utils import timeutils
@ -138,9 +139,15 @@ class ZVMInspector(virt_inspector.Inspector):
self._update_cache(meter)
def _get_inst_stat(self, meter, instance):
inst_name = zvmutils.get_inst_name(instance)
# zvm inspector can not get instance info in shutdown stat
if zvmutils.get_inst_power_state(instance) == 0x04:
msg = _("Can not get vm info in shutdown state "
"for %s") % inst_name
raise virt_inspector.InstanceShutOffException(msg)
self._check_expiration_and_update_cache(meter)
inst_name = zvmutils.get_inst_name(instance)
inst_stat = self.cache.get(meter, inst_name)
if inst_stat is None:
@ -150,7 +157,8 @@ class ZVMInspector(virt_inspector.Inspector):
inst_stat = self.cache.get(meter, inst_name)
if inst_stat is None:
raise virt_inspector.InstanceNotFoundException()
msg = _("Can not get vm info for %s") % inst_name
raise virt_inspector.InstanceNotFoundException(msg)
else:
return inst_stat

View File

@ -235,11 +235,6 @@ def translate_xcat_resp(rawdata, dirt):
data[k] = ls[(ls.find(dirt[k]) + len(dirt[k])):].strip(' "')
break
if data == {}:
msg = _("No value matched with keywords. Raw Data: %(raw)s; "
"Keywords: %(kws)s") % {'raw': rawdata, 'kws': str(dirt)}
raise ZVMException(msg)
return data
@ -375,7 +370,8 @@ def image_performance_query(zhcp_node, inst_list):
rpi_list = raw_data.split("".join((zhcp_node, ": \n")))
for rpi in rpi_list:
pi = translate_xcat_resp(rpi, ipq_kws)
pi_dict[pi['userid']] = pi
if pi.get('userid') is not None:
pi_dict[pi['userid']] = pi
return pi_dict
@ -384,6 +380,10 @@ def get_inst_name(instance):
return getattr(instance, 'OS-EXT-SRV-ATTR:instance_name', None)
def get_inst_power_state(instance):
return getattr(instance, 'OS-EXT-STS:power_state', None)
def virutal_network_vswitch_query_iuo_stats(zhcp_node):
cmd = ('smcli Virtual_Network_Vswitch_Query_IUO_Stats -T "%s" '
'-k "switch_name=*"' % zhcp_node)

View File

@ -131,6 +131,19 @@ class TestZVMInspector(base.BaseTestCase):
check_update.assert_called_once_with('cpumem')
update.assert_called_once_with('cpumem', {'inst1': 'INST1'})
@mock.patch.object(zvmutils, 'get_inst_power_state')
@mock.patch.object(zvmutils, 'get_inst_name')
def test_get_inst_stat_shutoff(self, get_name, get_power_stat):
get_name.return_value = 'inst1'
get_power_stat.return_value = 0x04
self.inspector.instances = {'inst1': 'INST1'}
self.assertRaises(virt_inspertor.InstanceShutOffException,
self.inspector._get_inst_stat, 'cpumem',
{'inst1': 'INST1'})
get_name.assert_called_once_with({'inst1': 'INST1'})
get_power_stat.assert_called_once_with({'inst1': 'INST1'})
@mock.patch("ceilometer_zvm.compute.virt.zvm.inspector.ZVMInspector."
"_update_cache")
@mock.patch.object(zvmutils, 'get_userid')

View File

@ -189,13 +189,6 @@ class TestZVMUtils(base.BaseTestCase):
self.assertEqual(exp_data,
zvmutils.image_performance_query('zhcp', inst_list))
@mock.patch.object(zvmutils, 'xdsh')
def test_image_performance_query_invalid_xdsh_resp(self, dsh):
dsh.return_value = {'data': 'invalid data'}
inst_list = {'inst1': 'INST1', 'inst2': 'INST2'}
self.assertRaises(zvmutils.ZVMException,
zvmutils.image_performance_query, 'zhcp', inst_list)
@mock.patch.object(zvmutils, 'xdsh')
def test_virutal_network_vswitch_query_iuo_stats(self, dsh):
vsw_data = ['zhcp11: vswitch count: 2\n'