diff --git a/ceilometer_zvm/compute/virt/zvm/inspector.py b/ceilometer_zvm/compute/virt/zvm/inspector.py index 0c6d57d..f810d02 100644 --- a/ceilometer_zvm/compute/virt/zvm/inspector.py +++ b/ceilometer_zvm/compute/virt/zvm/inspector.py @@ -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 diff --git a/ceilometer_zvm/compute/virt/zvm/utils.py b/ceilometer_zvm/compute/virt/zvm/utils.py index d05a8ca..ef9e2cd 100644 --- a/ceilometer_zvm/compute/virt/zvm/utils.py +++ b/ceilometer_zvm/compute/virt/zvm/utils.py @@ -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) diff --git a/ceilometer_zvm/tests/unit/compute/virt/zvm/test_inspector.py b/ceilometer_zvm/tests/unit/compute/virt/zvm/test_inspector.py index ff1d3bc..4f265d2 100644 --- a/ceilometer_zvm/tests/unit/compute/virt/zvm/test_inspector.py +++ b/ceilometer_zvm/tests/unit/compute/virt/zvm/test_inspector.py @@ -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') diff --git a/ceilometer_zvm/tests/unit/compute/virt/zvm/test_utils.py b/ceilometer_zvm/tests/unit/compute/virt/zvm/test_utils.py index ca1c998..f1f8d91 100644 --- a/ceilometer_zvm/tests/unit/compute/virt/zvm/test_utils.py +++ b/ceilometer_zvm/tests/unit/compute/virt/zvm/test_utils.py @@ -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'