From 9a4f2e51a5b8f6f96535ee6968e5a209dd518654 Mon Sep 17 00:00:00 2001 From: Oleg Bondarev Date: Tue, 18 Aug 2015 12:48:41 +0300 Subject: [PATCH] Validate router admin_state_up on upgrade to distributed 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 | 6 ++++++ neutron/tests/api/admin/test_routers_dvr.py | 4 +++- .../services/l3_router/test_l3_dvr_router_plugin.py | 3 +++ neutron/tests/unit/db/test_l3_dvr_db.py | 10 +++++++++- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/neutron/db/l3_dvr_db.py b/neutron/db/l3_dvr_db.py index 16f48c86f..66f1e85bb 100644 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@ -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: diff --git a/neutron/tests/api/admin/test_routers_dvr.py b/neutron/tests/api/admin/test_routers_dvr.py index 34301ce74..592fded05 100644 --- a/neutron/tests/api/admin/test_routers_dvr.py +++ b/neutron/tests/api/admin/test_routers_dvr.py @@ -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']) diff --git a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py index 473133b18..ca12c9fe7 100644 --- a/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py +++ b/neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py @@ -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}}) diff --git a/neutron/tests/unit/db/test_l3_dvr_db.py b/neutron/tests/unit/db/test_l3_dvr_db.py index 70786b66e..94e330cfc 100644 --- a/neutron/tests/unit/db/test_l3_dvr_db.py +++ b/neutron/tests/unit/db/test_l3_dvr_db.py @@ -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( -- 2.45.2