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
This commit is contained in:
odonos12 2020-10-05 11:49:44 +01:00 committed by Helen Walsh
parent c6b2ea4253
commit d57a40680e
2 changed files with 36 additions and 1 deletions

View File

@ -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

View File

@ -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']