Port binding event extended information for Nova

There are several cases in the Nova/Neutron/os-vif interaction
where the knowledge of the neutron core plugin or ML2 driver
would be useful to facilitate a more robust handling of guest
networking.

For example, in Icehouse, a external event mechanism was
introduced to allow neutron to notify Nova of network changes
and VIF plugging. As the occasion on which these events are
emitted is dependent on the driver that bound the port and Nova
does not have knowledge of that. Therefore, Nova cannot rely on
the event to synchronize the operation between Nova and neutron,
which has lead to a race condition in the past.

Change-Id: I57f4df31bee83b818f2c0123577d11a8e07c0191
Related-Bug: #1821058
This commit is contained in:
Rodolfo Alonso Hernandez 2019-03-21 13:39:13 +00:00
parent a097bd8bce
commit fde298d0a1
1 changed files with 172 additions and 0 deletions

View File

@ -0,0 +1,172 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=============================================
Port binding records, capabilities and events
=============================================
https://bugs.launchpad.net/neutron/+bug/1821058
There are several cases in the Nova/Neutron/os-vif interaction where the
knowledge of the neutron core plugin or ML2 driver would be useful to
facilitate a more robust handling of guest networking. For example,
[3]_.
This spec aims to enhance the port binding API via the introduction of a new
extension to provide the additional information required to enable Nova and
os-vif to make more intelligent use of port binding info.
Please remember os-vif was only intended to remove the VIF plugging process
from Nova. The hypervisor configuration (e.g.: libvirt XML generation) is still
Nova's responsibility. Although os-vif removes the networking back-end logic
related to the plug and unplug process, Nova still needs to handle the
information proposed in this spec.
Problem Description
===================
This spec aims to resolve 3 related problems.
Network connectivity
--------------------
[3]_ blueprint seeks to enable the use of instances with ip_allocation=none.
The port parameter "ip_allocation" was introduced in the [1]_, to "distinguish
the unaddressed port case from the deferred IP allocation case where routed
networks is involved" (extracted from [2]_).
To do this safely and guarantee the guest will have network connectivity, Nova
must ensure that the network backend that bound the port provides L2
connectivity.
For example, in a mixed Calico/SR-IOV deployment, it is valid to use
ip_allocation=none for any port that is bound by the SR-IOV ML2 driver, but not
for the Calico backend. In this case, the only connectivity Calico provides to
a guest is L3, therefore is not possible to spawn a VM without an IP address.
Network isolation
-----------------
In resolving [4]_, a new config option was required in os-vif to allow
enabling VIF isolation for the ML2/ovs backend. As Nova cannot differentiate
between VIF_TYPE=”ovs” that is bound by ML2/odl or ML2/ovs it cannot
automatically instruct os-vif to enable or disable VIF isolation for ML2/ovs
hosts. If the ML2 driver(s) that bound the port are recorded in the port
binding details, Nova and os-vif can use that information to more
intelligently enable backend specific code paths without requiring additional
network backend specific config options.
Bandwidth scheduling
--------------------
The network driver information can be used too for the bandwidth scheduling
featured implemented in Stein, as pointed out in this [6]_. Currently Nova
cannot handle the case where the PF is used by one ML2 driver while the VF is
managed by the SR-IOV ML2 driver.
Proposed Change
===============
To address the 3 problems stated above, the following additions to the
``binding:vif_details`` dictionary in the port object are proposed:
* A new ``connectivity`` field will be introduced with allowed values of "l2",
"l3" and "legacy". The "legacy" ``connectivity`` value will be the default
and is a sentinel to indicate the driver does not support this extension yet
and no connectivity info is available. "l2" drivers provide layer 2
connectivity, like for example Linux Bridge, Open vSwitch or SR-IOV. "l3"
drivers provide only layer 3 connectivity, like for example Calico [8]_.
* A new ``bound_drivers`` field will be added that is a dictionary mapping
binding_level to driver name. The driver name will be the stevedore entry
point name for the driver which is already used in config files and intended
to be stable. A POC is available in [7]_.
To enable declaration of the ``connectivity``, a new property will be added to
the ML2 driver base class which will default to "legacy". ML2 drivers that
inherit from this will override the property.
The ``bound_drivers`` field will be used by the OVS os-vif plugin to remove the
need for [5]_. We can enable this option only when
needed.
Examples
--------
ML2/ovs:
.. code-block:: python
binding_details: {
...
"connectivity": "l2",
"bound_drivers": {"0": "openvswtich"}
}
ML2/odl v1:
.. code-block:: python
binding_details: {
...
"connectivity": "legacy",
"bound_drivers": {"0": "opendaylight"}
}
ML2/odl v2:
.. code-block:: python
binding_details: {
...
"connectivity": "l2",
"bound_drivers": {"0": "opendaylight_v2"}
}
ML2/calico
.. code-block:: python
binding_details: {
...
"connectivity": "l3",
"bound_drivers": {"0": "calico"}
}
References
==========
.. [1] `BP Allow vm to boot without l3 address`:
https://blueprints.launchpad.net/neutron/+spec/vm-without-l3-address
.. [2] `commit 361455`:
https://review.openstack.org/#/c/361455/
.. [3] `Boot a VM with an unaddressed port`:
https://blueprints.launchpad.net/nova/+spec/boot-vm-with-unaddressed-port
.. [4] `bug 1734320`:
https://bugs.launchpad.net/neutron/+bug/1734320
.. [5] `isolate_vif config option`:
https://github.com/openstack/os-vif/blob/stable/stein/vif_plug_ovs/ovs.py#L146-L159
.. [6] `review 1`:
https://review.opendev.org/#/c/623543/40/nova/compute/manager.py@2161
.. [7] `review 2`:
https://review.openstack.org/#/c/635083
.. [8] `Calico project`:
https://docs.openstack.org/networking-calico/latest/