From fd3e4da19c135932926aa216867574fdb7cd037e Mon Sep 17 00:00:00 2001 From: pbharathbhu Date: Thu, 23 Apr 2020 12:31:35 +0000 Subject: [PATCH] ipv6 and octavia cases Change-Id: I26c4cfa265feaf4ac8f568fac3851d1b70c30e39 --- .../lib/feature_manager.py | 33 +-- .../scenario/test_octavia_loadbalancers.py | 189 +++++++++++++++--- 2 files changed, 183 insertions(+), 39 deletions(-) diff --git a/vmware_nsx_tempest_plugin/lib/feature_manager.py b/vmware_nsx_tempest_plugin/lib/feature_manager.py index 3f01bcb..62fb094 100644 --- a/vmware_nsx_tempest_plugin/lib/feature_manager.py +++ b/vmware_nsx_tempest_plugin/lib/feature_manager.py @@ -1643,14 +1643,20 @@ class FeatureManager(traffic_manager.IperfManager, self.members = [] for server_name in self.topology_servers.keys(): if count < member_count: - fip_data = self.servers_details[server_name].floating_ips[0] - fixed_ip_address = fip_data['fixed_ip_address'] + if fip_disassociate is True: + x = str(self.topology_servers[server_name]['addresses']. + keys()).split("'")[1] + m = self.topology_servers[server_name] + fixed_ip_address = m['addresses'][x][0]['addr'] + else: + f_d = self.servers_details[server_name] + fip_data = f_d.floating_ips[0] + fixed_ip_address = fip_data['fixed_ip_address'] if fip_disassociate is None: kwargs = dict(port_id=None) self.cmgr_adm.floating_ips_client.\ update_floatingip(fip_data['id'], **kwargs)['floatingip'] - if weight: weight += count member = self.octavia_admin_members_client.\ @@ -1673,15 +1679,18 @@ class FeatureManager(traffic_manager.IperfManager, update_port(self.loadbalancer['vip_port_id'], security_groups=[self.sg['id']]) # create floatingip for public network - self.cmgr_adm.ports_client.update_port( - self.loadbalancer['vip_port_id'], - security_groups=[ - self.sg['id']]) - vip_fip = self.create_floatingip( - self.loadbalancer, - client=self.cmgr_adm.floating_ips_client, - port_id=self.loadbalancer['vip_port_id']) - self.vip_ip_address = vip_fip['floating_ip_address'] + if fip_disassociate is True: + self.vip_ip_address = self.loadbalancer['vip_port_id'] + else: + self.cmgr_adm.ports_client.update_port( + self.loadbalancer['vip_port_id'], + security_groups=[ + self.sg['id']]) + vip_fip = self.create_floatingip( + self.loadbalancer, + client=self.cmgr_adm.floating_ips_client, + port_id=self.loadbalancer['vip_port_id']) + self.vip_ip_address = vip_fip['floating_ip_address'] return dict(lb_id=lb_id, vip_address=self.vip_ip_address, pool_id=pool_id, diff --git a/vmware_nsx_tempest_plugin/tests/nsxv3/scenario/test_octavia_loadbalancers.py b/vmware_nsx_tempest_plugin/tests/nsxv3/scenario/test_octavia_loadbalancers.py index d5722fa..485e9cc 100644 --- a/vmware_nsx_tempest_plugin/tests/nsxv3/scenario/test_octavia_loadbalancers.py +++ b/vmware_nsx_tempest_plugin/tests/nsxv3/scenario/test_octavia_loadbalancers.py @@ -16,6 +16,7 @@ from tempest import config from tempest.lib.common.utils import test_utils from tempest.lib import decorators +from tempest.lib import exceptions from tempest import test from vmware_nsx_tempest_plugin.common import constants @@ -90,13 +91,14 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): LOG.debug("tearDown lbaas exiting...") super(OctaviaRoundRobin, self).tearDown() - def deploy_octavia_topology(self, no_of_servers=2, image_id=None): + def deploy_octavia_topology(self, no_of_servers=2, + image_id=None, slaac=False): kwargs = {'name': "router_lbaas", 'external_gateway_info': {"network_id": CONF.network.public_network_id}} router_lbaas = self.cmgr_adm.routers_client.create_router(**kwargs) self.addCleanup(test_utils.call_and_ignore_notfound_exc, - self.routers_client.delete_router, + self.cmgr_adm.routers_client.delete_router, router_lbaas['router']['id']) networks_client = self.cmgr_adm.networks_client name = "network_lbaas_1" @@ -120,9 +122,25 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): secclient=sec_client, ruleclient=sec_rule_client, tenant_id=t_id) - body = {"network_id": network_lbaas_1['id'], - "allocation_pools": [{"start": "2.0.0.2", "end": "2.0.0.254"}], - "ip_version": 4, "cidr": "2.0.0.0/24"} + if slaac: + address_cidr = CONF.network.project_network_v6_cidr + address_prefixlen = CONF.network.project_network_v6_mask_bits + if ((address_prefixlen >= 126)): + msg = ("Subnet %s isn't large" % address_cidr) + raise exceptions.InvalidConfiguration(msg) + body = {'ip_version': 6, 'ipv6_ra_mode': 'slaac', + 'ipv6_address_mode': 'slaac', 'cidr': '2001:db8::/64', + "network_id": network_lbaas_1['id'], + 'allocation_pools': [{ + 'start': str(address_cidr).split('/')[0] + '2', + 'end': str(address_cidr).split('/')[0] + '70'}]} + create_floating_ip = False + else: + body = {"network_id": network_lbaas_1['id'], + "allocation_pools": + [{"start": "2.0.0.2", "end": "2.0.0.254"}], + "ip_version": 4, "cidr": "2.0.0.0/24"} + create_floating_ip = True subnet_client = self.cmgr_adm.subnets_client subnet_lbaas = subnet_client.create_subnet(**body) self.addCleanup(test_utils.call_and_ignore_notfound_exc, @@ -139,7 +157,8 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): self.create_topology_instance( "server_lbaas_%s" % instance, [network_lbaas_1], security_groups=[{'name': self.sg['name']}], - image_id=image_id, clients=self.cmgr_adm) + image_id=image_id, clients=self.cmgr_adm, + create_floating_ip=create_floating_ip) return dict(router=router_lbaas, subnet=subnet_lbaas, network=network_lbaas_1) @@ -330,12 +349,14 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): if not CONF.nsxv3.ens: self.start_web_servers(constants.HTTP_PORT) subnet_id = diction['subnet']['subnet']['id'] - self.create_project_octavia(protocol_type="HTTP", - protocol_port="80", - lb_algorithm="ROUND_ROBIN", - vip_subnet_id=subnet_id, - l7policy=True, - action='REDIRECT_TO_URL') + self.assertRaises(exceptions.BadRequest, + self.create_project_octavia, + protocol_type="HTTP", + protocol_port="80", + lb_algorithm="ROUND_ROBIN", + vip_subnet_id=subnet_id, + l7policy=True, + action='REDIRECT_TO_URL') @decorators.attr(type='nsxv3') @decorators.idempotent_id('ca5c4368-6768-4b7a-8704-3844b11b1b34') @@ -453,13 +474,15 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): if not CONF.nsxv3.ens: self.start_web_servers(constants.HTTP_PORT) subnet_id = diction['subnet']['subnet']['id'] - self.create_project_octavia(protocol_type="HTTP", - protocol_port="80", - lb_algorithm="ROUND_ROBIN", - vip_subnet_id=subnet_id, - l7policy=True, action='REJECT', - compare_type='STARTS_WITH', type='PATH', - value='', l7rule=True) + self.assertRaises(exceptions.BadRequest, + self.create_project_octavia, + protocol_type="HTTP", + protocol_port="80", + lb_algorithm="ROUND_ROBIN", + vip_subnet_id=subnet_id, + l7policy=True, action='REJECT', + compare_type='STARTS_WITH', type='PATH', + value='', l7rule=True) @decorators.attr(type='nsxv3') @decorators.idempotent_id('ca5c5468-6768-4a7a-8704-3844b11b1a34') @@ -478,7 +501,7 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): vip_subnet_id=subnet_id, l7policy=True, action='REJECT', invert=True) - self.check_project_lbaas() + self.assertIn("KeyError", self.check_project_lbaas()) @decorators.attr(type='nsxv3') @decorators.idempotent_id('74f022d6-a6ef-4458-96a7-541deadacf99') @@ -515,7 +538,7 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): constants.CERT_FILE, constants.KEY_FILE) barbican_container = barbican_secrets['secret_container'] self.create_project_octavia(protocol_type="TERMINATED_HTTPS", - protocol_port="443", + protocol_port="80", lb_algorithm="ROUND_ROBIN", vip_subnet_id=subnet_id, barbican_container=barbican_container, @@ -550,7 +573,7 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): diction = self.deploy_octavia_topology() self.start_web_servers(constants.HTTP_PORT) net_id = diction['network']['id'] - self.create_project_octavia(protocol_type="HTTPS", protocol_port="443", + self.create_project_octavia(protocol_type="HTTPS", protocol_port="80", lb_algorithm="LEAST_CONNECTIONS", vip_net_id=net_id, hm_type='PING', timeout=self.hm_timeout, @@ -715,13 +738,13 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): """ diction = self.deploy_octavia_topology() - self.start_web_servers(constants.HTTPS_PORT) + self.start_web_servers(constants.HTTP_PORT) net_id = diction['network']['id'] port_id = self.cmgr_adm.ports_client.create_port( network_id=net_id)['port']['id'] self.addCleanup(test_utils.call_and_ignore_notfound_exc, self.cmgr_adm.ports_client.delete_port, port_id) - self.create_project_octavia(protocol_type="HTTPS", protocol_port="443", + self.create_project_octavia(protocol_type="HTTPS", protocol_port="80", lb_algorithm="SOURCE_IP", vip_port_id=port_id, hm_type='PING', timeout=self.hm_timeout, @@ -739,13 +762,13 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): """ diction = self.deploy_octavia_topology() - self.start_web_servers(constants.HTTPS_PORT) + self.start_web_servers(constants.HTTP_PORT) net_id = diction['network']['id'] port_id = self.cmgr_adm.ports_client.create_port( network_id=net_id)['port']['id'] self.addCleanup(test_utils.call_and_ignore_notfound_exc, self.cmgr_adm.ports_client.delete_port, port_id) - self.create_project_octavia(protocol_type="HTTPS", protocol_port="443", + self.create_project_octavia(protocol_type="HTTPS", protocol_port="80", lb_algorithm="ROUND_ROBIN", vip_port_id=port_id, hm_type='PING', timeout=self.hm_timeout, @@ -769,7 +792,7 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): network_id=net_id)['port']['id'] self.addCleanup(test_utils.call_and_ignore_notfound_exc, self.cmgr_adm.ports_client.delete_port, port_id) - self.create_project_octavia(protocol_type="HTTPS", protocol_port="443", + self.create_project_octavia(protocol_type="HTTPS", protocol_port="80", lb_algorithm="LEAST_CONNECTIONS", vip_port_id=port_id, hm_type='PING', timeout=self.hm_timeout, @@ -894,3 +917,115 @@ class OctaviaRoundRobin(feature_manager.FeatureManager): delay=self.hm_delay, default_pool=True, qos_policy_id=policy['policy']['id']) self.check_project_lbaas() + + @decorators.attr(type='nsxv3') + @decorators.idempotent_id('c5ac8546-5677-4b7a-8704-3843a12b1a98') + def test_verify_octavia_https_lb_port_id_source_ipv6_default_pool(self): + """ + This testcase is for verifying the loadbalancer with port-id and + the pool is created using lb option and attached to a listener + with default-pool option, source_ip algorithm, https protocol. + + """ + diction = self.deploy_octavia_topology(slaac=True) + net_id = diction['network']['id'] + port_id = self.cmgr_adm.ports_client.create_port( + network_id=net_id)['port']['id'] + self.addCleanup(test_utils.call_and_ignore_notfound_exc, + self.cmgr_adm.ports_client.delete_port, port_id) + self.create_project_octavia(protocol_type="HTTPS", protocol_port="80", + lb_algorithm="SOURCE_IP", + vip_port_id=port_id, hm_type='PING', + timeout=self.hm_timeout, + max_retries=self.hm_max_retries, + delay=self.hm_delay, default_pool=True, + fip_disassociate=True) + + @decorators.attr(type='nsxv3') + @decorators.idempotent_id('c5ac8546-6867-4b7a-8704-3844b11b1b43') + def test_ipv6__verify_octavia_lb_vip_net_id_ROUND_ROBIN_default_pool(self): + """ + This testcase is for verifying the loadbalancer with net-id and + the pool is created using lb option and attached to a listener + with default-pool option + """ + diction = self.deploy_octavia_topology() + self.start_web_servers(constants.HTTP_PORT) + net_id = diction['network']['id'] + self.create_project_octavia(protocol_type="HTTP", protocol_port="80", + lb_algorithm="ROUND_ROBIN", + vip_net_id=net_id, hm_type='PING', + timeout=self.hm_timeout, + max_retries=self.hm_max_retries, + delay=self.hm_delay, default_pool=True, + fip_disassociate=True) + + @decorators.attr(type='nsxv3') + @decorators.idempotent_id('c5ac8546-6867-4b7a-8544-3843a11b1a24') + def test_ipv6_verify_octavia_https_lb_port_id_source_ip_default_pool_qos( + self): + """ + This testcase is for verifying the loadbalancer with port-id and + the pool is created using lb option and attached to a listener + with default-pool option,SOURCE_IP https traffic + + """ + diction = self.deploy_octavia_topology() + self.start_web_servers(constants.HTTP_PORT) + net_id = diction['network']['id'] + policy = self.cmgr_adm.qos_client.create_qos_policy( + name='test-policy', description='test policy desc1', + shared=False) + self.addCleanup(test_utils.call_and_ignore_notfound_exc, + self.cmgr_adm.qos_client.delete_qos_policy, + policy['policy']['id']) + port_id = self.cmgr_adm.ports_client.create_port( + network_id=net_id)['port']['id'] + self.addCleanup(test_utils.call_and_ignore_notfound_exc, + self.cmgr_adm.ports_client.delete_port, port_id) + self.create_project_octavia(protocol_type="HTTP", protocol_port="80", + lb_algorithm="SOURCE_IP", + vip_port_id=port_id, hm_type='PING', + timeout=self.hm_timeout, + max_retries=self.hm_max_retries, + delay=self.hm_delay, default_pool=True, + qos_policy_id=policy['policy']['id'], + fip_disassociate=True) + + @decorators.attr(type='nsxv3') + @decorators.idempotent_id('ca5c5468-6768-4b7a-8704-3844b11b1a34') + def test_ipv6_create_REJECT_l7policies_listeneres(self): + """ + The Loadbalancer listener is created with allowed_cidrs specified + """ + diction = self.deploy_octavia_topology() + if not CONF.nsxv3.ens: + self.start_web_servers(constants.HTTP_PORT) + subnet_id = diction['subnet']['subnet']['id'] + self.create_project_octavia(protocol_type="HTTP", + protocol_port="80", + lb_algorithm="ROUND_ROBIN", + vip_subnet_id=subnet_id, + l7policy=True, action='REJECT', + fip_disassociate=True) + + @decorators.attr(type='nsxv3') + @decorators.idempotent_id('ca5c4368-6768-4b7a-8704-3844b11b1a34') + def test_ipv6_create_REDIRECT_TO_URL_l7policies_listeneres(self): + """ + The Loadbalancer listener is created with redirect_url l7policy + with no url specified. + """ + diction = self.deploy_octavia_topology() + if not CONF.nsxv3.ens: + self.start_web_servers(constants.HTTP_PORT) + subnet_id = diction['subnet']['subnet']['id'] + self.assertRaises(exceptions.BadRequest, + self.create_project_octavia, + protocol_type="HTTP", + protocol_port="80", + lb_algorithm="ROUND_ROBIN", + vip_subnet_id=subnet_id, + l7policy=True, + action='REDIRECT_TO_URL', + fip_disassociate=True)