From 97ce096c0ed49a09301d762b812504f3038e9843 Mon Sep 17 00:00:00 2001 From: Morgan Richomme Date: Sat, 17 Oct 2015 18:19:12 +0200 Subject: add dashboard method to test result collection API + add new fields in pod section JIRA: RELENG-45 Change-Id: I8e833207b7014d7fd07769af415a4892b9e9d924 Signed-off-by: Morgan Richomme --- .../result_collection_api/resources/handlers.py | 134 +++++++++++++++++++++ .../test/result_collection_api/resources/models.py | 8 ++ 2 files changed, 142 insertions(+) (limited to 'utils/test/result_collection_api/resources') diff --git a/utils/test/result_collection_api/resources/handlers.py b/utils/test/result_collection_api/resources/handlers.py index 27204a5b3..85c6172a5 100644 --- a/utils/test/result_collection_api/resources/handlers.py +++ b/utils/test/result_collection_api/resources/handlers.py @@ -18,6 +18,10 @@ 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): """ @@ -630,3 +634,133 @@ class TestResultsHandler(GenericApiHandler): 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": 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 = [] + # 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 case_arg is None: + raise HTTPError( + HTTP_NOT_FOUND, + "error:Test case missing for project " + project_arg) + elif 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) diff --git a/utils/test/result_collection_api/resources/models.py b/utils/test/result_collection_api/resources/models.py index 3b4d843f3..6829416bc 100644 --- a/utils/test/result_collection_api/resources/models.py +++ b/utils/test/result_collection_api/resources/models.py @@ -14,6 +14,8 @@ class Pod: self._id = "" self.name = "" self.creation_date = "" + self.mode = "" + self.details = "" @staticmethod def pod_from_dict(pod_dict): @@ -24,11 +26,15 @@ class Pod: p._id = pod_dict.get('_id') p.creation_date = str(pod_dict.get('creation_date')) p.name = pod_dict.get('name') + p.mode = pod_dict.get('mode') + p.details = pod_dict.get('details') return p def format(self): return { "name": self.name, + "mode": self.mode, + "details": self.details, "creation_date": str(self.creation_date), } @@ -36,6 +42,8 @@ class Pod: return { "_id": str(self._id), "name": self.name, + "mode": self.mode, + "details": self.details, "creation_date": str(self.creation_date), } -- cgit 1.2.3-korg