PAL: Add processing of PPS and CPS tests
[csit.git] / resources / tools / presentation / generator_plots.py
index c1e5bed..42f450e 100644 (file)
@@ -32,12 +32,31 @@ from plotly.exceptions import PlotlyError
 from pal_utils import mean, stdev
 
 
-COLORS = [u"SkyBlue", u"Olive", u"Purple", u"Coral", u"Indigo", u"Pink",
-          u"Chocolate", u"Brown", u"Magenta", u"Cyan", u"Orange", u"Black",
-          u"Violet", u"Blue", u"Yellow", u"BurlyWood", u"CadetBlue", u"Crimson",
-          u"DarkBlue", u"DarkCyan", u"DarkGreen", u"Green", u"GoldenRod",
-          u"LightGreen", u"LightSeaGreen", u"LightSkyBlue", u"Maroon",
-          u"MediumSeaGreen", u"SeaGreen", u"LightSlateGrey"]
+COLORS = (
+    u"#1A1110",
+    u"#DA2647",
+    u"#214FC6",
+    u"#01786F",
+    u"#BD8260",
+    u"#FFD12A",
+    u"#A6E7FF",
+    u"#738276",
+    u"#C95A49",
+    u"#FC5A8D",
+    u"#CEC8EF",
+    u"#391285",
+    u"#6F2DA8",
+    u"#FF878D",
+    u"#45A27D",
+    u"#FFD0B9",
+    u"#FD5240",
+    u"#DB91EF",
+    u"#44D7A8",
+    u"#4F86F7",
+    u"#84DE02",
+    u"#FFCFF1",
+    u"#614051"
+)
 
 REGEX_NIC = re.compile(r'(\d*ge\dp\d\D*\d*[a-z]*)-')
 
@@ -160,9 +179,16 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
                         f"Percentile: 0.0%<br>"
                         f"Latency: 0.0uSec"
                     ]
-                    decoded = hdrh.histogram.HdrHistogram.decode(
-                        test[u"latency"][graph][direction][u"hdrh"]
-                    )
+                    try:
+                        decoded = hdrh.histogram.HdrHistogram.decode(
+                            test[u"latency"][graph][direction][u"hdrh"]
+                        )
+                    except hdrh.codec.HdrLengthException:
+                        logging.warning(
+                            f"No data for direction {(u'W-E', u'E-W')[idx % 2]}"
+                        )
+                        continue
+
                     for item in decoded.get_recorded_iterator():
                         percentile = item.percentile_level_iterated_to
                         if percentile > 99.9:
@@ -185,7 +211,7 @@ def plot_hdrh_lat_by_percentile(plot, input_data):
                             showlegend=bool(idx),
                             line=dict(
                                 color=COLORS[color],
-                                dash=u"solid" if idx % 2 else u"dash"
+                                dash=u"dash" if idx % 2 else u"solid"
                             ),
                             hovertext=hovertext,
                             hoverinfo=u"text"
@@ -300,7 +326,7 @@ def plot_nf_reconf_box_name(plot, input_data):
         # Create plot
         layout = deepcopy(plot[u"layout"])
         layout[u"title"] = f"<b>Time Lost:</b> {layout[u'title']}"
-        layout[u"yaxis"][u"title"] = u"<b>Implied Time Lost [s]</b>"
+        layout[u"yaxis"][u"title"] = u"<b>Effective Blocked Time [s]</b>"
         layout[u"legend"][u"font"][u"size"] = 14
         layout[u"yaxis"].pop(u"range")
         plpl = plgo.Figure(data=traces, layout=layout)
@@ -337,12 +363,21 @@ def plot_perf_box_name(plot, input_data):
         f"{plot.get(u'title', u'')}."
     )
     data = input_data.filter_tests_by_name(
-        plot, params=[u"throughput", u"result", u"parent", u"tags", u"type"])
+        plot,
+        params=[u"throughput", u"gbps", u"result", u"parent", u"tags", u"type"])
     if data is None:
         logging.error(u"No data.")
         return
 
     # Prepare the data for the plot
