fix muptiply tests in one run, update report generation
diff --git a/wally/report.py b/wally/report.py
index 04577a9..650666b 100644
--- a/wally/report.py
+++ b/wally/report.py
@@ -66,6 +66,11 @@
         self.concurence = self.params.vals.get('numjobs', 1)
 
 
+# disk_info = None
+# base = None
+# linearity = None
+
+
 def group_by_name(test_data):
     name_map = collections.defaultdict(lambda: [])
 
@@ -186,9 +191,11 @@
     plt.xlabel("Block size")
     plt.ylabel("IO time, ms")
 
-    plt.legend(loc=0)
+    plt.subplots_adjust(top=0.85)
+    plt.legend(bbox_to_anchor=(0.5, 1.2), loc='upper center')
     plt.grid()
     iotime_plot = get_emb_data_svg(plt)
+    plt.clf()
 
     _, ax1 = plt.subplots()
     plt.boxplot(data)
@@ -197,6 +204,7 @@
     plt.xlabel("Block size")
     plt.ylabel("IOPS")
     plt.grid()
+    plt.subplots_adjust(top=0.85)
 
     iops_plot = get_emb_data_svg(plt)
 
@@ -218,26 +226,53 @@
 @report('lat_vs_iops', 'lat_vs_iops')
 def lat_vs_iops(processed_results, path, lab_info):
     lat_iops = collections.defaultdict(lambda: [])
+    requsted_vs_real = collections.defaultdict(lambda: {})
+
     for res in processed_results.values():
         if res.name.startswith('lat_vs_iops'):
             lat_iops[res.concurence].append((res.lat.average / 1000.0,
                                              res.lat.deviation / 1000.0,
                                              res.iops.average,
                                              res.iops.deviation))
+            requested_iops = res.p.rate_iops * res.concurence
+            requsted_vs_real[res.concurence][requested_iops] = \
+                (res.iops.average, res.iops.deviation)
 
-    colors = ['red', 'green', 'blue', 'orange', 'magenta', "teal"][::-1]
+    colors = ['red', 'green', 'blue', 'orange', 'magenta', "teal"]
+    colors_it = iter(colors)
     for conc, lat_iops in sorted(lat_iops.items()):
         lat, dev, iops, iops_dev = zip(*lat_iops)
         plt.errorbar(iops, lat, xerr=iops_dev, yerr=dev, fmt='ro',
                      label=str(conc) + " threads",
-                     color=colors.pop())
+                     color=next(colors_it))
 
     plt.xlabel("IOPS")
     plt.ylabel("Latency, ms")
     plt.grid()
     plt.legend(loc=0)
-    plt.show()
-    exit(1)
+    plt_iops_vs_lat = get_emb_data_svg(plt)
+    plt.clf()
+
+    colors_it = iter(colors)
+    for conc, req_vs_real in sorted(requsted_vs_real.items()):
+        req, real = zip(*sorted(req_vs_real.items()))
+        iops, dev = zip(*real)
+        plt.errorbar(req, iops, yerr=dev, fmt='ro',
+                     label=str(conc) + " threads",
+                     color=next(colors_it))
+    plt.xlabel("Requested IOPS")
+    plt.ylabel("Get IOPS")
+    plt.grid()
+    plt.legend(loc=0)
+    plt_iops_vs_requested = get_emb_data_svg(plt)
+
+    res1 = processed_results.values()[0]
+    params_map = {'iops_vs_lat': plt_iops_vs_lat,
+                  'iops_vs_requested': plt_iops_vs_requested,
+                  'oper_descr': get_test_lcheck_params(res1).capitalize()}
+
+    with open(path, 'w') as fd:
+        fd.write(get_template('report_iops_vs_lat.html').format(**params_map))
 
 
 def render_all_html(dest, info, lab_description, images, templ_name):