From dddf5f281b1fff7da593699a19e9f0d25d69dd43 Mon Sep 17 00:00:00 2001 From: Huang Rui Date: Wed, 13 Jan 2016 15:11:57 +0800 Subject: [PATCH] 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 --- ceilometer_zvm/compute/virt/zvm/inspector.py | 12 ++++++++++-- ceilometer_zvm/compute/virt/zvm/utils.py | 12 ++++++------ .../tests/unit/compute/virt/zvm/test_inspector.py | 13 +++++++++++++ .../tests/unit/compute/virt/zvm/test_utils.py | 7 ------- 4 files changed, 29 insertions(+), 15 deletions(-) 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'