summaryrefslogtreecommitdiffstats
path: root/os_net_config
diff options
context:
space:
mode:
Diffstat (limited to 'os_net_config')
-rw-r--r--os_net_config/tests/test_utils.py24
-rw-r--r--os_net_config/utils.py11
2 files changed, 34 insertions, 1 deletions
diff --git a/os_net_config/tests/test_utils.py b/os_net_config/tests/test_utils.py
index b766384..1885cbb 100644
--- a/os_net_config/tests/test_utils.py
+++ b/os_net_config/tests/test_utils.py
@@ -217,3 +217,27 @@ class TestUtils(base.TestCase):
def test_interface_mac_raises(self):
self.assertRaises(IOError, utils.interface_mac, 'ens20f2p3')
+
+ def test_is_active_nic_for_sriov_vf(self):
+
+ tmpdir = tempfile.mkdtemp()
+ self.stubs.Set(utils, '_SYS_CLASS_NET', tmpdir)
+
+ # SR-IOV PF = ens802f0
+ # SR-IOV VF = enp129s2
+ for nic in ['ens802f0', 'enp129s2']:
+ nic_path = os.path.join(tmpdir, nic)
+ os.makedirs(nic_path)
+ os.makedirs(os.path.join(nic_path, 'device'))
+ with open(os.path.join(nic_path, 'operstate'), 'w') as f:
+ f.write('up')
+ with open(os.path.join(nic_path, 'address'), 'w') as f:
+ f.write('1.2.3.4')
+
+ nic_path = os.path.join(tmpdir, 'enp129s2', 'device', 'physfn')
+ os.makedirs(nic_path)
+
+ self.assertEqual(utils._is_active_nic('ens802f0'), True)
+ self.assertEqual(utils._is_active_nic('enp129s2'), False)
+
+ shutil.rmtree(tmpdir)
diff --git a/os_net_config/utils.py b/os_net_config/utils.py
index af359d5..98bfe99 100644
--- a/os_net_config/utils.py
+++ b/os_net_config/utils.py
@@ -107,7 +107,16 @@ def _is_active_nic(interface_name):
with open(_SYS_CLASS_NET + '/%s/address' % interface_name, 'r') as f:
address = f.read().rstrip()
- if has_device_dir and operstate == 'up' and address:
+ # If SR-IOV Virtual Functions (VF) are enabled in an interface, there
+ # will be additional nics created for each VF. It has to be ignored in
+ # the nic numbering. All the VFs will have a reference to the PF with
+ # directory name as 'physfn', if this directory is present it should be
+ # ignored.
+ vf_path_check = _SYS_CLASS_NET + '/%s/device/physfn' % interface_name
+ is_sriov_vf = os.path.isdir(vf_path_check)
+
+ if (has_device_dir and operstate == 'up' and address and
+ not is_sriov_vf):
return True
else:
return False