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 017277242..3cea83b58 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 @@ -1,6 +1,7 @@ from dataclasses import dataclass import pytest +from neutron_lib.api.definitions import portbindings from neutron_lib.plugins.ml2 import api from oslo_config import cfg @@ -13,6 +14,22 @@ def test_with_simple_port(self, understack_driver, port_context): understack_driver.undersync.sync_devices.assert_called_once() + def test_skips_non_baremetal_port(self, understack_driver, port_context): + port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_NORMAL + + understack_driver.update_port_postcommit(port_context) + + understack_driver.undersync.sync_devices.assert_not_called() + + +class TestDeletePortPostCommit: + def test_skips_non_baremetal_port(self, understack_driver, port_context): + port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_NORMAL + + understack_driver.delete_port_postcommit(port_context) + + understack_driver.undersync.sync_devices.assert_not_called() + @pytest.mark.usefixtures("_ironic_baremetal_port_physical_network") class TestBindPort: @@ -94,6 +111,31 @@ def test_with_no_trunk( next_segments_to_bind=[vlan_network_segment], ) + def test_refuses_unsupported_vnic_type( + self, mocker, port_context, understack_driver + ): + port_context.current[portbindings.VNIC_TYPE] = portbindings.VNIC_DIRECT + mocker.patch.object(port_context, "continue_binding") + port_context._prepare_to_bind(port_context.network.network_segments) + + understack_driver.bind_port(port_context) + + port_context.continue_binding.assert_not_called() + + @pytest.mark.usefixtures("_ironic_baremetal_port_physical_network") + def test_does_not_bind_when_physical_network_not_found( + self, mocker, port_context, understack_driver + ): + understack_driver.ironic_client.baremetal_port_physical_network.return_value = ( + None + ) + mocker.patch.object(port_context, "continue_binding") + port_context._prepare_to_bind(port_context.network.network_segments) + + understack_driver.bind_port(port_context) + + port_context.continue_binding.assert_not_called() + @pytest.mark.parametrize("port_dict", [{"trunk": True}], indirect=True) def test_with_trunk_details( self, mocker, understack_driver, port_context, understack_trunk_driver diff --git a/python/neutron-understack/neutron_understack/tests/test_undersync_mech.py b/python/neutron-understack/neutron_understack/tests/test_undersync_mech.py index 42a229a3a..bda708a1f 100644 --- a/python/neutron-understack/neutron_understack/tests/test_undersync_mech.py +++ b/python/neutron-understack/neutron_understack/tests/test_undersync_mech.py @@ -92,13 +92,14 @@ def test_skips_unsupported_vnic_type(self, driver, vlan_segment): ctx.set_binding.assert_not_called() - def test_normal_vnic_type_is_supported(self, driver, vlan_segment): - seg = vlan_segment() - ctx = _make_context(vnic_type=portbindings.VNIC_NORMAL, segments=[seg]) + def test_normal_vnic_type_is_not_supported(self, driver, vlan_segment): + ctx = _make_context( + vnic_type=portbindings.VNIC_NORMAL, segments=[vlan_segment()] + ) driver.bind_port(ctx) - ctx.set_binding.assert_called_once() + ctx.set_binding.assert_not_called() def test_binds_vlan_when_preceded_by_vxlan( self, driver, vxlan_segment, vlan_segment @@ -121,3 +122,22 @@ def test_empty_segments_to_bind(self, driver): driver.bind_port(ctx) ctx.set_binding.assert_not_called() + + def test_skips_direct_vnic_type(self, driver, vlan_segment): + ctx = _make_context( + vnic_type=portbindings.VNIC_DIRECT, segments=[vlan_segment()] + ) + + driver.bind_port(ctx) + + ctx.set_binding.assert_not_called() + + def test_logs_warning_when_no_vlan_segment_found( + self, driver, vxlan_segment, caplog + ): + ctx = _make_context(segments=[vxlan_segment()]) + + driver.bind_port(ctx) + + assert "no VLAN segment found" in caplog.text + ctx.set_binding.assert_not_called() diff --git a/python/neutron-understack/neutron_understack/undersync_mech.py b/python/neutron-understack/neutron_understack/undersync_mech.py index f986661ff..97e649c7c 100644 --- a/python/neutron-understack/neutron_understack/undersync_mech.py +++ b/python/neutron-understack/neutron_understack/undersync_mech.py @@ -9,7 +9,7 @@ LOG = logging.getLogger(__name__) -SUPPORTED_VNIC_TYPES = [portbindings.VNIC_BAREMETAL, portbindings.VNIC_NORMAL] +SUPPORTED_VNIC_TYPES = [portbindings.VNIC_BAREMETAL] class UndersyncDriver(MechanismDriver):