Merge "Remove ovn vtep support"

This commit is contained in:
Zuul 2025-12-18 23:10:55 +00:00 committed by Gerrit Code Review
commit 3b4e3801a1
8 changed files with 48 additions and 50 deletions

View file

@ -169,19 +169,6 @@ above and beyond a dedicated interface, you will need to make the attachment
on the ``br-ex`` integration bridge, as opposed to ``br-int`` as one would
have done with OVS.
VTEP Switch Support
===================
Alpha-quality support was added to Ironic for OVN VTEP switches in API version
1.90. When the keys ``vtep-logical-switch``, ``vtep-physical-switch``, and
``port_id`` are set in ``port.local_link_connection``, Ironic will pass them on
to Neutron to be included in the binding profile to enable OVN support.
There `are reports of this approach working <https://bugs.launchpad.net/ironic/+bug/2034953>`_,
but Ironic developers do not have access to physical hardware to fully test
this feature. If you have any feedback for this feature, please reach out
to the Ironic community.
Unknowns
========

View file

@ -2,6 +2,14 @@
REST API Version History
========================
1.105 (Gazpacho)
----------------------
Removes support to set an OVN VTEP endpoint for ``local_link_information``.
Investigation by multiple contributors and maintainers realized that
this experiemntal feature was not scalable and relies upon a manual
ovn vtep endpoint service, and as such has been removed.
1.104 (Gazpacho)
------------------------

View file

@ -405,7 +405,8 @@ class PortsController(rest.RestController):
if (not api_utils.allow_local_link_connection_network_type()
and 'network_type' in fields['local_link_connection']):
raise exception.NotAcceptable()
if (not api_utils.allow_ovn_vtep_version()
if ((not api_utils.allow_ovn_vtep_version()
or api_utils.upper_ovn_vtep_version())
and 'vtep-logical-switch'
in fields['local_link_connection']):
raise exception.NotAcceptable()

View file

@ -96,6 +96,10 @@ TRAITS_SCHEMA = {
]
}
# NOTE(TheJulia): Support for vtep-physical-switch and
# vtep-logical-switch has been removed as of API version 1.104,
# but is still permitted on the API surface in the version range
# so we don't break overall API interaction compatibility.
LOCAL_LINK_BASE_SCHEMA = {
'type': 'object',
'properties': {
@ -2095,6 +2099,15 @@ def allow_ovn_vtep_version():
return api.request.version.minor >= versions.MINOR_90_OVN_VTEP
def upper_ovn_vtep_version():
"""Check if the ovn vtep version is at or beyond the removal.
Version 1.105 removed VTEP support logic, but we need to keep
the underlying api compatabity for now.
"""
return api.request.version.minor <= versions.MINOR_105_REMOVE_OVN_VTEP
def allow_build_configdrive():
"""Check if building configdrive is allowed.

View file

@ -142,7 +142,8 @@ BASE_VERSION = 1
# v1.102: Add physical_network field to portgroup.
# v1.103: Add category field to portgroup
# v1.104: Add instance_name to node
# v1.103: Add category field to portgroup.
# v1.105: Remove broken ovn vtep metadata support
MINOR_0_JUNO = 0
MINOR_1_INITIAL_VERSION = 1
@ -249,7 +250,7 @@ MINOR_101_PORT_CATEGORY = 101
MINOR_102_PORTGROUP_PHYSICAL_NETWORK = 102
MINOR_103_PORTGROUP_CATEGORY = 103
MINOR_104_NODE_INSTANCE_NAME = 104
MINOR_105_REMOVE_OVN_VTEP = 105
# When adding another version, update:
# - MINOR_MAX_VERSION
@ -259,7 +260,7 @@ MINOR_104_NODE_INSTANCE_NAME = 104
# - Add a comment describing the change above the list of consts
MINOR_MAX_VERSION = MINOR_104_NODE_INSTANCE_NAME
MINOR_MAX_VERSION = MINOR_105_REMOVE_OVN_VTEP
# String representations of the minor and maximum versions
_MIN_VERSION_STRING = '{}.{}'.format(BASE_VERSION, MINOR_1_INITIAL_VERSION)

View file

@ -362,16 +362,6 @@ def add_ports_to_network(task, network_uuid, security_groups=None):
binding_profile = {'local_link_information':
[portmap[ironic_port.uuid]]}
# Determine if network type is OVN
if is_ovn_vtep_port(ironic_port):
vtep_logical_switch = \
portmap[ironic_port.uuid]['vtep-logical-switch']
vtep_physical_switch = \
portmap[ironic_port.uuid]['vtep-physical-switch']
binding_profile['vtep-logical-switch'] = vtep_logical_switch
binding_profile['vtep-physical-switch'] = vtep_physical_switch
# Include physical_network if available
if ironic_port.physical_network:
binding_profile['physical_network'] = ironic_port.physical_network
@ -460,28 +450,6 @@ def add_ports_to_network(task, network_uuid, security_groups=None):
return ports
def is_ovn_vtep_port(port_info):
"""Check if the current port is an OVN VTEP port
:param port_info: an instance of ironic.objects.port.Port
or port data as a port like object
:returns: Boolean indicating if the port is an OVN VTEP port
"""
local_link_connection = {}
if isinstance(port_info, objects.Port):
local_link_connection = port_info.local_link_connection
elif isinstance(port_info, dict):
local_link_connection = port_info['local_link_connection']
if all(k in local_link_connection.keys()
for k in ['vtep-logical-switch', 'vtep-physical-switch']):
return True
return False
def remove_ports_from_network(task, network_uuid):
"""Deletes the neutron ports created for booting the ramdisk.

View file

@ -944,7 +944,7 @@ RELEASE_MAPPING = {
# make it below. To release, we will preserve a version matching
# the release as a separate block of text, like above.
'master': {
'api': '1.104',
'api': '1.105',
'rpc': '1.62',
'networking_rpc': '1.0',
'objects': {

View file

@ -0,0 +1,20 @@
---
deprecations:
- |
Ironic is deprecating and immediately removing the capability to pass
OVN VTEP connection information across through to Neutron. Over the
past year, multiple contributors have looked into this alpha level
functionality which was merged into Ironic and it was realized that
the functionality was geared for the OVN VTEP port service which is
a separate service one must launch on a OVN networking node to make
an attachment.
Since the functionality which was merged into ironic is unsuitable for
scaled and automated operations it must be removed. API field
validation is being kept, and the API version has bee incremented to
``1.104`` to signify this change, however the passing on Neutron
Port Binding has been removed.
Ironic developers are actively working on a performant solution
in the short term. We hope to have something else usable before the
2026.1 release.