From 2442344fa1afd8d0a4c58b4df35f1b896129a0a1 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) (cherry picked from commit 247e33af8fa1705b037e3343ec3b72a1b520c0c5) --- 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 595fdc152602..391b8967ba8c 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -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', diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index d38ce62d1ee1..590d463938bc 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -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)