Port extension to create hardware offloaded ports
The aim of the RFE is to create a new port extension to allow to create ports with hardware offloaded capabilities. Related-Bug: #2013228 Change-Id: I0ee77fd4a0b1fe28b206db7dc13e105ffff122a6
This commit is contained in:
parent
d1eca25a3f
commit
739ac589f1
|
@ -0,0 +1,220 @@
|
|||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
=================================================
|
||||
Port extension to create hardware offloaded ports
|
||||
=================================================
|
||||
|
||||
Launchpad bug: https://bugs.launchpad.net/neutron/+bug/2013228
|
||||
|
||||
The aim of the RFE is to create a new port extension to allow to create ports
|
||||
with hardware offloaded capabilities.
|
||||
|
||||
|
||||
Problem Description
|
||||
===================
|
||||
|
||||
The RFE [1]_ introduced the capability of creating a port that could use the
|
||||
hardware offload support implemented in Open vSwitch [2]_. This feature was
|
||||
implemented in the following set of patches (initially for ML2/OVS): [3]_,
|
||||
[4]_ and [5]_.
|
||||
|
||||
In order to create a port with hardware offload capabilities, it is needed to
|
||||
define the VNIC type and set a specific value in the port binding profile::
|
||||
|
||||
openstack port create --vnic-type direct \
|
||||
--binding-profile '{"capabilities": ["switchdev"]}' port_hwol
|
||||
|
||||
|
||||
This method to create a port has several drawbacks:
|
||||
|
||||
* The port binding profile field is an admin only parameter by default.
|
||||
The values contained in this field can have references to PCI addresses of
|
||||
the host and should not be modified by a non-admin user.
|
||||
* Actually this parameter should not be written by Neutron, only by Nova when
|
||||
the port is bound.
|
||||
|
||||
|
||||
Proposed Change
|
||||
===============
|
||||
|
||||
This RFE proposes to create a new port extension, called "hardware-offload",
|
||||
that will replace the need of manually defining the port binding profile
|
||||
information when creating the port; please note the I'm referring only to the
|
||||
port creation process. This API extension consists on a boolean flag parameter
|
||||
that will be "False" by default.
|
||||
|
||||
This new flag will be passed to Nova along with the port information
|
||||
dictionary. Nova will use this flag instead of the port binding profile
|
||||
information to command ``os-vif`` to create the corresponding layer 1 port
|
||||
(a devlink port [3]_ [6]_).
|
||||
|
||||
Because of this Nova-Neutron communication, this RFE is going to be implemented
|
||||
in two steps:
|
||||
|
||||
* The first one will implement only the Neutron and OSC (plus the OpenstackSDK
|
||||
bits) code. The port dictionary passed to Nova will contain both the new flag
|
||||
added in this RFE and the port binding profile, that will be added internally
|
||||
by Neutron when the flag is enabled.
|
||||
|
||||
* The second step involves the Nova implementation. This changes implies that
|
||||
Nova can read the port flag and create the corresponding port. The port
|
||||
binding profile information passed by Neutron will be irrelevant.
|
||||
|
||||
.. NOTE::
|
||||
|
||||
The scope of this RFE, as discussed during the presentation of this new
|
||||
feature in the Neutron drivers meeting, involves only the first step. The
|
||||
Nova code change will be covered in other RFE and spec.
|
||||
|
||||
|
||||
Client Impact
|
||||
-------------
|
||||
|
||||
The OSC and OpenstackSDK projects will be updated in order to be able to create
|
||||
a port using this new extension. Port creation example::
|
||||
|
||||
openstack port create --vnic-type direct --hardware-offload port_hwol
|
||||
|
||||
|
||||
The new boolean field will be visible when showing the port resource.
|
||||
|
||||
|
||||
REST API Impact
|
||||
---------------
|
||||
|
||||
Proposed attribute::
|
||||
|
||||
RESOURCE_ATTRIBUTE_MAP = {
|
||||
port.COLLECTION_NAME: {
|
||||
"hardware_offload": {
|
||||
'allow_post': True,
|
||||
'allow_put': False,
|
||||
'convert_to': converters.convert_to_boolean_if_not_none,
|
||||
'default': False,
|
||||
'is_visible': True,
|
||||
'is_filter': True
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Sample REST calls::
|
||||
|
||||
POST /v2.0/ports
|
||||
{
|
||||
"port": {
|
||||
...
|
||||
"hardware_offload": "True"
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"port": {
|
||||
"id": "<id>",
|
||||
...
|
||||
"hardware_offload": "True"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Data Model Impact
|
||||
-----------------
|
||||
|
||||
This RFE proposes to create a child table to ``ports``, called
|
||||
``port_hardware_offload``.
|
||||
|
||||
.. table:: **Port hardware offload**
|
||||
|
||||
================ ======== ==== ==============================================
|
||||
Attribute Type CRUD Description
|
||||
================ ======== ==== ==============================================
|
||||
port_id uuid-str RO Unique identifier for the port object
|
||||
hardware_offload bool RO Flag to indicate if the port is a devlink port
|
||||
================ ======== ==== ==============================================
|
||||
|
||||
|
||||
Security Impact
|
||||
---------------
|
||||
|
||||
By default, this new field will be writable by the admin only. However, the
|
||||
admin can consider changing the rule owner and allow any project user to create
|
||||
a port enabling this flag::
|
||||
|
||||
policy.DocumentedRuleDefault(
|
||||
name='create_port:hardware_offload',
|
||||
check_str=base.ADMIN,
|
||||
scope_types=['project'],
|
||||
operations=ACTION_POST
|
||||
)
|
||||
|
||||
|
||||
This rule change was completely discouraged for the rule
|
||||
'create_port:binding:profile' for the reasons provided in the problem
|
||||
description.
|
||||
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
The port resource view will now require a new "JOIN" operation between the
|
||||
``ports`` table and the ``ports_hardware_offload`` table when building the
|
||||
port OVO. However there will be a 1:1 relationship between both tables and the
|
||||
data retrieved from the child table is minimal (two columns).
|
||||
|
||||
|
||||
Other Impact
|
||||
------------
|
||||
|
||||
None.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignees:
|
||||
Rodolfo Alonso Hernandez <ralonsoh@redhat.com> (IRC: ralonsoh)
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* API implementation (neutron-lib and Neutron).
|
||||
* Database migration (Neutron)
|
||||
* CLI implementation (OpenstackSDK and OSC)
|
||||
* Documentation.
|
||||
* Tests and CI related changes.
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
* Unit/functional tests.
|
||||
* Fullstack API tests.
|
||||
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
User Documentation
|
||||
------------------
|
||||
|
||||
Document the new way to create hardware offload ports and deprecate the older
|
||||
method.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [1] [RFE] SR-IOV accelerated OVS integration
|
||||
https://bugs.launchpad.net/neutron/+bug/1627987
|
||||
.. [2] https://mail.openvswitch.org/pipermail/ovs-dev/2017-April/330606.html
|
||||
.. [3] https://review.opendev.org/c/openstack/os-vif/+/460278
|
||||
.. [4] https://review.opendev.org/c/openstack/neutron/+/275616
|
||||
.. [5] https://review.opendev.org/c/openstack/neutron/+/499203
|
||||
.. [6] https://www.kernel.org/doc/html/next/networking/devlink/devlink-port.html
|
Loading…
Reference in New Issue