From 015ee1e72119dbc884cecbaf6149922850df7223 Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Mon, 14 Aug 2017 17:41:02 +0800 Subject: update scenario scores update score url: POST /api/v1/scenarios//scores? \ installer=& \ version=& \ project= add new score record interface add unit test add swagger specification Change-Id: Ib7bb31f303a9a9402325476bfdadb58aa0df560e Signed-off-by: SerenaFeng --- .../opnfv_testapi/resources/scenario_handlers.py | 131 ++++++++++++++++++++- 1 file changed, 129 insertions(+), 2 deletions(-) (limited to 'testapi/opnfv_testapi/resources') diff --git a/testapi/opnfv_testapi/resources/scenario_handlers.py b/testapi/opnfv_testapi/resources/scenario_handlers.py index 1c4ff48..a89e7ee 100644 --- a/testapi/opnfv_testapi/resources/scenario_handlers.py +++ b/testapi/opnfv_testapi/resources/scenario_handlers.py @@ -1,5 +1,7 @@ -import opnfv_testapi.resources.scenario_models as models +import functools + from opnfv_testapi.resources import handlers +import opnfv_testapi.resources.scenario_models as models from opnfv_testapi.tornado_swagger import swagger @@ -11,6 +13,24 @@ class GenericScenarioHandler(handlers.GenericApiHandler): self.table = self.db_scenarios self.table_cls = models.Scenario + def set_query(self, filters): + query = dict() + elem_query = dict() + for k, v in filters.iteritems(): + if k == 'scenario': + query['name'] = v + elif k == 'installer': + elem_query["installer"] = v + elif k == 'version': + elem_query["versions.version"] = v + elif k == 'project': + elem_query["versions.projects.project"] = v + else: + query[k] = v + if elem_query: + query['installers'] = {'$elemMatch': elem_query} + return query + class ScenariosCLHandler(GenericScenarioHandler): @swagger.operation(nickname="queryScenarios") @@ -102,5 +122,112 @@ class ScenarioGURHandler(GenericScenarioHandler): @return 200: delete success @raise 404: scenario not exist: """ - self._delete(query={'name': name}) + + +class ScenarioUpdater(object): + def __init__(self, data, body=None, + installer=None, version=None, project=None): + self.data = data + self.body = body + self.installer = installer + self.version = version + self.project = project + + def update(self, item, op): + updates = { + ('score', 'add'): self._update_requests_add_score, + } + updates[(item, op)](self.data) + + return self.data.format() + + def iter_installers(xstep): + @functools.wraps(xstep) + def magic(self, data): + [xstep(self, installer) + for installer in self._filter_installers(data.installers)] + return magic + + def iter_versions(xstep): + @functools.wraps(xstep) + def magic(self, installer): + [xstep(self, version) + for version in (self._filter_versions(installer.versions))] + return magic + + def iter_projects(xstep): + @functools.wraps(xstep) + def magic(self, version): + [xstep(self, project) + for project in (self._filter_projects(version.projects))] + return magic + + @iter_installers + @iter_versions + @iter_projects + def _update_requests_add_score(self, project): + project.scores.append( + models.ScenarioScore.from_dict(self.body)) + + def _filter_installers(self, installers): + return self._filter('installer', installers) + + def _filter_versions(self, versions): + return self._filter('version', versions) + + def _filter_projects(self, projects): + return self._filter('project', projects) + + def _filter(self, item, items): + return filter( + lambda f: getattr(f, item) == getattr(self, item), + items) + + +class ScenarioScoresHandler(GenericScenarioHandler): + @swagger.operation(nickname="addScoreRecord") + def post(self, scenario): + """ + @description: add a new score record + @notes: add a new score record to a project + POST /api/v1/scenarios//scores? \ + installer=& \ + version=& \ + project= + @param body: score to be added + @type body: L{ScenarioScore} + @in body: body + @param installer: installer type + @type installer: L{string} + @in installer: query + @required installer: True + @param version: version + @type version: L{string} + @in version: query + @required version: True + @param project: project name + @type project: L{string} + @in project: query + @required project: True + @rtype: L{Scenario} + @return 200: score is created. + @raise 404: scenario/installer/version/project not existed + """ + self.installer = self.get_query_argument('installer') + self.version = self.get_query_argument('version') + self.project = self.get_query_argument('project') + + filters = {'scenario': scenario, + 'installer': self.installer, + 'version': self.version, + 'project': self.project} + db_keys = ['name'] + self._update(query=self.set_query(filters=filters), db_keys=db_keys) + + def _update_requests(self, data): + return ScenarioUpdater(data, + self.json_args, + self.installer, + self.version, + self.project).update('score', 'add') -- cgit 1.2.3-korg