Merge "Avoid exploding if guest refuses to detach a volume"

This commit is contained in:
Zuul 2018-02-21 22:05:44 +00:00 committed by Gerrit Code Review
commit ef4000a0d3
2 changed files with 22 additions and 0 deletions

View File

@ -230,6 +230,24 @@ class TestDriverBlockDevice(test.NoDBTestCase):
bdm = getattr(self, attr % name)
bdm['attachment_id'] = self.attachment_id
@mock.patch('nova.virt.block_device.LOG')
@mock.patch('os_brick.encryptors')
def test_driver_detach_passes_failed(self, enc, log):
virt = mock.MagicMock()
virt.detach_volume.side_effect = exception.DeviceDetachFailed(
device='sda', reason='because testing')
driver_bdm = self.driver_classes['volume'](self.volume_bdm)
inst = mock.MagicMock(),
vol_api = mock.MagicMock()
# Make sure we pass through DeviceDetachFailed,
# but don't log it as an exception, just a warning
self.assertRaises(exception.DeviceDetachFailed,
driver_bdm.driver_detach,
self.context, inst, vol_api, virt)
self.assertFalse(log.exception.called)
self.assertTrue(log.warning.called)
def test_no_device_raises(self):
for name, cls in self.driver_classes.items():
bdm = fake_block_device.fake_bdm_object(

View File

@ -304,6 +304,10 @@ class DriverVolumeBlockDevice(DriverBlockDevice):
'%(mp)s : %(err)s',
{'volume_id': volume_id, 'mp': mp,
'err': err}, instance=instance)
except exception.DeviceDetachFailed as err:
with excutils.save_and_reraise_exception():
LOG.warning('Guest refused to detach volume %(vol)s',
{'vol': volume_id}, instance=instance)
except Exception:
with excutils.save_and_reraise_exception():
LOG.exception('Failed to detach volume '