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)
(cherry picked from commit 247e33af8f)
This commit is contained in:
Sean Mooney 2020-07-02 10:43:08 +00:00 committed by sean mooney
parent 9ae99a1101
commit 2442344fa1
2 changed files with 22 additions and 2 deletions

View File

@ -16512,6 +16512,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',

View File

@ -6641,9 +6641,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)