Merge "hardware offload support for openvswitch"

This commit is contained in:
Jenkins 2017-08-03 19:08:06 +00:00 committed by Gerrit Code Review
commit fc454044d6
5 changed files with 92 additions and 1 deletions

View File

@ -1492,6 +1492,12 @@ class API(base_api.NetworkAPI):
context, neutron, request_net.port_id)
pci_request_id = None
if vnic_type in network_model.VNIC_TYPES_SRIOV:
# TODO(moshele): To differentiate between the SR-IOV legacy
# and SR-IOV ovs hardware offload we will leverage the nic
# feature based scheduling in nova. This mean we will need
# libvirt to expose the nic feature. At the moment
# there is a limitation that deployers cannot use both
# SR-IOV modes (legacy and ovs) in the same deployment.
spec = {pci_request.PCI_NET_TAG: phynet_name}
dev_type = pci_request.DEVICE_TYPE_FOR_VNIC_TYPE.get(vnic_type)
if dev_type:

View File

@ -21,6 +21,7 @@ versioned object model os_vif.objects.*
import sys
from os_vif import objects
from os_vif.objects import fields as os_vif_fields
from oslo_config import cfg
from oslo_log import log as logging
@ -277,9 +278,24 @@ def _nova_to_osvif_vif_bridge(vif):
# VIF_TYPE_OVS = 'ovs'
def _nova_to_osvif_vif_ovs(vif):
vnic_type = vif.get('vnic_type', model.VNIC_TYPE_NORMAL)
profile = objects.vif.VIFPortProfileOpenVSwitch(
interface_id=vif.get('ovs_interfaceid') or vif['id'])
if _is_firewall_required(vif) or vif.is_hybrid_plug_enabled():
if vnic_type == model.VNIC_TYPE_DIRECT:
profile = objects.vif.VIFPortProfileOVSRepresentor(
interface_id=vif.get('ovs_interfaceid') or vif['id'],
representor_name=_get_vif_name(vif),
representor_address=vif["profile"]['pci_slot'])
obj = _get_vif_instance(
vif,
objects.vif.VIFHostDevice,
port_profile=profile,
plugin="ovs",
dev_address=vif["profile"]['pci_slot'],
dev_type=os_vif_fields.VIFHostDeviceDevType.ETHERNET)
if vif["network"]["bridge"] is not None:
obj.network.bridge = vif["network"]["bridge"]
elif _is_firewall_required(vif) or vif.is_hybrid_plug_enabled():
obj = _get_vif_instance(
vif,
objects.vif.VIFBridge,

View File

@ -13,6 +13,7 @@
# under the License.
from os_vif import objects as osv_objects
from os_vif.objects import fields as os_vif_fields
from nova import exception
from nova.network import model
@ -667,6 +668,43 @@ class OSVIFUtilTestCase(test.NoDBTestCase):
self.assertObjEqual(expect, actual)
def test_nova_to_osvif_ovs_with_vnic_direct(self):
vif = model.VIF(
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
type=model.VIF_TYPE_OVS,
address="22:52:25:62:e2:aa",
vnic_type=model.VNIC_TYPE_DIRECT,
network=model.Network(
id="b82c1929-051e-481d-8110-4669916c7915",
label="Demo Net",
subnets=[]),
profile={'pci_slot': '0000:0a:00.1'}
)
actual = os_vif_util.nova_to_osvif_vif(vif)
expect = osv_objects.vif.VIFHostDevice(
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
active=False,
address="22:52:25:62:e2:aa",
dev_address='0000:0a:00.1',
dev_type=os_vif_fields.VIFHostDeviceDevType.ETHERNET,
plugin="ovs",
port_profile=osv_objects.vif.VIFPortProfileOVSRepresentor(
interface_id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",
representor_name="nicdc065497-3c",
representor_address="0000:0a:00.1"),
has_traffic_filtering=False,
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)
def test_nova_to_osvif_vhostuser_ovs(self):
vif = model.VIF(
id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",

View File

@ -142,6 +142,15 @@ class LibvirtVifTestCase(test.NoDBTestCase):
devname='tap-xxx-yyy-zzz',
ovs_interfaceid='aaa-bbb-ccc')
vif_ovs_direct = network_model.VIF(id='vif-xxx-yyy-zzz',
address='ca:fe:de:ad:be:ef',
network=network_ovs,
vnic_type=network_model.VNIC_TYPE_DIRECT,
profile={'pci_slot': '0000:0a:00.1'},
type=network_model.VIF_TYPE_OVS,
details={'port_filter': False},
ovs_interfaceid='aaa-bbb-ccc')
vif_ovs_hybrid = network_model.VIF(id='vif-xxx-yyy-zzz',
address='ca:fe:de:ad:be:ef',
network=network_ovs,
@ -1480,6 +1489,15 @@ class LibvirtVifTestCase(test.NoDBTestCase):
self._assertMacEquals(node, self.vif_vhostuser_ovs)
self._assertModel(xml, network_model.VIF_MODEL_VIRTIO)
def test_ovs_direct(self):
d = vif.LibvirtGenericVIFDriver()
xml = self._get_instance_xml(d, self.vif_ovs_direct)
node = self._get_node(xml)
self._assertTypeAndPciEquals(node,
"hostdev",
self.vif_ovs_direct)
self._assertMacEquals(node, self.vif_ovs_direct)
def test_agilio_ovs_direct(self):
d = vif.LibvirtGenericVIFDriver()
xml = self._get_instance_xml(d, self.vif_agilio_ovs_direct)

View File

@ -0,0 +1,13 @@
---
features:
- |
Adds support to OVS vif type with direct port (SR-IOV).
In order to use this OVS acceleration mode, ``openvswitch`` 2.8.0
and 'Linux Kernel' 4.8 are required. This feature allows control of
an SR-IOV virtual function (VF) via OpenFlow control plane and gain
improved performance of 'Open vSwitch'. Please note that in Pike
release we can't differentiate between SR-IOV hardware and OVS offloaded
on the same host. This limitation should be resolved when the
enable-sriov-nic-features will be completed.
Until then operators can use host aggregates to ensure that they can
schedule instances on specific hosts based on hardware.