From 1429990deaa557f31a7aac50c44d8262a80453c6 Mon Sep 17 00:00:00 2001 From: Steve Keay Date: Fri, 21 Mar 2025 14:34:31 +0000 Subject: [PATCH] Fix secondary IP blocks on "external" subnets (SVIs) The Nautobot update is supposed to be adding to the set of subnets that are associated with the UCVNI. It was incorrectly replacing the entire set. --- .../neutron_understack/nautobot.py | 24 +++++++++---------- .../neutron_understack_mech.py | 5 +++- .../tests/test_neutron_understack_mech.py | 5 +++- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/python/neutron-understack/neutron_understack/nautobot.py b/python/neutron-understack/neutron_understack/nautobot.py index 5aec287c4..fffd69eda 100644 --- a/python/neutron-understack/neutron_understack/nautobot.py +++ b/python/neutron-understack/neutron_understack/nautobot.py @@ -188,21 +188,21 @@ def subnet_create( } return self.make_api_request("POST", "/api/ipam/prefixes/", payload) - def associate_subnet_with_network( - self, network_uuid: str, subnet_uuid: str, role: str - ): + def set_svi_role_on_network(self, network_uuid: str, role: str): url = f"/api/plugins/undercloud-vni/ucvnis/{network_uuid}/" + payload = {"role": {"name": role}} + self.make_api_request("PATCH", url, payload) + + def associate_subnet_with_network(self, network_uuid: str, subnet_uuid: str): + url = "/api/extras/relationship-associations/" payload = { - "role": {"name": role}, - "relationships": { - "ucvni_prefixes": { - "destination": { - "objects": [subnet_uuid], - }, - }, - }, + "relationship": {"key": "ucvni_prefixes"}, + "source_type": "vni_custom_model.ucvni", + "source_id": network_uuid, + "destination_type": "ipam.prefix", + "destination_id": subnet_uuid, } - self.make_api_request("PATCH", url, payload) + self.make_api_request("POST", url, payload) def add_tenant_vlan_tag_to_ucvni(self, network_uuid: str, vlan_tag: int) -> dict: url = f"/api/plugins/undercloud-vni/ucvnis/{network_uuid}/" diff --git a/python/neutron-understack/neutron_understack/neutron_understack_mech.py b/python/neutron-understack/neutron_understack/neutron_understack_mech.py index 1f7a7750a..2f2ad4c43 100644 --- a/python/neutron-understack/neutron_understack/neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/neutron_understack_mech.py @@ -176,10 +176,13 @@ def create_subnet_postcommit(self, context): if external: self.nb.associate_subnet_with_network( - role="svi_vxlan_anycast_gateway", network_uuid=network_uuid, subnet_uuid=subnet_uuid, ) + self.nb.set_svi_role_on_network( + role="svi_vxlan_anycast_gateway", + network_uuid=network_uuid, + ) LOG.info( "subnet with ID: %s and prefix %s has been " diff --git a/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py b/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py index f4f51920e..c90acaa03 100644 --- a/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/tests/test_neutron_understack_mech.py @@ -123,10 +123,13 @@ def test_create_public(self, understack_driver, subnet_context, subnet): tenant_uuid=ANY, ) understack_driver.nb.associate_subnet_with_network.assert_called_once_with( - role="svi_vxlan_anycast_gateway", network_uuid=subnet.network_id, subnet_uuid=subnet.id, ) + understack_driver.nb.set_svi_role_on_network.assert_called_once_with( + network_uuid=subnet.network_id, + role="svi_vxlan_anycast_gateway", + ) class TestDeleteSubnetPostCommit: