From 2665f968575edef56b3b8b6189f48a89a7a6e646 Mon Sep 17 00:00:00 2001 From: Genadi Chereshnya Date: Tue, 10 Jan 2017 11:17:07 +0200 Subject: [PATCH] Check permutations of router migrations This patch adds tests to check all possible router migrations, from and to: legacy, dvr, ha and dvr+ha. The tests are divided into different classes so as to not reach the quota (tempest resources are cleaned up as part of the tearDownClass). Related-Bug: #1654991 Depends-On: I4e08a97158dc4538c6f021c049c6e60fb7293459 Change-Id: I5b9fc4a81a1e6d59102c016e716000e68aaf4e0a --- neutron/tests/tempest/scenario/test_dvr.py | 40 ++---- .../tests/tempest/scenario/test_migration.py | 127 ++++++++++++++++++ .../services/network/json/network_client.py | 2 + 3 files changed, 140 insertions(+), 29 deletions(-) create mode 100644 neutron/tests/tempest/scenario/test_migration.py diff --git a/neutron/tests/tempest/scenario/test_dvr.py b/neutron/tests/tempest/scenario/test_dvr.py index 3c62f3ae9a7..049aa8f60f3 100644 --- a/neutron/tests/tempest/scenario/test_dvr.py +++ b/neutron/tests/tempest/scenario/test_dvr.py @@ -22,15 +22,7 @@ from neutron_lib import constants CONF = config.CONF -class NetworkDvrTest(base.BaseTempestTestCase): - credentials = ['primary', 'admin'] - force_tenant_isolation = False - - @classmethod - @test.requires_ext(extension="dvr", service="network") - def skip_checks(cls): - super(NetworkDvrTest, cls).skip_checks() - +class NetworkTestMixin(object): def _check_connectivity(self): self.check_connectivity(self.fip['floating_ip_address'], CONF.validation.image_ssh_user, @@ -51,6 +43,16 @@ class NetworkDvrTest(base.BaseTempestTestCase): self.admin_manager.network_client.update_port( port_id, admin_state_up=False) + +class NetworkDvrTest(base.BaseTempestTestCase, NetworkTestMixin): + credentials = ['primary', 'admin'] + force_tenant_isolation = False + + @classmethod + @test.requires_ext(extension="dvr", service="network") + def skip_checks(cls): + super(NetworkDvrTest, cls).skip_checks() + @decorators.idempotent_id('3d73ec1a-2ec6-45a9-b0f8-04a283d9d344') def test_vm_reachable_through_compute(self): """Check that the VM is reachable through compute node. @@ -62,23 +64,3 @@ class NetworkDvrTest(base.BaseTempestTestCase): ha=False) self.setup_network_and_server(router=router) self._check_snat_port_connectivity() - - @decorators.idempotent_id('23724222-483a-4129-bc15-7a9278f3828b') - def test_update_centralized_router_to_dvr(self): - """Check that updating centralized router to be distributed works. - """ - # Created a centralized router on a DVR setup - router = self.create_router_by_client( - distributed=False, tenant_id=self.client.tenant_id, is_admin=True, - ha=False) - self.setup_network_and_server(router=router) - self._check_connectivity() - - # Update router to be distributed - self.admin_manager.network_client.update_router( - router_id=router['id'], admin_state_up=False) - self.admin_manager.network_client.update_router( - router_id=router['id'], distributed=True) - self.admin_manager.network_client.update_router( - router_id=router['id'], admin_state_up=True) - self._check_snat_port_connectivity() diff --git a/neutron/tests/tempest/scenario/test_migration.py b/neutron/tests/tempest/scenario/test_migration.py new file mode 100644 index 00000000000..db897169206 --- /dev/null +++ b/neutron/tests/tempest/scenario/test_migration.py @@ -0,0 +1,127 @@ +# Copyright 2017 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from tempest.lib import decorators +from tempest import test + +from neutron.tests.tempest.scenario import base +from neutron.tests.tempest.scenario import test_dvr + + +class NetworkMigrationTestBase(base.BaseTempestTestCase, + test_dvr.NetworkTestMixin): + credentials = ['primary', 'admin'] + force_tenant_isolation = False + + @classmethod + @test.requires_ext(extension="dvr", service="network") + @test.requires_ext(extension="l3-ha", service="network") + def skip_checks(cls): + super(NetworkMigrationTestBase, cls).skip_checks() + + def _check_update(self, router, is_dvr, is_ha): + router = self.admin_manager.network_client.show_router(router['id']) + self.assertEqual(is_dvr, router['router']['distributed']) + self.assertEqual(is_ha, router['router']['ha']) + + def _test_migration(self, before_dvr, before_ha, after_dvr, after_ha): + router = self.create_router_by_client( + distributed=before_dvr, ha=before_ha, + tenant_id=self.client.tenant_id, is_admin=True) + + self.setup_network_and_server(router=router) + self._check_connectivity() + + self.admin_manager.network_client.update_router( + router_id=router['id'], admin_state_up=False) + self.admin_manager.network_client.update_router( + router_id=router['id'], distributed=after_dvr, ha=after_ha) + self._check_update(router, after_dvr, after_ha) + + self.admin_manager.network_client.update_router( + router_id=router['id'], admin_state_up=True) + self._check_connectivity() + + +class NetworkMigrationFromLegacy(NetworkMigrationTestBase): + + @decorators.idempotent_id('23724222-483a-4129-bc15-7a9278f3828b') + def test_from_legacy_to_dvr(self): + self._test_migration(before_dvr=False, before_ha=False, + after_dvr=True, after_ha=False) + + @decorators.idempotent_id('09d85102-994f-4ff9-bf3e-17051145ca12') + def test_from_legacy_to_ha(self): + self._test_migration(before_dvr=False, before_ha=False, + after_dvr=False, after_ha=True) + + @decorators.idempotent_id('fe169f2c-6ed3-4eb0-8afe-2d540c4b49e2') + def test_from_legacy_to_dvr_ha(self): + self._test_migration(before_dvr=False, before_ha=False, + after_dvr=True, after_ha=True) + + +class NetworkMigrationFromHA(NetworkMigrationTestBase): + + @decorators.idempotent_id('b4e68ac0-3b76-4306-ae8a-51cf4d363b22') + def test_from_ha_to_legacy(self): + self._test_migration(before_dvr=False, before_ha=True, + after_dvr=False, after_ha=False) + + @decorators.idempotent_id('42260eea-5d56-4d30-b62a-a62694dfe4d5') + def test_from_ha_to_dvr(self): + self._test_migration(before_dvr=False, before_ha=True, + after_dvr=True, after_ha=False) + + @decorators.idempotent_id('e4149576-248b-43fa-9d0b-a5c2f51967ce') + def test_from_ha_to_dvr_ha(self): + self._test_migration(before_dvr=False, before_ha=True, + after_dvr=True, after_ha=True) + + +class NetworkMigrationFromDVR(NetworkMigrationTestBase): + + @decorators.idempotent_id('e5cac02c-248d-4aac-bd5e-9d47c5197307') + def test_from_dvr_to_legacy(self): + self._test_migration(before_dvr=True, before_ha=False, + after_dvr=False, after_ha=False) + + @decorators.idempotent_id('a00d5ad7-8509-4bb0-bdd2-7f1ee052d1cd') + def test_from_dvr_to_ha(self): + self._test_migration(before_dvr=True, before_ha=False, + after_dvr=False, after_ha=True) + + @decorators.idempotent_id('25304a51-93a8-4cf3-9523-bce8b4eaecf8') + def test_from_dvr_to_dvr_ha(self): + self._test_migration(before_dvr=True, before_ha=False, + after_dvr=True, after_ha=True) + + +class NetworkMigrationFromDVRHA(NetworkMigrationTestBase): + + @decorators.idempotent_id('1be9b2e2-379c-40a4-a269-6687b81df691') + def test_from_dvr_ha_to_legacy(self): + self._test_migration(before_dvr=True, before_ha=True, + after_dvr=False, after_ha=False) + + @decorators.idempotent_id('55957267-4e84-4314-a2f7-7cd36a2df04b') + def test_from_dvr_ha_to_ha(self): + self._test_migration(before_dvr=True, before_ha=True, + after_dvr=False, after_ha=True) + + @decorators.idempotent_id('d6bedff1-72be-4a9a-8ea2-dc037cd838e0') + def test_from_dvr_ha_to_dvr(self): + self._test_migration(before_dvr=True, before_ha=True, + after_dvr=True, after_ha=False) diff --git a/neutron/tests/tempest/services/network/json/network_client.py b/neutron/tests/tempest/services/network/json/network_client.py index 671c0408aa7..83c45700bc8 100644 --- a/neutron/tests/tempest/services/network/json/network_client.py +++ b/neutron/tests/tempest/services/network/json/network_client.py @@ -366,6 +366,8 @@ class NetworkClientJSON(service_client.RestClient): 'external_gateway_info', body['router']['external_gateway_info']) if 'distributed' in kwargs: update_body['distributed'] = kwargs['distributed'] + if 'ha' in kwargs: + update_body['ha'] = kwargs['ha'] update_body = dict(router=update_body) update_body = jsonutils.dumps(update_body) resp, body = self.put(uri, update_body)