Do not rename rbd based volume after migration

After rbd based volume migrated (retyped), it will be
renamed to the original name unless name collision or
some errors happen. But the problem is this information
seems not reflect on connection info, especially this volume
is already in-use.

This patch mimics behavior of lvm driver by not renaming
in-used volume after migration(retype)

Close-Bug: #1866935

Change-Id: I4db0dc978d55d4704dd60e2eb8738b38ddefbbbd
(cherry picked from commit 662677280b)
(cherry picked from commit 7c1118febc)
This commit is contained in:
ushen 2020-03-09 19:34:24 +08:00 committed by norman shen
parent db58c6c902
commit 6e34c47195
2 changed files with 27 additions and 1 deletions

View File

@ -1809,6 +1809,24 @@ class RBDTestCase(test.TestCase):
self.assertEqual({'_name_id': None,
'provider_location': None}, model_update)
@common_mocks
def test_update_migrated_volume_in_use(self):
client = self.mock_client.return_value
client.__enter__.return_value = client
with mock.patch.object(self.driver.rbd.RBD(), 'rename') as mock_rename:
context = {}
mock_rename.return_value = 0
model_update = self.driver.update_migrated_volume(context,
self.volume_a,
self.volume_b,
'in-use')
mock_rename.assert_not_called()
self.assertEqual({'_name_id': self.volume_b.id,
'provider_location':
self.volume_b['provider_location']},
model_update)
@common_mocks
def test_update_migrated_volume_image_exists(self):
client = self.mock_client.return_value

View File

@ -1746,6 +1746,13 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
name_id = None
provider_location = None
if original_volume_status == 'in-use':
# The back-end will not be renamed.
name_id = new_volume['_name_id'] or new_volume['id']
provider_location = new_volume['provider_location']
return {'_name_id': name_id,
'provider_location': provider_location}
existing_name = CONF.volume_name_template % new_volume.id
wanted_name = CONF.volume_name_template % volume.id
with RADOSClient(self) as client:
@ -1761,7 +1768,8 @@ class RBDDriver(driver.CloneableImageVD, driver.MigrateVD,
# one from the new volume as well.
name_id = new_volume._name_id or new_volume.id
provider_location = new_volume['provider_location']
return {'_name_id': name_id, 'provider_location': provider_location}
return {'_name_id': name_id,
'provider_location': provider_location}
def migrate_volume(self, context, volume, host):