l3: Send notify on router_create when ext gw is specified

A router that got created with an external gateway specified now
triggers a notfiy_router_updated event. This triggers scheduling
of the router and creation of the network namespace on the target
node.

Change-Id: I7f6ff5edf6a9c5ffa6d8978c1f3de0e106b6a8bb
Closes-Bug: #1535707
This commit is contained in:
Andreas Scheuring 2016-03-09 13:56:22 +01:00
parent 53c03f5ed3
commit da00d1a186
2 changed files with 49 additions and 0 deletions

View File

@ -1575,6 +1575,13 @@ class L3RpcNotifierMixin(object):
class L3_NAT_db_mixin(L3_NAT_dbonly_mixin, L3RpcNotifierMixin):
"""Mixin class to add rpc notifier methods to db_base_plugin_v2."""
def create_router(self, context, router):
router_dict = super(L3_NAT_db_mixin, self).create_router(context,
router)
if router_dict.get('external_gateway_info'):
self.notify_router_updated(context, router_dict['id'], None)
return router_dict
def update_router(self, context, id, router):
router_dict = super(L3_NAT_db_mixin, self).update_router(context,
id, router)

View File

@ -207,3 +207,45 @@ class TestL3_NAT_dbonly_mixin(base.BaseTestCase):
events.AFTER_UPDATE, mock.ANY,
context=mock.ANY,
subnetpool_id='fake_id')
class L3_NAT_db_mixin(base.BaseTestCase):
def setUp(self):
super(L3_NAT_db_mixin, self).setUp()
self.db = l3_db.L3_NAT_db_mixin()
def _test_create_router(self, external_gateway_info=None):
router_db = l3_db.Router(id='123')
router_dict = {'id': '123', 'tenant_id': '456',
'external_gateway_info': external_gateway_info}
# Need to use a copy here as the create_router method pops the gateway
# information
router_input = {'router': router_dict.copy()}
with mock.patch.object(l3_db.L3_NAT_dbonly_mixin, '_create_router_db',
return_value=router_db) as crd,\
mock.patch.object(l3_db.L3_NAT_dbonly_mixin, '_make_router_dict',
return_value=router_dict),\
mock.patch.object(l3_db.L3_NAT_dbonly_mixin,
'_update_router_gw_info') as urgi,\
mock.patch.object(l3_db.L3_NAT_db_mixin, 'notify_router_updated')\
as nru:
self.db.create_router(mock.ANY, router_input)
self.assertTrue(crd.called)
if external_gateway_info:
self.assertTrue(urgi.called)
self.assertTrue(nru.called)
else:
self.assertFalse(urgi.called)
self.assertFalse(nru.called)
def test_create_router_no_gateway(self):
self._test_create_router()
def test_create_router_gateway(self):
ext_gateway_info = {'network_id': 'net-id', 'enable_snat': True,
'external_fixed_ips': [
{'subnet_id': 'subnet-id',
'ip_address': 'ip'}]}
self._test_create_router(ext_gateway_info)