Merge "modify old naming Testcase_base to TestCase"
[functest.git] / functest / opnfv_tests / openstack / refstack_client / refstack_client.py
index d388dcd..101bf73 100755 (executable)
@@ -7,23 +7,27 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 import argparse
 import os
+import re
 import sys
+import subprocess
+import time
 
-from functest.core import testcase_base
+from functest.core import testcase
 from functest.opnfv_tests.openstack.tempest import conf_utils
-from functest.utils import openstack_utils
 from functest.utils.constants import CONST
 import functest.utils.functest_logger as ft_logger
 import functest.utils.functest_utils as ft_utils
+from tempest_conf import TempestConf
 
 """ logging configuration """
 logger = ft_logger.Logger("refstack_defcore").getLogger()
 
 
-class RefstackClient(testcase_base.TestcaseBase):
+class RefstackClient(testcase.TestCase):
 
     def __init__(self):
         super(RefstackClient, self).__init__()
+        self.case_name = "refstack_defcore"
         self.FUNCTEST_TEST = CONST.dir_functest_test
         self.CONF_PATH = CONST.refstack_tempest_conf_path
         self.DEFCORE_LIST = CONST.refstack_defcore_list
@@ -31,12 +35,6 @@ class RefstackClient(testcase_base.TestcaseBase):
                                      self.CONF_PATH)
         self.defcorelist = os.path.join(self.FUNCTEST_TEST,
                                         self.DEFCORE_LIST)
-        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)
 
     def source_venv(self):
 
@@ -63,54 +61,138 @@ class RefstackClient(testcase_base.TestcaseBase):
                "cd -;".format(CONST.dir_refstack_client,
                               self.confpath,
                               self.defcorelist))
-        ft_utils.execute_command(cmd)
-
-    def defcore_env_prepare(self):
+        logger.info("Starting Refstack_defcore test case: '%s'." % cmd)
+
+        header = ("Refstack environment:\n"
+                  "  SUT: %s\n  Scenario: %s\n  Node: %s\n  Date: %s\n" %
+                  (CONST.INSTALLER_TYPE,
+                   CONST.DEPLOY_SCENARIO,
+                   CONST.NODE_NAME,
+                   time.strftime("%a %b %d %H:%M:%S %Z %Y")))
+
+        f_stdout = open(
+            os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
+                         "refstack.log"), 'w+')
+        f_env = open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
+                                  "environment.log"), 'w+')
+        f_env.write(header)
+
+        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
+                             stderr=subprocess.STDOUT, bufsize=1)
+
+        with p.stdout:
+            for line in iter(p.stdout.readline, b''):
+                if 'Tests' in line:
+                    break
+                if re.search("\} tempest\.", line):
+                    logger.info(line.replace('\n', ''))
+                f_stdout.write(line)
+        p.wait()
+
+        f_stdout.close()
+        f_env.close()
+
+    def parse_refstack_result(self):
         try:
-            img_flavor_dict = conf_utils.create_tempest_resources(
-                use_custom_images=True, use_custom_flavors=True)
-            conf_utils.configure_tempest_defcore(
-                self.DEPLOYMENT_DIR, img_flavor_dict)
-            self.source_venv()
-            res = testcase_base.TestcaseBase.EX_OK
-        except KeyError as e:
-            logger.error("defcore prepare env error with: %s", e)
-            res = testcase_base.TestcaseBase.EX_RUN_ERROR
-
-        return res
+            with open(os.path.join(conf_utils.REFSTACK_RESULTS_DIR,
+                                   "refstack.log"), 'r') as logfile:
+                output = logfile.read()
+
+            for match in re.findall("Ran: (\d+) tests in (\d+\.\d{4}) sec.",
+                                    output):
+                num_tests = match[0]
+                logger.info("Ran: %s tests in %s sec." % (num_tests, match[1]))
+            for match in re.findall("(- Passed: )(\d+)", output):
+                num_success = match[1]
+                logger.info("".join(match))
+            for match in re.findall("(- Skipped: )(\d+)", output):
+                num_skipped = match[1]
+                logger.info("".join(match))
+            for match in re.findall("(- Failed: )(\d+)", output):
+                num_failures = match[1]
+                logger.info("".join(match))
+            success_testcases = ""
+            for match in re.findall(r"\{0\}(.*?)[. ]*ok", output):
+                success_testcases += match + ", "
+            failed_testcases = ""
+            for match in re.findall(r"\{0\}(.*?)[. ]*FAILED", output):
+                failed_testcases += match + ", "
+            skipped_testcases = ""
+            for match in re.findall(r"\{0\}(.*?)[. ]*SKIPPED:", output):
+                skipped_testcases += match + ", "
+
+            num_executed = int(num_tests) - int(num_skipped)
+            success_rate = 100 * int(num_success) / int(num_executed)
+
+            self.details = {"tests": int(num_tests),
+                            "failures": int(num_failures),
+                            "success": success_testcases,
+                            "errors": failed_testcases,
+                            "skipped": skipped_testcases}
+        except Exception:
+            success_rate = 0
+
+        self.criteria = ft_utils.check_success_rate(
+            self.case_name, success_rate)
+        logger.info("Testcase %s success_rate is %s%%, is marked as %s"
+                    % (self.case_name, success_rate, self.criteria))
 
     def run(self):
