Fix tempest multisite config
[functest-xtesting.git] / functest / opnfv_tests / openstack / tempest / tempest.py
index 39df766..f925336 100644 (file)
@@ -35,73 +35,14 @@ class TempestCommon(testcase_base.TestcaseBase):
         self.OPTION = ""
         self.FLAVOR_ID = None
         self.IMAGE_ID = None
-        self.VERIFIER_ID = self.get_verifier_id()
-        self.VERIFIER_REPO_DIR = self.get_verifier_repo_dir()
-        self.DEPLOYMENT_ID = self.get_verifier_deployment_id()
-        self.DEPLOYMENT_DIR = self.get_verifier_deployment_dir()
+        self.VERIFIER_ID = conf_utils.get_verifier_id()
+        self.VERIFIER_REPO_DIR = conf_utils.get_verifier_repo_dir(
+            self.VERIFIER_ID)
+        self.DEPLOYMENT_ID = conf_utils.get_verifier_deployment_id()
+        self.DEPLOYMENT_DIR = conf_utils.get_verifier_deployment_dir(
+            self.VERIFIER_ID, self.DEPLOYMENT_ID)
         self.VERIFICATION_ID = None
 
-    @staticmethod
-    def get_verifier_id():
-        """
-        Returns verifer id for current Tempest
-        """
-        cmd = ("rally verify list-verifiers | awk '/" +
-               CONST.tempest_deployment_name +
-               "/ {print $2}'")
-        p = subprocess.Popen(cmd, shell=True,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-        deployment_uuid = p.stdout.readline().rstrip()
-        if deployment_uuid == "":
-            logger.error("Tempest verifier not found.")
-            raise Exception('Error with command:%s' % cmd)
-        return deployment_uuid
-
-    @staticmethod
-    def get_verifier_deployment_id():
-        """
-        Returns deployment id for active Rally deployment
-        """
-        cmd = ("rally deployment list | awk '/" +
-               CONST.rally_deployment_name +
-               "/ {print $2}'")
-        p = subprocess.Popen(cmd, shell=True,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-        deployment_uuid = p.stdout.readline().rstrip()
-        if deployment_uuid == "":
-            logger.error("Rally deployment not found.")
-            raise Exception('Error with command:%s' % cmd)
-        return deployment_uuid
-
-    def get_verifier_repo_dir(self):
-        """
-        Returns installed verfier repo directory for Tempest
-        """
-        if not self.VERIFIER_ID:
-            self.VERIFIER_ID = self.get_verifier_id()
-
-        return os.path.join(CONST.dir_rally_inst,
-                            'verification',
-                            'verifier-{}'.format(self.VERIFIER_ID),
-                            'repo')
-
-    def get_verifier_deployment_dir(self):
-        """
-        Returns Rally deployment directory for current verifier
-        """
-        if not self.VERIFIER_ID:
-            self.VERIFIER_ID = self.get_verifier_id()
-
-        if not self.DEPLOYMENT_ID:
-            self.DEPLOYMENT_ID = self.get_verifier_deployment_id()
-
-        return os.path.join(CONST.dir_rally_inst,
-                            'verification',
-                            'verifier-{}'.format(self.VERIFIER_ID),
-                            'for-deployment-{}'.format(self.DEPLOYMENT_ID))
-
     @staticmethod
     def read_file(filename):
         with open(filename) as src:
@@ -116,7 +57,7 @@ class TempestCommon(testcase_base.TestcaseBase):
             CONST.tempest_identity_tenant_name,
             CONST.tempest_identity_tenant_description)
         if not tenant_id:
-            logger.error("Error : Failed to create %s tenant"
+            logger.error("Failed to create %s tenant"
                          % CONST.tempest_identity_tenant_name)
 
         user_id = os_utils.create_user(keystone_client,
@@ -124,7 +65,7 @@ class TempestCommon(testcase_base.TestcaseBase):
                                        CONST.tempest_identity_user_password,
                                        None, tenant_id)
         if not user_id:
-            logger.error("Error : Failed to create %s user" %
+            logger.error("Failed to create %s user" %
                          CONST.tempest_identity_user_name)
 
         logger.debug("Creating private network for Tempest suite")
@@ -133,8 +74,8 @@ class TempestCommon(testcase_base.TestcaseBase):
             CONST.tempest_private_subnet_name,
             CONST.tempest_router_name,
             CONST.tempest_private_subnet_cidr)
-        if not network_dic:
-            return testcase_base.TestcaseBase.EX_RUN_ERROR
+        if network_dic is None:
+            raise Exception('Failed to create private network')
 
         if CONST.tempest_use_custom_images:
             # adding alternative image should be trivial should we need it
@@ -142,8 +83,8 @@ class TempestCommon(testcase_base.TestcaseBase):
             _, self.IMAGE_ID = os_utils.get_or_create_image(
                 CONST.openstack_image_name, conf_utils.GLANCE_IMAGE_PATH,
                 CONST.openstack_image_disk_format)
-            if not self.IMAGE_ID:
-                return testcase_base.TestcaseBase.EX_RUN_ERROR
+            if self.IMAGE_ID is None:
+                raise Exception('Failed to create image')
 
         if CONST.tempest_use_custom_flavors:
             # adding alternative flavor should be trivial should we need it
@@ -153,10 +94,8 @@ class TempestCommon(testcase_base.TestcaseBase):
                 CONST.openstack_flavor_ram,
                 CONST.openstack_flavor_disk,
                 CONST.openstack_flavor_vcpus)
-            if not self.FLAVOR_ID:
-                return testcase_base.TestcaseBase.EX_RUN_ERROR
-
-        return testcase_base.TestcaseBase.EX_OK
+            if self.FLAVOR_ID is None:
+                raise Exception('Failed to create flavor')
 
     def generate_test_list(self, verifier_repo_dir):
         logger.debug("Generating test case list...")
@@ -168,14 +107,13 @@ class TempestCommon(testcase_base.TestcaseBase):
                 shutil.copyfile(
                     conf_utils.TEMPEST_CUSTOM, conf_utils.TEMPEST_RAW_LIST)
             else:
-                logger.error("Tempest test list file %s NOT found."
-                             % conf_utils.TEMPEST_CUSTOM)
-                return testcase_base.TestcaseBase.EX_RUN_ERROR
+                raise Exception("Tempest test list file %s NOT found."
+                                % conf_utils.TEMPEST_CUSTOM)
         else:
             if self.MODE == 'smoke':
                 testr_mode = "smoke"
             elif self.MODE == 'feature_multisite':
-                testr_mode = " | grep -i kingbird "
+                testr_mode = "'[Kk]ingbird'"
             elif self.MODE == 'full':
                 testr_mode = ""
             else:
@@ -187,8 +125,6 @@ class TempestCommon(testcase_base.TestcaseBase):
                                   conf_utils.TEMPEST_RAW_LIST))
             ft_utils.execute_command(cmd)
 
