manila networking support for hierarchical port bindings for neutron

https://blueprints.launchpad.net/manila/+spec/manila-hpb-support

Many manila drivers are capable of supporting VLAN networking but this technology limits the number of actual networks in the cloud to 4096. Other overlay technologies are often not supported by vendor drivers. With HPB (Hierarchical port binding) this barrier can be reduced by using multiple (in the hierarchy of the physical network) port bindings. For example this allows the usage of VXLAN on top of VLAN. In general this is transparent for the underlying storage since this hierarchical binding is all done by neutron and in the end it’s just a VLAN that will be visible to the backend storage.

Problem description

Manila with the current design (manila/network) uses neutron only to reserve an IP and to retrieve the dedicated segmentation id (VLAN ID) out of it. The port itself stays in status inactive.

This feature will cover three aspects of implementation:

  • The support of neutron port binding in manila
  • The support of baremetal provisioning
  • The support of multi-segment network / HPB support

Use Cases

As admin I want to create a share-network with share-server that will be automatically provisioned to the underlaying network infrastructure. This covers neutron ML2 private and provider networks and multi-segmented networks (like HPB networks).

This feature is only useful for drivers with DHSS support (DHSS=True). Otherwise networking setup is a manual work an admin needs to do.

Proposed change

manila should be able to benefit from the neutron port-binding extension [1]. This API extension allows ports to do a real binding also with physical port configuration on a switch.

Enabling port binding support

To enable port binding it’s necessary to specify one additional field within the neutron port create request: binding:host_id

The host_id is often used in neutron ML2 drivers to identify the agent that can do the binding. An agent is not necessarily needed for manila case, so the host_id should be set to a value that is not managed by an OVS-agent. It can be set to the name (or IP address) of the storage box.

While binding the port, neutron will iterate through all ML2 mech drivers. It’s important that one of the drivers signals that the binding can be fulfilled. Available mech drivers from Cisco [2] and upcoming Arista mech driver already support binding for such cases.

Part of the feature is also a small neutron manila mech driver. Which can fulfill the binding generically. This also enables drivers that do a partial binding and would work in neutron also in the gate.

Baremetal vNIC type / Ironic ML2 integration

Ironic has a very similar problem when connecting physical devices/servers to a neutron managed network. This feature can reuse the ML2 Ironic interface described here: [3]

To reuse the feature, the vnic_type must be set to baremetal during port creation. Furthermore it’s needed to add some network information to the port create, like:

“binding:profile”: {
    “local_link_information”: [{
        “switch_id”: 00-12-ff-e1-0d,
        “port_id”: dd013:12:33:4,
        “switch_info”: {“switch_ip“: "10.0.0.1}
    }]
}

This can be done with static configuration in manila.conf per backend:

[manila_storage_drv1]
port_binding_profiles=phy_conn1,phy_conn2

[phy_conn1]
switch_id = 00-12-ff-e1-0d
port_id = dd013:12:33:4
switch_info = switch_ip=10.0.0.1

Multi-segment binding

A multi-segment binding behaves differently than binding a single segment network. API-wise a single segment looks like:

$ neutron net-show <>

provider:network_type: vlan
provider:physical_network: mynet1
provider:segmentation_id: 1029

A multi-segment network looks like:

$ neutron net-show <>

segments: [
    provider:network_type: vxlan, provider:segmentation_id: 123, ..
    provider:network_type: vlan, provider:segmentation_id: 544, ..
    ]

It’s also possible for mech drivers to dynamically allocate segments during binding.

For manila, this means, the ports must be created before identifying the used segment. This can be done with a dedicated neutron-manila-mech driver that adds needed information in binding:vif_details or by using the physical_network field in manila configuration.

Later, neutron should support an API interface to retrieve the binding information in a better way. This work will be tracked here: [5]

Alternatives

Introduce a neutron ML2 agent that does the actual binding following the concept that neutron is doing all network related actions. This would mean all the agent needs to have a driver concept to support multiple vendors and APIs.

Data model impact

None.

REST API impact

None.

Security impact

None.

Notifications impact

None.

Other end user impact

None.

Performance impact

The share server creation will take longer since manila needs to wait for the neutron port to become active. This can be enhanced later, e.g. by introducing multi-processing and proceeding with share server creation like Nova is doing.

Other deployer impact

Configuration files need to be enhanced to activate the feature. Old functionality / old configuration will work as before.

Developer impact

None

Implementation

Assignee(s)

Primary assignee:
m-koderer

Other contributors:

  • tpatzig
  • dgonzalez

Work Items

  • The support of neutron port binding in manila
  • The support of baremetal provisioning
  • The support of multi-segment network / HPB support
  • Adding a manila mech driver in contrib

Dependencies

None.

Testing

Code will be tested by unit tests. Functional testing must be done in a separate CI job:

  • Binding can be tested using a manila mech driver
  • Multi-segment (only static) can potentially be tested using a neutron network

A potential test candidate could be the container driver [6], since it needs a binding done by neutron. A full end-to-end test with dynamic multi-segments would need a 3rd-party CI. Currently in discussion is to add those tests in Netapp-CI system.

Documentation Impact

Documentation for new configuration switches and possible deployment types.