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
This commit is contained in:
ushen 2020-03-09 19:34:24 +08:00 committed by shenjiatong
parent 10bbfcc78e
commit 662677280b
2 changed files with 27 additions and 1 deletions

View File

@ -1836,6 +1836,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

@ -1768,6 +1768,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:
@ -1783,7 +1790,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):