In the MidoNet integration with OpenStack, there are two ways a port could be bound:
- When a VM is launched, orchestrated by nova
- When an operator binds a virtual port to a specific host interface
This document describes the design of port binding in MidoNet that implements these use cases.
In the case of operator-specified port binding, there is a special case in which a port is bound to an interface connected to the uplink physical network, but that is not covered in this document.
MidoNet does not currently provide a way to bind ports in Neutron using standard Neutron API.
Use the existing ‘binding’ extension API in Neutron to implement port binding in MidoNet.
To bind a port to a specific host interface, an operator makes a ‘create_port’ API request to Neutron and provide the following binding details:
- ‘binding:host_id’: ID of the host to bind the port on
- ‘binding:profile[“interface_name”]’: Name of the interface to bind the port
The host ID is stored in the ‘portbindings’ table, and the interface name is stored in the ‘midonet_portbindings’ table. When the host ID and the interface name are supplied in the port creation request, the MidoNet executes the binding within the same API request.
Updating a port with a different binding effectively unbinds the port and re-binds it to the new host interface.
In the case of VM port binding, the workflow is as follows:
- Nova API makes a ‘create_port’ request to Neutron API specifying the ID of the host(‘host_id’) where the VM is going to be placed. ‘host_id’ is stored in Neutron’s ‘portbindings’ table.
- Neutron generates the tap interface name the same way Nova does (‘tap’ + portID up to 14 chars), and stores it in the ‘midonet_portbindings’ table.
- On the compute host, ‘mm-ctl’ script is executed to do the actual binding. ‘mm-ctl’ adds a port binding task to signal to MidoNet that the binding should occur. This step may change in the future.
For each scenario in which a port binding occurs, the plugin inserts a PORTBINDING task with ‘resource_id’ set to the ID of the port getting bound.
The actual mechanism in which the binding takes place inside MidoNet is outside the scope of this document.
An example of a port binding attributes in the request to create a port is:
{
"binding:host_id": "HOST_ID",
"binding:profile": {"interface_name": "eth0"}
}
midonet_portbindings
Name | Type | Description |
---|---|---|
port_id | UUID | ID of the port |
interface_name | String | Name of the interface to bind the port |
‘port_id’ is the primary key and has a foreign key constraint to the ‘id’ column of the ‘ports’ table.
The following command creates a port with port binding attributes:
neutron port-create [--binding:host_id HOST_ID]
[--binding:profile if_name=IF_NAME]