Dynamic port groups

https://bugs.launchpad.net/ironic/+bug/1652630

In the Ocata release, Ironic added support for grouping ports into port groups. The administrator also has the ability to specify mode and properties of a port group by using appropriate port group fields. However the administrator is still required to pre-create a port group on the ToR (Top of Rack) switch manually. Or find some other way to sync portgroup settings between Ironic and the ML2 driver.

Problem description

While Ironic provides the ability to create port groups with different configurations (mode and properties), port groups still have to be pre-created on ToR manually as we do not pass port group details to ML2 drivers. To make port groups creation dynamic Ironic should pass port group settings to Neutron ML2 drivers. The ML2 driver is responsible for port group configuration (creation/deletion) on ToR switch during deployment.

This spec does not cover end-user interface for specifying port group configuration when doing nova boot at this moment. It can be extended when community has some agreement on it.

Proposed change

Start passing port group information to Neutron ML2 drivers via the Neutron port binding:profile field. Appropriate Neutron ML2 drivers will use that information to create port group dynamically on the ToR switch.

Note

We cannot use existing binding:profile local_link_information key as it is a list with port details, where switch_id and port_id are mandatory keys. For portgroup object those keys are not required as portgroup is virtual interface and might be spread across different switches. For example MLAG configuration.

Binding profile data structure

  • Introduce new local_group_information dictionary that stores portgroups information.
  • Reuse existing local_link_information for port objects only

A JSON example of binding:profile with local_link_information reuse:

"binding:profile": {
    'local_link_information': [
        {
            'switch_info': 'tor-switch0',
            'port_id': 'Gig0/1'
            'switch_id': 'aa:bb:cc:dd:ee:ff'
        },
        {
            'switch_info': 'tor-switch0',
            'port_id': 'Gig0/2',
            'switch_id': 'aa:bb:cc:dd:ee:ff'
        }
    ],
    'local_group_information': {
            'id': '51a9642b-1414-4bd6-9a92-1320ddc55a63',
            'name': 'PortGroup0',
            'bond_mode': 'active-backup',
            'bond_properties': {
                'bond_xmit_hash_policy': 'layer3+4',
                'bond_miimon': 100,
            }
        },
}

The data types:

Field Name Description
id The UUID of Ironic portgroup object
name The name of the ironic port group
bond_mode Ironic portgroup mode
bond_properties Ironic portgroup properties
switch_info The hostname of the switch
port_id The identifier of the port on the switch
switch_id The identifier of the switch, ie mac address

Note

It is recommended to pick bond_mode and keys/values for bond_properties from the [1] as they will be used by user OS.

Alternatives

  • Use port groups in the static fashion when administrator pre-creates port group on ToR switch.
  • If ML2 driver supports port group creation, make sure that port group properties in Ironic and ML2 are the same.

Data model impact

None.

State Machine Impact

None.

REST API impact

None.

Client (CLI) impact

None.

RPC API impact

None.

Driver API impact

None.

Nova driver impact

None.

Ramdisk impact

None.

Security impact

None.

Other end user impact

None.

Scalability impact

None.

Performance Impact

None.

Other deployer impact

No need to pre-create port group at the ToR switch. Only need to specify port group configuration at the Ironic portgroup object.

Developer impact

Out of tree network interfaces should be updated to pass portgroup.mode and portgroup.properties with links array in Neutron port binding:profile field. Vendors are responsible to deal with links to support dynamic port groups.

Implementation

Assignee(s)

Primary assignee:
vsaienko <vsaienko@mirantis.com>

Work Items

  • Update neutron network interface to pass data structure described in Binding profile data structure to Neutron.
  • Add dynamic port group support to networking-generic-switch
  • Update tempest with appropriate tests.

Dependencies

Dynamic portgroup support is dependent on Neutron ML2 driver functionality being developed to deal with links array in binding:profile field.

Testing

  • Add dynamic port group support to networking-generic-switch
  • Update tempest with appropriate tests.

Upgrades and Backwards Compatibility

Backward compatibility is retained as Ironic will still pass local_link_information in Neutron port binding:profile field.

Documentation Impact

This feature will be fully documented.