Fix bugs while integrated with Huawei Dorado array

This patch fixes two bugs while driver integrated with Huawei
Dorado array:
1. the KeyError exception while querying storage pool infos,
   because some attributes don't exist for Dorado array.
2. attaching volume failed if the volume is a Huawei hypermetro
   volume, at this instance, driver logic will miss querying
   some infos from Dorado array, which leads KeyError exception
   at the afterwards processing logic.

Change-Id: I0d5017de8417adc92bf6e3d3988a78cd761e75dc
Closes-Bug: #1698991
(cherry picked from commit bcf885c63e)
This commit is contained in:
zengyingzhe 2017-06-19 19:19:26 +08:00 committed by Yingzhe Zeng
parent 2239bb60c5
commit 87cf9cb41e
4 changed files with 37 additions and 24 deletions

View File

@ -2849,7 +2849,14 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
"USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE,
"TIER0CAPACITY": "0",
"TIER1CAPACITY": "0",
"TIER2CAPACITY": "48"}]
"TIER2CAPACITY": "48"},
{"NAME": "test004",
"ID": "0",
"USERFREECAPACITY": "36",
"DATASPACE": "35",
"USERTOTALCAPACITY": "48",
"USAGETYPE": constants.BLOCK_STORAGE_POOL_TYPE,
"TIER0CAPACITY": "40"}]
pool_name = 'test001'
test_info = {'CAPACITY': '36', 'ID': '0', 'TOTALCAPACITY': '48',
'TIER0CAPACITY': '48', 'TIER1CAPACITY': '0',
@ -2874,6 +2881,13 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
pool_info = self.driver.client.get_pool_info(pool_name, pools)
self.assertEqual(test_info, pool_info)
pool_name = 'test004'
test_info = {'CAPACITY': '35', 'ID': '0', 'TOTALCAPACITY': '48',
'TIER0CAPACITY': '40', 'TIER1CAPACITY': '0',
'TIER2CAPACITY': '0'}
pool_info = self.driver.client.get_pool_info(pool_name, pools)
self.assertEqual(test_info, pool_info)
def test_get_smartx_specs_opts(self):
smartx_opts = smartx.SmartX().get_smartx_specs_opts(smarttier_opts)
@ -3301,15 +3315,6 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
lun_PARENTID = mock_create_lun.call_args[0][0]['PARENTID']
self.assertEqual(FAKE_FIND_POOL_RESPONSE['ID'], lun_PARENTID)
@mock.patch.object(huawei_driver.huawei_utils, 'get_volume_metadata',
return_value={'hypermetro_id': '3400a30d844d0007',
'remote_lun_id': '1'})
def test_hypermetro_none_map_info_fail(self, mock_metadata):
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.metro.connect_volume_fc,
self.volume,
FakeConnector)
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(rest_client.RestClient, 'check_lun_exist',
return_value=True)
@ -4329,9 +4334,14 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
mock_fc_init.assert_called_with(volume, FakeConnector)
def test_initialize_connection_success(self):
do_mapping_mocker = self.mock_object(
self.driver.client, 'do_mapping',
wraps=self.driver.client.do_mapping)
iscsi_properties = self.driver.initialize_connection(self.volume,
FakeConnector)
self.assertEqual(1, iscsi_properties['data']['target_lun'])
do_mapping_mocker.assert_called_once_with(
'11', '0', '1', None, '11', False)
def test_initialize_connection_fail_no_online_wwns_in_host(self):
self.mock_object(rest_client.RestClient, 'get_online_free_wwns',
@ -4955,6 +4965,8 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
fc_properties = self.driver.metro.connect_volume_fc(self.volume,
FakeConnector)
self.assertEqual(1, fc_properties['data']['target_lun'])
mock_map.assert_called_once_with('1', '0', '1',
hypermetro_lun=True)
@mock.patch.object(huawei_driver.huawei_utils, 'get_volume_metadata',
return_value={'hypermetro_id': '3400a30d844d0007',

View File

@ -2170,9 +2170,14 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
# Add host into hostgroup.
hostgroup_id = self.client.add_host_to_hostgroup(host_id)
metadata = huawei_utils.get_volume_metadata(volume)
LOG.info(_LI("initialize_connection, metadata is: %s."), metadata)
hypermetro_lun = 'hypermetro_id' in metadata
map_info = self.client.do_mapping(lun_id, hostgroup_id,
host_id, portg_id,
lun_type)
lun_type, hypermetro_lun)
host_lun_id = self.client.get_host_lun_id(host_id, lun_id,
lun_type)
@ -2186,9 +2191,7 @@ class HuaweiFCDriver(HuaweiBaseDriver, driver.FibreChannelDriver):
'map_info': map_info}, }
# Deal with hypermetro connection.
metadata = huawei_utils.get_volume_metadata(volume)
LOG.info(_LI("initialize_connection, metadata is: %s."), metadata)
if 'hypermetro_id' in metadata:
if hypermetro_lun:
loc_tgt_wwn = fc_info['data']['target_wwn']
local_ini_tgt_map = fc_info['data']['initiator_target_map']
hyperm = hypermetro.HuaweiHyperMetro(self.client,

View File

@ -156,9 +156,8 @@ class HuaweiHyperMetro(object):
# Add host into hostgroup.
hostgroup_id = self.rmt_client.add_host_to_hostgroup(host_id)
map_info = self.rmt_client.do_mapping(lun_id,
hostgroup_id,
host_id)
map_info = self.rmt_client.do_mapping(lun_id, hostgroup_id, host_id,
hypermetro_lun=True)
if not map_info:
msg = _('Map info is None due to array version '
'not supporting hypermetro.')

View File

@ -257,10 +257,10 @@ class RestClient(object):
info['ID'] = pool['ID']
info['CAPACITY'] = pool.get('DATASPACE', pool['USERFREECAPACITY'])
info['TOTALCAPACITY'] = pool['USERTOTALCAPACITY']
info['TIER0CAPACITY'] = pool['TIER0CAPACITY']
info['TIER1CAPACITY'] = pool['TIER1CAPACITY']
info['TIER2CAPACITY'] = pool['TIER2CAPACITY']
info['TOTALCAPACITY'] = pool.get('USERTOTALCAPACITY', '0')
info['TIER0CAPACITY'] = pool.get('TIER0CAPACITY', '0')
info['TIER1CAPACITY'] = pool.get('TIER1CAPACITY', '0')
info['TIER2CAPACITY'] = pool.get('TIER2CAPACITY', '0')
return info
@ -432,7 +432,7 @@ class RestClient(object):
return False
def do_mapping(self, lun_id, hostgroup_id, host_id, portgroup_id=None,
lun_type=constants.LUN_TYPE):
lun_type=constants.LUN_TYPE, hypermetro_lun=False):
"""Add hostgroup and lungroup to mapping view."""
lungroup_name = constants.LUNGROUP_PREFIX + host_id
mapping_view_name = constants.MAPPING_VIEW_PREFIX + host_id
@ -475,8 +475,7 @@ class RestClient(object):
self._associate_portgroup_to_view(view_id,
portgroup_id)
version = self.find_array_version()
if version >= constants.ARRAY_VERSION:
if hypermetro_lun:
aval_luns = self.find_view_by_id(view_id)
map_info["lun_id"] = lun_id
map_info["view_id"] = view_id