3 from opnfv_testapi.common import message
4 from opnfv_testapi.common import raises
5 from opnfv_testapi.resources import handlers
6 import opnfv_testapi.resources.scenario_models as models
7 from opnfv_testapi.tornado_swagger import swagger
10 class GenericScenarioHandler(handlers.GenericApiHandler):
11 def __init__(self, application, request, **kwargs):
12 super(GenericScenarioHandler, self).__init__(application,
15 self.table = self.db_scenarios
16 self.table_cls = models.Scenario
19 class ScenariosCLHandler(GenericScenarioHandler):
20 @swagger.operation(nickname="queryScenarios")
23 @description: Retrieve scenario(s).
24 @notes: Retrieve scenario(s)
25 Available filters for this request are :
26 - name : scenario name
28 GET /scenarios?name=scenario_1
29 @param name: scenario name
33 @param installer: installer type
34 @type installer: L{string}
36 @required installer: False
37 @param version: version
38 @type version: L{string}
40 @required version: False
41 @param project: project name
42 @type project: L{string}
44 @required project: False
45 @return 200: all scenarios satisfy queries,
46 empty list if no scenario is found
53 for k in self.request.query_arguments.keys():
54 v = self.get_query_argument(k)
56 elem_query["installer"] = v
58 elem_query["versions.version"] = v
60 elem_query["versions.projects.project"] = v
64 query['installers'] = {'$elemMatch': elem_query}
67 self._list(query=_set_query())
69 @swagger.operation(nickname="createScenario")
72 @description: create a new scenario by name
73 @param body: scenario to be created
74 @type body: L{ScenarioCreateRequest}
76 @rtype: L{CreateResponse}
77 @return 200: scenario is created.
78 @raise 403: scenario already exists
79 @raise 400: body or name not provided
82 return {'name': self.json_args.get('name')}
83 miss_fields = ['name']
84 self._create(miss_fields=miss_fields, query=query)
87 class ScenarioGURHandler(GenericScenarioHandler):
88 @swagger.operation(nickname='getScenarioByName')
91 @description: get a single scenario by name
93 @return 200: scenario exist
94 @raise 404: scenario not exist
96 self._get_one(query={'name': name})
99 @swagger.operation(nickname="updateScenarioByName")
102 @description: update a single scenario by name
103 @param body: fields to be updated
104 @type body: L{ScenarioUpdateRequest}
107 @return 200: update success
108 @raise 404: scenario not exist
109 @raise 403: nothing to update
111 query = {'name': name}
113 self._update(query=query, db_keys=db_keys)
115 @swagger.operation(nickname="deleteScenarioByName")
116 def delete(self, name):
118 @description: delete a scenario by name
119 @return 200: delete success
120 @raise 404: scenario not exist:
123 self._delete(query={'name': name})
125 def _update_query(self, keys, data):
127 if self._is_rename():
128 new = self._term.get('name')
129 if data.get('name') != new:
134 def _update_requests(self, data):
136 ('name', 'update'): self._update_requests_rename,
137 ('installer', 'add'): self._update_requests_add_installer,
138 ('installer', 'delete'): self._update_requests_delete_installer,
139 ('version', 'add'): self._update_requests_add_version,
140 ('version', 'delete'): self._update_requests_delete_version,
141 ('owner', 'update'): self._update_requests_change_owner,
142 ('project', 'add'): self._update_requests_add_project,
143 ('project', 'delete'): self._update_requests_delete_project,
144 ('customs', 'add'): self._update_requests_add_customs,
145 ('customs', 'delete'): self._update_requests_delete_customs,
146 ('score', 'add'): self._update_requests_add_score,
147 ('trust_indicator', 'add'): self._update_requests_add_ti,
150 updates[(self._field, self._op)](data)
154 def _iter_installers(xstep):
155 @functools.wraps(xstep)
156 def magic(self, data):
157 [xstep(self, installer)
158 for installer in self._filter_installers(data.installers)]
161 def _iter_versions(xstep):
162 @functools.wraps(xstep)
163 def magic(self, installer):
164 [xstep(self, version)
165 for version in (self._filter_versions(installer.versions))]
168 def _iter_projects(xstep):
169 @functools.wraps(xstep)
170 def magic(self, version):
171 [xstep(self, project)
172 for project in (self._filter_projects(version.projects))]
175 def _update_requests_rename(self, data):
176 data.name = self._term.get('name')
178 raises.BadRequest(message.missing('name'))
180 def _update_requests_add_installer(self, data):
181 data.installers.append(models.ScenarioInstaller.from_dict(self._term))
183 def _update_requests_delete_installer(self, data):
184 data.installers = self._remove_installers(data.installers)
187 def _update_requests_add_version(self, installer):
188 installer.versions.append(models.ScenarioVersion.from_dict(self._term))
191 def _update_requests_delete_version(self, installer):
192 installer.versions = self._remove_versions(installer.versions)
196 def _update_requests_change_owner(self, version):
197 version.owner = self._term.get('owner')
201 def _update_requests_add_project(self, version):
202 version.projects.append(models.ScenarioProject.from_dict(self._term))
206 def _update_requests_delete_project(self, version):
207 version.projects = self._remove_projects(version.projects)
212 def _update_requests_add_customs(self, project):
213 project.customs = list(set(project.customs + self._term))
218 def _update_requests_delete_customs(self, project):
219 project.customs = filter(
220 lambda f: f not in self._term,
226 def _update_requests_add_score(self, project):
227 project.scores.append(
228 models.ScenarioScore.from_dict(self._term))
233 def _update_requests_add_ti(self, project):
234 project.trust_indicators.append(
235 models.ScenarioTI.from_dict(self._term))
237 def _is_rename(self):
238 return self._field == 'name' and self._op == 'update'
240 def _remove_installers(self, installers):
241 return self._remove('installer', installers)
243 def _filter_installers(self, installers):
244 return self._filter('installer', installers)
246 def _remove_versions(self, versions):
247 return self._remove('version', versions)
249 def _filter_versions(self, versions):
250 return self._filter('version', versions)
252 def _remove_projects(self, projects):
253 return self._remove('project', projects)
255 def _filter_projects(self, projects):
256 return self._filter('project', projects)
258 def _remove(self, field, fields):
260 lambda f: getattr(f, field) != self._locate.get(field),
263 def _filter(self, field, fields):
265 lambda f: getattr(f, field) == self._locate.get(field),
270 return self.json_args.get('field')
274 return self.json_args.get('op')
278 return self.json_args.get('locate')
282 return self.json_args.get('term')