Skip to content

Commit d1eaea7

Browse files
Merge pull request #760 from rackerlabs/PUC-795
fix: move logic from update_port_postcommit
2 parents c4a12d1 + a81e8f7 commit d1eaea7

File tree

3 files changed

+47
-41
lines changed

3 files changed

+47
-41
lines changed

python/neutron-understack/neutron_understack/neutron_understack_mech.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from uuid import UUID
33

44
import neutron_lib.api.definitions.portbindings as portbindings
5+
from neutron.plugins.ml2.driver_context import PortContext
56
from neutron_lib import constants as p_const
67
from neutron_lib.plugins.ml2 import api
78
from neutron_lib.plugins.ml2.api import MechanismDriver
@@ -223,31 +224,6 @@ def _configure_trunk(
223224
def update_port_postcommit(self, context):
224225
self._delete_tenant_port_on_unbound(context)
225226

226-
vif_type = context.current["binding:vif_type"]
227-
228-
if vif_type != portbindings.VIF_TYPE_OTHER:
229-
return
230-
231-
trunk_details = context.current.get("trunk_details", {})
232-
network_id = context.current["network_id"]
233-
network_type = context.network.current.get("provider:network_type")
234-
connected_interface_uuid = self.fetch_connected_interface_uuid(context.current)
235-
236-
if trunk_details:
237-
self._configure_trunk(trunk_details, connected_interface_uuid)
238-
if network_type == p_const.TYPE_VLAN:
239-
vlan_tag = int(context.network.current.get("provider:segmentation_id"))
240-
else:
241-
vlan_tag = None
242-
nb_vlan_group_id = self.update_nautobot(
243-
network_id, connected_interface_uuid, vlan_tag
244-
)
245-
246-
self.undersync.sync_devices(
247-
vlan_group_uuids=str(nb_vlan_group_id),
248-
dry_run=cfg.CONF.ml2_understack.undersync_dry_run,
249-
)
250-
251227
def delete_port_precommit(self, context):
252228
pass
253229

@@ -273,7 +249,28 @@ def delete_port_postcommit(self, context):
273249
dry_run=cfg.CONF.ml2_understack.undersync_dry_run,
274250
)
275251

276-
def bind_port(self, context):
252+
def _configure_switchport_on_bind(self, context: PortContext) -> None:
253+
trunk_details = context.current.get("trunk_details", {})
254+
network_id = context.current["network_id"]
255+
network_type = context.network.current.get("provider:network_type")
256+
connected_interface_uuid = self.fetch_connected_interface_uuid(context.current)
257+
258+
if trunk_details:
259+
self._configure_trunk(trunk_details, connected_interface_uuid)
260+
if network_type == p_const.TYPE_VLAN:
261+
vlan_tag = int(context.network.current.get("provider:segmentation_id"))
262+
else:
263+
vlan_tag = None
264+
nb_vlan_group_id = self.update_nautobot(
265+
network_id, connected_interface_uuid, vlan_tag
266+
)
267+
268+
self.undersync.sync_devices(
269+
vlan_group_uuids=str(nb_vlan_group_id),
270+
dry_run=cfg.CONF.ml2_understack.undersync_dry_run,
271+
)
272+
273+
def bind_port(self, context: PortContext) -> None:
277274
for segment in context.network.network_segments:
278275
if self.check_segment(segment):
279276
context.set_binding(
@@ -283,6 +280,7 @@ def bind_port(self, context):
283280
status=p_const.PORT_STATUS_ACTIVE,
284281
)
285282
LOG.debug("Bound segment: %s", segment)
283+
self._configure_switchport_on_bind(context)
286284
return
287285
else:
288286
LOG.debug(

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import uuid
44

55
import pytest
6+
from neutron.db.models.segment import NetworkSegment
67
from neutron.db.models_v2 import Network
78
from neutron.db.models_v2 import Port
89
from neutron.db.models_v2 import Subnet
@@ -73,12 +74,17 @@ def network_dict(ml2_plugin) -> dict:
7374

7475

7576
@pytest.fixture
76-
def network_context(ml2_plugin, network_dict) -> NetworkContext:
77+
def network_segment() -> NetworkSegment:
78+
return NetworkSegment(network_type="vxlan")
79+
80+
81+
@pytest.fixture
82+
def network_context(ml2_plugin, network_dict, network_segment) -> NetworkContext:
7783
return NetworkContext(
7884
ml2_plugin,
7985
"plugin_context",
8086
network_dict,
81-
segments=[],
87+
segments=[network_segment],
8288
)
8389

8490

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

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,7 @@ def test_for_provisioning_network(self, mocker, understack_driver, vlan_group_id
4545
understack_driver.nb.fetch_vlan_group_uuid.assert_called_once_with("444")
4646

4747

48-
@pytest.mark.usefixtures("update_nautobot_patch")
4948
class TestUpdatePortPostcommit:
50-
def test_vif_type_other_no_trunk(self, mocker, port_context, understack_driver):
51-
mocker.patch.object(understack_driver, "_configure_trunk")
52-
mocker.patch.object(understack_driver, "fetch_connected_interface_uuid")
53-
54-
understack_driver.update_port_postcommit(port_context)
55-
56-
understack_driver.update_nautobot.assert_called_once()
57-
understack_driver._configure_trunk.assert_not_called()
58-
understack_driver.fetch_connected_interface_uuid.assert_called_once()
59-
understack_driver.undersync.sync_devices.assert_called_once()
60-
6149
@pytest.mark.parametrize(
6250
"port_dict", [{"vif_type": portbindings.VIF_TYPE_UNBOUND}], indirect=True
6351
)
@@ -70,13 +58,27 @@ def test_vif_type_unbound(self, mocker, understack_driver, port_context):
7058
spy_delete_tenant_port.assert_called_once()
7159
assert result is None
7260

61+
62+
@pytest.mark.usefixtures("update_nautobot_patch")
63+
class TestBindPort:
64+
def test_with_no_trunk(self, mocker, port_context, understack_driver):
65+
mocker.patch.object(understack_driver, "_configure_trunk")
66+
mocker.patch.object(understack_driver, "fetch_connected_interface_uuid")
67+
68+
understack_driver.bind_port(port_context)
69+
70+
understack_driver.update_nautobot.assert_called_once()
71+
understack_driver._configure_trunk.assert_not_called()
72+
understack_driver.fetch_connected_interface_uuid.assert_called_once()
73+
understack_driver.undersync.sync_devices.assert_called_once()
74+
7375
@pytest.mark.parametrize("port_dict", [{"trunk": True}], indirect=True)
7476
def test_with_trunk_details(self, mocker, understack_driver, port_context, port_id):
7577
mocker.patch(
7678
"neutron_understack.utils.fetch_subport_network_id", return_value="112233"
7779
)
7880

79-
understack_driver.update_port_postcommit(port_context)
81+
understack_driver.bind_port(port_context)
8082
understack_driver.nb.prep_switch_interface.assert_called_once_with(
8183
connected_interface_id=str(port_id),
8284
ucvni_uuid="112233",

0 commit comments

Comments
 (0)