-        return testcase_base.TestcaseBase.EX_OK
-
     def apply_tempest_blacklist(self):
         logger.debug("Applying tempest blacklist...")
         cases_file = self.read_file(conf_utils.TEMPEST_RAW_LIST)
@@ -223,7 +159,6 @@ class TempestCommon(testcase_base.TestcaseBase):
             else:
                 result_file.write(str(cases_line) + '\n')
         result_file.close()
-        return testcase_base.TestcaseBase.EX_OK
 
     def _parse_verification_id(line):
         first_pos = line.index("UUID=") + len("UUID=")
@@ -276,7 +211,7 @@ class TempestCommon(testcase_base.TestcaseBase):
         f_env.close()
 
     def parse_verifier_result(self):
-        if not self.VERIFICATION_ID:
+        if self.VERIFICATION_ID is None:
             raise Exception('Verification UUID not found')
 
         cmd_line = "rally verify show --uuid {}".format(self.VERIFICATION_ID)
@@ -297,10 +232,27 @@ class TempestCommon(testcase_base.TestcaseBase):
                 num_success = new_line[2]
             elif 'Skipped' in new_line:
                 num_skipped = new_line[2]
+            elif 'Failures' in new_line:
+                num_failures = new_line[2]
 
         try:
             num_executed = int(num_tests) - int(num_skipped)
             success_rate = 100 * int(num_success) / int(num_executed)
+            with open(os.path.join(conf_utils.TEMPEST_RESULTS_DIR,
+                                   "tempest.log"), 'r') as logfile:
+                output = logfile.read()
+
+            error_logs = ""
+            for match in re.findall('(.*?)[. ]*fail ', output):
+                error_logs += match
+            skipped_testcase = ""
+            for match in re.findall('(.*?)[. ]*skip:', output):
+                skipped_testcase += match
+
+            self.details = {"tests": int(num_tests),
+                            "failures": int(num_failures),
+                            "errors": error_logs,
+                            "skipped": skipped_testcase}
         except Exception:
             success_rate = 0
 
@@ -316,30 +268,23 @@ class TempestCommon(testcase_base.TestcaseBase):
         if not os.path.exists(conf_utils.TEMPEST_RESULTS_DIR):
             os.makedirs(conf_utils.TEMPEST_RESULTS_DIR)
 
-        # Pre-configuration
-        res = self.create_tempest_resources()
-        if res != testcase_base.TestcaseBase.EX_OK:
-            return res
-
-        res = conf_utils.configure_tempest(logger,
-                                           self.DEPLOYMENT_DIR,
-                                           self.IMAGE_ID,
-                                           self.FLAVOR_ID)
-        if res != testcase_base.TestcaseBase.EX_OK:
-            return res
-
-        res = self.generate_test_list(self.VERIFIER_REPO_DIR)
-        if res != testcase_base.TestcaseBase.EX_OK:
-            return res
-
-        res = self.apply_tempest_blacklist()
-        if res != testcase_base.TestcaseBase.EX_OK:
-            return res
-
-        self.run_verifier_tests()
-        self.parse_verifier_result()
+        try:
+            self.create_tempest_resources()
+            conf_utils.configure_tempest(self.DEPLOYMENT_DIR,
+                                         self.IMAGE_ID,
+                                         self.FLAVOR_ID,
+                                         self.MODE)
+            self.generate_test_list(self.VERIFIER_REPO_DIR)
+            self.apply_tempest_blacklist()
+            self.run_verifier_tests()
+            self.parse_verifier_result()
+            res = testcase_base.TestcaseBase.EX_OK
+        except Exception as e:
+            logger.error('Error with run: %s' % e)
+            res = testcase_base.TestcaseBase.EX_RUN_ERROR
 
         self.stop_time = time.time()
+        return res
 
 
 class TempestSmokeSerial(TempestCommon):
@@ -375,7 +320,6 @@ class TempestMultisite(TempestCommon):
         self.case_name = "multisite"
         self.MODE = "feature_multisite"
         self.OPTION = "--concurrency 1"
-        conf_utils.configure_tempest_multisite(logger, self.DEPLOYMENT_DIR)
 
 
 class TempestCustom(TempestCommon):