Adds macvtap support

The current logic handles only VFs with direct vnic-type.
This fix will add support for VFs with macvtap vnic-type,
By checking the relevant upper_macvtap directory.

Change-Id: Id69b7e64858020682fd0f68b0e162e5e8022eea3
Closes-Bug: 1383098
This commit is contained in:
Samer Deeb 2014-10-21 10:33:35 +03:00
parent 6db9fac938
commit 6f41074e11
2 changed files with 29 additions and 2 deletions

View File

@ -13,6 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import glob
import os
import re
@ -30,6 +31,7 @@ class PciOsWrapper(object):
PCI_PATH = "/sys/class/net/%s/device/virtfn%s/net"
VIRTFN_FORMAT = "^virtfn(?P<vf_index>\d+)"
VIRTFN_REG_EX = re.compile(VIRTFN_FORMAT)
MAC_VTAP_PREFIX = "upper_macvtap*"
@classmethod
def scan_vf_devices(cls, dev_name):
@ -65,12 +67,18 @@ class PciOsWrapper(object):
"""Check if VF is assigned.
Checks if a given vf index of a given device name is assigned
by checking the relevant path in the system
by checking the relevant path in the system:
VF is assigned if:
Direct VF: PCI_PATH does not exist.
Macvtap VF: upper_macvtap path exists.
@param dev_name: pf network device name
@param vf_index: vf index
"""
path = cls.PCI_PATH % (dev_name, vf_index)
return not (os.path.isdir(path))
if not os.path.isdir(path):
return True
upper_macvtap_path = os.path.join(path, "*", cls.MAC_VTAP_PREFIX)
return bool(glob.glob(upper_macvtap_path))
class EmbSwitch(object):

View File

@ -363,3 +363,22 @@ class TestPciOsWrapper(base.BaseTestCase):
def test_is_assigned_vf_false(self):
self._mock_assign_vf(False)
def _mock_assign_vf_macvtap(self, macvtap_exists):
def _glob(file_path):
return ["upper_macvtap0"] if macvtap_exists else []
with contextlib.nested(
mock.patch("os.path.isdir",
return_value=True),
mock.patch("glob.glob",
side_effect=_glob)):
result = esm.PciOsWrapper.is_assigned_vf(self.DEV_NAME,
self.VF_INDEX)
self.assertEqual(macvtap_exists, result)
def test_is_assigned_vf_macvtap_true(self):
self._mock_assign_vf_macvtap(True)
def test_is_assigned_vf_macvtap_false(self):
self._mock_assign_vf_macvtap(False)