From 502543ed676a8df2a33a118adc28813229491cfa Mon Sep 17 00:00:00 2001 From: Steve Keay Date: Tue, 25 Feb 2025 10:31:06 +0000 Subject: [PATCH 1/2] ml2: Add type annotations to data extracted from "context" --- .../neutron_understack/neutron_understack_mech.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/neutron-understack/neutron_understack/neutron_understack_mech.py b/python/neutron-understack/neutron_understack/neutron_understack_mech.py index 2adf0d4fb..78fd13616 100644 --- a/python/neutron-understack/neutron_understack/neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/neutron_understack_mech.py @@ -138,10 +138,10 @@ def create_subnet_postcommit(self, context): Don't have an SVI, which means we don't associate them with a VNI in nautobot. """ - subnet_uuid = context.current["id"] - network_uuid = context.current["network_id"] - prefix = context.current["cidr"] - external = context.current["router:external"] + subnet_uuid: str = context.current["id"] + network_uuid: str = context.current["network_id"] + prefix: str = context.current["cidr"] + external: bool = context.current["router:external"] if external: namespace = cfg.CONF.ml2_understack.shared_nautobot_namespace_name From fc23ae7e4560e624ac982ba2621b15d4b1357743 Mon Sep 17 00:00:00 2001 From: Steve Keay Date: Tue, 25 Feb 2025 10:32:15 +0000 Subject: [PATCH 2/2] Only create SVIs for prefixes of service_type "network:understack_svi" Previously, an SVI was created by the understack ml2 mech driver for every subnet created with a true value for the boolean router:external attribute. This makes it more selective, with SVIs only being created when service_type is equal to network:understack_svi. The intention here is to allow for future types of "external" network that do not require these SVIs because they have other types of router. --- .../neutron_understack_mech.py | 3 ++- .../tests/test_neutron_understack_mech.py | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/python/neutron-understack/neutron_understack/neutron_understack_mech.py b/python/neutron-understack/neutron_understack/neutron_understack_mech.py index 78fd13616..2fad3e8d4 100644 --- a/python/neutron-understack/neutron_understack/neutron_understack_mech.py +++ b/python/neutron-understack/neutron_understack/neutron_understack_mech.py @@ -142,6 +142,7 @@ def create_subnet_postcommit(self, context): network_uuid: str = context.current["network_id"] prefix: str = context.current["cidr"] external: bool = context.current["router:external"] + service_types: list[str] = context.current["service_types"] if external: namespace = cfg.CONF.ml2_understack.shared_nautobot_namespace_name @@ -154,7 +155,7 @@ def create_subnet_postcommit(self, context): namespace_name=namespace, ) - if external: + if external and "network:understack_svi" in service_types: self.nb.associate_subnet_with_network( role="svi_vxlan_anycast_gateway", network_uuid=network_uuid, 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 e3bec43f8..44b9a3a09 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 @@ -170,6 +170,7 @@ def test_create_subnet_postcommit_private(nautobot_client): "network_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "cidr": "1.0.0.0/24", "router:external": False, + "service_types": [], } ) @@ -183,13 +184,14 @@ def test_create_subnet_postcommit_private(nautobot_client): ) -def test_create_subnet_postcommit_public(nautobot_client, undersync_client): +def test_create_subnet_postcommit_public_svi(nautobot_client, undersync_client): context = MagicMock( current={ "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "network_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "cidr": "1.0.0.0/24", "router:external": True, + "service_types": ["network:understack_svi"], } ) @@ -203,6 +205,27 @@ def test_create_subnet_postcommit_public(nautobot_client, undersync_client): prefix="1.0.0.0/24", namespace_name="Global", ) + nautobot_client.associate_subnet_with_network.assert_called_once() + + +def test_create_subnet_postcommit_public_non_svi(nautobot_client, undersync_client): + context = MagicMock( + current={ + "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", + "network_id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", + "cidr": "1.0.0.0/24", + "router:external": True, + "service_types": ["not_an_svi_type"], + } + ) + + driver.nb = nautobot_client + driver.undersync = undersync_client + + driver.create_subnet_postcommit(context) + + nautobot_client.subnet_create.assert_called_once() + nautobot_client.associate_subnet_with_network.assert_not_called() def test_delete_subnet_postcommit_public(nautobot_client, undersync_client):