catch libvirt exception when nodedev not found.
This is a minimal fix to workaround instance where libvirt
retruns stale data due to internal caching. In some cases
libivrt can return stale data vai the nodedev api when the
mac adress of an interface such as an sriov virtual function
canages, i.e. when a mac adress is reset after a vm with
a virtual funciton is migrated.
Change-Id: Ic5e60c8e28263365fad5867e483b6ad55cee7281
Partial-Bug: #1883671
(cherry picked from commit af80c3ffd1
)
This commit is contained in:
parent
840de3b892
commit
247e33af8f
|
@ -16854,6 +16854,22 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||
mock_get_net_name.assert_called_once_with(parent_address)
|
||||
mock_dev_lookup.assert_called_once_with(dev_name)
|
||||
|
||||
def test_get_pcinet_info_raises(self):
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
||||
dev_name = "net_enp2s2_02_9a_a1_37_be_54"
|
||||
parent_address = "pci_0000_04_11_7"
|
||||
|
||||
with mock.patch.object(pci_utils, 'get_net_name_by_vf_pci_address',
|
||||
return_value=dev_name) as mock_get_net_name, \
|
||||
mock.patch.object(
|
||||
drvr._host, 'device_lookup_by_name',
|
||||
side_effect=fakelibvirt.libvirtError("message")
|
||||
) as mock_dev_lookup:
|
||||
actualvf = drvr._get_pcinet_info(parent_address)
|
||||
self.assertIsNone(actualvf)
|
||||
mock_get_net_name.assert_called_once_with(parent_address)
|
||||
mock_dev_lookup.assert_called_once_with(dev_name)
|
||||
|
||||
@mock.patch.object(pci_utils, 'get_ifname_by_pci_address')
|
||||
def test_get_pcidev_info_non_nic(self, mock_get_ifname):
|
||||
self.stub_out('nova.virt.libvirt.host.Host.device_lookup_by_name',
|
||||
|
|
|
@ -6894,9 +6894,13 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||
"""Returns a dict of NET device."""
|
||||
devname = pci_utils.get_net_name_by_vf_pci_address(vf_address)
|
||||
if not devname:
|
||||
return
|
||||
return None
|
||||
|
||||
virtdev = self._host.device_lookup_by_name(devname)
|
||||
try:
|
||||
virtdev = self._host.device_lookup_by_name(devname)
|
||||
except libvirt.libvirtError as ex:
|
||||
LOG.warning(ex)
|
||||
return None
|
||||
xmlstr = virtdev.XMLDesc(0)
|
||||
cfgdev = vconfig.LibvirtConfigNodeDevice()
|
||||
cfgdev.parse_str(xmlstr)
|
||||
|
|
Loading…
Reference in New Issue