Fix NoneType error in _notify_volume_usage_detach
If the driver.block_stats() method returns None, like the libvirt driver will if the guest is gone during an evacuate, we'll get a NoneType error trying to unpack the return value from the driver. Instead, simply return as if the driver raised NotImplementedError. Since handling None is changing the contract on the virt driver API, the docstring is updated to explain the acceptable return values of the driver method. Change-Id: I98a2785c07f7af02ad83650c72d9e1868290ece4 Closes-Bug: #1796981 (cherry picked from commit4da54c0786
) (cherry picked from commit940034c27c
)
This commit is contained in:
parent
b5e8702f57
commit
62fbfdfa8f
|
@ -5335,13 +5335,14 @@ class ComputeManager(manager.Manager):
|
|||
if CONF.volume_usage_poll_interval <= 0:
|
||||
return
|
||||
|
||||
vol_stats = []
|
||||
mp = bdm.device_name
|
||||
# Handle bootable volumes which will not contain /dev/
|
||||
if '/dev/' in mp:
|
||||
mp = mp[5:]
|
||||
try:
|
||||
vol_stats = self.driver.block_stats(instance, mp)
|
||||
if vol_stats is None:
|
||||
return
|
||||
except NotImplementedError:
|
||||
return
|
||||
|
||||
|
|
|
@ -4622,6 +4622,23 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
|
|||
expected_reqspec_hints, self.compute._get_scheduler_hints(
|
||||
filter_properties, reqspec))
|
||||
|
||||
def test_notify_volume_usage_detach_no_block_stats(self):
|
||||
"""Tests the case that the virt driver returns None from the
|
||||
block_stats() method and no notification is sent, similar to the
|
||||
virt driver raising NotImplementedError.
|
||||
"""
|
||||
self.flags(volume_usage_poll_interval=60)
|
||||
fake_instance = objects.Instance()
|
||||
fake_bdm = objects.BlockDeviceMapping(device_name='/dev/vda')
|
||||
with mock.patch.object(self.compute.driver, 'block_stats',
|
||||
return_value=None) as block_stats:
|
||||
# Assert a notification isn't sent.
|
||||
with mock.patch.object(self.compute.notifier, 'info',
|
||||
new_callable=mock.NonCallableMock):
|
||||
self.compute._notify_volume_usage_detach(
|
||||
self.context, fake_instance, fake_bdm)
|
||||
block_stats.assert_called_once_with(fake_instance, 'vda')
|
||||
|
||||
|
||||
class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
|
||||
def setUp(self):
|
||||
|
|
|
@ -1337,6 +1337,13 @@ class ComputeDriver(object):
|
|||
unused.
|
||||
|
||||
Note that this function takes an instance ID.
|
||||
|
||||
:param instance: nova.objects.Instance to get block storage statistics
|
||||
:param disk_id: mountpoint name, e.g. "vda"
|
||||
:returns: None if block statistics could not be retrieved, otherwise a
|
||||
list of the form: [rd_req, rd_bytes, wr_req, wr_bytes, errs]
|
||||
:raises: NotImplementedError if the driver does not implement this
|
||||
method
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
|
|
Loading…
Reference in New Issue