From 247e33af8fa1705b037e3343ec3b72a1b520c0c5 Mon Sep 17 00:00:00 2001 From: Sean Mooney Date: Thu, 2 Jul 2020 10:43:08 +0000 Subject: [PATCH] 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 af80c3ffd116837b296e79858595d42c893708a6) --- nova/tests/unit/virt/libvirt/test_driver.py | 16 ++++++++++++++++ nova/virt/libvirt/driver.py | 8 ++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index 7b7ca6dd71f0..1231757b7a92 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -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', diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 49ef4673eaf3..47901a78cad3 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -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)