Skip to content

Commit ec0e867

Browse files
committed
DuplicateSubPort error when adding subnet to router if previous attempt failed
1 parent f0dd364 commit ec0e867

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

python/neutron-understack/neutron_understack/routers.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from neutron.objects.network import NetworkSegment
77
from neutron.objects.ports import Port
88
from neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.ovn_client import OVNClient
9+
from neutron.services.trunk import exceptions as trunk_exc
910
from neutron_lib import constants as p_const
1011
from neutron_lib import context as n_context
1112
from neutron_lib.api.definitions import segment as segment_def
@@ -97,11 +98,18 @@ def add_subport_to_trunk(shared_port: PortDict, segment: NetworkSegmentDict) ->
9798
}
9899
trunk_id = utils.fetch_network_node_trunk_id()
99100

100-
utils.fetch_trunk_plugin().add_subports(
101-
context=n_context.get_admin_context(),
102-
trunk_id=trunk_id,
103-
subports=subports,
104-
)
101+
try:
102+
utils.fetch_trunk_plugin().add_subports(
103+
context=n_context.get_admin_context(),
104+
trunk_id=trunk_id,
105+
subports=subports,
106+
)
107+
except trunk_exc.DuplicateSubPort:
108+
LOG.debug(
109+
"subport with segmentation_id %(seg_id)s already exists on trunk "
110+
"%(trunk_id)s, skipping",
111+
{"seg_id": segment["segmentation_id"], "trunk_id": trunk_id},
112+
)
105113

106114

107115
def fetch_or_create_router_segment(context: PortContext) -> NetworkSegmentDict:

python/neutron-understack/neutron_understack/tests/test_routers.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pytest
2+
from neutron.services.trunk import exceptions as trunk_exc
23
from neutron_lib import constants as p_const
34

45
from neutron_understack.routers import add_subport_to_trunk
@@ -66,6 +67,25 @@ def test_when_successful(self, mocker):
6667
},
6768
)
6869

70+
def test_duplicate_subport_is_ignored(self, mocker):
71+
"""A stranded sub-port from a previous failed attempt must not block retries."""
72+
mocker.patch(
73+
"neutron_understack.utils.fetch_network_node_trunk_id",
74+
return_value="trunk-uuid",
75+
)
76+
mocker.patch(
77+
"neutron_lib.context.get_admin_context", return_value="admin_context"
78+
)
79+
mock_trunk_plugin = mocker.Mock()
80+
mock_trunk_plugin.add_subports.side_effect = trunk_exc.DuplicateSubPort()
81+
mocker.patch(
82+
"neutron_understack.utils.fetch_trunk_plugin",
83+
return_value=mock_trunk_plugin,
84+
)
85+
86+
# should not raise
87+
add_subport_to_trunk({"id": "port-123"}, {"segmentation_id": 42})
88+
6989

7090
class TestHandleSubportRemoval:
7191
def test_when_successful(self, mocker, port_id, trunk_id):

0 commit comments

Comments
 (0)