if active_port:
subnet_id = port_data['fixed_ips'][0]['subnet_id']
subnet = plugin.get_subnet(context, subnet_id)
- if (cfg.CONF.dhcp_agent_notification and subnet.get('gateway_ip')
- or action == 'delete_port'):
- dhcp_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
- dhcp_notifier.notify(
- context, {'subnet': subnet}, 'subnet.update.end')
+ _notify_rpc_agent(context, {'subnet': subnet}, 'subnet.update.end')
def handle_port_metadata_access(context, port, is_delete=False):
# as it will be removed with the network
plugin.delete_network(context, meta_net['id'])
- if cfg.CONF.dhcp_agent_notification:
- # We need to send a notification to the dhcp agent in
- # order to start the metadata agent proxy
- dhcp_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
- dhcp_notifier.notify(context, {'network': meta_net},
- 'network.create.end')
+ # Tell to start the metadata agent proxy
+ _notify_rpc_agent(context, {'network': meta_net}, 'network.create.end')
def _destroy_metadata_access_network(plugin, context, router_id, ports):
# must re-add the router interface
plugin.add_router_interface(context, router_id,
{'subnet_id': meta_sub_id})
+ # Tell to stop the metadata agent proxy
+ _notify_rpc_agent(
+ context, {'network': {'id': meta_net_id}}, 'network.delete.end')
+
+def _notify_rpc_agent(context, payload, event):
if cfg.CONF.dhcp_agent_notification:
- # We need to send a notification to the dhcp agent in
- # order to stop the metadata agent proxy
dhcp_notifier = dhcp_rpc_agent_api.DhcpAgentNotifyAPI()
- dhcp_notifier.notify(context,
- {'network': {'id': meta_net_id}},
- 'network.delete.end')
+ dhcp_notifier.notify(context, payload, event)
# under the License.
import mock
+from oslo.config import cfg
+from neutron.common import constants
from neutron.common.test_lib import test_config
from neutron.plugins.nicira.common import sync
from neutron.tests.unit.nicira import fake_nvpapiclient
self.addCleanup(self.fc.reset_all)
self.addCleanup(patch_sync.stop)
self.addCleanup(self.mock_nvpapi.stop)
+ self.addCleanup(cfg.CONF.reset)
def _notification_mocks(self, hosts, mock_dhcp, net, subnet, port):
host_calls = {}
topic='dhcp_agent.' + host)]
host_calls[host] = expected_calls
return host_calls
+
+ def _test_gateway_subnet_notification(self, gateway='10.0.0.1'):
+ cfg.CONF.set_override('metadata_mode', 'dhcp_host_route', 'NVP')
+ hosts = ['hosta']
+ [mock_dhcp, net, subnet, port] = self._network_port_create(
+ hosts, gateway=gateway, owner=constants.DEVICE_OWNER_DHCP)
+ found = False
+ for call, topic in mock_dhcp.call_args_list:
+ method = call[1]['method']
+ if method == 'subnet_update_end':
+ found = True
+ break
+ self.assertTrue(found)
+ self.assertEqual(subnet['subnet']['gateway_ip'], gateway)
+
+ def test_gatewayless_subnet_notification(self):
+ self._test_gateway_subnet_notification(gateway=None)
+
+ def test_subnet_with_gateway_notification(self):
+ self._test_gateway_subnet_notification()
payload={'admin_state_up': False}),
topic='dhcp_agent.' + DHCP_HOSTA)
- def _network_port_create(self, hosts):
+ def _network_port_create(
+ self, hosts, gateway=attributes.ATTR_NOT_SPECIFIED, owner=None):
for host in hosts:
self._register_one_agent_state(
{'binary': 'neutron-dhcp-agent',
with mock.patch.object(self.dhcp_notifier, 'cast') as mock_dhcp:
with self.network(do_delete=False) as net1:
with self.subnet(network=net1,
+ gateway_ip=gateway,
do_delete=False) as subnet1:
- with self.port(subnet=subnet1, no_delete=True) as port:
- return [mock_dhcp, net1, subnet1, port]
+ if owner:
+ with self.port(subnet=subnet1,
+ no_delete=True,
+ device_owner=owner) as port:
+ return [mock_dhcp, net1, subnet1, port]
+ else:
+ with self.port(subnet=subnet1,
+ no_delete=True) as port:
+ return [mock_dhcp, net1, subnet1, port]
def _notification_mocks(self, hosts, mock_dhcp, net, subnet, port):
host_calls = {}