diff --git a/doc/source/admin/ovn-networking.rst b/doc/source/admin/ovn-networking.rst index 8305a1b19b..ac31317cd7 100644 --- a/doc/source/admin/ovn-networking.rst +++ b/doc/source/admin/ovn-networking.rst @@ -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 `_, -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 ======== diff --git a/doc/source/contributor/webapi-version-history.rst b/doc/source/contributor/webapi-version-history.rst index 50adde50a5..b52f3fdb54 100644 --- a/doc/source/contributor/webapi-version-history.rst +++ b/doc/source/contributor/webapi-version-history.rst @@ -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) ------------------------ diff --git a/ironic/api/controllers/v1/port.py b/ironic/api/controllers/v1/port.py index 69de6fde7b..ab1abebbce 100644 --- a/ironic/api/controllers/v1/port.py +++ b/ironic/api/controllers/v1/port.py @@ -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() diff --git a/ironic/api/controllers/v1/utils.py b/ironic/api/controllers/v1/utils.py index a04200c924..10865f3afd 100644 --- a/ironic/api/controllers/v1/utils.py +++ b/ironic/api/controllers/v1/utils.py @@ -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. diff --git a/ironic/api/controllers/v1/versions.py b/ironic/api/controllers/v1/versions.py index 3257cf8f05..278fe425bf 100644 --- a/ironic/api/controllers/v1/versions.py +++ b/ironic/api/controllers/v1/versions.py @@ -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) diff --git a/ironic/common/neutron.py b/ironic/common/neutron.py index b2ba7749bb..ce3e37332e 100644 --- a/ironic/common/neutron.py +++ b/ironic/common/neutron.py @@ -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. diff --git a/ironic/common/release_mappings.py b/ironic/common/release_mappings.py index 39306fcfe0..5dc0b6ab0b 100644 --- a/ironic/common/release_mappings.py +++ b/ironic/common/release_mappings.py @@ -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': { diff --git a/releasenotes/notes/remove-ovn-vtep-usage-c857f1ab22d8f6f1.yaml b/releasenotes/notes/remove-ovn-vtep-usage-c857f1ab22d8f6f1.yaml new file mode 100644 index 0000000000..e2c38bde5b --- /dev/null +++ b/releasenotes/notes/remove-ovn-vtep-usage-c857f1ab22d8f6f1.yaml @@ -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.