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:
parent
157f6392a4
commit
409e9796f0
@ -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,
|
||||
|
@ -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',
|
||||
|
1939
cinder/volume/drivers/huawei/common.py
Normal file
1939
cinder/volume/drivers/huawei/common.py
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user