]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Validate router admin_state_up on upgrade to distributed
authorOleg Bondarev <obondarev@mirantis.com>
Tue, 18 Aug 2015 09:48:41 +0000 (12:48 +0300)
committerOleg Bondarev <obondarev@mirantis.com>
Tue, 25 Aug 2015 15:46:25 +0000 (18:46 +0300)
For proper upgrade of centralized router to distributed the router
needs to be disabled (admin_state_up set to false).
The patch adds corresponding validation.

Closes-Bug: #1428713
Change-Id: Idf25db0936eee892ecb169a8678ba7f0a2cfceb6

neutron/db/l3_dvr_db.py
neutron/tests/api/admin/test_routers_dvr.py
neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py
neutron/tests/unit/db/test_l3_dvr_db.py

index 16f48c86f33d2d55e3a3d58064eb4e10e4487063..66f1e85bbb3836f3999b39ef1202241d7b1b1b04 100644 (file)
@@ -92,6 +92,12 @@ class L3_NAT_with_dvr_db_mixin(l3_db.L3_NAT_db_mixin,
                                            "to centralized"))
         elif (not router_db.extra_attributes.distributed and
               router_res.get('distributed')):
+            # router should be disabled in order for upgrade
+            if router_db.admin_state_up:
+                msg = _('Cannot upgrade active router to distributed. Please '
+                        'set router admin_state_up to False prior to upgrade.')
+                raise n_exc.BadRequest(resource='router', msg=msg)
+
             # Notify advanced services of the imminent state transition
             # for the router.
             try:
index 34301ce7448bfaefc4edf6c884f108b6ca8cd85b..592fded05f25710fed74c42883523689acaa51f7 100644 (file)
@@ -93,7 +93,9 @@ class RoutersTestDVR(base.BaseRouterTest):
         attribute will be set to True
         """
         name = data_utils.rand_name('router')
-        router = self.admin_client.create_router(name, distributed=False)
+        # router needs to be in admin state down in order to be upgraded to DVR
+        router = self.admin_client.create_router(name, distributed=False,
+                                                 admin_state_up=False)
         self.addCleanup(self.admin_client.delete_router,
                         router['router']['id'])
         self.assertFalse(router['router']['distributed'])
index 473133b182c54a6c8dce2d47594b7800b096daf3..ca12c9fe7bc348fe8718fcf2b8a92279a01b8ca7 100644 (file)
@@ -32,6 +32,9 @@ class L3DvrTestCase(ml2_test_base.ML2TestFramework):
 
     def test_update_router_db_centralized_to_distributed(self):
         router = self._create_router(distributed=False)
+        # router needs to be in admin state down in order to be upgraded to DVR
+        self.l3_plugin.update_router(
+            self.context, router['id'], {'router': {'admin_state_up': False}})
         self.assertFalse(router['distributed'])
         self.l3_plugin.update_router(
             self.context, router['id'], {'router': {'distributed': True}})
index 70786b66e478b933902e1b49282e8793e2035076..94e330cfc23c5a4bca82134db6f9d70621051459 100644 (file)
@@ -100,6 +100,14 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):
                           self.mixin._validate_router_migration,
                           self.ctx, router_db, {'distributed': False})
 
+    def test_upgrade_active_router_to_distributed_validation_failure(self):
+        router = {'name': 'foo_router', 'admin_state_up': True}
+        router_db = self._create_router(router)
+        update = {'distributed': True}
+        self.assertRaises(exceptions.BadRequest,
+                          self.mixin._validate_router_migration,
+                          self.ctx, router_db, update)
+
     def test_update_router_db_centralized_to_distributed(self):
         router = {'name': 'foo_router', 'admin_state_up': True}
         agent = {'id': _uuid()}
@@ -603,7 +611,7 @@ class L3DvrTestCase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):
             self.assertEqual(1, len(dvr_ports))
 
     def test__validate_router_migration_notify_advanced_services(self):
-        router = {'name': 'foo_router', 'admin_state_up': True}
+        router = {'name': 'foo_router', 'admin_state_up': False}
         router_db = self._create_router(router)
         with mock.patch.object(l3_dvr_db.registry, 'notify') as mock_notify:
             self.mixin._validate_router_migration(