Merge "Avoid driverctl run if the driver is already bound"

This commit is contained in:
Zuul 2019-08-22 11:39:12 +00:00 committed by Gerrit Code Review
commit 25996d84bb
2 changed files with 49 additions and 0 deletions

View File

@ -478,6 +478,36 @@ class TestUtils(base.TestCase):
utils.bind_dpdk_interfaces, 'eth2', 'vfio-pci',
False)
def test_bind_dpdk_interfaces_same_driver(self):
mocked_open = mock.mock_open(read_data='DRIVER=vfio-pci\n')
self.stub_out('os_net_config.utils.open', mocked_open)
mocked_logger = mock.Mock()
self.stub_out('os_net_config.utils.logger.info', mocked_logger)
try:
utils.bind_dpdk_interfaces('eth1', 'vfio-pci', False)
except utils.OvsDpdkBindException:
self.fail("Received OvsDpdkBindException unexpectedly")
msg = "Driver (vfio-pci) is already bound to the device (eth1)"
mocked_logger.assert_called_with(msg)
def test_get_interface_driver(self):
mocked_open = mock.mock_open(read_data='DRIVER=vfio-pci\n')
self.stub_out('os_net_config.utils.open', mocked_open)
driver = utils.get_interface_driver('eth1')
self.assertEqual(driver, 'vfio-pci')
def test_get_interface_driver_fail_none(self):
mocked_open = mock.mock_open(read_data='')
self.stub_out('os_net_config.utils.open', mocked_open)
driver = utils.get_interface_driver('eth1')
self.assertFalse(driver)
def test_get_interface_driver_fail_empty(self):
mocked_open = mock.mock_open(read_data='DRIVER\n')
self.stub_out('os_net_config.utils.open', mocked_open)
driver = utils.get_interface_driver('eth1')
self.assertFalse(driver)
def test__update_dpdk_map_new(self):
utils._update_dpdk_map('eth1', '0000:03:00.0', '01:02:03:04:05:06',
'vfio-pci')

View File

@ -251,6 +251,11 @@ def diff(filename, data):
def bind_dpdk_interfaces(ifname, driver, noop):
iface_driver = get_interface_driver(ifname)
if iface_driver == driver:
logger.info("Driver (%s) is already bound to the device (%s)" %
(driver, ifname))
return
pci_address = get_pci_address(ifname, noop)
if not noop:
if pci_address:
@ -362,6 +367,20 @@ def get_device_id(ifname):
return
def get_interface_driver(ifname):
try:
uevent = '%s/%s/device/uevent' % (_SYS_CLASS_NET, ifname)
with open(uevent, 'r') as f:
out = f.read().strip()
for line in out.split('\n'):
if 'DRIVER' in line:
driver = line.split('=')
if len(driver) == 2:
return driver[1]
except IOError:
return
def get_dpdk_devargs(ifname, noop):
if not noop:
vendor_id = get_vendor_id(ifname)