Merge "handle gw_info outside of the db transaction on router creation"

This commit is contained in:
Jenkins 2015-08-30 05:07:36 +00:00 committed by Gerrit Code Review
commit 6d6fade66f
2 changed files with 25 additions and 2 deletions

View File

@ -174,11 +174,17 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
r = router['router']
gw_info = r.pop(EXTERNAL_GW_INFO, None)
tenant_id = self._get_tenant_id_for_create(context, r)
with context.session.begin(subtransactions=True):
router_db = self._create_router_db(context, r, tenant_id)
router_db = self._create_router_db(context, r, tenant_id)
try:
if gw_info:
self._update_router_gw_info(context, router_db['id'],
gw_info, router=router_db)
except Exception:
with excutils.save_and_reraise_exception():
LOG.exception(_LE("An exception occurred while creating "
"the router: %s"), router)
self.delete_router(context, router_db.id)
return self._make_router_dict(router_db)
def _update_router_db(self, context, router_id, data, gw_info):

View File

@ -2477,6 +2477,23 @@ class L3NatTestCaseBase(L3NatTestCaseMixin):
fip['floatingip']['floating_ip_address'])
self.assertEqual(floating_ip.version, 4)
def test_create_router_gateway_fails(self):
# Force _update_router_gw_info failure
plugin = manager.NeutronManager.get_service_plugins()[
service_constants.L3_ROUTER_NAT]
ctx = context.Context('', 'foo')
plugin._update_router_gw_info = mock.Mock(
side_effect=n_exc.NeutronException)
data = {'router': {
'name': 'router1', 'admin_state_up': True,
'external_gateway_info': {'network_id': 'some_uuid'}}}
# Verify router doesn't persist on failure
self.assertRaises(n_exc.NeutronException,
plugin.create_router, ctx, data)
routers = plugin.get_routers(ctx)
self.assertEqual(0, len(routers))
class L3AgentDbTestCaseBase(L3NatTestCaseMixin):