Current Series Release Notes¶
30.0.0.0b1-51¶
Known Issues¶
Live migrating an instance with an InfiniBand port needs
[compute] live_migration_wait_for_vif_plug = Falsein Nova’s configuration on the compute hosts that can receive it. Nova otherwise waits for anetwork-vif-pluggedevent that nothing sends for an InfiniBand port before the guest is copied, and the migration fails when[DEFAULT] vif_plugging_timeoutexpires. See the live migration page of the documentation.
Upgrade Notes¶
neutron-servernow refuses to start if[sdn] bind_normal_portsis enabled and[sdn] bind_normal_ports_physnetsis empty. Previously, with[sdn] physical_networksset to*, the default, it started but themlnx_sdn_assistmechanism driver bound no normal ports. Set[sdn] bind_normal_ports_physnetsto the InfiniBand physical networks, or disable[sdn] bind_normal_ports.
Ports on VLAN networks of
mlnx_infinibandfail to bind unlessmlnx_sdn_assistis enabled, with[sdn] sync_enabledand the network’s physical network in[sdn] physical_networks. If the subnet manager’s partition configuration matches the networks’ segmentation IDs by other means, or the virtual functions are ConnectX-3 ones, set the new[mlnx] allow_unenforced_pkeysoption toTrue.
Support for NVIDIA (Mellanox) NEO as the SDN controller of
mlnx_sdn_assisthas been removed. NEO has reached end of life; see EOL notice LCR-000668. UFM is the only supported controller.
mlnx_sdn_assistno longer binds bare metal ports without a DHCP client ID, such as Ethernet ports described only by their local link information, on any network. Deployments that relied on it to bind them, including on flat networks without an SDN controller, must enable another mechanism driver that does, such asbaremetalfrom networking-baremetal.
The
mlnx_sdn_assistmechanism driver now sends a bare metal node’s InfiniBand port to the SDN controller when its binding is committed, rather than when its host is set.
Requests that failed because the SDN controller was unreachable are also retried with the longer delays, so after a controller outage some of them can take up to five minutes to be sent once the controller is back. Later operations on the same networks and ports wait for them.
When
[sdn] sync_enabledis true,neutron-servernow refuses to start if the networking-mlnx database schema is out of date, and names the command to run:neutron-db-manage --subproject networking-mlnx upgrade head. It checks that thesdn_journal.statecolumn accepts every SDN journal state. Deployments that missed the migration adding themonitoringstate could not record it, so the journal row of every network or port operation that started a UFM job was sent to UFM again and again and never deleted, thesdn_journaltable kept growing, and later operations on the same networks and ports were held behind those rows. These rows were sent again without counting a retry, so[sdn] retry_countdid not limit them. After the schema is upgraded, they are sent to UFM once more, then completed and deleted as usual.
A database migration adds a
seqnumcolumn, and a unique constraint onobject_uuidandseqnum, to thesdn_journaltable. Runneutron-db-manage --subproject networking-mlnx upgrade head.
Projects can no longer set the
client-idDHCP option ofdirectorbaremetalports on networks thatmlnx_sdn_assistsyncs.
Instances with InfiniBand ports on VLAN networks now fail to boot if the SDN controller doesn’t add their ports to the partition key. This relies on the Nova defaults
[DEFAULT] vif_plugging_is_fatal = Trueand a non-zerovif_plugging_timeout. If the controller can’t be reached, boots fail when the timeout expires. Check that the controller is reachable and that thesdn_journaltable has no rows stuck in thependingormonitoringstate before upgrading.
The
mlnx_sdn_assistmechanism driver now sends an instance’sdirectport to the SDN controller when its binding is committed, rather than each time ML2 tries to bind it, so failed binding attempts no longer send the port. When Nova live migrates an instance, the port is now sent for the destination host when its binding is activated.
When
[sdn] sync_enabledisTrueand[sdn] physical_networksdoesn’t contain*, creating a network with segments both on synced and on unsynced physical networks, or adding such a segment to a network, now fails.
Failed
mlnx_sdn_assistjournal entries are now deleted after[sdn] completed_rows_retention, like completed ones.
mlnx_sdn_assistnow also sends the SDN controller the creation of networks without a segmentation ID: flat networks, and networks with several segments. It already sent their updates, deletion and ports, but not their creation, since 2016, for a reason that wasn’t recorded. A controller that rejects such a creation now logs a failed journal row for each one; nothing else waits on it.
Networks created before the upgrade aren’t sent again. A controller that checks a port’s network, such as the alternative fabric manager, rejects their ports until it learns of the network. Updating the network, for example its description, sends it, which the alternative fabric manager takes as its creation.
mlnx_sdn_assistnow only sends the SDN controller ports that have a DHCP client ID, by which UFM identifies an InfiniBand port, once they are bound to a network that it syncs. Other ports, such as Ethernet ports and networks’ DHCP and router ports, are no longer sent, and if earlier releases sent any of them, they aren’t deleted from the controller either.
The DHCP client ID of a port bound to a network that
mlnx_sdn_assistsyncs can no longer be changed, added or removed; unbind the port first. Previously the port stayed up while the controller moved it. This includes Ironic changing theclient-idof an active node’s port, which now fails.
Security Issues¶
On ConnectX-3 adapters, when a port’s partition key is not in the physical function’s pkey table,
eswitchdnow removes the virtual function from its partition and reports a failure, so the port isn’t reported up. Previously it did nothing, so a virtual function configured again without being plugged again kept the partition key it had before.
eswitchdnow disables the link of a virtual function when it is plugged for a port, and only enables it whenneutron-mlnx-agentasks with the port’s MAC address and the virtual function has the GUID derived from it. A virtual function left with another port’s GUID, for example after Nova ignored a failedebrctl add-port, can no longer reach the fabric. Failures to enable or disable a link are now reported to the agent, rather than logged and reported as successful.
neutron-mlnx-agentnow sets the link of every assigned virtual function on each polling iteration, rather than only when it thinks the state changed, so a link that Nova disabled by plugging the virtual function again is enabled again. When it can’t get its ports from the Neutron server, it disables every link except those it enabled for the same port, including after it restarts. It also disables the link of a virtual function that is no longer assigned.
neutron-mlnx-agentnow enables the link of an InfiniBand virtual function only while its port isACTIVE, administratively up and bound to the agent’s host, and only if the virtual function has the port’s GUID. ML2 makes a portACTIVEonly once nothing holds it, which includes the SDN controller adding it to its partition key. The agent disables the link when any of this stops being true. So an instance can’t reach the fabric outside its partition, even where Nova runs it without waiting for its port, for example when it attaches an interface, migrates or resumes an instance, or whenvif_plugging_is_fatalisFalse. Instances get network access once their ports areACTIVE, within one agent polling interval.
neutron-mlnx-agentno longer reports a port up when it fails to configure it, so the port can’t becomeACTIVE, and it carries on with the other ports.
mlnx_infinibandnow treats a VLAN segment’s partition key as enforced only ifmlnx_sdn_assistsyncs the physical networks of all the network’s segments, which is when it sends the network’s ports to the SDN controller. Previously a port on a network with segments on several physical networks could be bound while the SDN driver ignored it, and so was never added to its partition key.
The
mlnx_infinibandmechanism driver no longer binds a port to a VLAN segment unless themlnx_sdn_assistmechanism driver syncs the segment’s physical network to an SDN controller, which adds the port to the segment’s partition key. Previously the port was bound, and its virtual function used the default partition, whatever the segmentation ID. It also no longer binds a port if another port with the same MAC address, on another network, is bound asib_hostdev, since both virtual functions would have the same GUID.
A bare metal node’s InfiniBand port (VNIC type
baremetalwith a DHCP client ID) on a VLAN network now staysDOWNuntil the SDN controller’s job that adds it to the network’s partition key has completed, and is set toERRORif the controller fails. Previouslymlnx_sdn_assistmade the portACTIVEas soon as it was bound. Ironic waits for its ports to beACTIVEbefore it powers a node on into the tenant network, when[neutron] fail_on_port_binding_failureisTrue, its default, so the deployment now fails instead. A port inERRORfails the deployment when Ironic’s wait times out, which is set by[agent] neutron_agent_max_attemptsand[agent] neutron_agent_status_retry_interval.
mlnx_sdn_assistnow rejects a DHCP client ID set or changed by a project on any port of a network it syncs, not only ondirectandbaremetalports, since a port’s VNIC type can change later. It accepts client IDs from users with theservicerole as well as from administrators. A port with more than one client ID option can’t be bound, nor can adirectInfiniBand port whose client ID isn’t the one derived from its MAC address, from which its virtual function’s GUID is derived. The deletion of everydirectport is now sent to the SDN controller, whatever its device owner.
Failed deletions of ports are no longer removed from the
sdn_journaltable after[sdn] completed_rows_retention, so ports with the same GUID keep being set toERRORuntil an operator has checked that the GUID was removed from its partition key and deleted the row.
mlnx_sdn_assistnow rejects a request that sets or changes the DHCP client ID of adirectorbaremetalport unless it comes from an administrator. The SDN controller takes an InfiniBand port’s GUID from its client ID, so a project that set it could have had another port’s GUID added to its network’s partition key. Nova, Ironic andmlnx_infinibandset client IDs as administrators. A bare metal node’s InfiniBand port is no longer sent when it is created, only when its binding is committed.
Every
directInfiniBand port is now heldDOWNuntil the SDN controller has added it to its partition key, whatever its device owner. Previously only instances’ ports were.
When the
mlnx_sdn_assistmechanism driver syncs to an SDN controller, an instance’s InfiniBand port (VIF typeib_hostdev) on a VLAN network now staysDOWNuntil the controller’s job that adds the port to the network’s partition key has completed. If the controller rejects the port, its job fails, it doesn’t implement the request, it doesn’t return a job, or the retries run out, the port is set toERROR. Nova then fails the boot, at the latest whenvif_plugging_timeoutexpires. Previously the port could becomeACTIVE, and the instance could start, while the port was still in the default partition, where it can reach other tenants’ ports.
The
mlnx_sdn_assistjournal now sends a port’sPOSTto the SDN controller only once the deletion of any other port with the same GUID has finished. A bare metal node’s provisioning and tenant ports have the same DHCP client ID, and ports with the same MAC address on different networks give virtual functions the same GUID. Previously a tenant port could be added to its partition key, and madeACTIVE, while the controller was still removing, or had failed to remove, the same GUID from another partition. If the controller failed to delete the other port, an instance’s or bare metal node’s port that is heldDOWNis now set toERRORinstead of being sent.
mlnx_sdn_assistnow refuses a segment that would give a network segments both on physical networks in[sdn] physical_networksand on others. It only sends a network’s ports to the SDN controller while all the network’s segments are on synced physical networks, so adding a segment on an unsynced physical network to a synced network stopped its ports from being sent, including their deletion, which left their GUIDs in the network’s partition key. Networks that already mix them aren’t synced; check for them after upgrading, and for ports whose GUIDs were left in partition keys.
Bug Fixes¶
Fixed a race in
neutron-mlnx-agentwhere a port update received from the Neutron server while the agent was scanning ports could be lost, so the port’s binding was not refreshed until the next update or resync.
The
mlnx_infinibandmechanism driver no longer replaces aclient-idDHCP option set by the user when it binds a port, and keeps the port’s other extra DHCP options in the port it passes to other mechanism drivers and returns from the API.
If
[sdn] bind_normal_portswas enabled,[sdn] physical_networkslisted physical networks and[sdn] bind_normal_ports_physnetswas empty,neutron-serverfailed to start with an unhelpfulTypeError. It now reports that[sdn] bind_normal_ports_physnetsmust be set.
The
mlnx_infinibandmechanism driver no longer adds the InfiniBandclient-idDHCP option to every instance port, including ports on other networks bound by other mechanism drivers such as OVN. It now adds it only when a live Mellanox agent on the port’s host can bind the port’s network.
On ConnectX-3 adapters, releasing a virtual function now sets its partition key to the invalid one, without logging an error.
eswitchdno longer exits when it receives a message that is not a JSON object, such as a stray connection to its ZeroMQ port. It now logs an error and replies with a failure.
After a live migration,
neutron-mlnx-agentnow reports the port of the virtual function that the instance has on the destination host, rather than one it had there before, so the port becomesACTIVE. The agent also releases removed virtual functions before configuring new ones, so a virtual function given to another port within one polling interval keeps the new port’s configuration.
Ports bound by the
mlnx_infinibandmechanism driver now stayDOWNuntilneutron-mlnx-agentreports that it has configured the virtual function. Previously the driver never added the L2 agent provisioning block when a port was bound to a host, so the port could becomeACTIVE, and Nova could start the instance, before the agent had configured the virtual function.
neutron-mlnx-agentno longer stops processing ports when it fails to get the virtual functions fromeswitchd, for example wheneswitchdreports an error. It now tries again after the polling interval, and keeps the port updates it received meanwhile. Previously its main loop stopped while the agent was still reported as alive.
When the SDN controller can’t be reached, or doesn’t answer in time,
mlnx_sdn_assist’s journal now handles it as a connection error, and retries the request. Previously the error ended the journal’s whole sync run, and a request being sent was left in theprocessingstate until the cleanup reset it.
A port’s
POSTnow only waits for deletions of ports with the same GUID that were recorded no later than it, so that operations recorded during a controller outage can’t wait for each other forever.
When a UFM job fails, the SDN journal now counts sending the request again against
[sdn] retry_count, as it does for other failures, and marks the row failed when the count is reached. Previously the request was sent again indefinitely, whateverretry_countwas set to.
The SDN journal now waits longer before each new attempt to send a request that has failed: at least one
[sdn] sync_timeoutbefore the first retry, doubling with each further retry up to five minutes, or one[sdn] sync_timeoutif that is longer. Previously a request that kept failing, for example because its controller job kept failing, was sent again on every sync. With the default[sdn] retry_countof -1 such a request is still retried indefinitely, but at most every five minutes, or every[sdn] sync_timeoutif that is longer.
The
mlnx_sdn_assistjournal now orders the operations on a network or port by a sequence number recorded with each operation, rather than by their creation time, which only has a resolution of a second. Operations recorded in the same second, such as theDELETEandPOSTof a port that moves to another host, or twoPOSToperations of a port that is bound twice in a second, are now sent in the order they were recorded. Previously a port could be leftDOWN, or out of its partition key, in these cases. Operations recorded before the upgrade are sent first, in the old order.
The
mlnx_sdn_assistmechanism driver now waits for the SDN controller to finish a job before sending operations that depend on it. For example, it used to delete a network while UFM was still running the job that removes the network’s ports, which UFM rejected withNetwork ID cannot be removed because it is associated to one or more hosts. Similarly, a port could be sent before UFM had finished creating its network. Dependent operations now wait for as long as the job runs. If the job status can’t be read, the request is sent again, up to[sdn] retry_counttimes.
The SDN journal no longer updates a row that is waiting for another operation, such as a network deletion waiting for its ports’ deletions, on every sync. With row-based binary logging and the default
binlog_row_image=FULL, each update logged the whole row, including the network or port data it holds, so waiting rows added to the database’s binary log volume for as long as they waited.
When
mlnx_sdn_assist’s journal can’t reach the SDN controller to check a job, it now keeps monitoring the job and checks it again later. Previously it sent the request again, which started another job on the controller although the first one may have been fine. When the controller answers a job check with an error, for example because it no longer knows the job, the request is still sent again, and this now counts towards[sdn] retry_count.
The
mlnx_sdn_assistjournal now locks a port’s binding while it releases the port, or sets it toERROR, after the SDN controller’s job for the port has finished. Previously, if the port was rebound at the same moment, the result of the job for the old binding could release the new binding before the controller had added it to the partition key.
When the SDN controller accepts a create or update request but returns no job to monitor,
mlnx_sdn_assist’s journal now records the request as done. Previously the request stayed in theprocessingstate until the cleanup reset it, and was then sent again. A deletion without a job is sent again, counting towards[sdn] retry_count, since nothing shows it was done. A request that holds an InfiniBand portDOWNuntil it is in its partition key still fails, and sets the port toERROR.
The
mlnx_sdn_assistmechanism driver now recognises a port’s DHCP client ID when the option is set by its number,61, as Ironic does. Neutron stores option names as strings and the driver only matched the integer, so it never found the client ID of such bare metal InfiniBand ports and did not send them to UFM unless they had local link information.
When a port moves to another host, the
mlnx_sdn_assistjournal now sends theDELETEof the port’s old binding to the SDN controller before thePOSTof its new one, even when both were recorded in the same second. Previously the two could be sent in either order, and theDELETEcould remove the port from its partition key after thePOSThad added it.
The
mlnx_sdn_assistmechanism driver no longer retries a create or update request that the SDN controller rejects with HTTP 400 or 422, such as UFM’sMissing attribute(s): client-idfor a port without an InfiniBand client ID. These were treated as connection errors, so with the default[sdn] retry_countof -1 the request was retried forever, and each retry stopped the rest of the journal from being synced until the next sync interval. The journal entry is now marked as failed and the error is logged. To send a port again, fix it and update it. To send a network again, delete and recreate it. Rejected deletions are still retried, because the controller can reject them only until the resources that use them are removed.
When the
mlnx_sdn_assistjournal fails to release a port after the SDN controller’s job for it has completed, for example because of a database deadlock, it now tries again on its next run. Previously it marked the journal row as completed first, so the port stayedDOWN.
The SDN controller no longer gets ports, and updates, of flat networks and networks with several segments that it was never told were created.
A request that would bind a
directport (VIF typeib_hostdev) on a VLAN network thatmlnx_sdn_assistsyncs now fails if the port has no DHCP client ID, since the controller can’t add it to its partition key, and the port stays unbound. Previously the controller rejected the port and set it toERROR.
mlnx_sdn_assistno longer asks the controller to delete or update ports that it never sent, such as a port whose binding failed, and now deletes the old port when a port update makes ML2 bind it again on the same host.
When a port is unbound, the
mlnx_infinibandmechanism driver now removes theclient-idDHCP option only if it has the value the driver generates, so aclient-idset by the user is kept. Ports that were wrongly given the driver’sclient-idhave it removed when they are next unbound.
The
mlnx_infinibandmechanism driver no longer deletes all of a port’s extra DHCP options when the port is unbound. Only theclient-idoption that the driver added is removed.
The
mlnx_infinibandmechanism driver now removes theclient-idDHCP option from a port when it is unbound, for example when its instance is deleted. Previously the option was left on the port.
Other Notes¶
neutron-mlnx-agentnow asks the Neutron server for thedirectports bound to its host on every polling iteration while virtual functions are attached, and handlesbinding_activatenotifications for live migrated instances.
30.0.0.0b1¶
Upgrade Notes¶
The minimum versions of networking-mlnx’s requirements now match neutron 29.0.0. This raises the minimum versions of neutron-lib to 5.0.0, oslo.config to 10.2.0, oslo.privsep to 2.3.0, pbr to 6.0.0, pyroute2 to 0.7.3 and SQLAlchemy to 1.4.23.
Following the lead from Neutron, support for the eventlet library has been dropped. Although not a user facing change, users should be on the lookout for multi-threading related bugs now that networking-mlnx uses native threads.
Support for Python 3.10 has been dropped as it is no longer a supported OpenStack runtime.
Support for Python 3.9 has been dropped as it is no longer a supported OpenStack runtime.
The
neutronpackage is no longer a required dependency. It has been moved to an optional extra calledneutron. This allows installing networking-mlnx without replacing or upgrading an existing Neutron installation.For installations where Neutron is not already present, install with the extra, which requires neutron 29.0.0 or later:
pip install 'networking-mlnx[neutron]'
Existing deployments that install neutron separately (e.g. via distribution packages, Kolla images or devstack) are not affected.
networking-mlnx itself no longer requires
python-openstackclient,python-neutronclient,Babel,defusedxmlornetaddr, which it does not use. Installpython-openstackclientseparately if you relied on networking-mlnx to provide theopenstackcommand.
The libraries that networking-mlnx imports directly are now declared as requirements: alembic, oslo.db, oslo.i18n, oslo.log, oslo.messaging, oslo.serialization, oslo.service (with its
threadingextra), oslo.utils and requests.
Bug Fixes¶
Fixed a race in
neutron-mlnx-agentwhere its state report thread and its main loop could send requests toeswitchdon the same ZeroMQ socket at the same time. The main loop then stopped withZMQError: Operation cannot be accomplished in current statewhile the agent was still reported as alive, so ports were never bound and instances with InfiniBand ports failed to boot with a VIF plugging timeout. Requests are now serialised, and the socket is replaced after a failed request.
Other Notes¶
Python 3.14 is now a supported runtime, as part of the tested runtimes for 2027.1.