+    plot_title = plot.get(u"title", u"").lower()
+
+    if u"-gbps" in plot_title:
+        value = u"gbps"
+        multiplier = 1e6
+    else:
+        value = u"throughput"
+        multiplier = 1.0
     y_vals = OrderedDict()
     test_type = u""
     for job in data:
@@ -351,20 +386,28 @@ def plot_perf_box_name(plot, input_data):
                 if y_vals.get(test[u"parent"], None) is None:
                     y_vals[test[u"parent"]] = list()
                 try:
-                    if (test[u"type"] in (u"NDRPDR", ) and
-                            u"-pdr" in plot.get(u"title", u"").lower()):
-                        y_vals[test[u"parent"]].\
-                            append(test[u"throughput"][u"PDR"][u"LOWER"])
-                        test_type = u"NDRPDR"
-                    elif (test[u"type"] in (u"NDRPDR", ) and
-                          u"-ndr" in plot.get(u"title", u"").lower()):
-                        y_vals[test[u"parent"]]. \
-                            append(test[u"throughput"][u"NDR"][u"LOWER"])
-                        test_type = u"NDRPDR"
+                    if test[u"type"] in (u"NDRPDR", u"CPS"):
+                        test_type = test[u"type"]
+
+                        if u"-pdr" in plot_title:
+                            ttype = u"PDR"
+                        elif u"-ndr" in plot_title:
+                            ttype = u"NDR"
+                        else:
+                            raise RuntimeError(
+                                u"Wrong title. No information about test type. "
+                                u"Add '-ndr' or '-pdr' to the test title."
+                            )
+
+                        y_vals[test[u"parent"]].append(
+                            test[value][ttype][u"LOWER"] * multiplier
+                        )
+
                     elif test[u"type"] in (u"SOAK", ):
                         y_vals[test[u"parent"]].\
                             append(test[u"throughput"][u"LOWER"])
                         test_type = u"SOAK"
+
                     elif test[u"type"] in (u"HOSTSTACK", ):
                         if u"LDPRELOAD" in test[u"tags"]:
                             y_vals[test[u"parent"]].append(
@@ -379,8 +422,10 @@ def plot_perf_box_name(plot, input_data):
                                  2)
                             )
                         test_type = u"HOSTSTACK"
+
                     else:
                         continue
+
                 except (KeyError, TypeError):
                     y_vals[test[u"parent"]].append(None)
 
@@ -432,7 +477,7 @@ def plot_perf_box_name(plot, input_data):
         # Create plot
         layout = deepcopy(plot[u"layout"])
         if layout.get(u"title", None):
-            if test_type in (u"HOSTSTACK", ):
+            if test_type in (u"HOSTSTACK", u"CPS"):
                 layout[u"title"] = f"<b>Bandwidth:</b> {layout[u'title']}"
             else:
                 layout[u"title"] = f"<b>Throughput:</b> {layout[u'title']}"
@@ -472,11 +517,24 @@ def plot_tsa_name(plot, input_data):
         f"    Creating data set for the {plot.get(u'type', u'')} {plot_title}."
     )
     data = input_data.filter_tests_by_name(
-        plot, params=[u"throughput", u"parent", u"tags", u"type"])
+        plot,
+        params=[u"throughput", u"gbps", u"parent", u"tags", u"type"]
+    )
     if data is None:
         logging.error(u"No data.")
         return
 
+    plot_title = plot_title.lower()
+
+    if u"-gbps" in plot_title:
+        value = u"gbps"
+        h_unit = u"Gbps"
+        multiplier = 1e6
+    else:
+        value = u"throughput"
+        h_unit = u"Mpps"
+        multiplier = 1.0
+
     y_vals = OrderedDict()
     for job in data:
         for build in job:
@@ -491,22 +549,22 @@ def plot_tsa_name(plot, input_data):
                     if test[u"type"] not in (u"NDRPDR",):
                         continue
 
-                    if u"-pdr" in plot_title.lower():
+                    if u"-pdr" in plot_title:
                         ttype = u"PDR"
