Merge "VNX: failed to create from image cache"
This commit is contained in:
commit
e0b417e9eb
@ -455,6 +455,19 @@ test_require_consistent_group_snapshot_enabled:
|
||||
_uuid: group_id
|
||||
group_type_id:
|
||||
_uuid: group_type_id
|
||||
|
||||
test_is_image_cache_volume_false:
|
||||
volume: *volume_base
|
||||
|
||||
test_is_image_cache_volume_true:
|
||||
volume: *volume_base
|
||||
|
||||
test_calc_migrate_and_provision_image_cache:
|
||||
volume: *volume_base
|
||||
|
||||
test_calc_migrate_and_provision:
|
||||
volume: *volume_base
|
||||
|
||||
###########################################################
|
||||
# TestClient
|
||||
###########################################################
|
||||
|
@ -178,3 +178,35 @@ class TestUtils(test.TestCase):
|
||||
driver = FakeDriver()
|
||||
is_called = driver.fake_group_method('context', input['group'])
|
||||
self.assertTrue(is_called)
|
||||
|
||||
@res_mock.mock_driver_input
|
||||
def test_is_image_cache_volume_false(self, mocked):
|
||||
volume = mocked['volume']
|
||||
volume.display_name = 'volume-ca86b9a0-d0d5-4267-8cd5-c62274056cc0'
|
||||
self.assertFalse(vnx_utils.is_image_cache_volume(volume))
|
||||
volume.display_name = 'volume-ca86b9a0-d0d5-c62274056cc0'
|
||||
self.assertFalse(vnx_utils.is_image_cache_volume(volume))
|
||||
|
||||
@res_mock.mock_driver_input
|
||||
def test_is_image_cache_volume_true(self, mocked):
|
||||
volume = mocked['volume']
|
||||
volume.display_name = 'image-ca86b9a0-d0d5-4267-8cd5-c62274056cc0'
|
||||
self.assertTrue(vnx_utils.is_image_cache_volume(volume))
|
||||
|
||||
@res_mock.mock_driver_input
|
||||
def test_calc_migrate_and_provision_image_cache(self, mocked):
|
||||
volume = mocked['volume']
|
||||
volume.display_name = 'image-ca86b9a0-d0d5-4267-8cd5-c62274056cc0'
|
||||
self.assertTrue(vnx_utils.is_image_cache_volume(volume))
|
||||
async_migrate, provision = vnx_utils.calc_migrate_and_provision(volume)
|
||||
self.assertFalse(async_migrate)
|
||||
self.assertEqual(provision.name, 'THIN')
|
||||
|
||||
@res_mock.mock_driver_input
|
||||
def test_calc_migrate_and_provision(self, mocked):
|
||||
volume = mocked['volume']
|
||||
volume.display_name = 'volume-ca86b9a0-d0d5-4267-8cd5-c62274056cc0'
|
||||
async_migrate, provision = vnx_utils.calc_migrate_and_provision(volume)
|
||||
self.assertEqual(vnx_utils.is_async_migrate_enabled(volume),
|
||||
async_migrate)
|
||||
self.assertEqual(provision.name, 'THICK')
|
||||
|
@ -313,7 +313,6 @@ class CommonAdapter(object):
|
||||
pool = utils.get_pool_from_host(volume.host)
|
||||
|
||||
specs = common.ExtraSpecs.from_volume(volume)
|
||||
provision = specs.provision
|
||||
tier = specs.tier
|
||||
base_lun_name = utils.get_base_lun_name(snapshot.volume)
|
||||
rep_update = dict()
|
||||
@ -333,7 +332,7 @@ class CommonAdapter(object):
|
||||
volume_metadata['snapcopy'] = 'True'
|
||||
volume_metadata['async_migrate'] = 'False'
|
||||
else:
|
||||
async_migrate = utils.is_async_migrate_enabled(volume)
|
||||
async_migrate, provision = utils.calc_migrate_and_provision(volume)
|
||||
new_snap_name = (
|
||||
utils.construct_snap_name(volume) if async_migrate else None)
|
||||
new_lun_id = emc_taskflow.create_volume_from_snapshot(
|
||||
@ -366,7 +365,6 @@ class CommonAdapter(object):
|
||||
pool = utils.get_pool_from_host(volume.host)
|
||||
|
||||
specs = common.ExtraSpecs.from_volume(volume)
|
||||
provision = specs.provision
|
||||
tier = specs.tier
|
||||
base_lun_name = utils.get_base_lun_name(src_vref)
|
||||
|
||||
@ -389,7 +387,7 @@ class CommonAdapter(object):
|
||||
volume_metadata['snapcopy'] = 'True'
|
||||
volume_metadata['async_migrate'] = 'False'
|
||||
else:
|
||||
async_migrate = utils.is_async_migrate_enabled(volume)
|
||||
async_migrate, provision = utils.calc_migrate_and_provision(volume)
|
||||
new_lun_id = emc_taskflow.create_cloned_volume(
|
||||
client=self.client,
|
||||
snap_name=snap_name,
|
||||
|
@ -70,9 +70,11 @@ class VNXDriver(driver.ManageableVD,
|
||||
Configurable migration rate support
|
||||
8.0.0 - New VNX Cinder driver
|
||||
9.0.0 - Use asynchronous migration for cloning
|
||||
10.0.1 - Extend SMP size before aync migration when cloning from an
|
||||
image cache volume
|
||||
"""
|
||||
|
||||
VERSION = '09.00.00'
|
||||
VERSION = '10.00.01'
|
||||
VENDOR = 'Dell EMC'
|
||||
# ThirdPartySystems wiki page
|
||||
CI_WIKI_NAME = "EMC_VNX_CI"
|
||||
|
@ -20,6 +20,7 @@ from oslo_log import log as logging
|
||||
from oslo_service import loopingcall
|
||||
from oslo_utils import excutils
|
||||
from oslo_utils import importutils
|
||||
from oslo_utils import uuidutils
|
||||
|
||||
from cinder.i18n import _
|
||||
from cinder.volume.drivers.dell_emc.vnx import common
|
||||
@ -356,3 +357,26 @@ def get_remote_pool(config, volume):
|
||||
rep_list = common.ReplicationDeviceList(config)
|
||||
remote_pool_name = rep_list[0].pool_name
|
||||
return remote_pool_name if remote_pool_name else pool_name
|
||||
|
||||
|
||||
def is_image_cache_volume(volume):
|
||||
display_name = volume.display_name
|
||||
if (display_name.startswith('image-')
|
||||
and uuidutils.is_uuid_like(display_name[6:])):
|
||||
LOG.debug('Volume: %s is for image cache. Use sync migration and '
|
||||
'thin provisioning.', volume.name)
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def calc_migrate_and_provision(volume):
|
||||
"""Returns a tuple of async migrate and provision type.
|
||||
|
||||
The first element is the flag whether to enable async migrate,
|
||||
the second is the provision type (thin or thick).
|
||||
"""
|
||||
if is_image_cache_volume(volume):
|
||||
return False, storops.VNXProvisionEnum.THIN
|
||||
else:
|
||||
specs = common.ExtraSpecs.from_volume(volume)
|
||||
return is_async_migrate_enabled(volume), specs.provision
|
||||
|
Loading…
x
Reference in New Issue
Block a user