From d57a40680ec2ee9f9baa6d6e1ad1a79b6687acb2 Mon Sep 17 00:00:00 2001 From: odonos12 Date: Mon, 5 Oct 2020 11:49:44 +0100 Subject: [PATCH] PowerMax Driver - U4P Failover SerialNumber KeyError fix Fix bug where U4P failover was raising a KeyError exception due to missing SerialNumber key. SerialNumber was not being added to failover target list during driver initialization leading to error when attempting a failover at a later stage. Fix by adding SerialNumber to each failover target during driver initialization. Change-Id: Id6f064a638dbaec09875c43f9ccec3758a1added Closes-Bug: 1898208 --- .../dell_emc/powermax/test_powermax_common.py | 34 +++++++++++++++++++ .../drivers/dell_emc/powermax/common.py | 3 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py index bbbf41f3e0d..df8c6e8b4a4 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py @@ -3314,6 +3314,40 @@ class PowerMaxCommonTest(test.TestCase): self.assertTrue(self.rest.u4p_failover_enabled) self.assertIsNotNone(self.rest.u4p_failover_targets) + @mock.patch.object(rest.PowerMaxRest, 'set_u4p_failover_config') + def test_get_u4p_failover_info_failover_config(self, mck_set_fo): + configuration = tpfo.FakeConfiguration( + None, 'CommonTests', 1, 1, san_ip='1.1.1.1', san_login='test', + san_password='test', san_api_port=8443, + driver_ssl_cert_verify='/path/to/cert', + u4p_failover_target=(self.data.u4p_failover_config[ + 'u4p_failover_targets']), u4p_failover_backoff_factor='2', + u4p_failover_retries='3', u4p_failover_timeout='10', + u4p_primary='10.10.10.10', powermax_array=self.data.array, + powermax_srp=self.data.srp) + expected_u4p_failover_config = { + 'u4p_failover_targets': [ + {'RestServerIp': '10.10.10.11', 'RestServerPort': '8443', + 'RestUserName': 'test', 'RestPassword': 'test', + 'SSLVerify': 'True', 'SerialNumber': '000197800123'}, + {'RestServerIp': '10.10.10.12', 'RestServerPort': '8443', + 'RestUserName': 'test', 'RestPassword': 'test', + 'SSLVerify': True, 'SerialNumber': '000197800123'}, + {'RestServerIp': '10.10.10.11', 'RestServerPort': '8443', + 'RestUserName': 'test', 'RestPassword': 'test', + 'SSLVerify': 'False', 'SerialNumber': '000197800123'}], + 'u4p_failover_backoff_factor': '2', 'u4p_failover_retries': '3', + 'u4p_failover_timeout': '10', 'u4p_failover_autofailback': None, + 'u4p_primary': { + 'RestServerIp': '1.1.1.1', 'RestServerPort': 8443, + 'RestUserName': 'test', 'RestPassword': 'test', + 'SerialNumber': '000197800123', 'srpName': 'SRP_1', + 'PortGroup': None, 'SSLVerify': True}} + self.common.configuration = configuration + self.common._get_u4p_failover_info() + self.assertIsNotNone(self.rest.u4p_failover_targets) + mck_set_fo.assert_called_once_with(expected_u4p_failover_config) + def test_update_vol_stats_retest_u4p(self): self.rest.u4p_in_failover = True self.rest.u4p_failover_autofailback = True diff --git a/cinder/volume/drivers/dell_emc/powermax/common.py b/cinder/volume/drivers/dell_emc/powermax/common.py index 2403ca9559c..d3b350b96ee 100644 --- a/cinder/volume/drivers/dell_emc/powermax/common.py +++ b/cinder/volume/drivers/dell_emc/powermax/common.py @@ -287,12 +287,13 @@ class PowerMaxCommon(object): 'driver_ssl_cert_path': 'SSLPath'} if self.configuration.safe_get('u4p_failover_target'): + serial_number = self.configuration.safe_get(utils.POWERMAX_ARRAY) u4p_targets = self.configuration.safe_get('u4p_failover_target') formatted_target_list = list() for target in u4p_targets: formatted_target = {key_dict[key]: value for key, value in target.items()} - + formatted_target['SerialNumber'] = serial_number try: formatted_target['SSLVerify'] = formatted_target['SSLPath'] del formatted_target['SSLPath']