diff --git a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py index 664fa116f30..e7cfbb11b52 100644 --- a/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py +++ b/cinder/tests/unit/volume/drivers/solidfire/test_solidfire.py @@ -1342,6 +1342,35 @@ class SolidFireVolumeTestCase(test.TestCase): self.assertTrue(migrated) self.assertEqual({}, updates) + @data(None, 'Success', 'Error', f'target:{f_uuid[0]}') + @mock.patch.object(solidfire.SolidFireDriver, '_get_sf_volume') + @mock.patch.object(solidfire.SolidFireDriver, '_get_sfaccount') + def test_attach_volume(self, mig_status, mock_get_sfaccount, + mock_get_sf_volume): + mock_get_sfaccount.return_value = self.fake_sfaccount + i_uuid = 'fake_instance_uuid' + ctx = context.get_admin_context() + type_fields = {} + vol_type = fake_volume.fake_volume_type_obj(ctx, **type_fields) + utc_now = timeutils.utcnow().isoformat() + vol_fields = { + 'id': f_uuid[0], + 'created_at': utc_now, + 'volume_type': vol_type, + 'volume_type_id': vol_type.id, + 'migration_status': mig_status, + } + vol = fake_volume.fake_volume_obj(ctx, **vol_fields) + sf_vol = self.fake_sfvol + mock_get_sf_volume.return_value = sf_vol + + sfv = solidfire.SolidFireDriver(configuration=self.configuration) + sfv.attach_volume(ctx, vol, i_uuid, 'fake_host', '/dev/sdf') + self.assertEqual(sf_vol['attributes']['attached_to'], + i_uuid) + mock_get_sfaccount.assert_called() + mock_get_sf_volume.assert_called() + def test_retype_with_qos_spec(self): test_type = {'name': 'sf-1', 'qos_specs_id': 'fb0576d7-b4b5-4cad-85dc-ca92e6a497d1', diff --git a/cinder/volume/drivers/solidfire.py b/cinder/volume/drivers/solidfire.py index 24b29997f34..f35f54dbcc1 100644 --- a/cinder/volume/drivers/solidfire.py +++ b/cinder/volume/drivers/solidfire.py @@ -2086,7 +2086,14 @@ class SolidFireDriver(san.SanISCSIDriver): sfaccount = self._get_sfaccount(volume['project_id']) params = {'accountID': sfaccount['accountID']} - sf_vol = self._get_sf_volume(volume['id'], params) + # In a retype of an attached volume scenario, the volume id will be + # as a target on 'migration_status', otherwise it'd be None. + migration_status = volume.get('migration_status') + if migration_status and 'target' in migration_status: + __, vol_id = migration_status.split(':') + else: + vol_id = volume['id'] + sf_vol = self._get_sf_volume(vol_id, params) if sf_vol is None: LOG.error("Volume ID %s was not found on " "the SolidFire Cluster while attempting " diff --git a/releasenotes/notes/bug-1859652-netapp-fix-retype-attached-volume-to-solidfire-1933f03673ff078d.yaml b/releasenotes/notes/bug-1859652-netapp-fix-retype-attached-volume-to-solidfire-1933f03673ff078d.yaml new file mode 100644 index 00000000000..6292157609a --- /dev/null +++ b/releasenotes/notes/bug-1859652-netapp-fix-retype-attached-volume-to-solidfire-1933f03673ff078d.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed `bug #1859652 `_ + to allow retyping an attached volume to SolidFire.