Restructure Huawei driver

As part of further refactoring work, this pulls out common driver code
into its own file to better organize the code.

Change-Id: Ib5b52b638e27743d86106cc9859f8adeab2aab08
Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
This commit is contained in:
Sean McGinnis 2018-08-31 11:27:44 -05:00
parent 157f6392a4
commit 409e9796f0
No known key found for this signature in database
GPG Key ID: CE7EE4BFAF8D70C8
5 changed files with 1986 additions and 1961 deletions

View File

@ -101,8 +101,8 @@ from cinder.volume.drivers.hpe import hpe_3par_common as \
cinder_volume_drivers_hpe_hpe3parcommon
from cinder.volume.drivers.hpe import hpe_lefthand_iscsi as \
cinder_volume_drivers_hpe_hpelefthandiscsi
from cinder.volume.drivers.huawei import huawei_driver as \
cinder_volume_drivers_huawei_huaweidriver
from cinder.volume.drivers.huawei import common as \
cinder_volume_drivers_huawei_common
from cinder.volume.drivers.ibm import flashsystem_common as \
cinder_volume_drivers_ibm_flashsystemcommon
from cinder.volume.drivers.ibm import flashsystem_iscsi as \
@ -291,7 +291,7 @@ def list_opts():
cinder_volume_drivers_fusionstorage_dsware.volume_opts,
cinder_volume_drivers_hpe_hpe3parcommon.hpe3par_opts,
cinder_volume_drivers_hpe_hpelefthandiscsi.hpelefthand_opts,
cinder_volume_drivers_huawei_huaweidriver.huawei_opts,
cinder_volume_drivers_huawei_common.huawei_opts,
cinder_volume_drivers_ibm_flashsystemcommon.flashsystem_opts,
cinder_volume_drivers_ibm_flashsystemiscsi.
flashsystem_iscsi_opts,

View File

