303e8d1642b0bcbd0ab6ee58cd60087770fe02a3
[releng.git] / utils / test / result_collection_api / opnfv_testapi / resources / dashboard_handlers.py
1 ##############################################################################
2 # Copyright (c) 2015 Orange
3 # guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 from tornado.web import HTTPError
11
12 from opnfv_testapi.common.constants import HTTP_NOT_FOUND
13 from opnfv_testapi.dashboard.dashboard_utils import \
14     check_dashboard_ready_project, check_dashboard_ready_case, \
15     get_dashboard_result, get_dashboard_projects
16 from opnfv_testapi.resources.result_handlers import GenericResultHandler
17 from opnfv_testapi.resources.result_models import TestResult
18 from opnfv_testapi.tornado_swagger import swagger
19
20
21 class GenericDashboardHandler(GenericResultHandler):
22     def __init__(self, application, request, **kwargs):
23         super(GenericDashboardHandler, self).__init__(application,
24                                                       request,
25                                                       **kwargs)
26         self.table = self.db_results
27         self.table_cls = TestResult
28
29
30 class DashboardHandler(GenericDashboardHandler):
31     @swagger.operation(nickname='query')
32     def get(self):
33         """
34             @description: Retrieve dashboard ready result(s)
35                           for a test project
36             @notes: Retrieve dashboard ready result(s) for a test project
37                 Available filters for this request are :
38                  - project : project name
39                  - case : case name
40                  - pod : pod name
41                  - version : platform version (Arno-R1, ...)
42                  - installer (fuel, ...)
43                  - period : x (x last days)
44
45                 GET /dashboard?project=functest&case=vPing&version=Colorado \
46                 &pod=pod_name&period=15
47             @rtype: L{string}
48             @param pod: pod name
49             @type pod: L{string}
50             @in pod: query
51             @required pod: False
52             @param project: project name
53             @type project: L{string}
54             @in project: query
55             @required project: True
56             @param case: case name
57             @type case: L{string}
58             @in case: query
59             @required case: True
60             @param version: i.e. Colorado
61             @type version: L{string}
62             @in version: query
63             @required version: False
64             @param installer: fuel/apex/joid/compass
65             @type installer: L{string}
66             @in installer: query
67             @required installer: False
68             @param period: last days
69             @type period: L{string}
70             @in period: query
71             @required period: False
72             @return 200: test result exist
73             @raise 400: period is not in
74             @raise 404: project or case name missing,
75                         or project or case is not dashboard ready
76         """
77
78         project_arg = self.get_query_argument("project", None)
79         case_arg = self.get_query_argument("case", None)
80
81         # on /dashboard retrieve the list of projects and testcases
82         # ready for dashboard
83         if project_arg is None:
84             raise HTTPError(HTTP_NOT_FOUND, "Project name missing")
85
86         if not check_dashboard_ready_project(project_arg):
87             raise HTTPError(HTTP_NOT_FOUND,
88                             'Project [{}] not dashboard ready'
89                             .format(project_arg))
90
91         if case_arg is None:
92             raise HTTPError(
93                 HTTP_NOT_FOUND,
94                 'Test case missing for project [{}]'.format(project_arg))
95
96         if not check_dashboard_ready_case(project_arg, case_arg):
97             raise HTTPError(
98                 HTTP_NOT_FOUND,
99                 'Test case [{}] not dashboard ready for project [{}]'
100                 .format(case_arg, project_arg))
101
102         # special case of status for project
103         if case_arg == 'status':
104             self.finish_request(get_dashboard_result(project_arg, case_arg))
105         else:
106             def get_result(res, project, case):
107                 return get_dashboard_result(project, case, res)
108
109             self._list(self.set_query(), get_result, project_arg, case_arg)
110
111
112 class DashboardProjectsHandler(GenericDashboardHandler):
113     @swagger.operation(nickname='list')
114     def get(self):
115         """
116             @description: Retrieve dashboard ready project(s)
117             @rtype: L{list}
118             @return 200: return all dashboard ready project(s)
119         """
120         self.finish_request(get_dashboard_projects())