+        '''used for functest command line,
+           functest testcase run refstack_defcore'''
+        self.start_time = time.time()
+
+        if not os.path.exists(conf_utils.REFSTACK_RESULTS_DIR):
+            os.makedirs(conf_utils.REFSTACK_RESULTS_DIR)
+
         try:
-            self.defcore_env_prepare()
+            tempestconf = TempestConf()
+            tempestconf.generate_tempestconf()
+            self.source_venv()
             self.run_defcore_default()
-            res = testcase_base.TestcaseBase.EX_OK
+            self.parse_refstack_result()
+            res = testcase.TestCase.EX_OK
         except Exception as e:
             logger.error('Error with run: %s', e)
-            res = testcase_base.TestcaseBase.EX_RUN_ERROR
+            res = testcase.TestCase.EX_RUN_ERROR
 
+        self.stop_time = time.time()
         return res
 
+    def _prep_test(self):
+        '''Check that the config file exists.'''
+        if not os.path.isfile(self.confpath):
+            logger.error("Conf file not valid: %s" % self.confpath)
+        if not os.path.isfile(self.testlist):
+            logger.error("testlist file not valid: %s" % self.testlist)
+
     def main(self, **kwargs):
+        '''used for manually running,
+           python refstack_client.py -c <tempest_conf_path>
+           --testlist <testlist_path>
+           can generate a reference tempest.conf by
+           python tempest_conf.py
+        '''
         try:
-            tempestconf = kwargs['config']
-            testlist = kwargs['testlist']
+            self.confpath = kwargs['config']
+            self.testlist = kwargs['testlist']
         except KeyError as e:
             logger.error("Cannot run refstack client. Please check "
                          "%s", e)
             return self.EX_RUN_ERROR
         try:
-            openstack_utils.source_credentials(CONST.openstack_creds)
-            self.defcore_env_prepare()
-            self.run_defcore(tempestconf, testlist)
-            res = testcase_base.TestcaseBase.EX_OK
+            self.source_venv()
+            self._prep_test()
+            self.run_defcore(self.confpath, self.testlist)
+            res = testcase.TestcaseBase.EX_OK
         except Exception as e:
             logger.error('Error with run: %s', e)
-            res = testcase_base.TestcaseBase.EX_RUN_ERROR
+            res = testcase.TestCase.EX_RUN_ERROR
 
         return res
 
 
-class RefstackClientParser(testcase_base.TestcaseBase):
+class RefstackClientParser(testcase.TestCase):
 
     def __init__(self):
         super(RefstackClientParser, self).__init__()
@@ -143,7 +225,7 @@ if __name__ == '__main__':
     args = parser.parse_args(sys.argv[1:])
     try:
         result = refstackclient.main(**args)
-        if result != testcase_base.TestcaseBase.EX_OK:
+        if result != testcase.TestCase.EX_OK:
             sys.exit(result)
     except Exception:
-        sys.exit(testcase_base.TestcaseBase.EX_RUN_ERROR)
+        sys.exit(testcase.TestCase.EX_RUN_ERROR)