koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 1 | import os |
| 2 | import sys |
| 3 | |
| 4 | from wally import charts |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 5 | from wally.statistic import med_dev, round_3_digit, round_deviation |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 6 | from wally.utils import parse_creds |
| 7 | from wally.suits.io.results_loader import filter_data |
| 8 | from wally.meta_info import total_lab_info, collect_lab_data |
| 9 | |
| 10 | |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 11 | def render_html(charts_urls, dest, lab_description, info): |
| 12 | templ = open("report.html", 'r').read() |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 13 | open(dest, 'w').write(templ.format(urls=charts_urls, |
| 14 | data=info, lab_info=lab_description)) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 15 | |
| 16 | |
| 17 | def 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 | |
| 44 | def 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 Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 62 | max_info = {} |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 63 | |
| 64 | name_filters = [ |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 65 | ('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 kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 71 | ] |
| 72 | |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 73 | for name_filter, fields, fname, desc in name_filters: |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 74 | 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 Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 84 | url = io_chart(desc, concurence, latv, iops_or_bw_v, |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 85 | iops_or_bw_dev_v, |
| 86 | fields[2], fname) |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 87 | 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 kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 94 | charts_url.append(url) |
| 95 | |
| 96 | if len(charts_url) != 0: |
Yulia Portnova | 66b71e6 | 2015-04-20 17:18:11 +0300 | [diff] [blame] | 97 | render_html(charts_url, path, lab_info, max_info) |
koder aka kdanilov | cff7b2e | 2015-04-18 20:48:15 +0300 | [diff] [blame] | 98 | |
| 99 | |
| 100 | def 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 | |
| 108 | if __name__ == '__main__': |
| 109 | exit(main(sys.argv)) |