diff options
Diffstat (limited to 'sfc/tests/functest/sfc_parent_function.py')
-rw-r--r-- | sfc/tests/functest/sfc_parent_function.py | 297 |
1 files changed, 206 insertions, 91 deletions
diff --git a/sfc/tests/functest/sfc_parent_function.py b/sfc/tests/functest/sfc_parent_function.py index 10c76968..410c0e71 100644 --- a/sfc/tests/functest/sfc_parent_function.py +++ b/sfc/tests/functest/sfc_parent_function.py @@ -47,18 +47,16 @@ class SfcCommonTestCase(object): self.server_creator = None self.client_instance = None self.client_creator = None - self.server_ip = None self.vnf_id = None self.client_floating_ip = None self.server_floating_ip = None self.fips_sfs = [] - self.neutron_port = None self.vnf_objects = dict() self.testcase_config = testcase_config self.vnfs = vnfs - - # n-sfc variables - self.port_groups = [] + self.port_server = None + self.server_ip = None + self.port_client = None self.prepare_env(testcase_config, supported_installers, vnfs) @@ -72,37 +70,66 @@ class SfcCommonTestCase(object): :return: Environment preparation """ - deployment_handler = DeploymentFactory.get_handler( - COMMON_CONFIG.installer_type, - COMMON_CONFIG.installer_ip, - COMMON_CONFIG.installer_user, - COMMON_CONFIG.installer_password, - COMMON_CONFIG.installer_key_file) + if COMMON_CONFIG.installer_type != 'configByUser': + deployment_handler = DeploymentFactory.get_handler( + COMMON_CONFIG.installer_type, + COMMON_CONFIG.installer_ip, + COMMON_CONFIG.installer_user, + COMMON_CONFIG.installer_password, + COMMON_CONFIG.installer_key_file) + + installer_type = os.environ.get("INSTALLER_TYPE") + installer_ip = os.environ.get("INSTALLER_IP") + cluster = COMMON_CONFIG.installer_cluster + openstack_nodes = (deployment_handler. + get_nodes({'cluster': cluster}) + if cluster is not None + else deployment_handler.get_nodes()) + + self.compute_nodes = [node for node in openstack_nodes + if node.is_compute()] + + for compute in self.compute_nodes: + logger.info("This is a compute: %s" % compute.ip) + + controller_nodes = [node for node in openstack_nodes + if node.is_controller()] + self.controller_clients = test_utils. \ + get_ssh_clients(controller_nodes) + self.compute_clients = test_utils. \ + get_ssh_clients(self.compute_nodes) + + self.odl_ip, self.odl_port = odl_utils. \ + get_odl_ip_port(openstack_nodes) + + else: + installer_type = 'configByUser' + installer_ip = COMMON_CONFIG.installer_ip + openstack_nodes = COMMON_CONFIG.nodes_pod + self.compute_nodes = [node for node in + COMMON_CONFIG.nodes_pod + if node['role'] == 'Compute'] + + for compute in self.compute_nodes: + logger.info("This is a compute: %s" % compute['ip']) - installer_type = os.environ.get("INSTALLER_TYPE") + controller_nodes = [node for node in openstack_nodes + if node['role'] == 'Controller'] + + self.odl_ip, self.odl_port = odl_utils. \ + get_odl_ip_port_no_installer(openstack_nodes) if installer_type not in supported_installers: - raise Exception( - '\033[91mYour installer is not supported yet\033[0m') + if installer_type != 'configByUser': + raise Exception( + '\033[91mYour installer is not supported yet\033[0m') - installer_ip = os.environ.get("INSTALLER_IP") if not installer_ip: logger.error( '\033[91minstaller ip is not set\033[0m') raise Exception( '\033[91mexport INSTALLER_IP=<ip>\033[0m') - cluster = COMMON_CONFIG.installer_cluster - openstack_nodes = (deployment_handler.get_nodes({'cluster': cluster}) - if cluster is not None - else deployment_handler.get_nodes()) - - self.compute_nodes = [node for node in openstack_nodes - if node.is_compute()] - - for compute in self.compute_nodes: - logger.info("This is a compute: %s" % compute.ip) - results.add_to_summary(0, "=") results.add_to_summary(2, "STATUS", "SUBTEST") results.add_to_summary(0, "=") @@ -115,12 +142,6 @@ class SfcCommonTestCase(object): if not custom_flv: raise Exception("Failed to create custom flavor") - controller_nodes = [node for node in openstack_nodes - if node.is_controller()] - - self.controller_clients = test_utils.get_ssh_clients(controller_nodes) - self.compute_clients = test_utils.get_ssh_clients(self.compute_nodes) - if COMMON_CONFIG.mano_component == 'tacker': self.tacker_client = os_sfc_utils.get_tacker_client() os_sfc_utils.register_vim(self.tacker_client, @@ -155,7 +176,7 @@ class SfcCommonTestCase(object): self.creators = openstack_sfc.creators - self.odl_ip, self.odl_port = odl_utils.get_odl_ip_port(openstack_nodes) + odl_utils.get_odl_username_password() self.default_param_file = os.path.join( COMMON_CONFIG.sfc_test_dir, @@ -171,27 +192,39 @@ class SfcCommonTestCase(object): logger.info('Topology description: {0}' .format(self.test_topology['description'])) - self.server_instance, self.server_creator = \ + self.server_instance, port_server = \ openstack_sfc.create_instance(SERVER, COMMON_CONFIG.flavor, self.image_creator, self.network, self.sg, self.test_topology['server'], [SERVER + '-port']) - self.client_instance, self.client_creator = \ + self.client_instance, port_client = \ openstack_sfc.create_instance(CLIENT, COMMON_CONFIG.flavor, self.image_creator, self.network, self.sg, self.test_topology['client'], [CLIENT + '-port']) + logger.info('This test is run with the topology {0}'.format( self.test_topology['id'])) logger.info('Topology description: {0}'.format( self.test_topology['description'])) - self.server_ip = self.server_instance.ports[0].ips[0]['ip_address'] - logger.info("Server instance received private ip [{}]".format( - self.server_ip)) + if COMMON_CONFIG.installer_type != 'configByUser': + self.port_server = port_server[0] + self.port_client = port_client[0] + port_fixed_ips = self.port_server + for ip in port_fixed_ips: + self.server_ip = ip.get('ip_address') + logger.info("Server instance received private ip [{}]".format( + self.server_ip)) + else: + self.port_server = port_server + self.port_client = port_client + self.server_ip = self.server_instance.ports[0].ips[0]['ip_address'] + logger.info("Server instance received private ip [{}]".format( + self.server_ip)) def register_vnf_template(self, test_case_name, template_name): """ Register the template which defines the VNF @@ -254,7 +287,7 @@ class SfcCommonTestCase(object): ports = [vnf_name + '-port1', vnf_name + '-port2'] else: ports = [vnf_name + '-port'] - vnf_instance, vnf_creator = \ + vnf_instance, vnf_port = \ openstack_sfc.create_instance(vnf_name, COMMON_CONFIG.flavor, self.vnf_image_creator, self.network, @@ -263,25 +296,22 @@ class SfcCommonTestCase(object): ports, port_security=False) - if not openstack_sfc.wait_for_vnf(vnf_creator): - raise Exception('ERROR while booting vnf %s' % vnf_name) - - self.creators.append(vnf_creator) - self.vnf_objects[vnf_name] = [vnf_creator, vnf_instance] + self.vnf_objects[vnf_name] = [vnf_instance, vnf_port] + logger.info("Creating VNF with name...%s", vnf_name) + logger.info("Port associated with VNF...%s", + self.vnf_objects[vnf_name][1]) def assign_floating_ip_client_server(self): """Assign floating IPs on the router about server and the client instances - :return: Floating IPs for client and server """ - logger.info("Assigning floating IPs to client and server instances") self.client_floating_ip = openstack_sfc.assign_floating_ip( - self.router, self.client_instance, self.client_creator) + self.client_instance, self.port_client) self.server_floating_ip = openstack_sfc.assign_floating_ip( - self.router, self.server_instance, self.server_creator) + self.server_instance, self.port_server) def assign_floating_ip_sfs(self): """Assign floating IPs to service function @@ -299,11 +329,11 @@ class SfcCommonTestCase(object): vnf_ip) elif COMMON_CONFIG.mano_component == 'no-mano': for vnf in self.vnfs: - # creator object is in [0] and instance in [1] - vnf_instance = self.vnf_objects[vnf][1] - vnf_creator = self.vnf_objects[vnf][0] - sf_floating_ip = openstack_sfc.assign_floating_ip( - self.router, vnf_instance, vnf_creator) + # instance object is in [0] and port in [1] + vnf_instance = self.vnf_objects[vnf][0] + vnf_port = self.vnf_objects[vnf][1] + sf_floating_ip = openstack_sfc.\ + assign_floating_ip(vnf_instance, vnf_port[0]) self.fips_sfs.append(sf_floating_ip) def check_floating_ips(self): @@ -404,16 +434,45 @@ class SfcCommonTestCase(object): # TODO: If we had a testcase where only one chains must be removed # we would need to add the logic. Now it removes all of them openstack_sfc.delete_chain() + openstack_sfc.delete_port_groups() + + def create_classifier(self, fc_name, port=85, + protocol='tcp', symmetric=False): + """Create the classifier component following the instructions from + relevant templates. + + :param fc_name: The name of the classifier + :param port: Input port number + :param protocol: Input protocol + :param symmetric: Check symmetric + :return: Create the classifier component + """ + + logger.info("Creating the classifier...") + + self.neutron_port = self.port_client + if COMMON_CONFIG.mano_component == 'no-mano': + openstack_sfc.create_classifier(self.neutron_port.id, + port, + protocol, + fc_name, + symmetric) + + elif COMMON_CONFIG.mano_component == 'tacker': + logger.info("Creating classifier with tacker is not supported") def create_vnffg(self, testcase_config_name, vnffgd_name, vnffg_name, - port=80, protocol='tcp', symmetric=False, - only_chain=False): + port=80, protocol='tcp', symmetric=False, vnf_index=-1): """Create the vnffg components following the instructions from relevant templates. :param testcase_config_name: The config input of the test case :param vnffgd_name: The name of the vnffgd template :param vnffg_name: The name for the vnffg + :param port: Input port number + :param protocol: Input protocol + :param symmetric: Check symmetric + :param vnf_index: Index to specify vnf :return: Create the vnffg component """ @@ -428,14 +487,9 @@ class SfcCommonTestCase(object): tosca_file=tosca_file, vnffgd_name=vnffgd_name) - self.neutron_port = \ - openstack_sfc.get_instance_port(self.client_instance, - self.client_creator) + self.neutron_port = self.port_client if symmetric: - server_port = openstack_sfc.get_instance_port( - self.server_instance, - self.server_creator) server_ip_prefix = self.server_ip + '/32' os_sfc_utils.create_vnffg_with_param_file( @@ -444,7 +498,7 @@ class SfcCommonTestCase(object): vnffg_name, self.default_param_file, self.neutron_port.id, - server_port=server_port.id, + server_port=self.port_server.id, server_ip=server_ip_prefix) else: @@ -456,60 +510,121 @@ class SfcCommonTestCase(object): self.neutron_port.id) elif COMMON_CONFIG.mano_component == 'no-mano': - if not only_chain: + logger.info("Creating the vnffg without any mano component...") + port_groups = [] + if vnf_index == -1: for vnf in self.vnfs: - # creator object is in [0] and instance in [1] - vnf_instance = self.vnf_objects[vnf][1] - vnf_creator = self.vnf_objects[vnf][0] + # vnf_instance is in [0] and vnf_port in [1] + vnf_instance = self.vnf_objects[vnf][0] + vnf_port = self.vnf_objects[vnf][1] if symmetric: # VNFs have two ports - p1 = vnf_instance.name + '-port1' - neutron_port1 = \ - openstack_sfc.get_instance_port(vnf_instance, - vnf_creator, - port_name=p1) - p2 = vnf_instance.name + '-port2' - neutron_port2 = \ - openstack_sfc.get_instance_port(vnf_instance, - vnf_creator, - port_name=p2) + neutron_port1 = vnf_port[0] + neutron_port2 = vnf_port[1] neutron_ports = [neutron_port1, neutron_port2] - else: - neutron_port1 = \ - openstack_sfc.get_instance_port(vnf_instance, - vnf_creator) + neutron_port1 = vnf_port[0] neutron_ports = [neutron_port1] port_group = \ openstack_sfc.create_port_groups(neutron_ports, vnf_instance) + port_groups.append(port_group) - self.port_groups.append(port_group) - self.neutron_port = \ - openstack_sfc.get_instance_port(self.client_instance, - self.client_creator) + else: + vnf = self.vnfs[vnf_index] + vnf_instance = self.vnf_objects[vnf][0] + vnf_port = self.vnf_objects[vnf][1] + if symmetric: + # VNFs have two ports + neutron_port1 = vnf_port[0] + neutron_port2 = vnf_port[1] + neutron_ports = [neutron_port1, neutron_port2] + else: + neutron_port1 = vnf_port[0] + neutron_ports = [neutron_port1] + + port_group = openstack_sfc.create_port_groups( + neutron_ports, vnf_instance) + port_groups.append(port_group) + + self.neutron_port = self.port_client if symmetric: # We must pass the server_port and server_ip in the symmetric # case. Otherwise ODL does not work well - server_port = openstack_sfc.get_instance_port( - self.server_instance, - self.server_creator) server_ip_prefix = self.server_ip + '/32' - openstack_sfc.create_chain(self.port_groups, + openstack_sfc.create_chain(port_groups, self.neutron_port.id, port, protocol, vnffg_name, symmetric, - server_port=server_port.id, + server_port=self.port_server.id, server_ip=server_ip_prefix) else: - openstack_sfc.create_chain(self.port_groups, + openstack_sfc.create_chain(port_groups, self.neutron_port.id, port, protocol, vnffg_name, symmetric) + def update_vnffg(self, testcase_config_name, vnffgd_name, vnffg_name, + port=80, protocol='tcp', symmetric=False, + vnf_index=0, fc_name='red'): + """Update the vnffg components following the instructions from + relevant templates. + + :param testcase_config_name: The config input of the test case + :param vnffgd_name: The name of the vnffgd template + :param vnffg_name: The name for the vnffg + :param port: To input port number + :param protocol: To input protocol + :param symmetric: To check symmetric + :param vnf_index: Index to identify vnf + :param fc_name: The name of the flow classifier + :return: Update the vnffg component + """ + + logger.info("Update the vnffg...") + + if COMMON_CONFIG.mano_component == 'no-mano': + port_groups = [] + for vnf in self.vnfs: + # vnf_instance is in [0] and vnf_port in [1] + vnf_instance = self.vnf_objects[vnf][0] + vnf_port = self.vnf_objects[vnf][1] + if symmetric: + # VNFs have two ports + neutron_port1 = vnf_port[0] + neutron_port2 = vnf_port[1] + neutron_ports = [neutron_port1, neutron_port2] + else: + neutron_port1 = vnf_port[0] + neutron_ports = [neutron_port1] + + port_group = \ + openstack_sfc.create_port_groups(neutron_ports, + vnf_instance) + port_groups.append(port_group) + + openstack_sfc.update_chain(vnffg_name, fc_name, symmetric) + + elif COMMON_CONFIG.mano_component == 'tacker': + logger.info("update for tacker is not supported") + + def swap_classifiers(self, vnffg_1_name, vnffg_2_name, symmetric=False): + """Interchange classifiers between port chains + + :param vnffg_1_name: Reference to port_chain_1 + :param vnffg_2_name: Reference to port_chain_2 + :param symmetric: To check symmetric + :return: Interchange the classifiers + """ + + if COMMON_CONFIG.mano_component == 'no-mano': + openstack_sfc.swap_classifiers(vnffg_1_name, + vnffg_2_name, + symmetric=False) + def present_results_http(self): """Check whether the connection between server and client using HTTP protocol is blocked or not. @@ -589,7 +704,7 @@ class SfcCommonTestCase(object): check_vnffg_deletion(self.odl_ip, self.odl_port, self.ovs_logger, [self.neutron_port], - self.client_instance.compute_host, + self.client_instance.hypervisor_hostname, self.compute_nodes): logger.debug("The chains were not correctly removed") raise Exception("Chains not correctly removed, test failed") |