Add support for Rally OpenStack CI test cases
[functest.git] / functest / opnfv_tests / openstack / refstack / refstack.py
index a55b147..c709e56 100644 (file)
 
 import logging
 import os
-import shutil
-import time
-
-from refstack_client import list_parser
-from xtesting.core import testcase
-from xtesting.energy import energy
+import re
+import subprocess
+import yaml
 
 from functest.opnfv_tests.openstack.tempest import tempest
 from functest.utils import config
@@ -30,32 +27,57 @@ class Refstack(tempest.TempestCommon):
     defcorelist = os.path.join(
         getattr(config.CONF, 'dir_refstack_data'), 'defcore.txt')
 
-    def __init__(self, **kwargs):
-        if "case_name" not in kwargs:
-            kwargs["case_name"] = 'refstack'
-        super(Refstack, self).__init__(**kwargs)
-        self.res_dir = os.path.join(
-            getattr(config.CONF, 'dir_results'), 'refstack')
-        self.list = os.path.join(self.res_dir, 'tempest-list.txt')
-
-    @energy.enable_recording
-    def run(self, **kwargs):
-        """Start Refstack testcase."""
-        self.start_time = time.time()
+    def _extract_refstack_data(self):
+        yaml_data = ""
+        with open(self.defcorelist) as def_file:
+            for line in def_file:
+                try:
+                    grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line)
+                    yaml_data = "{}\n{}: {}".format(
+                        yaml_data, grp.group(1), grp.group(2))
+                except Exception:  # pylint: disable=broad-except
+                    self.__logger.warning("Cannot parse %s", line)
+        return yaml.load(yaml_data)
+
+    def _extract_tempest_data(self):
+        olddir = os.getcwd()
         try:
-            self.configure()
-            parser = list_parser.TestListParser(
-                getattr(config.CONF, 'dir_repo_tempest'))
-            nfile = parser.get_normalized_test_list(Refstack.defcorelist)
-            shutil.copyfile(nfile, self.list)
-            self.run_verifier_tests()
-            self.parse_verifier_result()
-            self.generate_report()
-            res = testcase.TestCase.EX_OK
-        except Exception:  # pylint: disable=broad-except
-            self.__logger.exception('Error with run')
-            res = testcase.TestCase.EX_RUN_ERROR
+            os.chdir(self.verifier_repo_dir)
+            cmd = ['stestr', 'list', '^tempest.']
+            output = subprocess.check_output(cmd)
+        except subprocess.CalledProcessError as cpe:
+            self.__logger.error(
+                "Exception when listing tempest tests: %s\n%s",
+                cpe.cmd, cpe.output)
+            raise
         finally:
-            self.resources.cleanup()
-        self.stop_time = time.time()
-        return res
+            os.chdir(olddir)
+        yaml_data2 = ""
+        for line in output.splitlines():
+            try:
+                grp = re.search(r'^([^\[]*)(\[.*\])\n*$', line)
+                yaml_data2 = "{}\n{}: {}".format(
+                    yaml_data2, grp.group(1), grp.group(2))
+            except Exception:  # pylint: disable=broad-except
+                self.__logger.warning("Cannot parse %s. skipping it", line)
+        return yaml.load(yaml_data2)
+
+    def generate_test_list(self, **kwargs):
+        self.backup_tempest_config(self.conf_file, '/etc')
+        refstack_data = self._extract_refstack_data()
+        tempest_data = self._extract_tempest_data()
+        with open(self.list, 'w') as ref_file:
+            for key in refstack_data.keys():
+                try:
+                    for data in tempest_data[key]:
+                        if data == refstack_data[key][0]:
+                            break
+                    else:
+                        self.__logger.info("%s: ids differ. skipping it", key)
+                        continue
+                    ref_file.write("{}{}\n".format(
+                        key, str(tempest_data[key]).replace(
+                            "'", "").replace(", ", ",")))
+                except Exception:  # pylint: disable=broad-except
+                    self.__logger.info("%s: not found. skipping it", key)
+                    continue