]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fixes update router gateway successful with existed floatingip association
authorHe Jie Xu <xuhj@linux.vnet.ibm.com>
Mon, 26 Nov 2012 07:23:15 +0000 (15:23 +0800)
committerHe Jie Xu <xuhj@linux.vnet.ibm.com>
Wed, 28 Nov 2012 03:24:50 +0000 (11:24 +0800)
Fixes bug 1081877

Change-Id: I77e6034a39dc9db85de691a9ba596b2c8ca9d124

quantum/db/l3_db.py
quantum/extensions/l3.py
quantum/tests/unit/test_l3_plugin.py

index dcf91becf5a3cc9a8328b6c7295bc5f7b5e4af08..f3fab12edd07ab0e00998c5864e060ab8b9e93a7 100644 (file)
@@ -182,6 +182,11 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
 
         # 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)
index 15542d31aef29acfbc29352b09ba0b1753af4971..3d23be5f218780d7bffcd0ed3d403ef6755a643e 100644 (file)
@@ -64,6 +64,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), since a "
+                "gateway to external network %(net_id) is required by one or "
+                "more floating IPs.")
+
+
 def _validate_uuid_or_none(data, valid_values=None):
     if data is None:
         return None
index fe0a0b600189f272766a9593c155a1a5346bc1c7..787d10e3adbd7c8b0fe2320ac4d85c8fc982e884 100644 (file)
@@ -717,6 +717,21 @@ class L3NatDBTestCase(test_db_plugin.QuantumDbPluginV2TestCase):
                         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(
@@ -950,9 +965,6 @@ class L3NatDBTestCase(test_db_plugin.QuantumDbPluginV2TestCase):
                     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