diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 58d5a82ebdb..d0e0b473cc6 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1161,6 +1161,11 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, raise psec.PortSecurityAndIPRequiredForSecurityGroups() def _setup_dhcp_agent_provisioning_component(self, context, port): + # NOTE(kevinbenton): skipping network ports is a workaround for + # the fact that we don't issue dhcp notifications from internal + # port creation like router ports and dhcp ports via RPC + if utils.is_port_trusted(port): + return subnet_ids = [f['subnet_id'] for f in port['fixed_ips']] if (db.is_dhcp_active_on_any_subnet(context, subnet_ids) and any(self.get_configuration_dict(a).get('notifies_port_ready') diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index fa7f6f807f8..5f35821da29 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -688,6 +688,13 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): with self.port(): self.assertTrue(ap.called) + def test_dhcp_provisioning_blocks_skipped_with_network_port(self): + self._add_fake_dhcp_agent() + with mock.patch.object(provisioning_blocks, + 'add_provisioning_component') as ap: + with self.port(device_owner=constants.DEVICE_OWNER_DHCP): + self.assertFalse(ap.called) + def test_dhcp_provisioning_blocks_skipped_on_create_with_no_dhcp(self): self._add_fake_dhcp_agent() with self.subnet(enable_dhcp=False) as subnet: