Dell SC: Add check of current value on retype

The recently merged retype code for the Dell Storage
Center driver does not check if the new Storage Profile
value is different than the currently set value. While
this is mostly harmless since there isn't a lot of overhead
to setting the Storage Profile to its existing value, it
is still extra overhead and API calls that need to be
performed to complete the operation.

This adds a simple check to compare the current value against
the requested value to decide whether or not to perform the
retype operation. We only support retyping of the Storage
Profile, so if they are the same, just return true to
prevent a migration from happening.

Change-Id: I2d16b4129170cc8ecedfd3674b609badb27b9095
This commit is contained in:
Sean McGinnis 2015-07-27 09:18:44 -05:00
parent d620337353
commit 6dd75f4554
2 changed files with 29 additions and 10 deletions

View File

@ -1652,6 +1652,16 @@ class DellSCSanISCSIDriverTestCase(test.TestCase):
None, None, None, {'extra_specs': {'something': 'else'}}, None) None, None, None, {'extra_specs': {'something': 'else'}}, None)
self.assertFalse(res) self.assertFalse(res)
def test_retype_same(self,
mock_close_connection,
mock_open_connection,
mock_init):
res = self.driver.retype(
None, None, None,
{'extra_specs': {'storagetype:storageprofile': ['A', 'A']}},
None)
self.assertTrue(res)
def test_retype_malformed(self, def test_retype_malformed(self,
mock_close_connection, mock_close_connection,
mock_open_connection, mock_open_connection,

View File

@ -663,16 +663,25 @@ class DellCommonDriver(driver.ConsistencyGroupVD, driver.ManageableVD,
storage_profiles) storage_profiles)
return False return False
current = storage_profiles[0]
requested = storage_profiles[1] requested = storage_profiles[1]
volume_name = volume.get('id')
LOG.debug('Retyping volume %(vol)s to use storage ' if current != requested:
'profile %(profile)s', volume_name = volume.get('id')
{'vol': volume_name, LOG.debug('Retyping volume %(vol)s to use storage '
'profile': requested}) 'profile %(profile)s.',
with self._client.open_connection() as api: {'vol': volume_name,
if api.find_sc(): 'profile': requested})
scvolume = api.find_volume(volume_name) with self._client.open_connection() as api:
return api.update_storage_profile( if api.find_sc():
scvolume, requested) scvolume = api.find_volume(volume_name)
return api.update_storage_profile(
scvolume, requested)
else:
# We only support retype of Storage Profile and they are
# the same, so just return True to avoid unnecessary data
# migration.
LOG.info(_LI('Retype was to same Storage Profile.'))
return True
return False return False