Switch to snaps in orchestra testcases
[functest.git] / functest / opnfv_tests / vnf / ims / orchestra_openims.py
index f9a81f2..8f209d5 100644 (file)
@@ -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 <michael.pauls@fokus.fraunhofer.de>"
@@ -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
@@ -195,46 +187,45 @@ class OpenImsVnf(vnf.VnfOnBoarding):
         if not os.path.exists(self.data_dir):
             os.makedirs(self.data_dir)
 
-        self.images = get_config("tenant_images.%s" %
-                                 self.case_name, config_file)
+        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"""
         self.logger.info("Upload images if they doen't exist yet")
-        for image_name, image_url in self.images.iteritems():
-            self.logger.info("image: %s, url: %s", image_name, image_url)
-            if image_url and image_name:
+        for image_name, image_file in self.images.iteritems():
+            self.logger.info("image: %s, file: %s", image_name, image_file)
+            if image_file and image_name:
                 image = OpenStackImage(
                     self.snaps_creds,
-                    ImageSettings(name=image_name,
-                                  image_user='cloud',
-                                  img_format='qcow2',
-                                  url=image_url))
+                    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()