@ -34,6 +34,7 @@ from cinder.tests.unit import fake_snapshot
from cinder.tests.unit import fake_volume
from cinder.tests.unit import utils
from cinder.volume import configuration as conf
from cinder.volume.drivers.huawei import common
from cinder.volume.drivers.huawei import constants
from cinder.volume.drivers.huawei import fc_zone_helper
from cinder.volume.drivers.huawei import huawei_conf
@ -2617,7 +2618,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.driver.support_func = pool_data
self.mock_object(replication.ReplicaCommonDriver, 'split')
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
self.mock_object(rest_client.RestClient,
@ -2779,7 +2780,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.mock_object(rest_client.RestClient, 'get_lun_id_by_name',
return_value='ID1')
self.mock_object(rest_client.RestClient, 'rename_lun')
self.mock_object(huawei_driver.HuaweiBaseDriver,
self.mock_object(common.HuaweiBaseDriver,
'_get_lun_info_by_ref',
return_value={
'PARENTNAME': 'OpenStack_Pool',
@ -2789,7 +2790,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
'WWN': '6643e8c1004c5f6723e9f454003'})
self.mock_object(volume_types, 'get_volume_type',
return_value={'extra_specs': test_new_type})
self.mock_object(huawei_driver.HuaweiBaseDriver,
self.mock_object(common.HuaweiBaseDriver,
'_check_needed_changes',
return_value={})
external_ref = {'source-name': 'test1',
@ -2807,7 +2808,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_create_volume_from_snapsuccess(self):
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
self.mock_object(replication.ReplicaCommonDriver, 'sync')
@ -3177,7 +3178,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
json.loads(lun_info['provider_location']))
@ddt.data('front-end', 'back-end')
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
'smartpartition': 'true',
@ -3186,7 +3187,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
'policy': '2',
'cachename': 'cache-test',
'partitionname': 'partition-test'})
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_type',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_type',
return_value={'qos_specs_id': u'025ce295-15e9-41a7'})
def test_create_smartqos_success(self,
mock_consumer,
@ -3215,7 +3216,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_create_smartqos_failed(self, qos_specs_value, pool_data):
self.driver.support_func = pool_data
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
@ -3225,7 +3226,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
'policy': '2',
'cachename': 'cache-test',
'partitionname': 'partition-test'})
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_type',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_type',
return_value={'qos_specs_id': u'025ce295-15e9-41a7'})
self.mock_object(qos_specs, 'get_qos_specs',
return_value=qos_specs_value)
@ -3236,7 +3237,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_create_smartqos_without_huawei_type(self, pool_data):
self.driver.support_func = pool_data
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
@ -3246,7 +3247,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
'policy': '2',
'cachename': 'cache-test',
'partitionname': 'partition-test'})
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_type',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_type',
return_value={'qos_specs_id': u'025ce295-15e9-41a7'})
self.mock_object(qos_specs, 'get_qos_specs',
return_value={'specs': {'fake_qos_type': '100',
@ -3365,7 +3366,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.driver.delete_volume(self.volume)
@mock.patch.object(rest_client.RestClient, 'add_lun_to_partition')
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
'smartpartition': 'true',
@ -3413,14 +3414,14 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_create_smartCache_failed(self, opts, pool_data):
self.driver.support_func = pool_data
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_params',
return_value=opts)
self.assertRaises(exception.VolumeBackendAPIException,
self.driver.create_volume, self.volume)
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
'smartpartition': 'true',
@ -3438,7 +3439,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.driver.create_volume, self.volume)
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'smarttier': 'true',
'smartcache': 'true',
'smartpartition': 'true',
@ -3506,7 +3507,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
(qos_id, lun_list) = self.driver.client.find_available_qos(qos)
self.assertEqual(("11", u'["0", "1", "2"]'), (qos_id, lun_list))
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value=fake_hypermetro_opts)
@mock.patch.object(rest_client.RestClient, 'get_all_pools',
return_value=FAKE_STORAGE_POOL_RESPONSE)
@ -3531,7 +3532,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
json.loads(lun_info['provider_location']))
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value=fake_hypermetro_opts)
@mock.patch.object(rest_client.RestClient, 'get_all_pools',
return_value=FAKE_STORAGE_POOL_RESPONSE)
@ -3692,7 +3693,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_manage_existing_pool_mismatch(self, mock_get_by_name,
mock_get_info):
# LUN does not belong to the specified pool.
with mock.patch.object(huawei_driver.HuaweiBaseDriver,
with mock.patch.object(common.HuaweiBaseDriver,
'_get_lun_info_by_ref',
return_value={'PARENTNAME': 'StoragePool'}):
external_ref = {'source-name': 'LUN1'}
@ -3714,7 +3715,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
# Status is not normal.
ret = {'PARENTNAME': "OpenStack_Pool",
'HEALTHSTATUS': '2'}
with mock.patch.object(huawei_driver.HuaweiBaseDriver,
with mock.patch.object(common.HuaweiBaseDriver,
'_get_lun_info_by_ref',
return_value=ret):
external_ref = {'source-name': 'LUN1'}
@ -3849,7 +3850,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
[{'source-id': 'ID1'}, FAKE_POOLS_UNSUPPORT_REPORT],
[{'source-id': 'ID1'}, FAKE_POOLS_SUPPORT_REPORT])
@mock.patch.object(rest_client.RestClient, 'rename_lun')
@mock.patch.object(huawei_driver.HuaweiBaseDriver,
@mock.patch.object(common.HuaweiBaseDriver,
'_get_lun_info_by_ref',
return_value={'PARENTNAME': 'OpenStack_Pool',
'SNAPSHOTIDS': [],
@ -3877,7 +3878,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.driver.unmanage(self.volume)
def test_manage_existing_snapshot_abnormal(self):
with mock.patch.object(huawei_driver.HuaweiBaseDriver,
with mock.patch.object(common.HuaweiBaseDriver,
'_get_snapshot_info_by_ref',
return_value={'HEALTHSTATUS': '2',
'PARENTID': '11'}):
@ -3908,7 +3909,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
ex.msg))
@mock.patch.object(rest_client.RestClient, 'rename_snapshot')
@mock.patch.object(huawei_driver.HuaweiBaseDriver,
@mock.patch.object(common.HuaweiBaseDriver,
'_get_snapshot_info_by_ref',
return_value={'ID': 'ID1',
'EXPOSEDTOINITIATOR': 'false',
@ -3978,7 +3979,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
def test_create_replication_success(self, mock_type):
self.mock_object(replication.ReplicaCommonDriver, 'sync')
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': mock_type})
@ -4081,7 +4082,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
mock_value, pool_data):
self.driver.support_func = pool_data
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
self.mock_object(replication.ReplicaPairManager, '_delete_pair')
@ -4095,7 +4096,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.driver.support_func = pool_data
self.mock_object(replication.ReplicaCommonDriver, 'split')
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
self.driver.delete_volume(self.replica_volume)
@ -4254,7 +4255,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
old_replica_client = driver.replica_client
old_replica = driver.replica
self.mock_object(replication.ReplicaCommonDriver, 'failover')
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'replication_enabled': 'true'})
secondary_id, volumes_update, __ = driver.failover_host(
None, [self.replica_volume], REPLICA_BACKEND_ID, [])
@ -4291,7 +4292,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
old_client = driver.client
old_replica_client = driver.replica_client
old_replica = driver.replica
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'replication_enabled': 'true'})
secondary_id, volumes_update, __ = driver.failover_host(
None, [volume], REPLICA_BACKEND_ID, [])
@ -4310,7 +4311,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
self.mock_object(replication.ReplicaCommonDriver, 'enable')
self.mock_object(replication.ReplicaCommonDriver, 'wait_replica_ready')
self.mock_object(replication.ReplicaCommonDriver, 'failover')
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'replication_enabled': 'true'})
volume = self.replica_volume
@ -4348,7 +4349,7 @@ class HuaweiISCSIDriverTestCase(HuaweiTestBase):
@ddt.data({}, {'pair_id': TEST_PAIR_ID})
def test_failback_replica_volumes_invalid_drv_data(self, mock_drv_data):
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
self.mock_object(common.HuaweiBaseDriver, '_get_volume_params',
return_value={'replication_enabled': 'true'})
volume = self.replica_volume
@ -4982,7 +4983,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(rest_client, 'RestClient')
@mock.patch.object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
def test_retype_replication_volume_success(self, mock_get_type,
@ -5033,7 +5034,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
self.mock_object(mock_module, mock_func, side_effect=side_effect)
self.mock_object(rest_client.RestClient, 'add_lun_to_partition')
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': sync_replica_specs})
retype = self.driver.retype(None, self.volume,
@ -5212,7 +5213,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
None)
self.assertEqual(expected_pool_capacity, pool_capacity)
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value=fake_hypermetro_opts)
@mock.patch.object(rest_client.RestClient, 'get_all_pools',
return_value=FAKE_STORAGE_POOL_RESPONSE)
@ -5245,7 +5246,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
json.loads(lun_info['provider_location']))
@ddt.data(FAKE_POOLS_UNSUPPORT_REPORT, FAKE_POOLS_SUPPORT_REPORT)
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_volume_params',
@mock.patch.object(common.HuaweiBaseDriver, '_get_volume_params',
return_value=fake_hypermetro_opts)
@mock.patch.object(rest_client.RestClient, 'get_all_pools',
return_value=FAKE_STORAGE_POOL_RESPONSE)
@ -5323,7 +5324,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
def test_create_snapshot_fail_hypermetro(self):
self.mock_object(
huawei_driver.HuaweiBaseDriver,
common.HuaweiBaseDriver,
'_get_volume_type',
return_value={'extra_specs': replica_hypermetro_specs})
self.assertRaises(exception.VolumeBackendAPIException,
@ -5383,7 +5384,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
@ddt.data([{"hypermetro": "true"}], [])
def test_create_group_success(self, cg_type):
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_group_type',
self.mock_object(common.HuaweiBaseDriver, '_get_group_type',
return_value=cg_type)
self.mock_object(volume_utils, 'is_group_a_cg_snapshot_type',
return_value=True)
@ -5399,7 +5400,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
)
@ddt.unpack
def test_create_group_from_src(self, snapshots, source_vols, tmp_snap):
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_group_type',
self.mock_object(common.HuaweiBaseDriver, '_get_group_type',
return_value=[])
self.mock_object(volume_utils, 'is_group_a_cg_snapshot_type',
return_value=True)
@ -5431,7 +5432,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
def test_delete_group_success(self, cg_type):
test_volumes = [self.volume]
ctxt = context.get_admin_context()
self.mock_object(huawei_driver.HuaweiBaseDriver, '_get_group_type',
self.mock_object(common.HuaweiBaseDriver, '_get_group_type',
return_value=cg_type)
self.mock_object(volume_utils, 'is_group_a_cg_snapshot_type',
return_value=True)
@ -5439,7 +5440,7 @@ class HuaweiFCDriverTestCase(HuaweiTestBase):
ctxt, self.group, test_volumes)
self.assertEqual(fields.GroupStatus.DELETED, model['status'])
@mock.patch.object(huawei_driver.HuaweiBaseDriver, '_get_group_type',
@mock.patch.object(common.HuaweiBaseDriver, '_get_group_type',
return_value=[{"hypermetro": "true"}])
@mock.patch.object(huawei_driver.huawei_utils, 'get_lun_metadata',
return_value={'hypermetro_id': '3400a30d844d0007',

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -521,4 +521,4 @@ The following are the Huawei driver specific options that may be set in
.. config-table::
:config-target: Huawei
cinder.volume.drivers.huawei.huawei_driver
cinder.volume.drivers.huawei.common