Drop six
[functest-xtesting.git] / xtesting / core / testcase.py
index 58de9f4..15936f1 100644 (file)
@@ -16,24 +16,22 @@ import logging
 import mimetypes
 import os
 import re
-import sys
 
+from urllib.parse import urlparse
 import boto3
 from boto3.s3.transfer import TransferConfig
 import botocore
 import prettytable
 import requests
-import six
-from six.moves import urllib
 
 from xtesting.utils import decorators
 from xtesting.utils import env
+from xtesting.utils import constants
 
 __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
 
 
-@six.add_metaclass(abc.ABCMeta)
-class TestCase():
+class TestCase(metaclass=abc.ABCMeta):
     # pylint: disable=too-many-instance-attributes
     """Base model for single test case."""
 
@@ -55,9 +53,9 @@ class TestCase():
     EX_PUBLISH_ARTIFACTS_ERROR = os.EX_SOFTWARE - 4
     """publish_artifacts() failed"""
 
-    dir_results = "/var/lib/xtesting/results"
+    dir_results = constants.RESULTS_DIR
     _job_name_rule = "(dai|week)ly-(.+?)-[0-9]*"
-    _headers = {'Content-Type': 'application/json'}
+    headers = {'Content-Type': 'application/json'}
     __logger = logging.getLogger(__name__)
 
     def __init__(self, **kwargs):
@@ -69,9 +67,9 @@ class TestCase():
         self.start_time = 0
         self.stop_time = 0
         self.is_skipped = False
-        self.output_log_name = 'xtesting.log'
-        self.output_debug_log_name = 'xtesting.debug.log'
-        self.res_dir = "{}/{}".format(self.dir_results, self.case_name)
+        self.output_log_name = os.path.basename(constants.LOG_PATH)
+        self.output_debug_log_name = os.path.basename(constants.DEBUG_LOG_PATH)
+        self.res_dir = os.path.join(self.dir_results, self.case_name)
 
     def __str__(self):
         try:
@@ -107,8 +105,9 @@ class TestCase():
             assert self.stop_time
             if self.stop_time < self.start_time:
                 return "XX:XX"
-            return "{0[0]:02.0f}:{0[1]:02.0f}".format(divmod(
-                self.stop_time - self.start_time, 60))
+            return "{}:{}".format(
+                str(int(self.stop_time - self.start_time) // 60).zfill(2),
+                str(int(self.stop_time - self.start_time) % 60).zfill(2))
         except Exception:  # pylint: disable=broad-except
             self.__logger.error("Please run test before getting the duration")
             return "XX:XX"
@@ -234,16 +233,17 @@ class TestCase():
                 data["version"] = "unknown"
             req = requests.post(
                 url, data=json.dumps(data, sort_keys=True),
-                headers=self._headers)
+                headers=self.headers)
             req.raise_for_status()
-            if urllib.parse.urlparse(url).scheme != "file":
-                res_url = req.json()["href"]
-                if env.get('TEST_DB_EXT_URL'):
-                    res_url = res_url.replace(
-                        env.get('TEST_DB_URL'), env.get('TEST_DB_EXT_URL'))
+            if urlparse(url).scheme != "file":
+                # href must be postprocessed as OPNFV testapi is misconfigured
+                # (localhost is returned)
+                uid = re.sub(r'^.*/api/v1/results/*', '', req.json()["href"])
+                netloc = env.get('TEST_DB_EXT_URL') if env.get(
+                    'TEST_DB_EXT_URL') else env.get('TEST_DB_URL')
                 self.__logger.info(
                     "The results were successfully pushed to DB: \n\n%s\n",
-                    res_url)
+                    os.path.join(netloc, uid))
         except AssertionError:
             self.__logger.exception(
                 "Please run test before publishing the results")
@@ -286,7 +286,7 @@ class TestCase():
             multipart_threshold = 5 * 1024 ** 5 if "google" in os.environ[
                 "S3_ENDPOINT_URL"] else 8 * 1024 * 1024
             config = TransferConfig(multipart_threshold=multipart_threshold)
-            bucket_name = urllib.parse.urlparse(dst_s3_url).netloc
+            bucket_name = urlparse(dst_s3_url).netloc
             try:
                 b3resource.meta.client.head_bucket(Bucket=bucket_name)
             except botocore.exceptions.ClientError as exc:
@@ -295,12 +295,10 @@ class TestCase():
                     # pylint: disable=no-member
                     b3resource.create_bucket(Bucket=bucket_name)
                 else:
-                    typ, value, traceback = sys.exc_info()
-                    six.reraise(typ, value, traceback)
-            except Exception:  # pylint: disable=broad-except
-                typ, value, traceback = sys.exc_info()
-                six.reraise(typ, value, traceback)
-            path = urllib.parse.urlparse(dst_s3_url).path.strip("/")
+                    raise exc
+            except Exception as exc:  # pylint: disable=broad-except
+                raise exc
+            path = urlparse(dst_s3_url).path.strip("/")
             dst_http_url = os.environ["HTTP_DST_URL"]
             output_str = "\n"
             self.details["links"] = []