Skip to content

Commit 15450b6

Browse files
committed
undersync mechanism would operate only on baremetal ports
1 parent f0dd364 commit 15450b6

4 files changed

Lines changed: 76 additions & 6 deletions

File tree

.github/workflows/containers-openstack.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ jobs:
3737
- glance
3838
- horizon
3939
- keystone
40-
- neutron
4140
- nova
4241
- octavia
4342
- openstack-client
@@ -51,6 +50,15 @@ jobs:
5150
build_args: OPENSTACK_VERSION=2025.2
5251
latest_name: "2025.2"
5352

53+
neutron:
54+
uses: ./.github/workflows/build-container-reuse.yaml
55+
secrets: inherit
56+
with:
57+
container_name: neutron
58+
dockerfile_path: containers/neutron/Dockerfile
59+
build_args: OPENSTACK_VERSION=2026.1
60+
latest_name: "2026.1"
61+
5462
ironic:
5563
uses: ./.github/workflows/build-container-reuse.yaml
5664
secrets: inherit

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import dataclass
22

33
import pytest
4+
from neutron_lib.api.definitions import portbindings
45
from neutron_lib.plugins.ml2 import api
56
from oslo_config import cfg
67

@@ -13,6 +14,22 @@ def test_with_simple_port(self, understack_driver, port_context):
1314

1415
understack_driver.undersync.sync_devices.assert_called_once()
1516

17+
def test_skips_non_baremetal_port(self, understack_driver, port_context):
18+
port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_NORMAL
19+
20+
understack_driver.update_port_postcommit(port_context)
21+
22+
understack_driver.undersync.sync_devices.assert_not_called()
23+
24+
25+
class TestDeletePortPostCommit:
26+
def test_skips_non_baremetal_port(self, understack_driver, port_context):
27+
port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_NORMAL
28+
29+
understack_driver.delete_port_postcommit(port_context)
30+
31+
understack_driver.undersync.sync_devices.assert_not_called()
32+
1633

1734
@pytest.mark.usefixtures("_ironic_baremetal_port_physical_network")
1835
class TestBindPort:
@@ -94,6 +111,31 @@ def test_with_no_trunk(
94111
next_segments_to_bind=[vlan_network_segment],
95112
)
96113

114+
def test_refuses_unsupported_vnic_type(
115+
self, mocker, port_context, understack_driver
116+
):
117+
port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_DIRECT
118+
mocker.patch.object(port_context, "continue_binding")
119+
port_context._prepare_to_bind(port_context.network.network_segments)
120+
121+
understack_driver.bind_port(port_context)
122+
123+
port_context.continue_binding.assert_not_called()
124+
125+
@pytest.mark.usefixtures("_ironic_baremetal_port_physical_network")
126+
def test_does_not_bind_when_physical_network_not_found(
127+
self, mocker, port_context, understack_driver
128+
):
129+
understack_driver.ironic_client.baremetal_port_physical_network.return_value = (
130+
None
131+
)
132+
mocker.patch.object(port_context, "continue_binding")
133+
port_context._prepare_to_bind(port_context.network.network_segments)
134+
135+
understack_driver.bind_port(port_context)
136+
137+
port_context.continue_binding.assert_not_called()
138+
97139
@pytest.mark.parametrize("port_dict", [{"trunk": True}], indirect=True)
98140
def test_with_trunk_details(
99141
self, mocker, understack_driver, port_context, understack_trunk_driver

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,14 @@ def test_skips_unsupported_vnic_type(self, driver, vlan_segment):
9292

9393
ctx.set_binding.assert_not_called()
9494

95-
def test_normal_vnic_type_is_supported(self, driver, vlan_segment):
96-
seg = vlan_segment()
97-
ctx = _make_context(vnic_type=portbindings.VNIC_NORMAL, segments=[seg])
95+
def test_normal_vnic_type_is_not_supported(self, driver, vlan_segment):
96+
ctx = _make_context(
97+
vnic_type=portbindings.VNIC_NORMAL, segments=[vlan_segment()]
98+
)
9899

99100
driver.bind_port(ctx)
100101

101-
ctx.set_binding.assert_called_once()
102+
ctx.set_binding.assert_not_called()
102103

103104
def test_binds_vlan_when_preceded_by_vxlan(
104105
self, driver, vxlan_segment, vlan_segment
@@ -121,3 +122,22 @@ def test_empty_segments_to_bind(self, driver):
121122
driver.bind_port(ctx)
122123

123124
ctx.set_binding.assert_not_called()
125+
126+
def test_skips_direct_vnic_type(self, driver, vlan_segment):
127+
ctx = _make_context(
128+
vnic_type=portbindings.VNIC_DIRECT, segments=[vlan_segment()]
129+
)
130+
131+
driver.bind_port(ctx)
132+
133+
ctx.set_binding.assert_not_called()
134+
135+
def test_logs_warning_when_no_vlan_segment_found(
136+
self, driver, vxlan_segment, caplog
137+
):
138+
ctx = _make_context(segments=[vxlan_segment()])
139+
140+
driver.bind_port(ctx)
141+
142+
assert "no VLAN segment found" in caplog.text
143+
ctx.set_binding.assert_not_called()

python/neutron-understack/neutron_understack/undersync_mech.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
LOG = logging.getLogger(__name__)
1111

12-
SUPPORTED_VNIC_TYPES = [portbindings.VNIC_BAREMETAL, portbindings.VNIC_NORMAL]
12+
SUPPORTED_VNIC_TYPES = [portbindings.VNIC_BAREMETAL]
1313

1414

1515
class UndersyncDriver(MechanismDriver):

0 commit comments

Comments
 (0)