Add provider_location to cloned volume
Forced backup was failing when the driver returned a 'provider_location' for a cloned volume, because the return value for create_cloned_volume() was ignored in _create_temp_cloned_volume(). Change-Id: I709996316e4c212243629e461d36da4152e995e4 Closes-Bug: 1573126
This commit is contained in:
parent
ab8d63b796
commit
616a2bd34d
@ -6369,6 +6369,26 @@ class GenericVolumeDriverTestCase(DriverTestCase):
|
|||||||
|
|
||||||
mock_volume_get.assert_called_with(self.context, vol['id'])
|
mock_volume_get.assert_called_with(self.context, vol['id'])
|
||||||
|
|
||||||
|
def test_create_temp_cloned_volume(self):
|
||||||
|
with mock.patch.object(
|
||||||
|
self.volume.driver,
|
||||||
|
'create_cloned_volume') as mock_create_cloned_volume:
|
||||||
|
model_update = {'provider_location': 'dummy'}
|
||||||
|
mock_create_cloned_volume.return_value = model_update
|
||||||
|
vol = tests_utils.create_volume(self.context,
|
||||||
|
status='backing-up')
|
||||||
|
cloned_vol = self.volume.driver._create_temp_cloned_volume(
|
||||||
|
self.context, vol)
|
||||||
|
self.assertEqual('dummy', cloned_vol['provider_location'])
|
||||||
|
self.assertEqual('available', cloned_vol['status'])
|
||||||
|
|
||||||
|
mock_create_cloned_volume.return_value = None
|
||||||
|
vol = tests_utils.create_volume(self.context,
|
||||||
|
status='backing-up')
|
||||||
|
cloned_vol = self.volume.driver._create_temp_cloned_volume(
|
||||||
|
self.context, vol)
|
||||||
|
self.assertEqual('available', cloned_vol['status'])
|
||||||
|
|
||||||
@mock.patch.object(utils, 'temporary_chown')
|
@mock.patch.object(utils, 'temporary_chown')
|
||||||
@mock.patch('six.moves.builtins.open')
|
@mock.patch('six.moves.builtins.open')
|
||||||
@mock.patch.object(os_brick.initiator.connector,
|
@mock.patch.object(os_brick.initiator.connector,
|
||||||
|
@ -1351,15 +1351,19 @@ class BaseVD(object):
|
|||||||
}
|
}
|
||||||
temp_vol_ref = self.db.volume_create(context, temp_volume)
|
temp_vol_ref = self.db.volume_create(context, temp_volume)
|
||||||
try:
|
try:
|
||||||
self.create_cloned_volume(temp_vol_ref, volume)
|
# Some drivers return None, because they do not need to update the
|
||||||
|
# model for the volume. For those cases we set the model_update to
|
||||||
|
# an empty dictionary.
|
||||||
|
model_update = self.create_cloned_volume(temp_vol_ref,
|
||||||
|
volume) or {}
|
||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
self.db.volume_destroy(context.elevated(),
|
self.db.volume_destroy(context.elevated(),
|
||||||
temp_vol_ref['id'])
|
temp_vol_ref['id'])
|
||||||
|
|
||||||
self.db.volume_update(context, temp_vol_ref['id'],
|
model_update['status'] = 'available'
|
||||||
{'status': 'available'})
|
self.db.volume_update(context, temp_vol_ref['id'], model_update)
|
||||||
return temp_vol_ref
|
return self.db.volume_get(context, temp_vol_ref['id'])
|
||||||
|
|
||||||
def _create_temp_volume_from_snapshot(self, context, volume, snapshot):
|
def _create_temp_volume_from_snapshot(self, context, volume, snapshot):
|
||||||
temp_volume = {
|
temp_volume = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user