-                    elif u"-ndr" in plot_title.lower():
+                    elif u"-ndr" in plot_title:
                         ttype = u"NDR"
                     else:
                         continue
 
                     if u"1C" in test[u"tags"]:
                         y_vals[test[u"parent"]][u"1"]. \
-                            append(test[u"throughput"][ttype][u"LOWER"])
+                            append(test[value][ttype][u"LOWER"] * multiplier)
                     elif u"2C" in test[u"tags"]:
                         y_vals[test[u"parent"]][u"2"]. \
-                            append(test[u"throughput"][ttype][u"LOWER"])
+                            append(test[value][ttype][u"LOWER"] * multiplier)
                     elif u"4C" in test[u"tags"]:
                         y_vals[test[u"parent"]][u"4"]. \
-                            append(test[u"throughput"][ttype][u"LOWER"])
+                            append(test[value][ttype][u"LOWER"] * multiplier)
                 except (KeyError, TypeError):
                     pass
 
@@ -528,7 +586,7 @@ def plot_tsa_name(plot, input_data):
     y_max = list()
     nic_limit = 0
     lnk_limit = 0
-    pci_limit = plot[u"limits"][u"pci"][u"pci-g3-x8"]
+    pci_limit = 0
     for test_name, test_vals in y_vals.items():
         try:
             if test_vals[u"1"][1]:
@@ -612,108 +670,110 @@ def plot_tsa_name(plot, input_data):
         if limit > lnk_limit:
             lnk_limit = limit
 
+        if u"cx556a" in test_name:
+            limit = plot[u"limits"][u"pci"][u"pci-g3-x8"]
+        else:
+            limit = plot[u"limits"][u"pci"][u"pci-g3-x16"]
+        if limit > pci_limit:
+            pci_limit = limit
+
     traces = list()
     annotations = list()
     x_vals = [1, 2, 4]
 
     # Limits:
