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 commitaf80c3ffd1
) (cherry picked from commit247e33af8f
)
This commit is contained in:
parent
9ae99a1101
commit
2442344fa1
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
||||
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