blob: eaf96804229f0caaad9cdd656d8979ec748d5f7d [file] [log] [blame]
koder aka kdanilov0f0546c2015-02-17 20:42:05 -08001# <koder>: order imports in usual way
gstepanov0832b772015-02-20 17:48:19 +02002import json
koder aka kdanilov0f0546c2015-02-17 20:42:05 -08003
gstepanov94531b82015-02-11 14:20:34 +02004from urlparse import urlparse
stgleb75c70412015-02-17 02:52:00 +02005from flask import render_template, url_for, make_response, request
gstepanov200d3b42015-02-06 14:01:49 +02006from report import build_vertical_bar, build_lines_chart
gstepanov81a52ee2015-02-10 16:22:20 +02007from logging import getLogger, INFO
stgleb75c70412015-02-17 02:52:00 +02008from web_app import app
gstepanov94531b82015-02-11 14:20:34 +02009from web_app.keystone import KeystoneAuth
stgleb75c70412015-02-17 02:52:00 +020010from persistance.storage_api import builds_list, prepare_build_data, get_data_for_table, add_data, get_builds_data
11from web_app.app import app
12import os.path
13from werkzeug.routing import Rule
gstepanov3ce37b82015-02-12 16:20:56 +020014
15
gstepanove1ee9dc2015-02-11 18:09:46 +020016def total_lab_info(data):
koder aka kdanilov0f0546c2015-02-17 20:42:05 -080017 # <koder>: give 'd' meaningful name
gstepanove1ee9dc2015-02-11 18:09:46 +020018 d = {}
19 d['nodes_count'] = len(data['nodes'])
20 d['total_memory'] = 0
21 d['total_disk'] = 0
22 d['processor_count'] = 0
23
24 for node in data['nodes']:
25 d['total_memory'] += node['memory']['total']
26 d['processor_count'] += len(node['processors'])
27
28 for disk in node['disks']:
29 d['total_disk'] += disk['size']
30
gstepanov9eb8bf32015-02-11 20:13:14 +020031 to_gb = lambda x: x / (1024 ** 3)
32 d['total_memory'] = format(to_gb(d['total_memory']), ',d')
33 d['total_disk'] = format(to_gb(d['total_disk']), ',d')
gstepanove1ee9dc2015-02-11 18:09:46 +020034 return d
35
gstepanov9eb8bf32015-02-11 20:13:14 +020036
gstepanov9ddc18f2015-02-11 20:28:59 +020037def collect_lab_data(meta):
38 u = urlparse(meta['__meta__'])
39 cred = {"username": "admin", "password": "admin", "tenant_name": "admin"}
40 keystone = KeystoneAuth(root_url=meta['__meta__'], creds=cred, admin_node_ip=u.hostname)
41 lab_info = keystone.do(method='get', path="")
42 nodes = []
43 result = {}
44
45 for node in lab_info:
koder aka kdanilov0f0546c2015-02-17 20:42:05 -080046 # <koder>: give p,i,d,... vars meaningful names
gstepanov9ddc18f2015-02-11 20:28:59 +020047 d = {}
48 d['name'] = node['name']
49 p = []
50 i = []
51 disks = []
52 devices = []
53
54 for processor in node['meta']['cpu']['spec']:
55 p.append(processor)
56
57 for iface in node['meta']['interfaces']:
58 i.append(iface)
59
60 m = node['meta']['memory'].copy()
61
62 for disk in node['meta']['disks']:
63 disks.append(disk)
64
65 d['memory'] = m
66 d['disks'] = disks
67 d['devices'] = devices
68 d['interfaces'] = i
69 d['processors'] = p
70
71 nodes.append(d)
72
73 result['nodes'] = nodes
74 result['name'] = 'Perf-1 Env'
75
76 return result
77
78
gstepanov6c5deb32015-02-12 19:25:46 +020079def merge_builds(b1, b2):
80 d = {}
81
82 for pair in b2.items():
gstepanov8053b012015-02-16 17:25:27 +020083 if pair[0] in b1 and type(pair[1]) is list:
stgleb75c70412015-02-17 02:52:00 +020084 b1[pair[0]].extend(pair[1])
gstepanov8053b012015-02-16 17:25:27 +020085 else:
86 b1[pair[0]] = pair[1]
gstepanov6c5deb32015-02-12 19:25:46 +020087
88
stgleb75c70412015-02-17 02:52:00 +020089app.url_map.add(Rule('/', endpoint='index'))
90app.url_map.add(Rule('/images/<image_name>', endpoint='get_image'))
91app.url_map.add(Rule('/tests/<test_name>', endpoint='render_test'))
92app.url_map.add(Rule('/tests/table/<test_name>/', endpoint='render_table'))
93app.url_map.add(Rule('/api/tests/<test_name>', endpoint='add_test', methods=['POST']))
94app.url_map.add(Rule('/api/tests', endpoint='get_all_tests'))
95app.url_map.add(Rule('/api/tests/<test_name>', endpoint='get_test'))
96
97
98@app.endpoint('index')
gstepanov9ddc18f2015-02-11 20:28:59 +020099def index():
100 data = builds_list()
stgleb75c70412015-02-17 02:52:00 +0200101
102 for elem in data:
103 elem['url'] = url_for('render_test', test_name=elem['url'])
104
gstepanov9ddc18f2015-02-11 20:28:59 +0200105 return render_template("index.html", tests=data)
106
107
stgleb75c70412015-02-17 02:52:00 +0200108@app.endpoint('get_image')
gstepanov6ce6bf02015-02-16 19:04:14 +0200109def get_image(image_name):
110 with open("static/images/" + image_name, 'rb') as f:
111 image_binary = f.read()
112
113 response = make_response(image_binary)
114 response.headers['Content-Type'] = 'image/png'
115 response.headers['Content-Disposition'] = 'attachment; filename=img.png'
116
117 return response
118
119
stgleb75c70412015-02-17 02:52:00 +0200120@app.endpoint('render_test')
gstepanov2164d822015-02-04 19:49:40 +0200121def render_test(test_name):
gstepanove1ee9dc2015-02-11 18:09:46 +0200122 meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
123 data = collect_lab_data(meta)
124 lab_meta = total_lab_info(data)
stgleb75c70412015-02-17 02:52:00 +0200125 results = prepare_build_data(test_name)
gstepanovbdc406b2015-02-11 17:35:55 +0200126
stgleb75c70412015-02-17 02:52:00 +0200127 bars = build_vertical_bar(results)
128 lines = build_lines_chart(results)
129 urls = bars + lines
gstepanov6ce6bf02015-02-16 19:04:14 +0200130
131 urls = [url_for("get_image", image_name=os.path.basename(url)) if not url.startswith('http') else url for url in urls]
132
stgleb75c70412015-02-17 02:52:00 +0200133 return render_template("test.html", urls=urls,
134 table_url=url_for('render_table', test_name=test_name),
gstepanov9eb8bf32015-02-11 20:13:14 +0200135 index_url=url_for('index'), lab_meta=lab_meta)
gstepanovcd77d5a2015-02-06 14:49:34 +0200136
137
stgleb75c70412015-02-17 02:52:00 +0200138@app.endpoint('render_table')
gstepanovcd77d5a2015-02-06 14:49:34 +0200139def render_table(test_name):
stgleb75c70412015-02-17 02:52:00 +0200140 builds = get_data_for_table(test_name)
gstepanov3ce37b82015-02-12 16:20:56 +0200141
stgleb75c70412015-02-17 02:52:00 +0200142 header_keys = ['build_id', 'iso_md5', 'type', 'date']
gstepanovcd77d5a2015-02-06 14:49:34 +0200143 table = [[]]
gstepanov94531b82015-02-11 14:20:34 +0200144 meta = {"__meta__": "http://172.16.52.112:8000/api/nodes"}
gstepanove1ee9dc2015-02-11 18:09:46 +0200145 data = collect_lab_data(meta)
gstepanovbdc406b2015-02-11 17:35:55 +0200146
147 if len(builds) > 0:
148 sorted_keys = sorted(builds[0].keys())
gstepanovcd77d5a2015-02-06 14:49:34 +0200149
150 for key in sorted_keys:
151 if key not in header_keys:
152 header_keys.append(key)
153
gstepanovbdc406b2015-02-11 17:35:55 +0200154 for test in builds:
gstepanovcd77d5a2015-02-06 14:49:34 +0200155 row = []
156
157 for header in header_keys:
158 if isinstance(test[header], list):
159 row.append(str(test[header][0]) + unichr(0x00B1) + str(test[header][1]))
160 else:
161 row.append(test[header])
162
163 table.append(row)
164
gstepanovbb854922015-02-09 18:18:17 +0200165 return render_template("table.html", headers=header_keys, table=table,
166 back_url=url_for('render_test', test_name=test_name), lab=data)
gstepanov2164d822015-02-04 19:49:40 +0200167
168
stgleb75c70412015-02-17 02:52:00 +0200169@app.endpoint('add_test')
gstepanov2164d822015-02-04 19:49:40 +0200170def add_test(test_name):
stgleb75c70412015-02-17 02:52:00 +0200171 add_data(request.data)
gstepanov2164d822015-02-04 19:49:40 +0200172 return "Created", 201
173
174
stgleb75c70412015-02-17 02:52:00 +0200175@app.endpoint('get_all_tests')
gstepanov3ce37b82015-02-12 16:20:56 +0200176def get_all_tests():
stgleb75c70412015-02-17 02:52:00 +0200177 return json.dumps(get_builds_data())
gstepanov3ce37b82015-02-12 16:20:56 +0200178
179
stgleb75c70412015-02-17 02:52:00 +0200180@app.endpoint('get_test')
gstepanov3ce37b82015-02-12 16:20:56 +0200181def get_test(test_name):
stgleb75c70412015-02-17 02:52:00 +0200182 builds = get_builds_data(test_name)
gstepanov3ce37b82015-02-12 16:20:56 +0200183
stgleb75c70412015-02-17 02:52:00 +0200184 return json.dumps(builds)
gstepanov3ce37b82015-02-12 16:20:56 +0200185
186
gstepanov2164d822015-02-04 19:49:40 +0200187if __name__ == "__main__":
gstepanov81a52ee2015-02-10 16:22:20 +0200188 logger = getLogger("logger")
189 app.logger.setLevel(INFO)
190 app.logger.addHandler(logger)
stgleb75c70412015-02-17 02:52:00 +0200191 app.run(host='0.0.0.0', debug=True)