From 323f01b9a454b92d52e3fb2137167c73904327aa Mon Sep 17 00:00:00 2001 From: Danil Golov Date: Tue, 3 Sep 2019 16:59:31 +0300 Subject: [PATCH] Fix sensitivity to the initial device driver Previously it was expected that all devices are initially binded on kernel driver. In case of userspace driver it caused an incorrect behavior. This patch makes sriov binding driver insensitive for initial device driver. Change-Id: I1be19aceb9176d1bdf7f0f712a4a02ec2cd3ce8d Closes-Bug: 1842446 Signed-off-by: Danil Golov --- kuryr_kubernetes/cni/binding/sriov.py | 13 +++++++++---- kuryr_kubernetes/tests/unit/cni/test_binding.py | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/kuryr_kubernetes/cni/binding/sriov.py b/kuryr_kubernetes/cni/binding/sriov.py index f1bac696e..a1ee6fad7 100644 --- a/kuryr_kubernetes/cni/binding/sriov.py +++ b/kuryr_kubernetes/cni/binding/sriov.py @@ -128,7 +128,7 @@ class VIFSriovDriver(object): def _compute_pci(self, pci, driver, pod_link, vif, ifname, netns): port_id = vif.id - vf_name, vf_index, pf, pci_info = self._get_vf_info(pci) + vf_name, vf_index, pf, pci_info = self._get_vf_info(pci, driver) if driver in constants.USERSPACE_DRIVERS: LOG.info("PCI device %s will be rebinded to userspace network " "driver %s", pci, driver) @@ -165,10 +165,15 @@ class VIFSriovDriver(object): return pci_info - def _get_vf_info(self, pci): + def _get_vf_info(self, pci, driver): vf_sys_path = '/sys/bus/pci/devices/{}/net/'.format(pci) - vf_names = os.listdir(vf_sys_path) - vf_name = vf_names[0] + if not os.path.exists(vf_sys_path): + if driver not in constants.USERSPACE_DRIVERS: + raise OSError(_("No vf name for device {}").format(pci)) + vf_name = None + else: + vf_names = os.listdir(vf_sys_path) + vf_name = vf_names[0] pfysfn_path = '/sys/bus/pci/devices/{}/physfn/net/'.format(pci) pf_names = os.listdir(pfysfn_path) diff --git a/kuryr_kubernetes/tests/unit/cni/test_binding.py b/kuryr_kubernetes/tests/unit/cni/test_binding.py index 14de3d864..ebdcceb35 100644 --- a/kuryr_kubernetes/tests/unit/cni/test_binding.py +++ b/kuryr_kubernetes/tests/unit/cni/test_binding.py @@ -330,7 +330,7 @@ class TestSriovDriver(TestDriverMixin, test_base.TestCase): self.vif, self.ifname, self.netns)) - m_driver._get_vf_info.assert_called_once_with(self.pci) + m_driver._get_vf_info.assert_called_once_with(self.pci, new_driver) m_driver._set_vf_mac.assert_called_once_with(pf, vf_index, self.vif.address) m_driver._bind_device.assert_called_once_with(self.pci, new_driver) @@ -359,7 +359,7 @@ class TestSriovDriver(TestDriverMixin, test_base.TestCase): self.ifname, self.netns)) - m_driver._get_vf_info.assert_called_once_with(self.pci) + m_driver._get_vf_info.assert_called_once_with(self.pci, new_driver) m_driver._move_to_netns.assert_called_once_with(self.pci, self.ifname, self.netns, self.vif, vf_name, vf_index, pf,