Skip to content

Commit

Permalink
Merge "Fixes update router gateway successful with existed floatingip…
Browse files Browse the repository at this point in the history
… association" into stable/folsom
  • Loading branch information
Jenkins authored and openstack-gerrit committed Jan 4, 2013
2 parents 5df31af + 9c3812f commit 166a7aa
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
5 changes: 5 additions & 0 deletions quantum/db/l3_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,11 @@ def _update_router_gw_info(self, context, router_id, info):

# figure out if we need to delete existing port
if gw_port and gw_port['network_id'] != network_id:
fip_count = self.get_floatingips_count(context.elevated(),
{'router_id': [router_id]})
if fip_count:
raise l3.RouterExternalGatewayInUseByFloatingIp(
router_id=router_id, net_id=gw_port['network_id'])
with context.session.begin(subtransactions=True):
router.gw_port = None
context.session.add(router)
Expand Down
6 changes: 6 additions & 0 deletions quantum/extensions/l3.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ class ExternalNetworkInUse(qexception.InUse):
"non-external, since it has existing gateway ports")


class RouterExternalGatewayInUseByFloatingIp(qexception.InUse):
message = _("Gateway cannot be updated for router %(router_id)s, since a "
"gateway to external network %(net_id)s is required by one or "
"more floating IPs.")


def _validate_uuid_or_none(data, valid_values=None):
if data is None:
return None
Expand Down
18 changes: 15 additions & 3 deletions quantum/tests/unit/test_l3_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,21 @@ def test_router_update_gateway(self):
r['router']['id'],
s2['subnet']['network_id'])

def test_router_update_gateway_with_existed_floatingip(self):
with self.subnet() as subnet:
self._set_net_external(subnet['subnet']['network_id'])
with self.floatingip_with_assoc() as fip:
self._add_external_gateway_to_router(
fip['floatingip']['router_id'],
subnet['subnet']['network_id'],
expected_code=exc.HTTPConflict.code)

def test_router_update_gateway_to_empty_with_existed_floatingip(self):
with self.floatingip_with_assoc() as fip:
self._remove_external_gateway_from_router(
fip['floatingip']['router_id'], None,
expected_code=exc.HTTPConflict.code)

def test_router_add_gateway_invalid_network(self):
with self.router() as r:
self._add_external_gateway_to_router(
Expand Down Expand Up @@ -951,9 +966,6 @@ def test_router_delete_with_floatingip(self):
port_id=p['port']['id'])
self.assertEqual(res.status_int, exc.HTTPCreated.code)
floatingip = self.deserialize(fmt, res)
self._remove_external_gateway_from_router(
r['router']['id'],
public_sub['subnet']['network_id'])
self._delete('routers', r['router']['id'],
expected_code=exc.HTTPConflict.code)
# Cleanup
Expand Down

0 comments on commit 166a7aa

Please sign in to comment.