Send notification on router interface create/delete

This fixes bug #1060985 for Quantum

Change-Id: I39d2d15340913dd0fad753c3e95fb74d329481a9
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2013-01-04 16:29:20 +01:00
parent 0f6d26b1ac
commit 58d39cccf2
2 changed files with 40 additions and 3 deletions

View File

@ -32,6 +32,7 @@ from quantum.db import model_base
from quantum.db import models_v2 from quantum.db import models_v2
from quantum.extensions import l3 from quantum.extensions import l3
from quantum.openstack.common import log as logging from quantum.openstack.common import log as logging
from quantum.openstack.common.notifier import api as notifier_api
from quantum.openstack.common import uuidutils from quantum.openstack.common import uuidutils
from quantum import policy from quantum import policy
@ -352,8 +353,14 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
routers = self.get_sync_data(context.elevated(), [router_id]) routers = self.get_sync_data(context.elevated(), [router_id])
l3_rpc_agent_api.L3AgentNofity.routers_updated(context, routers) l3_rpc_agent_api.L3AgentNofity.routers_updated(context, routers)
return {'port_id': port['id'], info = {'port_id': port['id'],
'subnet_id': port['fixed_ips'][0]['subnet_id']} 'subnet_id': port['fixed_ips'][0]['subnet_id']}
notifier_api.notify(context,
notifier_api.publisher_id('network'),
'router.interface.create',
notifier_api.CONF.default_notification_level,
{'router.interface': info})
return info
def _confirm_router_interface_not_in_use(self, context, router_id, def _confirm_router_interface_not_in_use(self, context, router_id,
subnet_id): subnet_id):
@ -391,9 +398,9 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
raise q_exc.SubnetMismatchForPort( raise q_exc.SubnetMismatchForPort(
port_id=port_id, port_id=port_id,
subnet_id=interface_info['subnet_id']) subnet_id=interface_info['subnet_id'])
subnet_id = port_db['fixed_ips'][0]['subnet_id']
self._confirm_router_interface_not_in_use( self._confirm_router_interface_not_in_use(
context, router_id, context, router_id, subnet_id)
port_db['fixed_ips'][0]['subnet_id'])
self.delete_port(context, port_db['id'], l3_port_check=False) self.delete_port(context, port_db['id'], l3_port_check=False)
elif 'subnet_id' in interface_info: elif 'subnet_id' in interface_info:
subnet_id = interface_info['subnet_id'] subnet_id = interface_info['subnet_id']
@ -412,6 +419,7 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
for p in ports: for p in ports:
if p['fixed_ips'][0]['subnet_id'] == subnet_id: if p['fixed_ips'][0]['subnet_id'] == subnet_id:
port_id = p['id']
self.delete_port(context, p['id'], l3_port_check=False) self.delete_port(context, p['id'], l3_port_check=False)
found = True found = True
break break
@ -423,6 +431,13 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
subnet_id=subnet_id) subnet_id=subnet_id)
routers = self.get_sync_data(context.elevated(), [router_id]) routers = self.get_sync_data(context.elevated(), [router_id])
l3_rpc_agent_api.L3AgentNofity.routers_updated(context, routers) l3_rpc_agent_api.L3AgentNofity.routers_updated(context, routers)
notifier_api.notify(context,
notifier_api.publisher_id('network'),
'router.interface.delete',
notifier_api.CONF.default_notification_level,
{'router.interface':
{'port_id': port_id,
'subnet_id': subnet_id}})
def _get_floatingip(self, context, id): def _get_floatingip(self, context, id):
try: try:

View File

@ -42,6 +42,8 @@ from quantum.extensions import l3
from quantum import manager from quantum import manager
from quantum.openstack.common import cfg from quantum.openstack.common import cfg
from quantum.openstack.common import log as logging from quantum.openstack.common import log as logging
from quantum.openstack.common.notifier import test_notifier
from quantum.openstack.common.notifier import api as notifier_api
from quantum.openstack.common import uuidutils from quantum.openstack.common import uuidutils
from quantum.tests.unit import test_api_v2 from quantum.tests.unit import test_api_v2
from quantum.tests.unit import test_db_plugin from quantum.tests.unit import test_db_plugin
@ -296,6 +298,14 @@ class L3NatDBTestCase(test_db_plugin.QuantumDbPluginV2TestCase):
test_config['extension_manager'] = ext_mgr test_config['extension_manager'] = ext_mgr
super(L3NatDBTestCase, self).setUp() super(L3NatDBTestCase, self).setUp()
# Set to None to reload the drivers
notifier_api._drivers = None
cfg.CONF.set_override("notification_driver", [test_notifier.__name__])
def tearDown(self):
test_notifier.NOTIFICATIONS = []
super(L3NatDBTestCase, self).tearDown()
def _create_router(self, fmt, tenant_id, name=None, def _create_router(self, fmt, tenant_id, name=None,
admin_state_up=None, set_context=False): admin_state_up=None, set_context=False):
data = {'router': {'tenant_id': tenant_id}} data = {'router': {'tenant_id': tenant_id}}
@ -477,6 +487,18 @@ class L3NatDBTestCase(test_db_plugin.QuantumDbPluginV2TestCase):
body = self._show('ports', r_port_id, body = self._show('ports', r_port_id,
expected_code=exc.HTTPNotFound.code) expected_code=exc.HTTPNotFound.code)
self.assertEqual(len(test_notifier.NOTIFICATIONS), 8)
self.assertEqual(
set(n['event_type'] for n in test_notifier.NOTIFICATIONS),
set(['router.create.start',
'router.create.end',
'network.create.start',
'network.create.end',
'subnet.create.start',
'subnet.create.end',
'router.interface.create',
'router.interface.delete']))
def test_router_add_interface_subnet_with_bad_tenant_returns_404(self): def test_router_add_interface_subnet_with_bad_tenant_returns_404(self):
with mock.patch('quantum.context.Context.to_dict') as tdict: with mock.patch('quantum.context.Context.to_dict') as tdict:
tenant_id = _uuid() tenant_id = _uuid()