blob: d19142886fc1ab5b8875313651eca0548ba33cfd [file] [log] [blame]
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03001import os
2import sys
3
4from wally import charts
Yulia Portnova66b71e62015-04-20 17:18:11 +03005from wally.statistic import med_dev, round_3_digit, round_deviation
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +03006from wally.utils import parse_creds
7from wally.suits.io.results_loader import filter_data
8from wally.meta_info import total_lab_info, collect_lab_data
9
10
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030011def render_html(charts_urls, dest, lab_description, info):
12 templ = open("report.html", 'r').read()
Yulia Portnova66b71e62015-04-20 17:18:11 +030013 open(dest, 'w').write(templ.format(urls=charts_urls,
14 data=info, lab_info=lab_description))
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030015
16
17def io_chart(title, concurence, latv, iops_or_bw, iops_or_bw_dev,
18 legend, fname):
19 bar_data, bar_dev = iops_or_bw, iops_or_bw_dev
20 legend = [legend]
21
22 iops_or_bw_per_vm = []
23 for i in range(len(concurence)):
24 iops_or_bw_per_vm.append(iops_or_bw[i] / concurence[i])
25
26 bar_dev_bottom = []
27 bar_dev_top = []
28 for i in range(len(bar_data)):
29 bar_dev_top.append(bar_data[i] + bar_dev[i])
30 bar_dev_bottom.append(bar_data[i] - bar_dev[i])
31
32 latv = [lat / 1000 for lat in latv]
33 ch = charts.render_vertical_bar(title, legend, [bar_data], [bar_dev_top],
34 [bar_dev_bottom], file_name=fname,
35 scale_x=concurence,
36 lines=[
37 (latv, "msec", "rr", "lat"),
38 (iops_or_bw_per_vm, None, None,
39 "bw_per_vm")
40 ])
41 return str(ch)
42
43
44def make_io_report(results, path, lab_url=None, creds=None):
45 if lab_url is not None:
46 username, password, tenant_name = parse_creds(creds)
47 creds = {'username': username,
48 'password': password,
49 "tenant_name": tenant_name}
50 data = collect_lab_data(lab_url, creds)
51 lab_info = total_lab_info(data)
52 else:
53 lab_info = ""
54
55 for suite_type, test_suite_data in results:
56 if suite_type != 'io' or test_suite_data is None:
57 continue
58
59 io_test_suite_res = test_suite_data['res']
60
61 charts_url = []
Yulia Portnova66b71e62015-04-20 17:18:11 +030062 max_info = {}
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030063
64 name_filters = [
Yulia Portnova66b71e62015-04-20 17:18:11 +030065 ('hdd_test_rrd4k', ('concurence', 'lat', 'iops'),
66 'rand_read_4k', 'random read 4k'),
67 # ('hdd_test_swd1m', ('concurence', 'lat', 'bw'), 'seq_write_1m'),
68 # ('hdd_test_srd1m', ('concurence', 'lat', 'bw'), 'seq_read_1m'),
69 ('hdd_test_rws4k', ('concurence', 'lat', 'iops'),
70 'rand_write_4k', 'random write 4k')
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030071 ]
72
Yulia Portnova66b71e62015-04-20 17:18:11 +030073 for name_filter, fields, fname, desc in name_filters:
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030074 th_filter = filter_data(name_filter, fields)
75
76 data = sorted(th_filter(io_test_suite_res.values()))
77 if len(data) == 0:
78 continue
79
80 concurence, latv, iops_or_bw_v = zip(*data)
81 iops_or_bw_v, iops_or_bw_dev_v = zip(*map(med_dev, iops_or_bw_v))
82 latv, _ = zip(*map(med_dev, latv))
83
Yulia Portnova66b71e62015-04-20 17:18:11 +030084 url = io_chart(desc, concurence, latv, iops_or_bw_v,
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030085 iops_or_bw_dev_v,
86 fields[2], fname)
Yulia Portnova66b71e62015-04-20 17:18:11 +030087 max_lat = "%s msec" % round_3_digit(max(latv) / 1000)
88 max_iops_or_bw = max(iops_or_bw_v)
89 max_iops_or_bw_dev = iops_or_bw_dev_v[
90 iops_or_bw_v.index(max_iops_or_bw)]
91 r = round_deviation((max_iops_or_bw, max_iops_or_bw_dev))
92 max_info[fname] = {fields[2]: r,
93 "lat": max_lat}
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030094 charts_url.append(url)
95
96 if len(charts_url) != 0:
Yulia Portnova66b71e62015-04-20 17:18:11 +030097 render_html(charts_url, path, lab_info, max_info)
koder aka kdanilovcff7b2e2015-04-18 20:48:15 +030098
99
100def main(args):
101 make_io_report(results=[('a', 'b')],
102 path=os.path.dirname(args[0]),
103 lab_url='http://172.16.52.112:8000',
104 creds='admin:admin@admin')
105 return 0
106
107
108if __name__ == '__main__':
109 exit(main(sys.argv))