blob: 446dcc80cd6b28a9f76695ba5ad565383bda1ac8 [file] [log] [blame]
koder aka kdanilov0f0546c2015-02-17 20:42:05 -08001# <koder>: order imports in usual way
2
gstepanov94531b82015-02-11 14:20:34 +02003from urlparse import urlparse
stgleb75c70412015-02-17 02:52:00 +02004from flask import render_template, url_for, make_response, request
gstepanov200d3b42015-02-06 14:01:49 +02005from report import build_vertical_bar, build_lines_chart
gstepanov81a52ee2015-02-10 16:22:20 +02006from logging import getLogger, INFO
stgleb75c70412015-02-17 02:52:00 +02007from web_app import app
gstepanov94531b82015-02-11 14:20:34 +02008from web_app.keystone import KeystoneAuth
stgleb75c70412015-02-17 02:52:00 +02009from persistance.storage_api import builds_list, prepare_build_data, get_data_for_table, add_data, get_builds_data
10from web_app.app import app
11import os.path
12from werkzeug.routing import Rule
gstepanov3ce37b82015-02-12 16:20:56 +020013
14
gstepanove1ee9dc2015-02-11 18:09:46 +020015def total_lab_info(data):
koder aka kdanilov0f0546c2015-02-17 20:42:05 -080016 # <koder>: give 'd' meaningful name
gstepanove1ee9dc2015-02-11 18:09:46 +020017 d = {}
18 d['nodes_count'] = len(data['nodes'])
19 d['total_memory'] = 0
20 d['total_disk'] = 0
21 d['processor_count'] = 0
22
23 for node in data['nodes']:
24 d['total_memory'] += node['memory']['total']
25 d['processor_count'] += len(node['processors'])
26
27 for disk in node['disks']:
28 d['total_disk'] += disk['size']
29
gstepanov9eb8bf32015-02-11 20:13:14 +020030 to_gb = lambda x: x / (1024 ** 3)
31 d['total_memory'] = format(to_gb(d['total_memory']), ',d')
32 d['total_disk'] = format(to_gb(d['total_disk']), ',d')
gstepanove1ee9dc2015-02-11 18:09:46 +020033 return d
34
gstepanov9eb8bf32015-02-11 20:13:14 +020035
gstepanov9ddc18f2015-02-11 20:28:59 +020036def collect_lab_data(meta):
37 u = urlparse(meta['__meta__'])
38 cred = {"username": "admin", "password": "admin", "tenant_name": "admin"}
39 keystone = KeystoneAuth(root_url=meta['__meta__'], creds=cred, admin_node_ip=u.hostname)
40 lab_info = keystone.do(method='get', path="")
41 nodes = []
42 result = {}
43
44 for node in lab_info:
koder aka kdanilov0f0546c2015-02-17 20:42:05 -080045 # <koder>: give p,i,d,... vars meaningful names
gstepanov9ddc18f2015-02-11 20:28:59 +020046 d = {}
47 d['name'] = node['name']
48 p = []
49 i = []
50 disks = []
51 devices = []
52
53 for processor in node['meta']['cpu']['spec']:
54 p.append(processor)
55
56 for iface in node['meta']['interfaces']:
57 i.append(iface)
58
59 m = node['meta']['memory'].copy()
60
61 for disk in node['meta']['disks']:
62 disks.append(disk)
63
64 d['memory'] = m
65 d['disks'] = disks
66 d['devices'] = devices
67 d['interfaces'] = i
68 d['processors'] = p
69
70 nodes.append(d)
71
72 result['nodes'] = nodes
73 result['name'] = 'Perf-1 Env'
74
75 return result
76
77
gstepanov6c5deb32015-02-12 19:25:46 +020078def merge_builds(b1, b2):
79 d = {}
80
81 for pair in b2.items():
gstepanov8053b012015-02-16 17:25:27 +020082 if pair[0] in b1 and type(pair[1]) is list:
stgleb75c70412015-02-17 02:52:00 +020083 b1[pair[0]].extend(pair[1])
gstepanov8053b012015-02-16 17:25:27 +020084 else:
85 b1[pair[0]] = pair[1]
gstepanov6c5deb32015-02-12 19:25:46 +020086
87
stgleb75c70412015-02-17 02:52:00 +020088app.url_map.add(Rule('/', endpoint='index'))
89app.url_map.add(Rule('/images/<image_name>', endpoint='get_image'))
90app.url_map.add(Rule('/tests/<test_name>', endpoint='render_test'))
91app.url_map.add(Rule('/tests/table/<test_name>/', endpoint='render_table'))
92app.url_map.add(Rule('/api/tests/<test_name>', endpoint='add_test', methods=['POST']))
93app.url_map.add(Rule('/api/tests', endpoint='get_all_tests'))
94app.url_map.add(Rule('/api/tests/<test_name>', endpoint='get_test'))
95
96
97@app.endpoint('index')
gstepanov9ddc18f2015-02-11 20:28:59 +020098def index():
99 data = builds_list()
stgleb75c70412015-02-17 02:52:00 +0200100
101 for elem in data:
102 elem['url'] = url_for('render_test', test_name=elem['url'])
103
gstepanov9ddc18f2015-02-11 20:28:59 +0200104 return render_template("index.html", tests=data)
105
106
stgleb75c70412015-02-17 02:52:00 +0200107@app.endpoint('get_image')
gstepanov6ce6bf02015-02-16 19:04:14 +0200108def get_image(image_name):
109 with open("static/images/" + image_name, 'rb') as f:
110 image_binary = f.read()
111
112 response = make_response(image_binary)
113 response.headers['Content-Type'] = 'image/png'
114 response.headers['Content-Disposition'] = 'attachment; filename=img.png'
115
116 return response
117
118
stgleb75c70412015-02-17 02:52:00 +0200119@app.endpoint('render_test')
gstepanov2164d822015-02-04 19:49:40 +0200120def render_test(test_name):
gstepanove1ee9dc2015-02-11 18:09:46 +0200121 meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
122 data = collect_lab_data(meta)
123 lab_meta = total_lab_info(data)
stgleb75c70412015-02-17 02:52:00 +0200124 results = prepare_build_data(test_name)
gstepanovbdc406b2015-02-11 17:35:55 +0200125
stgleb75c70412015-02-17 02:52:00 +0200126 bars = build_vertical_bar(results)
127 lines = build_lines_chart(results)
128 urls = bars + lines
gstepanov6ce6bf02015-02-16 19:04:14 +0200129
130 urls = [url_for("get_image", image_name=os.path.basename(url)) if not url.startswith('http') else url for url in urls]
131
stgleb75c70412015-02-17 02:52:00 +0200132 return render_template("test.html", urls=urls,
133 table_url=url_for('render_table', test_name=test_name),
gstepanov9eb8bf32015-02-11 20:13:14 +0200134 index_url=url_for('index'), lab_meta=lab_meta)
gstepanovcd77d5a2015-02-06 14:49:34 +0200135
136
stgleb75c70412015-02-17 02:52:00 +0200137@app.endpoint('render_table')
gstepanovcd77d5a2015-02-06 14:49:34 +0200138def render_table(test_name):
stgleb75c70412015-02-17 02:52:00 +0200139 builds = get_data_for_table(test_name)
gstepanov3ce37b82015-02-12 16:20:56 +0200140
stgleb75c70412015-02-17 02:52:00 +0200141 header_keys = ['build_id', 'iso_md5', 'type', 'date']
gstepanovcd77d5a2015-02-06 14:49:34 +0200142 table = [[]]
gstepanov94531b82015-02-11 14:20:34 +0200143 meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
gstepanove1ee9dc2015-02-11 18:09:46 +0200144 data = collect_lab_data(meta)
gstepanovbdc406b2015-02-11 17:35:55 +0200145
146 if len(builds) > 0:
147 sorted_keys = sorted(builds[0].keys())
gstepanovcd77d5a2015-02-06 14:49:34 +0200148
149 for key in sorted_keys:
150 if key not in header_keys:
151 header_keys.append(key)
152
gstepanovbdc406b2015-02-11 17:35:55 +0200153 for test in builds:
gstepanovcd77d5a2015-02-06 14:49:34 +0200154 row = []
155
156 for header in header_keys:
157 if isinstance(test[header], list):
158 row.append(str(test[header][0]) + unichr(0x00B1) + str(test[header][1]))
159 else:
160 row.append(test[header])
161
162 table.append(row)
163
gstepanovbb854922015-02-09 18:18:17 +0200164 return render_template("table.html", headers=header_keys, table=table,
165 back_url=url_for('render_test', test_name=test_name), lab=data)
gstepanov2164d822015-02-04 19:49:40 +0200166
167
stgleb75c70412015-02-17 02:52:00 +0200168@app.endpoint('add_test')
gstepanov2164d822015-02-04 19:49:40 +0200169def add_test(test_name):
stgleb75c70412015-02-17 02:52:00 +0200170 add_data(request.data)
gstepanov2164d822015-02-04 19:49:40 +0200171 return "Created", 201
172
173
stgleb75c70412015-02-17 02:52:00 +0200174@app.endpoint('get_all_tests')
gstepanov3ce37b82015-02-12 16:20:56 +0200175def get_all_tests():
stgleb75c70412015-02-17 02:52:00 +0200176 return json.dumps(get_builds_data())
gstepanov3ce37b82015-02-12 16:20:56 +0200177
178
stgleb75c70412015-02-17 02:52:00 +0200179@app.endpoint('get_test')
gstepanov3ce37b82015-02-12 16:20:56 +0200180def get_test(test_name):
stgleb75c70412015-02-17 02:52:00 +0200181 builds = get_builds_data(test_name)
gstepanov3ce37b82015-02-12 16:20:56 +0200182
stgleb75c70412015-02-17 02:52:00 +0200183 return json.dumps(builds)
gstepanov3ce37b82015-02-12 16:20:56 +0200184
185
gstepanov2164d822015-02-04 19:49:40 +0200186if __name__ == "__main__":
gstepanov81a52ee2015-02-10 16:22:20 +0200187 logger = getLogger("logger")
188 app.logger.setLevel(INFO)
189 app.logger.addHandler(logger)
stgleb75c70412015-02-17 02:52:00 +0200190 app.run(host='0.0.0.0', debug=True)