diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 25de47f33..9fa32cf5d 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -25,10 +25,12 @@ from neutron.db import agentschedulers_db from neutron.db import allowedaddresspairs_db as addr_pair_db from neutron.db import db_base_plugin_v2 from neutron.db import external_net_db +from neutron.db import extradhcpopt_db from neutron.db import models_v2 from neutron.db import quota_db # noqa from neutron.db import securitygroups_rpc_base as sg_db_rpc from neutron.extensions import allowedaddresspairs as addr_pair +from neutron.extensions import extra_dhcp_opt as edo_ext from neutron.extensions import multiprovidernet as mpnet from neutron.extensions import portbindings from neutron.extensions import providernet as provider @@ -58,7 +60,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, external_net_db.External_net_db_mixin, sg_db_rpc.SecurityGroupServerRpcMixin, agentschedulers_db.DhcpAgentSchedulerDbMixin, - addr_pair_db.AllowedAddressPairsMixin): + addr_pair_db.AllowedAddressPairsMixin, + extradhcpopt_db.ExtraDhcpOptMixin): """Implement the Neutron L2 abstractions using modules. @@ -80,7 +83,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, _supported_extension_aliases = ["provider", "external-net", "binding", "quotas", "security-group", "agent", "dhcp_agent_scheduler", - "multi-provider", "allowed-address-pairs"] + "multi-provider", "allowed-address-pairs", + "extra_dhcp_opt"] @property def supported_extension_aliases(self): @@ -441,6 +445,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, with session.begin(subtransactions=True): self._ensure_default_security_group_on_port(context, port) sgids = self._get_security_groups_on_port(context, port) + dhcp_opts = port['port'].get(edo_ext.EXTRADHCPOPTS, []) result = super(Ml2Plugin, self).create_port(context, port) self._process_port_create_security_group(context, result, sgids) network = self.get_network(context, result['network_id']) @@ -451,6 +456,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, self._process_create_allowed_address_pairs( context, result, attrs.get(addr_pair.ADDRESS_PAIRS))) + self._process_port_create_extra_dhcp_opts(context, result, + dhcp_opts) self.mechanism_manager.create_port_precommit(mech_context) try: @@ -481,6 +488,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, need_port_update_notify |= self.update_security_group_on_port( context, id, port, original_port, updated_port) network = self.get_network(context, original_port['network_id']) + need_port_update_notify |= self._update_extra_dhcp_opts_on_port( + context, id, port, updated_port) mech_context = driver_context.PortContext( self, context, updated_port, network, original_port=original_port) diff --git a/neutron/tests/unit/ml2/test_ml2_plugin.py b/neutron/tests/unit/ml2/test_ml2_plugin.py index ae61fe662..46b7550d3 100644 --- a/neutron/tests/unit/ml2/test_ml2_plugin.py +++ b/neutron/tests/unit/ml2/test_ml2_plugin.py @@ -19,6 +19,7 @@ from neutron.extensions import providernet as pnet from neutron.plugins.ml2 import config from neutron.tests.unit import _test_extension_portbindings as test_bindings from neutron.tests.unit import test_db_plugin as test_plugin +from neutron.tests.unit import test_extension_extradhcpopts as test_dhcpopts from neutron.tests.unit import test_security_groups_rpc as test_sg_rpc @@ -194,3 +195,10 @@ class TestMultiSegmentNetworks(Ml2PluginV2TestCase): network_req = self.new_create_request('networks', data) res = network_req.get_response(self.api) self.assertEqual(res.status_int, 400) + + +class DHCPOptsTestCase(test_dhcpopts.TestExtraDhcpOpt): + + def setUp(self, plugin=None): + super(test_dhcpopts.ExtraDhcpOptDBTestCase, self).setUp( + plugin=PLUGIN_NAME) diff --git a/neutron/tests/unit/test_extension_extradhcpopts.py b/neutron/tests/unit/test_extension_extradhcpopts.py index fbe583663..863cfc006 100644 --- a/neutron/tests/unit/test_extension_extradhcpopts.py +++ b/neutron/tests/unit/test_extension_extradhcpopts.py @@ -55,8 +55,9 @@ class ExtraDhcpOptTestPlugin(db_base_plugin_v2.NeutronDbPluginV2, class ExtraDhcpOptDBTestCase(test_db_plugin.NeutronDbPluginV2TestCase): - def setUp(self, plugin=None): - super(ExtraDhcpOptDBTestCase, self).setUp(plugin=DB_PLUGIN_KLASS) + + def setUp(self, plugin=DB_PLUGIN_KLASS): + super(ExtraDhcpOptDBTestCase, self).setUp(plugin=plugin) class TestExtraDhcpOpt(ExtraDhcpOptDBTestCase):