Dynamic port groups


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.


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



The UUID of Ironic portgroup object


The name of the ironic port group


Ironic portgroup mode


Ironic portgroup properties


The hostname of the switch


The identifier of the port on the switch


The identifier of the switch, ie mac address


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


  • 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


State Machine Impact


REST API impact


Client (CLI) impact


RPC API impact


Driver API impact


Nova driver impact


Ramdisk impact


Security impact


Other end user impact


Scalability impact


Performance Impact


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.



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.


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


  • 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.