X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fvnf%2Fims%2Forchestra_openims.py;h=8f209d5cfd3dc823c570cd3bcc5adbee66653cf3;hb=d6c5f7efe042f24bad35dab461d8820a7d507f7b;hp=45440704e091cb93be0002b07e1d174ad9f74ebe;hpb=90d34ecea4e5eaa90db2092b831ece909d9c1477;p=functest.git diff --git a/functest/opnfv_tests/vnf/ims/orchestra_openims.py b/functest/opnfv_tests/vnf/ims/orchestra_openims.py index 45440704e..8f209d5cf 100644 --- a/functest/opnfv_tests/vnf/ims/orchestra_openims.py +++ b/functest/opnfv_tests/vnf/ims/orchestra_openims.py @@ -17,32 +17,28 @@ import time import pkg_resources import yaml - -from snaps.openstack.create_image import OpenStackImage, ImageSettings -from snaps.openstack.create_flavor import OpenStackFlavor, FlavorSettings -from snaps.openstack.create_security_group import ( - OpenStackSecurityGroup, - SecurityGroupSettings, - SecurityGroupRuleSettings, - Direction, - Protocol) -from snaps.openstack.create_network import ( - OpenStackNetwork, - NetworkSettings, - SubnetSettings, - PortSettings) -from snaps.openstack.create_router import OpenStackRouter, RouterSettings -from snaps.openstack.os_credentials import OSCreds -from snaps.openstack.create_instance import ( - VmInstanceSettings, OpenStackVmInstance) -from functest.opnfv_tests.openstack.snaps import snaps_utils - -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 +from snaps.config.flavor import FlavorConfig +from snaps.config.image import ImageConfig +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 +from snaps.openstack.create_flavor import OpenStackFlavor +from snaps.openstack.create_security_group import OpenStackSecurityGroup +from snaps.openstack.create_network import OpenStackNetwork +from snaps.openstack.create_router import OpenStackRouter +from snaps.openstack.create_instance import OpenStackVmInstance + +from functest.opnfv_tests.openstack.snaps import snaps_utils __author__ = "Pauls, Michael " @@ -76,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) @@ -93,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" @@ -114,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" @@ -131,6 +121,8 @@ def get_userdata(orchestrator=dict): orchestrator['gvnfm']['userdata']['url']) userdata += "sed -i '113i"'\ \ \ \ '"sleep 60' " \ "/etc/openbaton/openbaton-vnfm-generic-user-data.sh\n" + userdata += ("sed -i s/nfvo.marketplace.port=8082/nfvo.marketplace." + "port=8080/g /etc/openbaton/openbaton-nfvo.properties\n") userdata += "echo \"Starting NFVO\"\n" userdata += "service openbaton-nfvo restart\n" userdata += "echo \"Starting Generic VNFM\"\n" @@ -142,25 +134,25 @@ def get_userdata(orchestrator=dict): class OpenImsVnf(vnf.VnfOnBoarding): """OpenIMS VNF deployed with openBaton orchestrator""" - logger = logging.getLogger(__name__) + # logger = logging.getLogger(__name__) def __init__(self, **kwargs): if "case_name" not in kwargs: kwargs["case_name"] = "orchestra_openims" super(OpenImsVnf, self).__init__(**kwargs) - # self.logger = logging.getLogger("functest.ci.run_tests.orchestra") + self.logger = logging.getLogger("functest.ci.run_tests.orchestra") self.logger.info("kwargs %s", (kwargs)) self.case_dir = pkg_resources.resource_filename( 'functest', 'opnfv_tests/vnf/ims/') - self.data_dir = CONST.__getattribute__('dir_ims_data') - self.test_dir = CONST.__getattribute__('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 = CONST.__getattribute__( - 'vnf_{}_config'.format(self.case_name)) + self.config = getattr( + 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 @@ -198,27 +190,26 @@ 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.snaps_creds = None + self.creds = None + self.orchestra_router = None def prepare(self): """Prepare testscase (Additional pre-configuration steps).""" super(OpenImsVnf, self).prepare() - self.logger.info("Additional pre-configuration steps") - self.logger.info("creds %s", (self.creds)) - - self.snaps_creds = OSCreds( - username=self.creds['username'], - password=self.creds['password'], - auth_url=self.creds['auth_url'], - project_name=self.creds['tenant'], - identity_api_version=int(os_utils.get_keystone_client_version())) + public_auth_url = keystone_utils.get_endpoint( + self.snaps_creds, 'identity') + 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} 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""" @@ -228,13 +219,13 @@ class OpenImsVnf(vnf.VnfOnBoarding): if image_file and image_name: image = OpenStackImage( self.snaps_creds, - ImageSettings(name=image_name, - image_user='cloud', - img_format='qcow2', - image_file=image_file, - public=True)) + ImageConfig(name=image_name, + image_user='cloud', + img_format='qcow2', + 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""" @@ -242,62 +233,42 @@ class OpenImsVnf(vnf.VnfOnBoarding): "Creating security group for Open Baton if not yet existing...") sg_rules = list() sg_rules.append( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", + SecurityGroupRuleConfig( + 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( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", + SecurityGroupRuleConfig( + 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( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", + SecurityGroupRuleConfig( + 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( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", + SecurityGroupRuleConfig( + 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( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.ingress, - protocol=Protocol.icmp)) - sg_rules.append( - SecurityGroupRuleSettings( - sec_grp_name="orchestra-sec-group-allowall", - direction=Direction.egress, - protocol=Protocol.icmp)) - # sg_rules.append( - # SecurityGroupRuleSettings( - # sec_grp_name="orchestra-sec-group-allowall", - # direction=Direction.ingress, - # protocol=Protocol.icmp, - # port_range_min=-1, - # port_range_max=-1)) - # sg_rules.append( - # SecurityGroupRuleSettings( - # sec_grp_name="orchestra-sec-group-allowall", - # direction=Direction.egress, - # protocol=Protocol.icmp, - # port_range_min=-1, - # port_range_max=-1)) - security_group = OpenStackSecurityGroup( self.snaps_creds, - SecurityGroupSettings( - name="orchestra-sec-group-allowall", + SecurityGroupConfig( + name="orchestra-sec-group-allowall-{}".format( + self.uuid), rule_settings=sg_rules)) security_group_info = security_group.create() @@ -311,7 +282,7 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.logger.info( "Create Flavor for Open Baton NFVO if not yet existing") - flavor_settings = FlavorSettings( + flavor_settings = FlavorConfig( name=self.mano['requirements']['flavor']['name'], ram=self.mano['requirements']['flavor']['ram_min'], disk=self.mano['requirements']['flavor']['disk'], @@ -327,13 +298,11 @@ class OpenImsVnf(vnf.VnfOnBoarding): """Create network/subnet/router if they doen't exist yet""" self.logger.info( "Creating network/subnet/router if they doen't exist yet...") - subnet_settings = SubnetSettings( - name='%s_subnet' % - self.case_name, + subnet_settings = SubnetConfig( + name='{}_subnet-{}'.format(self.case_name, self.uuid), cidr="192.168.100.0/24") - network_settings = NetworkSettings( - name='%s_net' % - self.case_name, + network_settings = NetworkConfig( + name='{}_net-{}'.format(self.case_name, self.uuid), subnet_settings=[subnet_settings]) orchestra_network = OpenStackNetwork( self.snaps_creds, network_settings) @@ -344,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, - RouterSettings( - name='%s_router' % - self.case_name, + RouterConfig( + 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"), @@ -449,60 +368,47 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.mano['details']['network']['id']) self.logger.debug("userdata: %s\n", userdata) # setting up image - image_settings = ImageSettings( + image_settings = ImageConfig( name=self.mano['requirements']['image'], image_user='ubuntu', exists=True) # setting up port - port_settings = PortSettings( - name='%s_port' % self.case_name, + port_settings = PortConfig( + name='{}_port-{}'.format(self.case_name, self.uuid), network_name=self.mano['details']['network']['name']) # build configuration of vm - orchestra_settings = VmInstanceSettings( - name=self.case_name, + orchestra_settings = VmInstanceConfig( + 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']], - userdata=userdata) - orchestra_vm = OpenStackVmInstance(self.snaps_creds, - orchestra_settings, - image_settings) - + 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.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 < 200: + while timeout < 20: if servertest( self.mano['details']['fip'].ip, "8080"): break else: self.logger.info("Open Baton NFVO is not started yet (%ss)", - (timeout * 5)) - time.sleep(5) + (timeout * 60)) + time.sleep(60) timeout += 1 - if timeout >= 200: + if timeout >= 20: duration = time.time() - start_time self.details["orchestrator"].update( status='FAIL', duration=duration) @@ -530,7 +436,7 @@ class OpenImsVnf(vnf.VnfOnBoarding): self.logger.info( "Create %s Flavor if not existing", self.vnf['name']) - flavor_settings = FlavorSettings( + flavor_settings = FlavorConfig( name=self.vnf['requirements']['flavor']['name'], ram=self.vnf['requirements']['flavor']['ram_min'], disk=self.vnf['requirements']['flavor']['disk'], @@ -573,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 @@ -595,13 +501,13 @@ class OpenImsVnf(vnf.VnfOnBoarding): while self.mano['details']['nsr'].get("status") != 'ACTIVE' \ and self.mano['details']['nsr'].get("status") != 'ERROR': timeout += 1 - self.logger.info("NSR is not yet ACTIVE... (%ss)", 5 * timeout) - if timeout == 300: - self.logger.error("INACTIVE NSR after %s sec..", 5 * timeout) + self.logger.info("NSR is not yet ACTIVE... (%ss)", 60 * timeout) + if timeout == 30: + self.logger.error("INACTIVE NSR after %s sec..", 60 * timeout) duration = time.time() - start_time self.details["vnf"].update(status='FAIL', duration=duration) return False - time.sleep(5) + time.sleep(60) self.mano['details']['nsr'] = json.loads( nsr_agent.find(self.mano['details']['nsr'].get('id'))) @@ -674,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']).\ @@ -689,31 +593,6 @@ class OpenImsVnf(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_by_name( - neutron_client, '%s_port' % self.case_name) - snaps_utils.neutron_utils.delete_port(neutron_client, port) - time.sleep(10) - except Exception as exc: - 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: - 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()