Merge "Modify YARDSTICK_DB_BACKEND value on zte-pod1."
[releng.git] / utils / test / result_collection_api / resources / handlers.py
index 27204a5..fff1662 100644 (file)
@@ -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
@@ -630,3 +656,144 @@ 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": 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)