From 99916612d361186c889b32a19bea6fb28eaf8b70 Mon Sep 17 00:00:00 2001 From: Helen Walsh Date: Fri, 11 Oct 2019 17:05:13 +0100 Subject: [PATCH] PowerMax Driver - QoS calculation failure The value for 'host_io_limit_mb_sec' is not correctly being cast to an int and U4P REST will only accept an whole int between 1 and 100000. Change-Id: Idb3841f39428de93f0482cf7785fcf398487e595 --- .../dell_emc/powermax/test_powermax_utils.py | 24 +++++++++++++++++++ .../volume/drivers/dell_emc/powermax/utils.py | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_utils.py b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_utils.py index 19996f5b905..293c33be2f9 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_utils.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_utils.py @@ -531,6 +531,30 @@ class PowerMaxUtilsTest(test.TestCase): sg_value, qos_extra_spec, input_prop_dict) self.assertEqual(input_prop_dict, ret_prop_dict) + def test_validate_qos_cast_to_int(self): + qos_extra_spec = {'total_iops_sec': '500', + 'total_bytes_sec': '104857600', + 'DistributionType': 'Always'} + property_dict = {'host_io_limit_io_sec': 500} + input_prop_dict = {'host_io_limit_io_sec': 500, + 'host_io_limit_mb_sec': 100} + input_key = 'total_bytes_sec' + ret_prop_dict = self.utils.validate_qos_input( + input_key, None, qos_extra_spec, property_dict) + self.assertEqual(input_prop_dict, ret_prop_dict) + + def test_validate_qos_cast_to_int_drop_fraction(self): + qos_extra_spec = {'total_iops_sec': '500', + 'total_bytes_sec': '105000000', + 'DistributionType': 'Always'} + property_dict = {'host_io_limit_io_sec': 500} + input_prop_dict = {'host_io_limit_io_sec': 500, + 'host_io_limit_mb_sec': 100} + input_key = 'total_bytes_sec' + ret_prop_dict = self.utils.validate_qos_input( + input_key, None, qos_extra_spec, property_dict) + self.assertEqual(input_prop_dict, ret_prop_dict) + def test_compare_cylinders(self): source_cylinders = '12345' target_cylinders = '12345' diff --git a/cinder/volume/drivers/dell_emc/powermax/utils.py b/cinder/volume/drivers/dell_emc/powermax/utils.py index 11c7fee9cbc..890ed371fc3 100644 --- a/cinder/volume/drivers/dell_emc/powermax/utils.py +++ b/cinder/volume/drivers/dell_emc/powermax/utils.py @@ -918,7 +918,8 @@ class PowerMaxUtils(object): else: qos_unit = "MB/sec" min_value = 1 - input_value = int(qos_extra_spec['total_bytes_sec']) / units.Mi + input_value = int( + int(qos_extra_spec['total_bytes_sec']) / units.Mi) sg_key = 'host_io_limit_mb_sec' if min_value <= input_value <= max_value: if sg_value is None or input_value != int(sg_value):