Add support for vrouter HW datapath offloads
Add plumbing for Contrail/Tungsten Fabric datapath offloads * This change expands the VNIC type support for the vrouter VIF type by adding 'direct' and 'virtio-forwarder' plugging support. * After this change, the vrouter VIF type will support the following modes: * 'normal': the 'classic' tap-style VNIC plugged into the instance, * 'direct': a PCI Virtual Function is passed through to the instance, * 'virtio-forwarder': a PCI Virtual Function is proxied to the instance via a vhost-user virtio forwarder. * The os-vif conversion function was extended to support the two new plugging modes. * Unit tests were added for the os-vif conversion functions. * OpenContrail / Tungsten Fabric is planning to consume this functionality for the 5.1 release. * os-vif 1.14.0 is required to pass the metadata Change-Id: I327894839a892a976cf314d4292b22ce247b0afa Depends-On: I401ee6370dad68e62bc2d089e786a840d91d0267 Signed-off-by: Jan Gutter <jan.gutter@netronome.com> blueprint: vrouter-hw-offloads
This commit is contained in:
parent
172855f293
commit
4d32b45c15
@ -70,7 +70,7 @@ os-brick==2.6.1
|
|||||||
os-client-config==1.29.0
|
os-client-config==1.29.0
|
||||||
os-service-types==1.2.0
|
os-service-types==1.2.0
|
||||||
os-traits==0.4.0
|
os-traits==0.4.0
|
||||||
os-vif==1.7.0
|
os-vif==1.14.0
|
||||||
os-win==3.0.0
|
os-win==3.0.0
|
||||||
os-xenapi==0.3.3
|
os-xenapi==0.3.3
|
||||||
osc-lib==1.10.0
|
osc-lib==1.10.0
|
||||||
|
@ -436,6 +436,38 @@ def _nova_to_osvif_vif_vrouter(vif):
|
|||||||
plugin="vrouter",
|
plugin="vrouter",
|
||||||
vif_name=_get_vif_name(vif)
|
vif_name=_get_vif_name(vif)
|
||||||
)
|
)
|
||||||
|
elif vnic_type == model.VNIC_TYPE_DIRECT:
|
||||||
|
datapath_offload = objects.vif.DatapathOffloadRepresentor(
|
||||||
|
representor_name=_get_vif_name(vif),
|
||||||
|
representor_address=vif["profile"]["pci_slot"]
|
||||||
|
)
|
||||||
|
profile = objects.vif.VIFPortProfileBase(
|
||||||
|
datapath_offload=datapath_offload
|
||||||
|
)
|
||||||
|
obj = _get_vif_instance(
|
||||||
|
vif,
|
||||||
|
objects.vif.VIFHostDevice,
|
||||||
|
port_profile=profile,
|
||||||
|
plugin="vrouter",
|
||||||
|
dev_address=vif["profile"]["pci_slot"],
|
||||||
|
dev_type=objects.fields.VIFHostDeviceDevType.ETHERNET
|
||||||
|
)
|
||||||
|
elif vnic_type == model.VNIC_TYPE_VIRTIO_FORWARDER:
|
||||||
|
datapath_offload = objects.vif.DatapathOffloadRepresentor(
|
||||||
|
representor_name=_get_vif_name(vif),
|
||||||
|
representor_address=vif["profile"]["pci_slot"]
|
||||||
|
)
|
||||||
|
profile = objects.vif.VIFPortProfileBase(
|
||||||
|
datapath_offload=datapath_offload
|
||||||
|
)
|
||||||
|
obj = _get_vif_instance(
|
||||||
|
vif,
|
||||||
|
objects.vif.VIFVHostUser,
|
||||||
|
port_profile=profile,
|
||||||
|
plugin="vrouter",
|
||||||
|
vif_name=_get_vif_name(vif)
|
||||||
|
)
|
||||||
|
_set_vhostuser_settings(vif, obj)
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
return obj
|
return obj
|
||||||
|
@ -1128,3 +1128,91 @@ class OSVIFUtilTestCase(test.NoDBTestCase):
|
|||||||
objects=[])))
|
objects=[])))
|
||||||
|
|
||||||
self.assertObjEqual(expect, actual)
|
self.assertObjEqual(expect, actual)
|
||||||
|
|
||||||
|
def test_nova_to_osvif_vrouter_direct(self):
|
||||||
|
"""Test for Contrail / Tungsten Fabric direct offloaded datapath."""
|
||||||
|
vif = model.VIF(
|
||||||
|
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
|
||||||
|
type=model.VIF_TYPE_VROUTER,
|
||||||
|
address="22:52:25:62:e2:aa",
|
||||||
|
profile={
|
||||||
|
"pci_slot": "0000:08:08.5",
|
||||||
|
},
|
||||||
|
network=model.Network(
|
||||||
|
id="b82c1929-051e-481d-8110-4669916c7915",
|
||||||
|
label="Demo Net",
|
||||||
|
subnets=[]),
|
||||||
|
vnic_type=model.VNIC_TYPE_DIRECT,
|
||||||
|
)
|
||||||
|
|
||||||
|
actual = os_vif_util.nova_to_osvif_vif(vif)
|
||||||
|
|
||||||
|
expect = osv_objects.vif.VIFHostDevice(
|
||||||
|
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
|
||||||
|
active=False,
|
||||||
|
has_traffic_filtering=False,
|
||||||
|
address="22:52:25:62:e2:aa",
|
||||||
|
dev_type=osv_objects.fields.VIFHostDeviceDevType.ETHERNET,
|
||||||
|
dev_address="0000:08:08.5",
|
||||||
|
plugin="vrouter",
|
||||||
|
port_profile=osv_objects.vif.VIFPortProfileBase(
|
||||||
|
datapath_offload=osv_objects.vif.DatapathOffloadRepresentor(
|
||||||
|
representor_name="nicdc065497-3c",
|
||||||
|
representor_address="0000:08:08.5")
|
||||||
|
),
|
||||||
|
preserve_on_delete=False,
|
||||||
|
vif_name="nicdc065497-3c",
|
||||||
|
network=osv_objects.network.Network(
|
||||||
|
id="b82c1929-051e-481d-8110-4669916c7915",
|
||||||
|
bridge_interface=None,
|
||||||
|
label="Demo Net",
|
||||||
|
subnets=osv_objects.subnet.SubnetList(
|
||||||
|
objects=[])))
|
||||||
|
|
||||||
|
self.assertObjEqual(expect, actual)
|
||||||
|
|
||||||
|
def test_nova_to_osvif_vrouter_forwarder(self):
|
||||||
|
"""Test for Contrail / Tungsten Fabric indirect offloaded datapath."""
|
||||||
|
vif = model.VIF(
|
||||||
|
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
|
||||||
|
type=model.VIF_TYPE_VROUTER,
|
||||||
|
address="22:52:25:62:e2:aa",
|
||||||
|
profile={
|
||||||
|
"pci_slot": "0000:08:08.5",
|
||||||
|
},
|
||||||
|
network=model.Network(
|
||||||
|
id="b82c1929-051e-481d-8110-4669916c7915",
|
||||||
|
label="Demo Net",
|
||||||
|
subnets=[]),
|
||||||
|
details={
|
||||||
|
model.VIF_DETAILS_VHOSTUSER_MODE: 'client',
|
||||||
|
model.VIF_DETAILS_VHOSTUSER_SOCKET: '/fake/socket',
|
||||||
|
},
|
||||||
|
vnic_type=model.VNIC_TYPE_VIRTIO_FORWARDER,
|
||||||
|
)
|
||||||
|
|
||||||
|
actual = os_vif_util.nova_to_osvif_vif(vif)
|
||||||
|
|
||||||
|
expect = osv_objects.vif.VIFVHostUser(
|
||||||
|
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
|
||||||
|
active=False,
|
||||||
|
address="22:52:25:62:e2:aa",
|
||||||
|
plugin="vrouter",
|
||||||
|
vif_name="nicdc065497-3c",
|
||||||
|
path='/fake/socket',
|
||||||
|
mode='client',
|
||||||
|
has_traffic_filtering=False,
|
||||||
|
port_profile=osv_objects.vif.VIFPortProfileBase(
|
||||||
|
datapath_offload=osv_objects.vif.DatapathOffloadRepresentor(
|
||||||
|
representor_address="0000:08:08.5",
|
||||||
|
representor_name="nicdc065497-3c")
|
||||||
|
),
|
||||||
|
preserve_on_delete=False,
|
||||||
|
network=osv_objects.network.Network(
|
||||||
|
id="b82c1929-051e-481d-8110-4669916c7915",
|
||||||
|
bridge_interface=None,
|
||||||
|
label="Demo Net",
|
||||||
|
subnets=osv_objects.subnet.SubnetList(
|
||||||
|
objects=[])))
|
||||||
|
|
||||||
|
self.assertObjEqual(expect, actual)
|
||||||
|
@ -273,6 +273,25 @@ class LibvirtVifTestCase(test.NoDBTestCase):
|
|||||||
type=network_model.VIF_TYPE_VROUTER,
|
type=network_model.VIF_TYPE_VROUTER,
|
||||||
devname='tap-xxx-yyy-zzz')
|
devname='tap-xxx-yyy-zzz')
|
||||||
|
|
||||||
|
vif_vrouter_direct = network_model.VIF(id=uuids.vif,
|
||||||
|
address='ca:fe:de:ad:be:ef',
|
||||||
|
network=network_vrouter,
|
||||||
|
type=network_model.VIF_TYPE_VROUTER,
|
||||||
|
vnic_type=network_model.VNIC_TYPE_DIRECT,
|
||||||
|
profile={'pci_slot': '0000:0a:00.1'},
|
||||||
|
devname='tap-xxx-yyy-zzz')
|
||||||
|
|
||||||
|
vif_vrouter_forwarder = network_model.VIF(id=uuids.vif,
|
||||||
|
address='ca:fe:de:ad:be:ef',
|
||||||
|
network=network_vrouter,
|
||||||
|
type=network_model.VIF_TYPE_VROUTER,
|
||||||
|
vnic_type=network_model.VNIC_TYPE_VIRTIO_FORWARDER,
|
||||||
|
profile={'pci_slot': '0000:0a:00.1'},
|
||||||
|
details={
|
||||||
|
network_model.VIF_DETAILS_VHOSTUSER_MODE: 'server',
|
||||||
|
network_model.VIF_DETAILS_VHOSTUSER_SOCKET: '/tmp/usv-xxx-yyy-zzz',
|
||||||
|
network_model.VIF_DETAILS_VHOSTUSER_VROUTER_PLUG: True})
|
||||||
|
|
||||||
vif_contrail_vrouter = network_model.VIF(id=uuids.vif,
|
vif_contrail_vrouter = network_model.VIF(id=uuids.vif,
|
||||||
address='ca:fe:de:ad:be:ef',
|
address='ca:fe:de:ad:be:ef',
|
||||||
network=network_vrouter,
|
network=network_vrouter,
|
||||||
@ -1400,6 +1419,34 @@ class LibvirtVifTestCase(test.NoDBTestCase):
|
|||||||
self._assertTypeAndMacEquals(node, "ethernet", "target", "dev",
|
self._assertTypeAndMacEquals(node, "ethernet", "target", "dev",
|
||||||
self.vif_vrouter, dev_want)
|
self.vif_vrouter, dev_want)
|
||||||
|
|
||||||
|
def test_vrouter_direct(self):
|
||||||
|
"""Test for Contrail / Tungsten Fabric direct offloaded datapath."""
|
||||||
|
d = vif.LibvirtGenericVIFDriver()
|
||||||
|
xml = self._get_instance_xml(d, self.vif_vrouter_direct)
|
||||||
|
node = self._get_node(xml)
|
||||||
|
self._assertTypeAndPciEquals(node,
|
||||||
|
"hostdev",
|
||||||
|
self.vif_vrouter_direct)
|
||||||
|
self._assertMacEquals(node, self.vif_vrouter_direct)
|
||||||
|
|
||||||
|
def test_vrouter_forwarder(self):
|
||||||
|
"""Test for Contrail / Tungsten Fabric indirect offloaded datapath."""
|
||||||
|
d = vif.LibvirtGenericVIFDriver()
|
||||||
|
xml = self._get_instance_xml(d,
|
||||||
|
self.vif_vrouter_forwarder)
|
||||||
|
node = self._get_node(xml)
|
||||||
|
self.assertEqual(node.get("type"),
|
||||||
|
network_model.VIF_TYPE_VHOSTUSER)
|
||||||
|
|
||||||
|
self._assertTypeEquals(node, network_model.VIF_TYPE_VHOSTUSER,
|
||||||
|
"source", "mode", "server")
|
||||||
|
self._assertTypeEquals(node, network_model.VIF_TYPE_VHOSTUSER,
|
||||||
|
"source", "path", "/tmp/usv-xxx-yyy-zzz")
|
||||||
|
self._assertTypeEquals(node, network_model.VIF_TYPE_VHOSTUSER,
|
||||||
|
"source", "type", "unix")
|
||||||
|
self._assertMacEquals(node, self.vif_vrouter_forwarder)
|
||||||
|
self._assertModel(xml, network_model.VIF_MODEL_VIRTIO)
|
||||||
|
|
||||||
def test_contrail_vrouter(self):
|
def test_contrail_vrouter(self):
|
||||||
"""Test for the Contrail / Tungsten Fabric DPDK datapath."""
|
"""Test for the Contrail / Tungsten Fabric DPDK datapath."""
|
||||||
d = vif.LibvirtGenericVIFDriver()
|
d = vif.LibvirtGenericVIFDriver()
|
||||||
|
14
releasenotes/notes/vrouter-hw-offloads-38257f49ac1d3a60.yaml
Normal file
14
releasenotes/notes/vrouter-hw-offloads-38257f49ac1d3a60.yaml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
This release adds support for ``direct`` and ``virtio-forwarder`` VNIC
|
||||||
|
types to the ``vrouter`` VIF type. In order to use these VNIC types,
|
||||||
|
support is required from the version of OpenContrail, Contrail or Tungsten
|
||||||
|
Fabric that is installed, as well the required hardware. At this time, the
|
||||||
|
reference os-vif plugin is hosted on OpenContrail at
|
||||||
|
https://github.com/Juniper/contrail-nova-vif-driver but is expected to
|
||||||
|
transition to Tungsten Fabric in the future. Version 5.1 or later of the
|
||||||
|
plugin is required to use these new VNIC types. Consult the `Tungsten
|
||||||
|
Fabric documentation <https://tungstenfabric.github.io/website/>`_ for
|
||||||
|
release notes, when available, about hardware support. For commercial
|
||||||
|
support, consult the release notes from a downstream vendor.
|
@ -57,7 +57,7 @@ psutil>=3.2.2 # BSD
|
|||||||
oslo.versionedobjects>=1.33.3 # Apache-2.0
|
oslo.versionedobjects>=1.33.3 # Apache-2.0
|
||||||
os-brick>=2.6.1 # Apache-2.0
|
os-brick>=2.6.1 # Apache-2.0
|
||||||
os-traits>=0.4.0 # Apache-2.0
|
os-traits>=0.4.0 # Apache-2.0
|
||||||
os-vif!=1.8.0,>=1.7.0 # Apache-2.0
|
os-vif>=1.14.0 # Apache-2.0
|
||||||
os-win>=3.0.0 # Apache-2.0
|
os-win>=3.0.0 # Apache-2.0
|
||||||
castellan>=0.16.0 # Apache-2.0
|
castellan>=0.16.0 # Apache-2.0
|
||||||
microversion-parse>=0.2.1 # Apache-2.0
|
microversion-parse>=0.2.1 # Apache-2.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user