Table of Contents
Neutron QoS (Quality of Service)¶
https://git.opendaylight.org/gerrit/#/q/topic:qos
Neutron provides QoS 2 6 feature which is partially supported in OpenDaylight today. This feature is to bring ODL implementation on parity with Neutron QoS API, esp OVS Agent implementation as detailed in 3. This will require changes in networking-odl, Neutron Northbound and Netvirt.
Note
Ingress/Egress in Neutron is from VM’s perspective.
Ingress/Egress in OVS/ODL is from switch perspective.
Egress from VM is Ingress on switch and vice versa
Problem description¶
Support for QoS was added to OpenDaylight in Boron release and it was later updated during Carbon release 1. Neutron has updated QoS since then to support more features and they are already implemented in Neutron OVS Agent.
Following table captures current state of QoS support in Neutron and OpenDaylight as well as comparison with current support in OVS Agent.
Feature |
N-ODL |
ODL |
OVS Agent |
---|---|---|---|
Bandwidth Limit Egress |
✓ |
✓ |
✓ |
Bandwidth Limit Ingress |
✕ |
✕ |
✓ |
Min Bandwidth Egress |
✕ |
✕ |
SRIOV only |
Min Bandwidth Ingress |
✕ |
✕ |
✕ |
DSCP Marking Egress |
✕ |
✓ |
✓ |
DSCP Marking Ingress |
✕ |
✕ |
✕ |
FIP QoS |
✕ |
✕ |
✓ |
Proposed change¶
This will require changes to multiple components.
Bandwidth Limit Ingress¶
Ingress Limit is not as simple as egress. This will require creation of a QoS Profile and adding the port to that profile 5. Then we appply limiters on that queue. OVSDB Plugin already supports creating QoS Profiles. OpenFlow rules for that port will then direct traffic to that queue.
Creation of profile varies for DPDK vs Kernel datapath 9
ovs-vsctl -- \
add-br br0 -- \
add-port br0 eth0 -- \
add-port br0 vif1.0 -- set interface vif1.0 ofport_request=5 -- \
add-port br0 vif2.0 -- set interface vif2.0 ofport_request=6 -- \
set port eth0 qos=@newqos -- \
--id=@newqos create qos type=linux-htb \
other-config:max-rate=1000000000 \
queues:123=@vif10queue \
queues:234=@vif20queue -- \
--id=@vif10queue create queue other-config:max-rate=10000000 -- \
--id=@vif20queue create queue other-config:max-rate=20000000
ovs-vsctl set port vhost-user0 qos=@newqos -- \
--id=@newqos create qos type=egress-policer other-config:cir=46000000 \
other-config:cbs=2048`
Neutron Northbound¶
Direction field is already present in neutron-qos.yang so no yang changes needed for this. However, SPI still needs to add code to populate mdsal with direction field. Corresponding changes to NeutronQos POJO will also be done.
OVSDB¶
Nothing extra needs to be done here, OVSDB already supports QoS queues.
Genius¶
To support Ingress limiting, QoS needs to bind as an Egress service in Genius. For this a new
QOS_EGRESS_TABLE [232]
will be added.
Note
TBD - QoS Egress Service priority
Netvirt¶
Existing QoS code in Netvirt will be enhanced to support Ingress rules, bind/unbind Egress service, create OVS QoS profiles and add port to the QoS queues.
FIP QoS¶
Similar to Ingress Limit, QoS profiles will be used to create queue per FIP and then use OpenFlow flows to direct traffic to the specific queue 4.
NeutronNorthbound¶
qos-policy-id will be added to L3-floatingip-attributes
in neutron-L3.yang
OVSDB¶
Nothing needs to be done here.
Genius¶
A new QOS_FIP_INGRESS [91]
table will be added to Ingress L3 pipeline to add set queue
for Egress Limit. For Ingress Limit, QOS_FIP_EGRESS [233]
will be added to set queue.
Netvirt¶
FloatingIp listeners will be enhanced to track QoS configuration and invoke QoS API to configure flow rules for the FloatingIp. QoS API will create OVS profiles for QoS rules and when applied to FIP or port, will program appropriate flows.
Pipeline changes¶
A new QoS Egress table will be added to support for Ingress rules on port and another for FIP.
Table |
Match |
Action |
---|---|---|
QoS FIP Ingress [91] |
Ethtype == IPv4 or IPv6 AND IP |
SetQueue |
QoS Port Egress [232] |
Ethtype == IPv4 or IPv6 AND LPort tag |
SetQueue |
QoS FIP Egress [233] |
Ethtype == IPv4 or IPv6 AND IP |
SetQueue |
Yang changes¶
No yang changes needed for Ingress support in QoS. Ingress is already supported in NeutronNorthbound and 7 will enable it as part of networking-odl.
Changes will be needed to neutron-qos-ext.yang to augment floating-ip.
augment "/neutron:neutron/neutron:floating-ips/neutron:ip" {
description "This module augments the floating-ips container
in the neutron-floating-ips module with qos information";
// ext:augment-identifier value needs to unique as name of the generated classes
// is derived from this string
ext:augment-identifier "qos-floating-ip-extension";
leaf qos-policy-id {
description "The floating-ips to which the Qos Policies can be applied";
type yang:uuid;
}
Configuration impact¶
This doesn’t introduce any new configuration parameters.
Targeted Release¶
Flourine
Alternatives¶
N.A.
Usage¶
Nothing extra needs to be done to enable these features other than already captured in [1].
Features to Install¶
odl-netvirt-openstack
Implementation¶
Assignee(s)¶
Who is implementing this feature? In case of multiple authors, designate a primary assignee and other contributors.
- Primary assignee:
Vishal Thapar, <#vthapar>, <vthapar@redhat.com>
- Other contributors:
TBD. (volunteers welcome)
Work Items¶
Changes in networking-odl (mostly testing)
Changes in NeutronNorthbound
Add listeners in Netvirt
Genius changes for modified pipeline
Netvirt implementation for Bandwidth Limit Ingress
Netvirt changes for FIP Egress
Netvirt changes for FIP Ingress
Add CSIT (depends on CSIT for existing QoS features)
Documentation
Dependencies¶
This has dependencies on other projects:
Neutron - Rocky
Networking-Odl - Rocky
Neutron Northbound - Flourine
OVSDB - Flourine
Genius - Flourine
Testing¶
This will update existing tests for QoS for newer use cases
Unit Tests¶
Existing UTs, if any, will be updated to provide coverage for new code.
Integration Tests¶
N.A.
Documentation Impact¶
Existing documenation will be updated to reflect the new changes.