summaryrefslogtreecommitdiffstats
path: root/utils/test/result_collection_api/resources
diff options
context:
space:
mode:
authorMorgan Richomme <morgan.richomme@orange.com>2015-10-17 18:19:12 +0200
committerMorgan Richomme <morgan.richomme@orange.com>2015-10-19 10:48:40 +0200
commit97ce096c0ed49a09301d762b812504f3038e9843 (patch)
tree36ea5a0c8cc463c8de6ac0c3e37a657a5f87ca8c /utils/test/result_collection_api/resources
parented1f97c622b272f91fe3bcb6fb1b8b65a27bd624 (diff)
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 <morgan.richomme@orange.com>
Diffstat (limited to 'utils/test/result_collection_api/resources')
-rw-r--r--utils/test/result_collection_api/resources/handlers.py134
-rw-r--r--utils/test/result_collection_api/resources/models.py8
2 files changed, 142 insertions, 0 deletions
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),
}