-    try:
-        threshold = 1.1 * max(y_max)  # 10%
-    except ValueError as err:
-        logging.error(err)
-        return
-    nic_limit /= 1e6
-    traces.append(plgo.Scatter(
-        x=x_vals,
-        y=[nic_limit, ] * len(x_vals),
-        name=f"NIC: {nic_limit:.2f}Mpps",
-        showlegend=False,
-        mode=u"lines",
-        line=dict(
-            dash=u"dot",
-            color=COLORS[-1],
-            width=1),
-        hoverinfo=u"none"
-    ))
-    annotations.append(dict(
-        x=1,
-        y=nic_limit,
-        xref=u"x",
-        yref=u"y",
-        xanchor=u"left",
-        yanchor=u"bottom",
-        text=f"NIC: {nic_limit:.2f}Mpps",
-        font=dict(
-            size=14,
-            color=COLORS[-1],
-        ),
-        align=u"left",
-        showarrow=False
-    ))
-    y_max.append(nic_limit)
-
-    lnk_limit /= 1e6
-    if lnk_limit < threshold:
-        traces.append(plgo.Scatter(
-            x=x_vals,
-            y=[lnk_limit, ] * len(x_vals),
-            name=f"Link: {lnk_limit:.2f}Mpps",
-            showlegend=False,
-            mode=u"lines",
-            line=dict(
-                dash=u"dot",
-                color=COLORS[-2],
-                width=1),
-            hoverinfo=u"none"
-        ))
-        annotations.append(dict(
-            x=1,
-            y=lnk_limit,
-            xref=u"x",
-            yref=u"y",
-            xanchor=u"left",
-            yanchor=u"bottom",
-            text=f"Link: {lnk_limit:.2f}Mpps",
-            font=dict(
-                size=14,
-                color=COLORS[-2],
-            ),
-            align=u"left",
-            showarrow=False
-        ))
-        y_max.append(lnk_limit)
-
-    pci_limit /= 1e6
-    if (pci_limit < threshold and
-            (pci_limit < lnk_limit * 0.95 or lnk_limit > lnk_limit * 1.05)):
-        traces.append(plgo.Scatter(
-            x=x_vals,
-            y=[pci_limit, ] * len(x_vals),
-            name=f"PCIe: {pci_limit:.2f}Mpps",
-            showlegend=False,
-            mode=u"lines",
-            line=dict(
-                dash=u"dot",
-                color=COLORS[-3],
-                width=1),
-            hoverinfo=u"none"
-        ))
-        annotations.append(dict(
-            x=1,
-            y=pci_limit,
-            xref=u"x",
-            yref=u"y",
-            xanchor=u"left",
-            yanchor=u"bottom",
-            text=f"PCIe: {pci_limit:.2f}Mpps",
-            font=dict(
-                size=14,
-                color=COLORS[-3],
-            ),
-            align=u"left",
-            showarrow=False
-        ))
-        y_max.append(pci_limit)
+    if u"-gbps" not in plot_title:
+        nic_limit /= 1e6
+        lnk_limit /= 1e6
+        pci_limit /= 1e6
+        min_limit = min((nic_limit, lnk_limit, pci_limit))
+        if nic_limit == min_limit:
+            traces.append(plgo.Scatter(
+                x=x_vals,
+                y=[nic_limit, ] * len(x_vals),
+                name=f"NIC: {nic_limit:.2f}Mpps",
+                showlegend=False,
+                mode=u"lines",
+                line=dict(
+                    dash=u"dot",
+                    color=COLORS[-1],
+                    width=1),
+                hoverinfo=u"none"
+            ))
+            annotations.append(dict(
+                x=1,
+                y=nic_limit,
+                xref=u"x",
+                yref=u"y",
+                xanchor=u"left",
+                yanchor=u"bottom",
+                text=f"NIC: {nic_limit:.2f}Mpps",
+                font=dict(
+                    size=14,
+                    color=COLORS[-1],
+                ),
+                align=u"left",
+                showarrow=False
+            ))
+            y_max.append(nic_limit)
+        elif lnk_limit == min_limit:
+            traces.append(plgo.Scatter(
+                x=x_vals,
+                y=[lnk_limit, ] * len(x_vals),
+                name=f"Link: {lnk_limit:.2f}Mpps",
+                showlegend=False,
+                mode=u"lines",
+                line=dict(
+                    dash=u"dot",
+                    color=COLORS[-1],
+                    width=1),
+                hoverinfo=u"none"
+            ))
+            annotations.append(dict(
+                x=1,
+                y=lnk_limit,
+                xref=u"x",
+                yref=u"y",
+                xanchor=u"left",
+                yanchor=u"bottom",
+                text=f"Link: {lnk_limit:.2f}Mpps",
+                font=dict(
+                    size=14,
+                    color=COLORS[-1],
+                ),
+                align=u"left",
+                showarrow=False
+            ))
+            y_max.append(lnk_limit)
+        elif pci_limit == min_limit:
+            traces.append(plgo.Scatter(
+                x=x_vals,
+                y=[pci_limit, ] * len(x_vals),
+                name=f"PCIe: {pci_limit:.2f}Mpps",
+                showlegend=False,
+                mode=u"lines",
+                line=dict(
+                    dash=u"dot",
+                    color=COLORS[-1],
+                    width=1),
+                hoverinfo=u"none"
+            ))
+            annotations.append(dict(
+                x=1,
+                y=pci_limit,
+                xref=u"x",
+                yref=u"y",
+                xanchor=u"left",
+                yanchor=u"bottom",
+                text=f"PCIe: {pci_limit:.2f}Mpps",
+                font=dict(
+                    size=14,
+                    color=COLORS[-1],
+                ),
+                align=u"left",
+                showarrow=False
+            ))
+            y_max.append(pci_limit)
 
     # Perfect and measured:
     cidx = 0
@@ -725,7 +785,7 @@ def plot_tsa_name(plot, input_data):
                 if isinstance(val[u"val"][idx], float):
                     htext += (
                         f"No. of Runs: {val[u'count'][idx]}<br>"
-                        f"Mean: {val[u'val'][idx]:.2f}Mpps<br>"
+                        f"Mean: {val[u'val'][idx]:.2f}{h_unit}<br>"
                     )
                 if isinstance(val[u"diff"][idx], float):
                     htext += f"Diff: {round(val[u'diff'][idx]):.0f}%<br>"