VNX: failed to create from image cache
Failed to create from image cache before the async migration was completed. So the fix is that change the migration mode of creating image cache volume from async to sync. Change-Id: I446fbd063a20291edf405085e7d1f3b6417beb2c Closes-Bug: 1698047
This commit is contained in:
parent
bd33bbffb7
commit
71b64e2752
|
@ -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…
Reference in New Issue