From d0e913f604b5e094db563db45b86cbaf347a4650 Mon Sep 17 00:00:00 2001 From: Vipin Balachandran Date: Mon, 24 Sep 2018 17:56:31 -0700 Subject: [PATCH] VMware: Implement retype Implementing retype for VMwareVStorageObjectDriver. It allows changing the storage policy of the backend volume using cinder retype. Change-Id: I28c2a6a59583d9a7be737c78869347bcbe51e0c2 --- .../unit/volume/drivers/vmware/test_fcd.py | 61 +++++++++++++++++++ cinder/volume/drivers/vmware/fcd.py | 23 ++++++- .../vmware_fcd_retype-979418c39fd5d59d.yaml | 5 ++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/vmware_fcd_retype-979418c39fd5d59d.yaml diff --git a/cinder/tests/unit/volume/drivers/vmware/test_fcd.py b/cinder/tests/unit/volume/drivers/vmware/test_fcd.py index 412c123b92b..620fe19d8a7 100644 --- a/cinder/tests/unit/volume/drivers/vmware/test_fcd.py +++ b/cinder/tests/unit/volume/drivers/vmware/test_fcd.py @@ -624,3 +624,64 @@ class VMwareVStorageObjectDriverTestCase(test.TestCase): self._driver.create_cloned_volume(volume, src_volume) create_volume_from_fcd.assert_called_once_with( src_volume.provider_location, src_volume.size, volume) + + @mock.patch.object(FCD_DRIVER, '_get_storage_profile') + @mock.patch.object(FCD_DRIVER, '_get_extra_spec_storage_profile') + @mock.patch.object(FCD_DRIVER, '_in_use') + @mock.patch.object(FCD_DRIVER, 'volumeops') + @mock.patch.object(volumeops.FcdLocation, 'from_provider_location') + @mock.patch.object(FCD_DRIVER, 'ds_sel') + @ddt.data({}, + {'storage_policy_enabled': False}, + {'same_profile': True}, + {'vol_in_use': True} + ) + @ddt.unpack + def test_retype( + self, ds_sel, from_provider_location, vops, in_use, + get_extra_spec_storage_profile, get_storage_profile, + storage_policy_enabled=True, same_profile=False, vol_in_use=False): + self._driver._storage_policy_enabled = storage_policy_enabled + + if storage_policy_enabled: + profile = mock.sentinel.profile + get_storage_profile.return_value = profile + + if same_profile: + new_profile = profile + else: + new_profile = mock.sentinel.new_profile + get_extra_spec_storage_profile.return_value = new_profile + + in_use.return_value = vol_in_use + + if not vol_in_use: + fcd_loc = mock.sentinel.fcd_loc + from_provider_location.return_value = fcd_loc + + new_profile_id = mock.Mock() + ds_sel.get_profile_id.return_value = new_profile_id + + ctxt = mock.sentinel.ctxt + volume = self._create_volume_obj() + new_type = {'id': mock.sentinel.new_type_id} + diff = mock.sentinel.diff + host = mock.sentinel.host + ret = self._driver.retype(ctxt, volume, new_type, diff, host) + + if not storage_policy_enabled: + self.assertTrue(ret) + else: + get_storage_profile.assert_called_once_with(volume) + get_extra_spec_storage_profile.assert_called_once_with( + new_type['id']) + if same_profile: + self.assertTrue(ret) + else: + in_use.assert_called_once_with(volume) + if vol_in_use: + self.assertFalse(ret) + else: + ds_sel.get_profile_id.assert_called_once_with(new_profile) + vops.update_fcd_policy.assert_called_once_with( + fcd_loc, new_profile_id.uniqueId) diff --git a/cinder/volume/drivers/vmware/fcd.py b/cinder/volume/drivers/vmware/fcd.py index 8b5e94f46bd..58bacc9b6da 100644 --- a/cinder/volume/drivers/vmware/fcd.py +++ b/cinder/volume/drivers/vmware/fcd.py @@ -45,7 +45,8 @@ class VMwareVStorageObjectDriver(vmdk.VMwareVcVmdkDriver): # 1.0 - initial version based on vSphere 6.5 vStorageObject APIs # 1.1 - support for vStorageObject snapshot APIs # 1.2 - support for SPBM storage policies - VERSION = '1.2.0' + # 1.3 - support for retype + VERSION = '1.3.0' # ThirdPartySystems wiki page CI_WIKI_NAME = "VMware_CI" @@ -364,3 +365,23 @@ class VMwareVStorageObjectDriver(vmdk.VMwareVcVmdkDriver): """ return self._create_volume_from_fcd( src_vref.provider_location, src_vref.size, volume) + + def retype(self, context, volume, new_type, diff, host): + if not self._storage_policy_enabled: + return True + + profile = self._get_storage_profile(volume) + new_profile = self._get_extra_spec_storage_profile(new_type['id']) + if profile == new_profile: + LOG.debug("Storage profile matches between new type and old type.") + return True + + if self._in_use(volume): + LOG.warning("Cannot change storage profile of attached FCD.") + return False + + fcd_loc = vops.FcdLocation.from_provider_location( + volume.provider_location) + new_profile_id = self.ds_sel.get_profile_id(new_profile) + self.volumeops.update_fcd_policy(fcd_loc, new_profile_id.uniqueId) + return True diff --git a/releasenotes/notes/vmware_fcd_retype-979418c39fd5d59d.yaml b/releasenotes/notes/vmware_fcd_retype-979418c39fd5d59d.yaml new file mode 100644 index 00000000000..128f0399f26 --- /dev/null +++ b/releasenotes/notes/vmware_fcd_retype-979418c39fd5d59d.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Added support for changing storage policy of backend volumes + created by VMwareVStorageObjectDriver using retype API.