From 3204a0ebc84b62d0e473878ac82a5cf5c46125cc Mon Sep 17 00:00:00 2001 From: Ken'ichi Ohmichi <ken-oomichi@wx.jp.nec.com> Date: Thu, 4 May 2017 18:44:28 -0700 Subject: [PATCH] Separate admin tests from test_routers 8 tests require admin credential on test_routers. So this patch separates these tests from current test_routers and moves them into admin path. Change-Id: I86d382390d7e968a35e2454f36c6cc6052b176a6 --- tempest/api/network/admin/test_routers.py | 231 ++++++++++++++++++++++ tempest/api/network/test_routers.py | 136 +------------ 2 files changed, 232 insertions(+), 135 deletions(-) create mode 100644 tempest/api/network/admin/test_routers.py diff --git a/tempest/api/network/admin/test_routers.py b/tempest/api/network/admin/test_routers.py new file mode 100644 index 0000000000..ec8d260d37 --- /dev/null +++ b/tempest/api/network/admin/test_routers.py @@ -0,0 +1,231 @@ +# Copyright 2013 OpenStack Foundation +# 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. + +import testtools + +from tempest.api.network import base +from tempest import config +from tempest.lib.common.utils import data_utils +from tempest.lib import decorators +from tempest import test + +CONF = config.CONF + + +class RoutersAdminTest(base.BaseAdminNetworkTest): + # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest + # as some router operations, such as enabling or disabling SNAT + # require admin credentials by default + + def _cleanup_router(self, router): + self.delete_router(router) + self.routers.remove(router) + + def _create_router(self, name=None, admin_state_up=False, + external_network_id=None, enable_snat=None): + # associate a cleanup with created routers to avoid quota limits + router = self.create_router(name, admin_state_up, + external_network_id, enable_snat) + self.addCleanup(self._cleanup_router, router) + return router + + def _add_router_interface_with_subnet_id(self, router_id, subnet_id): + interface = self.routers_client.add_router_interface( + router_id, subnet_id=subnet_id) + self.addCleanup(self._remove_router_interface_with_subnet_id, + router_id, subnet_id) + self.assertEqual(subnet_id, interface['subnet_id']) + return interface + + def _remove_router_interface_with_subnet_id(self, router_id, subnet_id): + body = self.routers_client.remove_router_interface(router_id, + subnet_id=subnet_id) + self.assertEqual(subnet_id, body['subnet_id']) + + @classmethod + def skip_checks(cls): + super(RoutersAdminTest, cls).skip_checks() + if not test.is_extension_enabled('router', 'network'): + msg = "router extension not enabled." + raise cls.skipException(msg) + + @classmethod + def resource_setup(cls): + super(RoutersAdminTest, cls).resource_setup() + cls.tenant_cidr = (CONF.network.project_network_cidr + if cls._ip_version == 4 else + CONF.network.project_network_v6_cidr) + + @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397') + def test_create_router_setting_project_id(self): + # Test creating router from admin user setting project_id. + project = data_utils.rand_name('test_tenant_') + description = data_utils.rand_name('desc_') + project = self.identity_utils.create_project(name=project, + description=description) + project_id = project['id'] + self.addCleanup(self.identity_utils.delete_project, project_id) + + name = data_utils.rand_name('router-') + create_body = self.admin_routers_client.create_router( + name=name, tenant_id=project_id) + self.addCleanup(self.admin_routers_client.delete_router, + create_body['router']['id']) + self.assertEqual(project_id, create_body['router']['tenant_id']) + + @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8') + @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_create_router_with_default_snat_value(self): + # Create a router with default snat rule + router = self._create_router( + external_network_id=CONF.network.public_network_id) + self._verify_router_gateway( + router['id'], {'network_id': CONF.network.public_network_id, + 'enable_snat': True}) + + @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f') + @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_create_router_with_snat_explicit(self): + name = data_utils.rand_name('snat-router') + # Create a router enabling snat attributes + enable_snat_states = [False, True] + for enable_snat in enable_snat_states: + external_gateway_info = { + 'network_id': CONF.network.public_network_id, + 'enable_snat': enable_snat} + create_body = self.admin_routers_client.create_router( + name=name, external_gateway_info=external_gateway_info) + self.addCleanup(self.admin_routers_client.delete_router, + create_body['router']['id']) + # Verify snat attributes after router creation + self._verify_router_gateway(create_body['router']['id'], + exp_ext_gw_info=external_gateway_info) + + def _verify_router_gateway(self, router_id, exp_ext_gw_info=None): + show_body = self.admin_routers_client.show_router(router_id) + actual_ext_gw_info = show_body['router']['external_gateway_info'] + if exp_ext_gw_info is None: + self.assertIsNone(actual_ext_gw_info) + return + # Verify only keys passed in exp_ext_gw_info + for k, v in exp_ext_gw_info.items(): + self.assertEqual(v, actual_ext_gw_info[k]) + + def _verify_gateway_port(self, router_id): + list_body = self.admin_ports_client.list_ports( + network_id=CONF.network.public_network_id, + device_id=router_id) + self.assertEqual(len(list_body['ports']), 1) + gw_port = list_body['ports'][0] + fixed_ips = gw_port['fixed_ips'] + self.assertGreaterEqual(len(fixed_ips), 1) + # Assert that all of the IPs from the router gateway port + # are allocated from a valid public subnet. + public_net_body = self.admin_networks_client.show_network( + CONF.network.public_network_id) + public_subnet_ids = public_net_body['network']['subnets'] + for fixed_ip in fixed_ips: + subnet_id = fixed_ip['subnet_id'] + self.assertIn(subnet_id, public_subnet_ids) + + @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_update_router_set_gateway(self): + router = self._create_router() + self.routers_client.update_router( + router['id'], + external_gateway_info={ + 'network_id': CONF.network.public_network_id}) + # Verify operation - router + self._verify_router_gateway( + router['id'], + {'network_id': CONF.network.public_network_id}) + self._verify_gateway_port(router['id']) + + @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33') + @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_update_router_set_gateway_with_snat_explicit(self): + router = self._create_router() + self.admin_routers_client.update_router( + router['id'], + external_gateway_info={ + 'network_id': CONF.network.public_network_id, + 'enable_snat': True}) + self._verify_router_gateway( + router['id'], + {'network_id': CONF.network.public_network_id, + 'enable_snat': True}) + self._verify_gateway_port(router['id']) + + @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279') + @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_update_router_set_gateway_without_snat(self): + router = self._create_router() + self.admin_routers_client.update_router( + router['id'], + external_gateway_info={ + 'network_id': CONF.network.public_network_id, + 'enable_snat': False}) + self._verify_router_gateway( + router['id'], + {'network_id': CONF.network.public_network_id, + 'enable_snat': False}) + self._verify_gateway_port(router['id']) + + @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_update_router_unset_gateway(self): + router = self._create_router( + external_network_id=CONF.network.public_network_id) + self.routers_client.update_router(router['id'], + external_gateway_info={}) + self._verify_router_gateway(router['id']) + # No gateway port expected + list_body = self.admin_ports_client.list_ports( + network_id=CONF.network.public_network_id, + device_id=router['id']) + self.assertFalse(list_body['ports']) + + @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374') + @test.requires_ext(extension='ext-gw-mode', service='network') + @testtools.skipUnless(CONF.network.public_network_id, + 'The public_network_id option must be specified.') + def test_update_router_reset_gateway_without_snat(self): + router = self._create_router( + external_network_id=CONF.network.public_network_id) + self.admin_routers_client.update_router( + router['id'], + external_gateway_info={ + 'network_id': CONF.network.public_network_id, + 'enable_snat': False}) + self._verify_router_gateway( + router['id'], + {'network_id': CONF.network.public_network_id, + 'enable_snat': False}) + self._verify_gateway_port(router['id']) + + +class RoutersIpV6AdminTest(RoutersAdminTest): + _ip_version = 6 diff --git a/tempest/api/network/test_routers.py b/tempest/api/network/test_routers.py index 0466d3a9a1..d78cd1e21f 100644 --- a/tempest/api/network/test_routers.py +++ b/tempest/api/network/test_routers.py @@ -25,10 +25,7 @@ from tempest import test CONF = config.CONF -class RoutersTest(base.BaseAdminNetworkTest): - # NOTE(salv-orlando): This class inherits from BaseAdminNetworkTest - # as some router operations, such as enabling or disabling SNAT - # require admin credentials by default +class RoutersTest(base.BaseNetworkTest): def _cleanup_router(self, router): self.delete_router(router) @@ -101,55 +98,6 @@ class RoutersTest(base.BaseAdminNetworkTest): router['id'])['router'] self.assertEqual(router_show['name'], updated_name) - @decorators.idempotent_id('e54dd3a3-4352-4921-b09d-44369ae17397') - def test_create_router_setting_project_id(self): - # Test creating router from admin user setting project_id. - project = data_utils.rand_name('test_tenant_') - description = data_utils.rand_name('desc_') - project = self.identity_utils.create_project(name=project, - description=description) - project_id = project['id'] - self.addCleanup(self.identity_utils.delete_project, project_id) - - name = data_utils.rand_name('router-') - create_body = self.admin_routers_client.create_router( - name=name, tenant_id=project_id) - self.addCleanup(self.admin_routers_client.delete_router, - create_body['router']['id']) - self.assertEqual(project_id, create_body['router']['tenant_id']) - - @decorators.idempotent_id('847257cc-6afd-4154-b8fb-af49f5670ce8') - @test.requires_ext(extension='ext-gw-mode', service='network') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_create_router_with_default_snat_value(self): - # Create a router with default snat rule - router = self._create_router( - external_network_id=CONF.network.public_network_id) - self._verify_router_gateway( - router['id'], {'network_id': CONF.network.public_network_id, - 'enable_snat': True}) - - @decorators.idempotent_id('ea74068d-09e9-4fd7-8995-9b6a1ace920f') - @test.requires_ext(extension='ext-gw-mode', service='network') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_create_router_with_snat_explicit(self): - name = data_utils.rand_name('snat-router') - # Create a router enabling snat attributes - enable_snat_states = [False, True] - for enable_snat in enable_snat_states: - external_gateway_info = { - 'network_id': CONF.network.public_network_id, - 'enable_snat': enable_snat} - create_body = self.admin_routers_client.create_router( - name=name, external_gateway_info=external_gateway_info) - self.addCleanup(self.admin_routers_client.delete_router, - create_body['router']['id']) - # Verify snat attributes after router creation - self._verify_router_gateway(create_body['router']['id'], - exp_ext_gw_info=external_gateway_info) - @decorators.attr(type='smoke') @decorators.idempotent_id('b42e6e39-2e37-49cc-a6f4-8467e940900a') def test_add_remove_router_interface_with_subnet_id(self): @@ -218,55 +166,6 @@ class RoutersTest(base.BaseAdminNetworkTest): subnet_id = fixed_ip['subnet_id'] self.assertIn(subnet_id, public_subnet_ids) - @decorators.idempotent_id('6cc285d8-46bf-4f36-9b1a-783e3008ba79') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_update_router_set_gateway(self): - router = self._create_router() - self.routers_client.update_router( - router['id'], - external_gateway_info={ - 'network_id': CONF.network.public_network_id}) - # Verify operation - router - self._verify_router_gateway( - router['id'], - {'network_id': CONF.network.public_network_id}) - self._verify_gateway_port(router['id']) - - @decorators.idempotent_id('b386c111-3b21-466d-880c-5e72b01e1a33') - @test.requires_ext(extension='ext-gw-mode', service='network') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_update_router_set_gateway_with_snat_explicit(self): - router = self._create_router() - self.admin_routers_client.update_router( - router['id'], - external_gateway_info={ - 'network_id': CONF.network.public_network_id, - 'enable_snat': True}) - self._verify_router_gateway( - router['id'], - {'network_id': CONF.network.public_network_id, - 'enable_snat': True}) - self._verify_gateway_port(router['id']) - - @decorators.idempotent_id('96536bc7-8262-4fb2-9967-5c46940fa279') - @test.requires_ext(extension='ext-gw-mode', service='network') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_update_router_set_gateway_without_snat(self): - router = self._create_router() - self.admin_routers_client.update_router( - router['id'], - external_gateway_info={ - 'network_id': CONF.network.public_network_id, - 'enable_snat': False}) - self._verify_router_gateway( - router['id'], - {'network_id': CONF.network.public_network_id, - 'enable_snat': False}) - self._verify_gateway_port(router['id']) - @decorators.idempotent_id('cbe42f84-04c2-11e7-8adb-fa163e4fa634') @test.requires_ext(extension='ext-gw-mode', service='network') @testtools.skipUnless(CONF.network.public_network_id, @@ -298,39 +197,6 @@ class RoutersTest(base.BaseAdminNetworkTest): 'external_fixed_ips'][0]['ip_address'], fixed_ip['ip_address']) - @decorators.idempotent_id('ad81b7ee-4f81-407b-a19c-17e623f763e8') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_update_router_unset_gateway(self): - router = self._create_router( - external_network_id=CONF.network.public_network_id) - self.routers_client.update_router(router['id'], - external_gateway_info={}) - self._verify_router_gateway(router['id']) - # No gateway port expected - list_body = self.admin_ports_client.list_ports( - network_id=CONF.network.public_network_id, - device_id=router['id']) - self.assertFalse(list_body['ports']) - - @decorators.idempotent_id('f2faf994-97f4-410b-a831-9bc977b64374') - @test.requires_ext(extension='ext-gw-mode', service='network') - @testtools.skipUnless(CONF.network.public_network_id, - 'The public_network_id option must be specified.') - def test_update_router_reset_gateway_without_snat(self): - router = self._create_router( - external_network_id=CONF.network.public_network_id) - self.admin_routers_client.update_router( - router['id'], - external_gateway_info={ - 'network_id': CONF.network.public_network_id, - 'enable_snat': False}) - self._verify_router_gateway( - router['id'], - {'network_id': CONF.network.public_network_id, - 'enable_snat': False}) - self._verify_gateway_port(router['id']) - @decorators.idempotent_id('c86ac3a8-50bd-4b00-a6b8-62af84a0765c') @test.requires_ext(extension='extraroute', service='network') def test_update_delete_extra_route(self):