1 ##############################################################################
2 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
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 ##############################################################################
11 from tornado.escape import json_encode
12 from tornado.escape import json_decode
14 from api.handlers import BaseHandler
18 class FiltersHandler(BaseHandler):
24 'status': ['success', 'warning', 'danger'],
25 'projects': ['functest', 'yardstick'],
26 'installers': ['apex', 'compass', 'fuel', 'joid'],
27 'version': ['colorado', 'master'],
28 'loops': ['daily', 'weekly', 'monthly'],
29 'time': ['10 days', '30 days']
32 return self.write(json_encode(filters))
35 class ScenariosHandler(BaseHandler):
39 body = json_decode(self.request.body)
40 args = self._get_args(body)
42 scenarios = self._get_result_data(self._get_scenarios(), args)
44 return self.write(json_encode(dict(scenarios=scenarios)))
46 def _get_result_data(self, data, args):
47 data = self._filter_status(data, args)
48 return {s: self._get_scenario_result(s, data[s], args) for s in data}
50 def _filter_status(self, data, args):
51 return {k: v for k, v in data.items() if v['status'] in args['status']}
53 def _get_scenario_result(self, scenario, data, args):
55 'status': data.get('status'),
56 'installers': self._get_installers_result(data['installers'], args)
60 def _get_installers_result(self, data, args):
61 func = self._get_installer_result
62 return {k: func(k, data.get(k, {}), args) for k in args['installers']}
64 def _get_installer_result(self, installer, data, args):
65 projects = data.get(args['version'], [])
66 return [self._get_project_data(projects, p) for p in args['projects']]
68 def _get_project_data(self, projects, project):
75 if p['project'] == project:
79 def _get_scenarios(self):
80 url = '{}/scenarios'.format(conf.base_url)
81 resp = requests.get(url).json()
82 data = self._change_to_utf8(resp).get('scenarios', {})
83 return {a.get('name'): self._get_scenario(a.get('installers', [])
86 def _get_scenario(self, data):
87 installers = {a.get('installer'): self._get_installer(a.get('versions',
91 'status': self._get_status(),
92 'installers': installers
96 def _get_status(self):
99 def _get_installer(self, data):
100 return {a.get('version'): self._get_version(a) for a in data}
102 def _get_version(self, data):
104 scores = data.get('score', {}).get('projects')[0]
105 trusts = data.get('trust_indicator', {}).get('projects')[0]
106 except (TypeError, IndexError):
109 scores = {key: [dict(date=a.get('date')[:10],
111 ) for a in scores[key]] for key in scores}
112 trusts = {key: [dict(date=a.get('date')[:10],
113 status=a.get('status')
114 ) for a in trusts[key]] for key in trusts}
115 atom = self._get_atom(scores, trusts)
116 return [dict(project=k,
117 score=sorted(atom[k], reverse=True)[0].get('score'),
118 status=sorted(atom[k], reverse=True)[0].get('status')
119 ) for k in atom if atom[k]]
121 def _get_atom(self, scores, trusts):
122 s = {k: {a['date']: a['score'] for a in scores[k]} for k in scores}
123 t = {k: {a['date']: a['status'] for a in trusts[k]} for k in trusts}
124 return {k: [dict(score=s[k][a], status=t[k][a], data=a
125 ) for a in s[k] if a in t[k]] for k in s}
127 def _change_to_utf8(self, obj):
128 if isinstance(obj, dict):
129 return {str(k): self._change_to_utf8(v) for k, v in obj.items()}
130 elif isinstance(obj, list):
131 return [self._change_to_utf8(ele) for ele in obj]
135 if isinstance(new, int):
137 return self._change_to_utf8(new)
138 except (NameError, TypeError, SyntaxError):
141 def _get_args(self, body):
142 status = self._get_status_args(body)
143 projects = self._get_projects_args(body)
144 installers = self._get_installers_args(body)
148 'projects': projects,
149 'installers': installers,
150 'version': body.get('version', 'master').lower(),
151 'loops': body.get('loops', 'daily').lower(),
152 'time': body.get('times', '10 days')[:2].lower()
156 def _get_status_args(self, body):
157 status_all = ['success', 'warning', 'danger']
158 status = [a.lower() for a in body.get('status', ['all'])]
159 return status_all if 'all' in status else status
161 def _get_projects_args(self, body):
162 project_all = ['functest', 'yardstick']
163 projects = [a.lower() for a in body.get('projects', ['all'])]
164 return project_all if 'all' in projects else projects
166 def _get_installers_args(self, body):
167 installer_all = ['apex', 'compass', 'fuel', 'joid']
168 installers = [a.lower() for a in body.get('installers', ['all'])]
169 return installer_all if 'all' in installers else installers