From a6df43da7ab4de653eecbc9b6380d5fc7ce7bc14 Mon Sep 17 00:00:00 2001 From: Cédric Ollivier Date: Sat, 20 Jan 2018 14:41:32 +0100 Subject: Move push_results_to_db to TestCase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It removes the link between TestCase and Functest utils (xtesting). It should be noted that testresults url can only be set by env var. Co-Authored-By: Cédric Ollivier Change-Id: Ie072c675890d0ae2e63619c599d2684a8c7d762d Signed-off-by: Jose Lausuch Signed-off-by: Cédric Ollivier --- functest/core/testcase.py | 71 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 14 deletions(-) (limited to 'functest/core') diff --git a/functest/core/testcase.py b/functest/core/testcase.py index fa380287..5894f5c0 100644 --- a/functest/core/testcase.py +++ b/functest/core/testcase.py @@ -9,10 +9,15 @@ """Define the parent class of all Functest TestCases.""" +from datetime import datetime +import json import logging import os +import re +import requests + +from functest.utils import decorators -import functest.utils.functest_utils as ft_utils import prettytable @@ -35,6 +40,8 @@ class TestCase(object): EX_TESTCASE_FAILED = os.EX_SOFTWARE - 2 """results are false""" + _job_name_rule = "(dai|week)ly-(.+?)-[0-9]*" + _headers = {'Content-Type': 'application/json'} __logger = logging.getLogger(__name__) def __init__(self, **kwargs): @@ -139,14 +146,16 @@ class TestCase(object): self.__logger.error("Run must be implemented") return TestCase.EX_RUN_ERROR + @decorators.can_dump_request_to_file def push_to_db(self): """Push the results of the test case to the DB. - It allows publishing the results and to check the status. + It allows publishing the results and checking the status. It could be overriden if the common implementation is not - suitable. The following attributes must be set before pushing - the results to DB: + suitable. + + The following attributes must be set before pushing the results to DB: * project_name, * case_name, @@ -154,6 +163,14 @@ class TestCase(object): * start_time, * stop_time. + The next vars must be set in env: + + * TEST_DB_URL, + * INSTALLER_TYPE, + * DEPLOY_SCENARIO, + * NODE_NAME, + * BUILD_TAG. + Returns: TestCase.EX_OK if results were pushed to DB. TestCase.EX_PUSH_TO_DB_ERROR otherwise. @@ -163,20 +180,46 @@ class TestCase(object): assert self.case_name assert self.start_time assert self.stop_time - pub_result = 'PASS' if self.is_successful( + url = os.environ['TEST_DB_URL'] + data = {"project_name": self.project_name, + "case_name": self.case_name, + "details": self.details} + data["installer"] = os.environ['INSTALLER_TYPE'] + data["scenario"] = os.environ['DEPLOY_SCENARIO'] + data["pod_name"] = os.environ['NODE_NAME'] + data["build_tag"] = os.environ['BUILD_TAG'] + data["criteria"] = 'PASS' if self.is_successful( ) == TestCase.EX_OK else 'FAIL' - if ft_utils.push_results_to_db( - self.project_name, self.case_name, self.start_time, - self.stop_time, pub_result, self.details): - self.__logger.info( - "The results were successfully pushed to DB") - return TestCase.EX_OK - else: - self.__logger.error("The results cannot be pushed to DB") - return TestCase.EX_PUSH_TO_DB_ERROR + data["start_date"] = datetime.fromtimestamp( + self.start_time).strftime('%Y-%m-%d %H:%M:%S') + data["stop_date"] = datetime.fromtimestamp( + self.stop_time).strftime('%Y-%m-%d %H:%M:%S') + try: + data["version"] = re.search( + TestCase._job_name_rule, + os.environ['BUILD_TAG']).group(2) + except Exception: # pylint: disable=broad-except + data["version"] = "unknown" + req = requests.post( + url, data=json.dumps(data, sort_keys=True), + headers=self._headers) + req.raise_for_status() + self.__logger.info( + "The results %s were successfully pushed to DB %s", data, url) + except AssertionError: + self.__logger.exception( + "Please run test before publishing the results") + return TestCase.EX_PUSH_TO_DB_ERROR + except KeyError as exc: + self.__logger.error("Please set env var: " + str(exc)) + return TestCase.EX_PUSH_TO_DB_ERROR + except requests.exceptions.HTTPError: + self.__logger.exception("The HTTP request raises issues") + return TestCase.EX_PUSH_TO_DB_ERROR except Exception: # pylint: disable=broad-except self.__logger.exception("The results cannot be pushed to DB") return TestCase.EX_PUSH_TO_DB_ERROR + return TestCase.EX_OK def clean(self): """Clean the resources. -- cgit 1.2.3-korg