Add missing libvirt exception during device detach
It turns out that when detaching a device libvirt can raise a libvirt.VIR_ERR_INTERNAL_ERROR exception with an error log of "unable to execute QEMU command 'device_del': Device <foo> not found". Add this exception to the existing "not found" case which currently handles only libvirt.VIR_ERR_OPERATION_FAILED. Change-Id: I3055cd7641de92ab188de73733ca9288a9ca730a Closes-Bug: #1815949 Signed-off-by: Chris Friesen <chris.friesen@windriver.com> (cherry picked from commit2a8ee40fcc
) (cherry picked from commit6a7e45c750
) (cherry picked from commit5433dc6a75
)
This commit is contained in:
parent
9191083211
commit
cc697d676c
@ -327,6 +327,28 @@ class GuestTestCase(test.NoDBTestCase):
|
||||
# Some time later, we can do the wait/retry to ensure detach
|
||||
self.assertRaises(exception.DeviceNotFound, retry_detach)
|
||||
|
||||
@mock.patch.object(libvirt_guest.Guest, "detach_device")
|
||||
def test_detach_device_with_retry_operation_internal(self, mock_detach):
|
||||
# This simulates a retry of the transient/live domain detach
|
||||
# failing because the device is not found
|
||||
conf = mock.Mock(spec=vconfig.LibvirtConfigGuestDevice)
|
||||
conf.to_xml.return_value = "</xml>"
|
||||
self.domain.isPersistent.return_value = True
|
||||
|
||||
get_config = mock.Mock(return_value=conf)
|
||||
fake_device = "vdb"
|
||||
fake_exc = fakelibvirt.make_libvirtError(
|
||||
fakelibvirt.libvirtError, "",
|
||||
error_message="operation failed: disk vdb not found",
|
||||
error_code=fakelibvirt.VIR_ERR_INTERNAL_ERROR,
|
||||
error_domain=fakelibvirt.VIR_FROM_DOMAIN)
|
||||
mock_detach.side_effect = [None, fake_exc]
|
||||
retry_detach = self.guest.detach_device_with_retry(
|
||||
get_config, fake_device, live=True,
|
||||
inc_sleep_time=.01, max_retry_count=3)
|
||||
# Some time later, we can do the wait/retry to ensure detach
|
||||
self.assertRaises(exception.DeviceNotFound, retry_detach)
|
||||
|
||||
def test_detach_device_with_retry_invalid_argument(self):
|
||||
# This simulates a persistent domain detach failing because
|
||||
# the device is not found
|
||||
|
@ -406,7 +406,8 @@ class Guest(object):
|
||||
except libvirt.libvirtError as ex:
|
||||
with excutils.save_and_reraise_exception():
|
||||
errcode = ex.get_error_code()
|
||||
if errcode == libvirt.VIR_ERR_OPERATION_FAILED:
|
||||
if errcode in (libvirt.VIR_ERR_OPERATION_FAILED,
|
||||
libvirt.VIR_ERR_INTERNAL_ERROR):
|
||||
errmsg = ex.get_error_message()
|
||||
if 'not found' in errmsg:
|
||||
# This will be raised if the live domain
|
||||
|
Loading…
Reference in New Issue
Block a user