set up mechanism to tun only runnable tests in CI based on scenario
[functest.git] / testcases / functest_utils.py
index 53f5706..e7641b0 100644 (file)
@@ -17,6 +17,8 @@ import sys
 import requests
 import json
 import shutil
+import re
+import yaml
 from git import Repo
 
 
@@ -166,7 +168,7 @@ def delete_neutron_net(neutron_client, network_id):
 
 def create_neutron_subnet(neutron_client, name, cidr, net_id):
     json_body = {'subnets': [{'name': name, 'cidr': cidr,
-                             'ip_version': 4, 'network_id': net_id}]}
+                              'ip_version': 4, 'network_id': net_id}]}
     try:
         subnet = neutron_client.create_subnet(body=json_body)
         return subnet['subnets'][0]['id']
@@ -382,7 +384,7 @@ def get_image_id(glance_client, image_name):
 
 def create_glance_image(glance_client, image_name, file_path, public=True):
     if not os.path.isfile(file_path):
-        print "Error: file "+file_path+" does not exist."
+        print "Error: file " + file_path + " does not exist."
         return False
     try:
         with open(file_path) as fimage:
@@ -414,6 +416,7 @@ def get_volumes(cinder_client):
     except:
         return None
 
+
 def delete_volume(cinder_client, volume_id, forced=False):
     try:
         if forced:
@@ -433,7 +436,8 @@ def delete_volume(cinder_client, volume_id, forced=False):
 # ################ CINDER #################
 def get_security_groups(neutron_client):
     try:
-        security_groups = neutron_client.list_security_groups()['security_groups']
+        security_groups = neutron_client.list_security_groups()[
+            'security_groups']
         return security_groups
     except:
         return None
@@ -606,7 +610,7 @@ def get_git_branch(repo_path):
 
 def get_installer_type(logger=None):
     """
-    Get installer type (fuel, foreman, apex, joid, compass)
+    Get installer type (fuel, apex, joid, compass)
     """
     try:
         installer = os.environ['INSTALLER_TYPE']
@@ -626,7 +630,8 @@ def get_pod_name(logger=None):
         return os.environ['NODE_NAME']
     except KeyError:
         if logger:
-            logger.error("Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
+            logger.error(
+                "Unable to retrieve the POD name from environment.Using pod name 'unknown-pod'")
         return "unknown-pod"
 
 
@@ -648,6 +653,17 @@ def push_results_to_db(db_url, case_name, logger, pod_name,
         return False
 
 
+def get_resolvconf_ns():
+    nameservers = []
+    rconf = open("/etc/resolv.conf", "r")
+    line = rconf.readline()
+    while line:
+        ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", line)
+        if ip:
+            nameservers.append(ip.group())
+        line = rconf.readline()
+    return nameservers
+
 def getTestEnv(test, functest_yaml):
     # get the config of the testcase based on functest_config.yaml
     # 2 options
@@ -679,75 +695,69 @@ def get_ci_envvars():
     """
     ci_env_var = {
         "installer": os.environ.get('INSTALLER_TYPE'),
-        "controller": os.environ.get('SDN_CONTROLLER'),
-        "options": os.environ.get("OPNFV_FEATURE")}
+        "scenario": os.environ.get('DEPLOY_SCENARIO')}
     return ci_env_var
 
 
 def isTestRunnable(test, functest_yaml):
-    # check getTestEnv(test) and CI env var
-    # check installer, controller and options
-    # e.g. if test needs onos => do not run odl suite
-    try:
-        # By default we assume that all the tests are always runnable...
-        is_runnable = True
-        # Retrieve CI environment
-        ci_env = get_ci_envvars()
-
-        # Retrieve test environement from config file
-        test_env = getTestEnv(test, functest_yaml)
-
-        # if test_env not empty => dependencies to be checked
-        if test_env is not None and len(test_env) > 0:
-            # possible criteria = ["installer", "controller", "options"]
-            # consider test criteria from config file
-            # compare towards CI env through CI en variable
-            for criteria in test_env:
-                if test_env[criteria] != ci_env[criteria]:
-                    # print "Test "+ test + " cannot be run on the environment"
-                    is_runnable = False
-    except:
-        print "Error isTestRunnable:", sys.exc_info()[0]
+    # By default we assume that all the tests are always runnable...
+    is_runnable = True
+    # Retrieve CI environment
+    ci_env = get_ci_envvars()
+    # Retrieve test environement from config file
+    test_env = getTestEnv(test, functest_yaml)
+
+    # if test_env not empty => dependencies to be checked
+    if test_env is not None and len(test_env) > 0:
+        # possible criteria = ["installer", "scenario"]
+        # consider test criteria from config file
+        # compare towards CI env through CI en variable
+        for criteria in test_env:
+            if re.search(test_env[criteria], ci_env[criteria]) is None:
+                # print "Test "+ test + " cannot be run on the environment"
+                is_runnable = False
     return is_runnable
 
 
 def generateTestcaseList(functest_yaml):
-    try:
-        test_list = ""
-        # Retrieve CI environment
-        get_ci_envvars()
-
-        # get testcases
-        testcase_list = functest_yaml.get("test-dependencies")
-        projects = testcase_list.keys()
-        for project in projects:
-            testcases = testcase_list[project]
-            # 1 or 2 levels for testcases project[/case]
-            # if only project name without controller or scenario
-            # => shall be runnable on any controller/scenario
-            if testcases is None:
-                test_list += project + " "
-            else:
-                for testcase in testcases:
-                    if testcase == "controller" or testcase == "scenario":
-                        # project (1 level)
-                        if isTestRunnable(project, functest_yaml):
-                            test_list += project + " "
-                    else:
-                        # project/testcase (2 levels)
-                        thetest = project + "/" + testcase
-                        if isTestRunnable(thetest, functest_yaml):
-                            test_list += testcase + " "
-
-        # create a file that could be consumed by run-test.sh
-        file = open("testcase-list.txt", 'w')
-        file.write(test_list)
-        file.close()
-
-        return test_list
-
-        # test for each testcase if it is runnable
-        # towards the declared configuration
-        # generate the test config file
-    except:
-        print "Error generateTestcaseList:", sys.exc_info()[0]
+    test_list = ""
+    # get testcases
+    testcase_list = functest_yaml.get("test-dependencies")
+    projects = testcase_list.keys()
+
+    for project in projects:
+        testcases = testcase_list[project]
+        # 1 or 2 levels for testcases project[/case]
+        # if only project name without controller or scenario
+        # => shall be runnable on any controller/scenario
+        if testcases is None:
+            test_list += project + " "
+        else:
+            for testcase in testcases:
+                if testcase == "installer" or testcase == "scenario":
+                    # project (1 level)
+                    if isTestRunnable(project, functest_yaml):
+                        test_list += project + " "
+                else:
+                    # project/testcase (2 levels)
+                    thetest = project + "/" + testcase
+                    if isTestRunnable(thetest, functest_yaml):
+                        test_list += testcase + " "
+
+    # sort the list to execute the test in the right order
+    test_order_list = functest_yaml.get("test_exec_priority")
+    test_sorted_list = ""
+    for test in test_order_list:
+        if test_order_list[test] in test_list:
+            test_sorted_list += test_order_list[test] + " "
+
+    # create a file that could be consumed by run-test.sh
+    # this method is used only for CI
+    # so it can be run only in container
+    # reuse default conf directory to store the list of runnable tests
+    file = open("/home/opnfv/functest/conf/testcase-list.txt", 'w')
+    file.write(test_sorted_list)
+    file.close()
+
+    return test_sorted_list
+