X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=utils%2Ftest%2Fresult_collection_api%2Fresources%2Fhandlers.py;h=fff16623736e8e7bff33099d6ad3d16af56751db;hb=ee593aa4a43aa7ecd2c92f62f2ae3b120d0492b9;hp=f8b26d090bb8fc277b4aceb7e5cc7c3244f34e6d;hpb=34afa756b383db9695745e3dab69cb925cf07b48;p=releng.git diff --git a/utils/test/result_collection_api/resources/handlers.py b/utils/test/result_collection_api/resources/handlers.py index f8b26d090..fff166237 100644 --- a/utils/test/result_collection_api/resources/handlers.py +++ b/utils/test/result_collection_api/resources/handlers.py @@ -13,11 +13,16 @@ from tornado.web import RequestHandler, asynchronous, HTTPError from tornado import gen from datetime import datetime, timedelta -from models import Pod, TestProject, TestCase, TestResult +from models import TestProject, TestCase, TestResult +from resources.pod_models import Pod from common.constants import DEFAULT_REPRESENTATION, HTTP_BAD_REQUEST, \ HTTP_NOT_FOUND, HTTP_FORBIDDEN from common.config import prepare_put_request +from dashboard.dashboard_utils import get_dashboard_cases, \ + check_dashboard_ready_project, check_dashboard_ready_case, \ + get_dashboard_result + class GenericApiHandler(RequestHandler): """ @@ -504,7 +509,12 @@ class TestResultsHandler(GenericApiHandler): - pod : pod name - version : platform version (Arno-R1, ...) - installer (fuel, ...) + - build_tag : Jenkins build tag name - period : x (x last days) + - scenario : the test scenario (previously version) + - criteria : the global criteria status passed or failed + - trust_indicator : evaluate the stability of the test case to avoid + running systematically long and stable test case :param result_id: Get a result by ID @@ -520,7 +530,11 @@ class TestResultsHandler(GenericApiHandler): pod_arg = self.get_query_argument("pod", None) version_arg = self.get_query_argument("version", None) installer_arg = self.get_query_argument("installer", None) + build_tag_arg = self.get_query_argument("build_tag", None) + scenario_arg = self.get_query_argument("scenario", None) + criteria_arg = self.get_query_argument("criteria", None) period_arg = self.get_query_argument("period", None) + trust_indicator_arg = self.get_query_argument("trust_indicator", None) # prepare request get_request = dict() @@ -540,6 +554,18 @@ class TestResultsHandler(GenericApiHandler): if installer_arg is not None: get_request["installer"] = installer_arg + if build_tag_arg is not None: + get_request["build_tag"] = build_tag_arg + + if scenario_arg is not None: + get_request["scenario"] = scenario_arg + + if criteria_arg is not None: + get_request["criteria_tag"] = criteria_arg + + if trust_indicator_arg is not None: + get_request["trust_indicator_arg"] = trust_indicator_arg + if period_arg is not None: try: period_arg = int(period_arg) @@ -548,7 +574,7 @@ class TestResultsHandler(GenericApiHandler): if period_arg > 0: period = datetime.now() - timedelta(days=period_arg) - obj = {"$gte": period} + obj = {"$gte": str(period)} get_request["creation_date"] = obj else: get_request["_id"] = result_id @@ -624,8 +650,150 @@ class TestResultsHandler(GenericApiHandler): test_result = TestResult.test_result_from_dict(self.json_args) test_result.creation_date = datetime.now() - future = self.db.test_results.insert(test_result.format()) + future = self.db.test_results.insert(test_result.format(), + check_keys=False) result = yield future test_result._id = result self.finish_request(test_result.format_http()) + + +class DashboardHandler(GenericApiHandler): + """ + DashboardHandler Class + Handle the requests about the Test project's results + in a dahboard ready format + HTTP Methdods : + - GET : Get all test results and details about a specific one + """ + def initialize(self): + """ Prepares the database for the entire class """ + super(DashboardHandler, self).initialize() + self.name = "dashboard" + + @asynchronous + @gen.coroutine + def get(self, result_id=None): + """ + Retrieve dashboard ready result(s) for a test project + Available filters for this request are : + - project : project name + - case : case name + - pod : pod name + - version : platform version (Arno-R1, ...) + - installer (fuel, ...) + - period : x (x last days) + + + :param result_id: Get a result by ID + :raise HTTPError + + GET /dashboard?project=functest&case=vPing&version=Arno-R1 \ + &pod=pod_name&period=15 + => get results with optional filters + """ + + project_arg = self.get_query_argument("project", None) + case_arg = self.get_query_argument("case", None) + pod_arg = self.get_query_argument("pod", None) + version_arg = self.get_query_argument("version", None) + installer_arg = self.get_query_argument("installer", None) + period_arg = self.get_query_argument("period", None) + + # prepare request + get_request = dict() + + # /dashboard?project=<>&pod=<>... + if (result_id is None): + if project_arg is not None: + get_request["project_name"] = project_arg + + if case_arg is not None: + get_request["case_name"] = case_arg + + if pod_arg is not None: + get_request["pod_name"] = pod_arg + + if version_arg is not None: + get_request["version"] = version_arg + + if installer_arg is not None: + get_request["installer"] = installer_arg + + if period_arg is not None: + try: + period_arg = int(period_arg) + except: + raise HTTPError(HTTP_BAD_REQUEST) + if period_arg > 0: + period = datetime.now() - timedelta(days=period_arg) + obj = {"$gte": str(period)} + get_request["creation_date"] = obj + else: + get_request["_id"] = result_id + + dashboard = [] + + # on /dashboard retrieve the list of projects and testcases + # ready for dashboard + if project_arg is None: + raise HTTPError(HTTP_NOT_FOUND, + "error:Project name missing") + elif check_dashboard_ready_project(project_arg, "./dashboard"): + res = [] + + if case_arg is None: + raise HTTPError( + HTTP_NOT_FOUND, + "error:Test case missing for project " + project_arg) + + # special case of status for project + if case_arg == "status": + del get_request["case_name"] + # retention time to be agreed + # last five days by default? + # TODO move to DB + period = datetime.now() - timedelta(days=5) + get_request["creation_date"] = {"$gte": period} + + # fetching results + cursor = self.db.test_results.find(get_request) + while (yield cursor.fetch_next): + test_result = TestResult.test_result_from_dict( + cursor.next_object()) + res.append(test_result.format_http()) + + if check_dashboard_ready_case(project_arg, case_arg): + dashboard = get_dashboard_result(project_arg, case_arg, res) + else: + raise HTTPError( + HTTP_NOT_FOUND, + "error:" + case_arg + + " test case not case dashboard ready on project " + + project_arg) + + else: + dashboard.append( + {"error": "Project not recognized or not dashboard ready"}) + dashboard.append( + {"Dashboard-ready-projects": + get_dashboard_cases("./dashboard")}) + raise HTTPError( + HTTP_NOT_FOUND, + "error: no dashboard ready data for this project") + + # fetching results + # cursor = self.db.test_results.find(get_request) + # while (yield cursor.fetch_next): + # test_result = TestResult.test_result_from_dict( + # cursor.next_object()) + # res.append(test_result.format_http()) + + # building meta object + meta = dict() + + # final response object + answer = dict() + answer["dashboard"] = dashboard + answer["meta"] = meta + self.finish_request(answer)