From 586361584d545dd76d055874284fdf70c730a476 Mon Sep 17 00:00:00 2001 From: Deepthi Kandavara Jayarama Date: Wed, 10 Apr 2019 19:04:11 +0000 Subject: [PATCH] [IPv6] Adding IPv6 external networks api tests Change-Id: Id294bc02008b06335626eb3ff6be17a1c2c0667e --- .../lib/appliance_manager.py | 18 ++- .../api/test_nsx_ipv6_external_network.py | 116 ++++++++++++++++++ 2 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 vmware_nsx_tempest_plugin/tests/nsxv3/api/test_nsx_ipv6_external_network.py diff --git a/vmware_nsx_tempest_plugin/lib/appliance_manager.py b/vmware_nsx_tempest_plugin/lib/appliance_manager.py index 1053b8d..6d37847 100644 --- a/vmware_nsx_tempest_plugin/lib/appliance_manager.py +++ b/vmware_nsx_tempest_plugin/lib/appliance_manager.py @@ -96,7 +96,8 @@ class ApplianceManager(manager.NetworkScenarioTest): return self.topology_keypairs[server['key_name']]['private_key'] def create_topology_router(self, router_name, routers_client=None, - tenant_id=None, set_gateway=True, **kwargs): + tenant_id=None, set_gateway=True, + ext_netid=None, **kwargs): if not routers_client: routers_client = self.routers_client if not tenant_id: @@ -113,13 +114,17 @@ class ApplianceManager(manager.NetworkScenarioTest): router = routers_client.create_router( name=name, admin_state_up=True, tenant_id=tenant_id)['router'] if set_gateway is not False: + if not ext_netid: + external_network_id = self.topology_public_network_id + else: + external_network_id = ext_netid if kwargs.get("enable_snat") is not None: public_network_info = {"external_gateway_info": dict( - network_id=self.topology_public_network_id, + network_id=external_network_id, enable_snat=kwargs["enable_snat"])} else: public_network_info = {"external_gateway_info": dict( - network_id=self.topology_public_network_id)} + network_id=external_network_id)} routers_client.update_router(router['id'], **public_network_info) self.topology_routers[router_name] = router if CONF.nsxv3.ens: @@ -168,6 +173,13 @@ class ApplianceManager(manager.NetworkScenarioTest): routers_client = self.routers_client routers_client.delete_router(router_id) + def show_topology_router( + self, router_id, routers_client=None): + if not routers_client: + routers_client = self.routers_client + result = routers_client.show_router(router_id) + return result + def create_topology_network( self, network_name, networks_client=None, tenant_id=None, net_name_enhance=True, **kwargs): diff --git a/vmware_nsx_tempest_plugin/tests/nsxv3/api/test_nsx_ipv6_external_network.py b/vmware_nsx_tempest_plugin/tests/nsxv3/api/test_nsx_ipv6_external_network.py new file mode 100644 index 0000000..ede1467 --- /dev/null +++ b/vmware_nsx_tempest_plugin/tests/nsxv3/api/test_nsx_ipv6_external_network.py @@ -0,0 +1,116 @@ +# 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 import config +from tempest.lib import decorators +from tempest.lib import exceptions as lib_exc + +from vmware_nsx_tempest_plugin.lib import feature_manager +CONF = config.CONF + + +class IPv6ExternalNetworksTest(feature_manager.FeatureManager): + """Test the operations on IPv6 External Network + """ + + @classmethod + def skip_checks(cls): + super(IPv6ExternalNetworksTest, cls).skip_checks() + if not (CONF.network_feature_enabled.ipv6 and + CONF.network_feature_enabled.ipv6_subnet_attributes): + raise cls.skipException('IPv6 or its attributes not supported') + if not (CONF.network.project_networks_reachable or + CONF.network.public_network_id): + msg = ('Either project_networks_reachable must be "true", or ' + 'public_network_id must be defined.') + raise cls.skipException(msg) + + @classmethod + def setup_clients(cls): + super(IPv6ExternalNetworksTest, cls).setup_clients() + cls.cmgr_adm = cls.get_client_manager('admin') + + @classmethod + def resource_setup(cls): + super(IPv6ExternalNetworksTest, cls).resource_setup() + + @decorators.attr(type=['nsxv3', 'positive']) + @decorators.idempotent_id('b3881f7a-4d7a-464d-9ecd-dc829e346e95') + def test_create_ipv6_external_gateway_no_snat(self): + """ + Test create IPv6 external network + Verify the router can be configured with IPv6 gateway with no-SNAT + """ + name = "ipv6-ext-network" + networks_client = self.cmgr_adm.networks_client + ext_network = self.create_topology_network(name, + networks_client=networks_client, + **{'router:external': True}) + self.assertIsNotNone(ext_network['id']) + self.assertTrue(ext_network['router:external']) + subnet_client = self.cmgr_adm.subnets_client + subnet_name = ext_network['name'] + 'sub' + allocation_pools = {'allocation_pools': [{ + 'start': '2000:20:20::2', + 'end': '2000:20:20::200'}]} + self.create_topology_subnet(subnet_name, ext_network, + subnets_client=subnet_client, + ip_version=6, enable_dhcp=False, + cidr="2000:20:20::/64", + **allocation_pools) + #Create a router and set gateway to an IPv6 external network + router = self.create_topology_router( + "ipv6-rtr", routers_client=self.cmgr_adm.routers_client, + set_gateway=True, enable_snat=False, + ext_netid=ext_network['id']) + show_body = self.show_topology_router(router['id'], + routers_client=self.cmgr_adm.routers_client) + self.assertEqual(show_body['router']['id'], router['id']) + self.assertEqual( + show_body['router']['external_gateway_info']['enable_snat'], + False) + self.assertEqual( + show_body['router']['external_gateway_info']['network_id'], + ext_network['id']) + + @decorators.attr(type=['nsxv3', 'negative']) + @decorators.idempotent_id('46aa564f-5d97-4540-aed5-660468b5f4a6') + def test_create_ipv6_external_gateway_snat(self): + """ + Test create IPv6 external network + Verify the router can not be configured with IPv6 gateway with SNAT + """ + name = "ipv6-ext-network" + networks_client = self.cmgr_adm.networks_client + ext_network = self.create_topology_network(name, + networks_client=networks_client, + **{'router:external': True}) + self.assertIsNotNone(ext_network['id']) + self.assertTrue(ext_network['router:external']) + subnet_client = self.cmgr_adm.subnets_client + subnet_name = ext_network['name'] + 'sub' + allocation_pools = {'allocation_pools': [{ + 'start': '2000:20:20::2', + 'end': '2000:20:20::200'}]} + self.create_topology_subnet(subnet_name, ext_network, + subnets_client=subnet_client, + ip_version=6, enable_dhcp=False, + cidr="2000:20:20::/64", + **allocation_pools) + #Create a router and set gateway to an IPv6 external network + self.assertRaises(lib_exc.BadRequest, + self.create_topology_router, + router_name="ipv6-rtr", + routers_client=self.cmgr_adm.routers_client, + set_gateway=True, enable_snat=True, + ext_netid=ext_network['id'])