diff options
Diffstat (limited to 'functest/opnfv_tests/vnf/ims')
-rw-r--r-- | functest/opnfv_tests/vnf/ims/clearwater_ims_base.py | 8 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/cloudify_ims.py | 33 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py | 4 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py | 201 | ||||
-rw-r--r-- | functest/opnfv_tests/vnf/ims/orchestra_openims.py | 190 |
5 files changed, 127 insertions, 309 deletions
diff --git a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py index f3f2e1d7c..7e1d5bb2d 100644 --- a/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py +++ b/functest/opnfv_tests/vnf/ims/clearwater_ims_base.py @@ -18,7 +18,7 @@ import pkg_resources import requests import functest.core.vnf as vnf -from functest.utils.constants import CONST +from functest.utils import config import functest.utils.functest_utils as ft_utils __author__ = ("Valentin Boucher <valentin.boucher@orange.com>, " @@ -33,10 +33,10 @@ class ClearwaterOnBoardingBase(vnf.VnfOnBoarding): super(ClearwaterOnBoardingBase, self).__init__(**kwargs) self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/ims') - self.data_dir = getattr(CONST, 'dir_ims_data') - self.result_dir = os.path.join(getattr(CONST, 'dir_results'), + self.data_dir = getattr(config.CONF, 'dir_ims_data') + self.result_dir = os.path.join(getattr(config.CONF, 'dir_results'), self.case_name) - self.test_dir = getattr(CONST, 'dir_repo_vims_test') + self.test_dir = getattr(config.CONF, 'dir_repo_vims_test') if not os.path.exists(self.data_dir): os.makedirs(self.data_dir) diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims.py b/functest/opnfv_tests/vnf/ims/cloudify_ims.py index 38a40ed83..81e9b5ee9 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims.py @@ -21,7 +21,7 @@ import yaml from functest.energy import energy from functest.opnfv_tests.openstack.snaps import snaps_utils import functest.opnfv_tests.vnf.ims.clearwater_ims_base as clearwater_ims_base -from functest.utils.constants import CONST +from functest.utils import config from snaps.config.flavor import FlavorConfig from snaps.config.image import ImageConfig @@ -59,7 +59,7 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): # Retrieve the configuration try: self.config = getattr( - CONST, 'vnf_{}_config'.format(self.case_name)) + config.CONF, 'vnf_{}_config'.format(self.case_name)) except Exception: raise Exception("VNF config file not found") @@ -280,12 +280,12 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): scp = SCPClient(ssh.get_transport(), socket_timeout=15.0) scp.put(kp_file, '~/') cmd = "sudo cp ~/cloudify_ims.pem /etc/cloudify/" - run_blocking_ssh_command(ssh, cmd) + self.run_blocking_ssh_command(ssh, cmd) cmd = "sudo chmod 444 /etc/cloudify/cloudify_ims.pem" - run_blocking_ssh_command(ssh, cmd) + self.run_blocking_ssh_command(ssh, cmd) cmd = "sudo yum install -y gcc python-devel" - run_blocking_ssh_command(ssh, cmd, "Unable to install packages \ - on manager") + self.run_blocking_ssh_command( + ssh, cmd, "Unable to install packages on manager") self.details['orchestrator'].update(status='PASS', duration=duration) @@ -399,7 +399,7 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): try: cfy_client.executions.cancel(execution['id'], force=True) - except: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.__logger.warn("Can't cancel the current exec") execution = cfy_client.executions.start( @@ -411,12 +411,22 @@ class CloudifyIms(clearwater_ims_base.ClearwaterOnBoardingBase): wait_for_execution(cfy_client, execution, self.__logger) cfy_client.deployments.delete(self.vnf['descriptor'].get('name')) cfy_client.blueprints.delete(self.vnf['descriptor'].get('name')) - except: # pylint: disable=broad-except + except Exception: # pylint: disable=broad-except self.__logger.warn("Some issue during the undeployment ..") self.__logger.warn("Tenant clean continue ..") super(CloudifyIms, self).clean() + @staticmethod + def run_blocking_ssh_command(ssh, cmd, + error_msg="Unable to run this command"): + """Command to run ssh command with the exit status.""" + _, stdout, stderr = ssh.exec_command(cmd) + CloudifyIms.__logger.debug("SSH %s stdout: %s", cmd, stdout.read()) + if stdout.channel.recv_exit_status() != 0: + CloudifyIms.__logger.error("SSH %s stderr: %s", cmd, stderr.read()) + raise Exception(error_msg) + @energy.enable_recording def run(self, **kwargs): """Execute CloudifyIms test case.""" @@ -530,10 +540,3 @@ def sig_test_format(sig_test): short_sig_test_result['skipped'] = nb_skipped nb_test = nb_passed + nb_skipped return (short_sig_test_result, nb_test) - - -def run_blocking_ssh_command(ssh, cmd, error_msg="Unable to run this command"): - """Command to run ssh command with the exit status.""" - stdin, stdout, stderr = ssh.exec_command(cmd) - if stdout.channel.recv_exit_status() != 0: - raise Exception(error_msg) diff --git a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py index 72e1e447e..cdf1edc0a 100644 --- a/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py +++ b/functest/opnfv_tests/vnf/ims/cloudify_ims_perf.py @@ -25,7 +25,7 @@ from functest.opnfv_tests.vnf.ims import cloudify_ims from functest.opnfv_tests.vnf.ims.ixia.utils import IxChassisUtils from functest.opnfv_tests.vnf.ims.ixia.utils import IxLoadUtils from functest.opnfv_tests.vnf.ims.ixia.utils import IxRestUtils -from functest.utils.constants import CONST +from functest.utils import config from snaps.config.flavor import FlavorConfig from snaps.config.image import ImageConfig @@ -58,7 +58,7 @@ class CloudifyImsPerf(cloudify_ims.CloudifyIms): # Retrieve the configuration try: self.config = getattr( - CONST, 'vnf_{}_config'.format(self.case_name)) + config.CONF, 'vnf_{}_config'.format(self.case_name)) except Exception: raise Exception("VNF config file not found") diff --git a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py index e1b7f3ab0..2d248b2e6 100644 --- a/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py +++ b/functest/opnfv_tests/vnf/ims/orchestra_clearwaterims.py @@ -14,13 +14,13 @@ import logging import os import socket import time + import pkg_resources import yaml -import functest.core.vnf as vnf -import functest.utils.openstack_utils as os_utils +from functest.core import vnf from functest.opnfv_tests.openstack.snaps import snaps_utils -from functest.utils.constants import CONST +from functest.utils import config from org.openbaton.cli.errors.errors import NfvoException from org.openbaton.cli.agents.agents import MainAgent @@ -30,6 +30,7 @@ from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig from snaps.config.router import RouterConfig from snaps.config.security_group import ( Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) +from snaps.config.vm_inst import FloatingIpConfig from snaps.config.vm_inst import VmInstanceConfig from snaps.openstack.utils import keystone_utils from snaps.openstack.create_flavor import OpenStackFlavor @@ -71,7 +72,7 @@ def get_config(parameter, file_path): def servertest(host, port): """Method to test that a server is reachable at IP:port""" args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) - for family, socktype, proto, canonname, sockaddr in args: + for family, socktype, proto, _, sockaddr in args: sock = socket.socket(family, socktype, proto) try: sock.connect(sockaddr) @@ -88,8 +89,6 @@ def get_userdata(orchestrator=dict): userdata += "echo \"Executing userdata...\"\n" userdata += "set -x\n" userdata += "set -e\n" - userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n" - userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n" userdata += "echo \"Install curl...\"\n" userdata += "apt-get install curl\n" userdata += "echo \"Inject public key...\"\n" @@ -109,10 +108,6 @@ def get_userdata(orchestrator=dict): orchestrator['bootstrap']['config']['url']) userdata += ("echo \"Disable usage of mysql...\"\n") userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n" - userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n" - % orchestrator['details']['fip'].ip) - userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip" - "=%s/g /config_file\n" % orchestrator['details']['fip'].ip) userdata += "echo \"Set autostart of components to 'false'\"\n" userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n" userdata += "echo \"Execute bootstrap...\"\n" @@ -150,14 +145,14 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/ims/') - self.data_dir = getattr(CONST, 'dir_ims_data') - self.test_dir = getattr(CONST, 'dir_repo_vims_test') + self.data_dir = getattr(config.CONF, 'dir_ims_data') + self.test_dir = getattr(config.CONF, 'dir_repo_vims_test') self.created_resources = [] self.logger.info("%s VNF onboarding test starting", self.case_name) try: self.config = getattr( - CONST, 'vnf_{}_config'.format(self.case_name)) + config.CONF, 'vnf_{}_config'.format(self.case_name)) except BaseException: raise Exception("Orchestra VNF config file not found") @@ -199,7 +194,8 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): "tenant_images.%s" % self.case_name, config_file)) - self.snaps_creds = None + self.creds = None + self.orchestra_router = None def prepare(self): """Prepare testscase (Additional pre-configuration steps).""" @@ -209,18 +205,15 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): public_auth_url = keystone_utils.get_endpoint( self.snaps_creds, 'identity') - self.creds = { - "tenant": self.snaps_creds.project_name, - "username": self.snaps_creds.username, - "password": self.snaps_creds.password, - "auth_url": public_auth_url - } + "tenant": self.snaps_creds.project_name, + "username": self.snaps_creds.username, + "password": self.snaps_creds.password, + "auth_url": public_auth_url} self.prepare_images() self.prepare_flavor() self.prepare_security_groups() self.prepare_network() - self.prepare_floating_ip() def prepare_images(self): """Upload images if they doen't exist yet""" @@ -236,7 +229,7 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): image_file=image_file, public=True)) image.create() - # self.created_resources.append(image); + self.created_resources.append(image) def prepare_security_groups(self): """Create Open Baton security group if it doesn't exist yet""" @@ -245,48 +238,54 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): sg_rules = list() sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.ingress, protocol=Protocol.tcp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.egress, protocol=Protocol.tcp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.ingress, protocol=Protocol.udp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.egress, protocol=Protocol.udp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.ingress, protocol=Protocol.icmp)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.egress, protocol=Protocol.icmp)) security_group = OpenStackSecurityGroup( self.snaps_creds, SecurityGroupConfig( - name="orchestra-sec-group-allowall", + name="orchestra-sec-group-allowall-{}".format( + self.uuid), rule_settings=sg_rules)) - security_group_info = security_group.create() self.created_resources.append(security_group) self.mano['details']['sec_group'] = security_group_info.name @@ -315,12 +314,10 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): self.logger.info( "Creating network/subnet/router if they doen't exist yet...") subnet_settings = SubnetConfig( - name='%s_subnet' % - self.case_name, + name='{}_subnet-{}'.format(self.case_name, self.uuid), cidr="192.168.100.0/24") network_settings = NetworkConfig( - name='%s_net' % - self.case_name, + name='{}_net-{}'.format(self.case_name, self.uuid), subnet_settings=[subnet_settings]) orchestra_network = OpenStackNetwork( self.snaps_creds, network_settings) @@ -331,77 +328,27 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): self.mano['details']['external_net_name'] = snaps_utils.\ get_ext_net_name(self.snaps_creds) self.created_resources.append(orchestra_network) - orchestra_router = OpenStackRouter( + self.orchestra_router = OpenStackRouter( self.snaps_creds, RouterConfig( - name='%s_router' % - self.case_name, + name='{}_router-{}'.format(self.case_name, self.uuid), external_gateway=self.mano['details']['external_net_name'], internal_subnets=[ subnet_settings.name])) - orchestra_router.create() - self.created_resources.append(orchestra_router) + self.orchestra_router.create() + self.created_resources.append(self.orchestra_router) self.logger.info("Created network and router for Open Baton NFVO...") - def prepare_floating_ip(self): - """Select/Create Floating IP if it doesn't exist yet""" - self.logger.info("Retrieving floating IP for Open Baton NFVO") - neutron_client = snaps_utils.neutron_utils.neutron_client( - self.snaps_creds) - # Finding Tenant ID to check to which tenant the Floating IP belongs - tenant_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(self.creds), - self.tenant_name) - # Use os_utils to retrieve complete information of Floating IPs - floating_ips = os_utils.get_floating_ips(neutron_client) - my_floating_ips = [] - # Filter Floating IPs with tenant id - for floating_ip in floating_ips: - if floating_ip.get('tenant_id') == tenant_id: - my_floating_ips.append(floating_ip.get('floating_ip_address')) - # Select if Floating IP exist else create new one - if len(my_floating_ips) >= 1: - # Get Floating IP object from snaps for clean up - snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips( - neutron_client) - for my_floating_ip in my_floating_ips: - for snaps_floating_ip in snaps_floating_ips: - if snaps_floating_ip.ip == my_floating_ip: - self.mano['details']['fip'] = snaps_floating_ip - self.logger.info( - "Selected floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - break - if self.mano['details']['fip'] is not None: - break - else: - self.logger.info("Creating floating IP for Open Baton NFVO") - self.mano['details']['fip'] = snaps_utils.neutron_utils.\ - create_floating_ip( - neutron_client, - self.mano['details']['external_net_name']) - self.logger.info( - "Created floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - def get_vim_descriptor(self): """"Create VIM descriptor to be used for onboarding""" self.logger.info( "Building VIM descriptor with PoP creds: %s", self.creds) - # Depending on API version either tenant ID or project name must be - # used - if os_utils.is_keystone_v3(): - self.logger.info( - "Using v3 API of OpenStack... -> Using OS_PROJECT_ID") - project_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(), - self.creds.get("project_name")) - else: - self.logger.info( - "Using v2 API of OpenStack... -> Using OS_TENANT_NAME") - project_id = self.creds.get("tenant_name") - self.logger.debug("VIM project/tenant id: %s", project_id) + self.logger.debug("VIM project/tenant id: %s", + self.snaps_creds.project_name) + keystone = keystone_utils.keystone_client(self.snaps_creds) + project_id = keystone_utils.get_project( + keystone=keystone, project_name=self.snaps_creds.project_name).id vim_json = { "name": "vim-instance", "authUrl": self.creds.get("auth_url"), @@ -442,40 +389,28 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): exists=True) # setting up port port_settings = PortConfig( - name='%s_port' % self.case_name, + name='{}_port-{}'.format(self.case_name, self.uuid), network_name=self.mano['details']['network']['name']) + # build configuration of vm orchestra_settings = VmInstanceConfig( name=self.case_name, flavor=self.mano['details']['flavor']['name'], port_settings=[port_settings], security_group_names=[self.mano['details']['sec_group']], + floating_ip_settings=[FloatingIpConfig( + name='orchestra_fip-{}'.format(self.uuid), + port_name=port_settings.name, + router_name=self.orchestra_router.router_settings.name)], userdata=str(userdata)) - orchestra_vm = OpenStackVmInstance(self.snaps_creds, - orchestra_settings, - image_settings) - + orchestra_vm = OpenStackVmInstance( + self.snaps_creds, orchestra_settings, image_settings) orchestra_vm.create() + self.mano['details']['fip'] = orchestra_vm.get_floating_ip() self.created_resources.append(orchestra_vm) self.mano['details']['id'] = orchestra_vm.get_vm_info()['id'] self.logger.info( - "Created orchestra instance: %s", - self.mano['details']['id']) - - self.logger.info("Associating floating ip: '%s' to VM '%s' ", - self.mano['details']['fip'].ip, - self.case_name) - nova_client = os_utils.get_nova_client() - if not os_utils.add_floating_ip( - nova_client, - self.mano['details']['id'], - self.mano['details']['fip'].ip): - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Cannot associate floating IP to VM.") - return False - + "Created orchestra instance: %s", self.mano['details']['id']) self.logger.info("Waiting for Open Baton NFVO to be up and running...") timeout = 0 while timeout < 20: @@ -561,8 +496,8 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): self.mano['details']['nsr'] = nsr_agent.create( self.mano['details']['nsd_id']) - except NfvoException as exc: - self.logger.error(exc.message) + except NfvoException: + self.logger.exception("failed") duration = time.time() - start_time self.details["vnf"].update(status='FAIL', duration=duration) return False @@ -621,13 +556,11 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): try: main_agent = MainAgent( nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, + nfvo_port=8080, https=False, version=1, username=self.mano['credentials']['username'], password=self.mano['credentials']['password']) self.logger.info("Terminating %s...", self.vnf['name']) - if (self.mano['details'].get('nsr')): + if self.mano['details'].get('nsr'): main_agent.get_agent( "nsr", project_id=self.mano['details']['project_id']).delete( @@ -636,32 +569,6 @@ class ClearwaterImsVnf(vnf.VnfOnBoarding): time.sleep(60) else: self.logger.info("No need to terminate the VNF...") - # os_utils.delete_instance(nova_client=os_utils.get_nova_client(), - # instance_id=self.mano_instance_id) except (NfvoException, KeyError) as exc: self.logger.error('Unexpected error cleaning - %s', exc) - - try: - neutron_client = os_utils.get_neutron_client(self.creds) - self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port( - neutron_client, - port_name='%s_port' % self.case_name) - snaps_utils.neutron_utils.delete_port(neutron_client, port) - time.sleep(10) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - try: - self.logger.info("Deleting Open Baton Floating IP...") - snaps_utils.neutron_utils.delete_floating_ip( - neutron_client, self.mano['details']['fip']) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - - for resource in reversed(self.created_resources): - try: - self.logger.info("Cleaning %s", str(resource)) - resource.clean() - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) super(ClearwaterImsVnf, self).clean() diff --git a/functest/opnfv_tests/vnf/ims/orchestra_openims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py index c35ec8c18..8f209d5cf 100644 --- a/functest/opnfv_tests/vnf/ims/orchestra_openims.py +++ b/functest/opnfv_tests/vnf/ims/orchestra_openims.py @@ -17,9 +17,8 @@ import time import pkg_resources import yaml -import functest.core.vnf as vnf -import functest.utils.openstack_utils as os_utils -from functest.utils.constants import CONST +from functest.core import vnf +from functest.utils import config from org.openbaton.cli.errors.errors import NfvoException from org.openbaton.cli.agents.agents import MainAgent @@ -29,6 +28,7 @@ from snaps.config.network import NetworkConfig, PortConfig, SubnetConfig from snaps.config.router import RouterConfig from snaps.config.security_group import ( Direction, Protocol, SecurityGroupConfig, SecurityGroupRuleConfig) +from snaps.config.vm_inst import FloatingIpConfig from snaps.config.vm_inst import VmInstanceConfig from snaps.openstack.utils import keystone_utils from snaps.openstack.create_image import OpenStackImage @@ -72,7 +72,7 @@ def get_config(parameter, file_path): def servertest(host, port): """Method to test that a server is reachable at IP:port""" args = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) - for family, socktype, proto, canonname, sockaddr in args: + for family, socktype, proto, _, sockaddr in args: sock = socket.socket(family, socktype, proto) try: sock.connect(sockaddr) @@ -89,8 +89,6 @@ def get_userdata(orchestrator=dict): userdata += "echo \"Executing userdata...\"\n" userdata += "set -x\n" userdata += "set -e\n" - userdata += "echo \"Set nameserver to '8.8.8.8'...\"\n" - userdata += "echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf\n" userdata += "echo \"Install curl...\"\n" userdata += "apt-get install curl\n" userdata += "echo \"Inject public key...\"\n" @@ -110,10 +108,6 @@ def get_userdata(orchestrator=dict): orchestrator['bootstrap']['config']['url']) userdata += ("echo \"Disable usage of mysql...\"\n") userdata += "sed -i s/mysql=.*/mysql=no/g /config_file\n" - userdata += ("echo \"Setting 'rabbitmq_broker_ip' to '%s'\"\n" - % orchestrator['details']['fip'].ip) - userdata += ("sed -i s/rabbitmq_broker_ip=localhost/rabbitmq_broker_ip" - "=%s/g /config_file\n" % orchestrator['details']['fip'].ip) userdata += "echo \"Set autostart of components to 'false'\"\n" userdata += "export OPENBATON_COMPONENT_AUTOSTART=false\n" userdata += "echo \"Execute bootstrap...\"\n" @@ -151,14 +145,14 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/ims/') - self.data_dir = getattr(CONST, 'dir_ims_data') - self.test_dir = getattr(CONST, 'dir_repo_vims_test') + self.data_dir = getattr(config.CONF, 'dir_ims_data') + self.test_dir = getattr(config.CONF, 'dir_repo_vims_test') self.created_resources = [] self.logger.info("%s VNF onboarding test starting", self.case_name) try: self.config = getattr( - CONST, 'vnf_{}_config'.format(self.case_name)) + config.CONF, 'vnf_{}_config'.format(self.case_name)) except BaseException: raise Exception("Orchestra VNF config file not found") config_file = self.case_dir + self.config @@ -196,6 +190,8 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.images = get_config("tenant_images.orchestrator", config_file) self.images.update(get_config("tenant_images.%s" % self.case_name, config_file)) + self.creds = None + self.orchestra_router = None def prepare(self): """Prepare testscase (Additional pre-configuration steps).""" @@ -206,16 +202,14 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.logger.info("Additional pre-configuration steps") self.creds = { - "tenant": self.snaps_creds.project_name, - "username": self.snaps_creds.username, - "password": self.snaps_creds.password, - "auth_url": public_auth_url - } + "tenant": self.snaps_creds.project_name, + "username": self.snaps_creds.username, + "password": self.snaps_creds.password, + "auth_url": public_auth_url} self.prepare_images() self.prepare_flavor() self.prepare_security_groups() self.prepare_network() - self.prepare_floating_ip() def prepare_images(self): """Upload images if they doen't exist yet""" @@ -231,7 +225,7 @@ class OpenImsVnf(vnf.VnfOnBoarding): image_file=image_file, public=True)) image.create() - # self.created_resources.append(image); + self.created_resources.append(image) def prepare_security_groups(self): """Create Open Baton security group if it doesn't exist yet""" @@ -240,28 +234,32 @@ class OpenImsVnf(vnf.VnfOnBoarding): sg_rules = list() sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.ingress, protocol=Protocol.tcp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.egress, protocol=Protocol.tcp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.ingress, protocol=Protocol.udp, port_range_min=1, port_range_max=65535)) sg_rules.append( SecurityGroupRuleConfig( - sec_grp_name="orchestra-sec-group-allowall", + sec_grp_name="orchestra-sec-group-allowall-{}".format( + self.uuid), direction=Direction.egress, protocol=Protocol.udp, port_range_min=1, @@ -269,7 +267,8 @@ class OpenImsVnf(vnf.VnfOnBoarding): security_group = OpenStackSecurityGroup( self.snaps_creds, SecurityGroupConfig( - name="orchestra-sec-group-allowall", + name="orchestra-sec-group-allowall-{}".format( + self.uuid), rule_settings=sg_rules)) security_group_info = security_group.create() @@ -300,12 +299,10 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.logger.info( "Creating network/subnet/router if they doen't exist yet...") subnet_settings = SubnetConfig( - name='%s_subnet' % - self.case_name, + name='{}_subnet-{}'.format(self.case_name, self.uuid), cidr="192.168.100.0/24") network_settings = NetworkConfig( - name='%s_net' % - self.case_name, + name='{}_net-{}'.format(self.case_name, self.uuid), subnet_settings=[subnet_settings]) orchestra_network = OpenStackNetwork( self.snaps_creds, network_settings) @@ -316,77 +313,27 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.mano['details']['external_net_name'] = \ snaps_utils.get_ext_net_name(self.snaps_creds) self.created_resources.append(orchestra_network) - orchestra_router = OpenStackRouter( + self.orchestra_router = OpenStackRouter( self.snaps_creds, RouterConfig( - name='%s_router' % - self.case_name, + name='{}_router-{}'.format(self.case_name, self.uuid), external_gateway=self.mano['details']['external_net_name'], internal_subnets=[ subnet_settings.name])) - orchestra_router.create() - self.created_resources.append(orchestra_router) + self.orchestra_router.create() + self.created_resources.append(self.orchestra_router) self.logger.info("Created network and router for Open Baton NFVO...") - def prepare_floating_ip(self): - """Select/Create Floating IP if it doesn't exist yet""" - self.logger.info("Retrieving floating IP for Open Baton NFVO") - neutron_client = snaps_utils.neutron_utils.neutron_client( - self.snaps_creds) - # Finding Tenant ID to check to which tenant the Floating IP belongs - tenant_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(self.creds), - self.tenant_name) - # Use os_utils to retrieve complete information of Floating IPs - floating_ips = os_utils.get_floating_ips(neutron_client) - my_floating_ips = [] - # Filter Floating IPs with tenant id - for floating_ip in floating_ips: - # self.logger.info("Floating IP: %s", floating_ip) - if floating_ip.get('tenant_id') == tenant_id: - my_floating_ips.append(floating_ip.get('floating_ip_address')) - # Select if Floating IP exist else create new one - if len(my_floating_ips) >= 1: - # Get Floating IP object from snaps for clean up - snaps_floating_ips = snaps_utils.neutron_utils.get_floating_ips( - neutron_client) - for my_floating_ip in my_floating_ips: - for snaps_floating_ip in snaps_floating_ips: - if snaps_floating_ip.ip == my_floating_ip: - self.mano['details']['fip'] = snaps_floating_ip - self.logger.info( - "Selected floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - break - if self.mano['details']['fip'] is not None: - break - else: - self.logger.info("Creating floating IP for Open Baton NFVO") - self.mano['details']['fip'] = ( - snaps_utils.neutron_utils. create_floating_ip( - neutron_client, self.mano['details']['external_net_name'])) - self.logger.info( - "Created floating IP for Open Baton NFVO %s", - (self.mano['details']['fip'].ip)) - def get_vim_descriptor(self): """"Create VIM descriptor to be used for onboarding""" self.logger.info( "Building VIM descriptor with PoP creds: %s", self.creds) - # Depending on API version either tenant ID or project name must be - # used - if os_utils.is_keystone_v3(): - self.logger.info( - "Using v3 API of OpenStack... -> Using OS_PROJECT_ID") - project_id = os_utils.get_tenant_id( - os_utils.get_keystone_client(), - self.creds.get("project_name")) - else: - self.logger.info( - "Using v2 API of OpenStack... -> Using OS_TENANT_NAME") - project_id = self.creds.get("tenant_name") - self.logger.debug("VIM project/tenant id: %s", project_id) + self.logger.debug("VIM project/tenant id: %s", + self.snaps_creds.project_name) + keystone = keystone_utils.keystone_client(self.snaps_creds) + project_id = keystone_utils.get_project( + keystone=keystone, project_name=self.snaps_creds.project_name).id vim_json = { "name": "vim-instance", "authUrl": self.creds.get("auth_url"), @@ -427,40 +374,27 @@ class OpenImsVnf(vnf.VnfOnBoarding): exists=True) # setting up port port_settings = PortConfig( - name='%s_port' % self.case_name, + name='{}_port-{}'.format(self.case_name, self.uuid), network_name=self.mano['details']['network']['name']) # build configuration of vm orchestra_settings = VmInstanceConfig( - name=self.case_name, + name='{}-{}'.format(self.case_name, self.uuid), flavor=self.mano['details']['flavor']['name'], port_settings=[port_settings], security_group_names=[self.mano['details']['sec_group']], + floating_ip_settings=[FloatingIpConfig( + name='orchestra_fip-{}'.format(self.uuid), + port_name=port_settings.name, + router_name=self.orchestra_router.router_settings.name)], userdata=str(userdata)) - orchestra_vm = OpenStackVmInstance(self.snaps_creds, - orchestra_settings, - image_settings) - + orchestra_vm = OpenStackVmInstance( + self.snaps_creds, orchestra_settings, image_settings) orchestra_vm.create() + self.mano['details']['fip'] = orchestra_vm.get_floating_ip() self.created_resources.append(orchestra_vm) self.mano['details']['id'] = orchestra_vm.get_vm_info()['id'] self.logger.info( - "Created orchestra instance: %s", - self.mano['details']['id']) - - self.logger.info("Associating floating ip: '%s' to VM '%s' ", - self.mano['details']['fip'].ip, - self.case_name) - nova_client = os_utils.get_nova_client() - if not os_utils.add_floating_ip( - nova_client, - self.mano['details']['id'], - self.mano['details']['fip'].ip): - duration = time.time() - start_time - self.details["orchestrator"].update( - status='FAIL', duration=duration) - self.logger.error("Cannot associate floating IP to VM.") - return False - + "Created orchestra instance: %s", self.mano['details']['id']) self.logger.info("Waiting for Open Baton NFVO to be up and running...") timeout = 0 while timeout < 20: @@ -545,8 +479,8 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.mano['details']['nsr'] = nsr_agent.create( self.mano['details']['nsd_id']) - except NfvoException as exc: - self.logger.error(exc.message) + except NfvoException: + self.logger.exception("failed") duration = time.time() - start_time self.details["vnf"].update(status='FAIL', duration=duration) return False @@ -646,13 +580,11 @@ class OpenImsVnf(vnf.VnfOnBoarding): try: main_agent = MainAgent( nfvo_ip=self.mano['details']['fip'].ip, - nfvo_port=8080, - https=False, - version=1, + nfvo_port=8080, https=False, version=1, username=self.mano['credentials']['username'], password=self.mano['credentials']['password']) self.logger.info("Terminating %s...", self.vnf['name']) - if (self.mano['details'].get('nsr')): + if self.mano['details'].get('nsr'): main_agent.get_agent( "nsr", project_id=self.mano['details']['project_id']).\ @@ -663,28 +595,4 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.logger.info("No need to terminate the VNF...") except (NfvoException, KeyError) as exc: self.logger.error('Unexpected error cleaning - %s', exc) - - try: - neutron_client = os_utils.get_neutron_client(self.creds) - self.logger.info("Deleting Open Baton Port...") - port = snaps_utils.neutron_utils.get_port( - neutron_client, - port_name='%s_port' % self.case_name) - snaps_utils.neutron_utils.delete_port(neutron_client, port) - time.sleep(10) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - try: - self.logger.info("Deleting Open Baton Floating IP...") - snaps_utils.neutron_utils.delete_floating_ip( - neutron_client, self.mano['details']['fip']) - except Exception as exc: # pylint: disable=broad-except - self.logger.error('Unexpected error cleaning - %s', exc) - - for resource in reversed(self.created_resources): - try: - self.logger.info("Cleaning %s", str(resource)) - resource.clean() - except Exception as exc: - self.logger.error('Unexpected error cleaning - %s', exc) super(OpenImsVnf, self).clean() |