Merge "Enable CI notification when the image build failed"
[releng.git] / utils / test / testapi / opnfv_testapi / resources / scenario_handlers.py
1 from opnfv_testapi.common.constants import HTTP_FORBIDDEN
2 from opnfv_testapi.resources.handlers import GenericApiHandler
3 from opnfv_testapi.resources.scenario_models import Scenario
4 from opnfv_testapi.tornado_swagger import swagger
5
6
7 class GenericScenarioHandler(GenericApiHandler):
8     def __init__(self, application, request, **kwargs):
9         super(GenericScenarioHandler, self).__init__(application,
10                                                      request,
11                                                      **kwargs)
12         self.table = self.db_scenarios
13         self.table_cls = Scenario
14
15
16 class ScenariosCLHandler(GenericScenarioHandler):
17     @swagger.operation(nickname="queryScenarios")
18     def get(self):
19         """
20             @description: Retrieve scenario(s).
21             @notes: Retrieve scenario(s)
22                 Available filters for this request are :
23                  - name : scenario name
24
25                 GET /scenarios?name=scenario_1
26             @param name: scenario name
27             @type name: L{string}
28             @in name: query
29             @required name: False
30             @param installer: installer type
31             @type installer: L{string}
32             @in installer: query
33             @required installer: False
34             @param version: version
35             @type version: L{string}
36             @in version: query
37             @required version: False
38             @param project: project name
39             @type project: L{string}
40             @in project: query
41             @required project: False
42             @return 200: all scenarios satisfy queries,
43                          empty list if no scenario is found
44             @rtype: L{Scenarios}
45         """
46
47         def _set_query():
48             query = dict()
49             elem_query = dict()
50             for k in self.request.query_arguments.keys():
51                 v = self.get_query_argument(k)
52                 if k == 'installer':
53                     elem_query["installer"] = v
54                 elif k == 'version':
55                     elem_query["versions.version"] = v
56                 elif k == 'project':
57                     elem_query["versions.projects.project"] = v
58                 else:
59                     query[k] = v
60             if elem_query:
61                 query['installers'] = {'$elemMatch': elem_query}
62             return query
63
64         self._list(_set_query())
65
66     @swagger.operation(nickname="createScenario")
67     def post(self):
68         """
69             @description: create a new scenario by name
70             @param body: scenario to be created
71             @type body: L{ScenarioCreateRequest}
72             @in body: body
73             @rtype: L{CreateResponse}
74             @return 200: scenario is created.
75             @raise 403: scenario already exists
76             @raise 400:  body or name not provided
77         """
78         def query(data):
79             return {'name': data.name}
80
81         def error(data):
82             message = '{} already exists as a scenario'.format(data.name)
83             return HTTP_FORBIDDEN, message
84
85         miss_checks = ['name']
86         db_checks = [(self.table, False, query, error)]
87         self._create(miss_checks=miss_checks, db_checks=db_checks)
88
89
90 class ScenarioGURHandler(GenericScenarioHandler):
91     @swagger.operation(nickname='getScenarioByName')
92     def get(self, name):
93         """
94             @description: get a single scenario by name
95             @rtype: L{Scenario}
96             @return 200: scenario exist
97             @raise 404: scenario not exist
98         """
99         self._get_one({'name': name})
100         pass
101
102     @swagger.operation(nickname="updateScenarioByName")
103     def put(self, name):
104         """
105             @description: update a single scenario by name
106             @param body: fields to be updated
107             @type body: L{ScenarioCreateRequest}
108             @in body: body
109             @rtype: L{Scenario}
110             @return 200: update success
111             @raise 404: scenario not exist
112             @raise 403: nothing to update
113         """
114         pass