aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2019-01-15 11:55:43 +0100
committerTibor Frank <tifrank@cisco.com>2019-01-21 15:25:47 +0000
commit46e30d465789d56832fff4cffd069d9d5058fc08 (patch)
tree5cd095059c6778e4842a37283b6f59495980a249
parent84d75908f4a91d0b16d968bffc704aecab6e571a (diff)
CSIT-1397: Create Heatmap graphs
- Heatmap is used Change-Id: I33a8619ea4a346bde92d85da0bbb63f3d916cbc5 Signed-off-by: Tibor Frank <tifrank@cisco.com> (cherry picked from commit 7f83ed570d3cd7ec18f2a7ea3c8c3badd0368099)
-rw-r--r--resources/tools/presentation/generator_plots.py241
-rw-r--r--resources/tools/presentation/specification.yaml58
2 files changed, 299 insertions, 0 deletions
diff --git a/resources/tools/presentation/generator_plots.py b/resources/tools/presentation/generator_plots.py
index 21dd1a0555..ca1cd9bdf6 100644
--- a/resources/tools/presentation/generator_plots.py
+++ b/resources/tools/presentation/generator_plots.py
@@ -1083,3 +1083,244 @@ def plot_http_server_performance_box(plot, input_data):
logging.error(" Finished with error: {}".
format(str(err).replace("\n", " ")))
return
+
+
+def plot_service_density_heatmap(plot, input_data):
+ """Generate the plot(s) with algorithm: plot_service_density_heatmap
+ specified in the specification file.
+
+ :param plot: Plot to generate.
+ :param input_data: Data to process.
+ :type plot: pandas.Series
+ :type input_data: InputData
+ """
+
+ # Example data in Mpps
+ txt_chains = ['1', '2', '4', '6', '8', '10']
+ txt_nodes = ['1', '2', '4', '6', '8', '10']
+ chains = [i + 1 for i in range(len(txt_chains))]
+ nodes = [i + 1 for i in range(len(txt_nodes))]
+ data = [
+ [6.3, 6.3, 6.3, 6.4, 6.5, 6.4],
+ [5.8, 5.6, 5.6, 5.6, 5.5, None],
+ [5.6, 5.5, 5.3, None, None, None],
+ [5.4, 5.3, None, None, None, None],
+ [5.4, 5.2, None, None, None, None],
+ [5.3, None, None, None, None, None]
+ ]
+
+ hovertext = list()
+ annotations = list()
+
+ text = "{name}"
+
+ for c in range(len(txt_chains)):
+ hover_line = list()
+ for n in range(len(txt_nodes)):
+ if data[c][n] is not None:
+ annotations.append(dict(
+ x=n+1,
+ y=c+1,
+ xref="x",
+ yref="y",
+ xanchor="center",
+ yanchor="middle",
+ text=str(data[c][n]),
+ font=dict(
+ size=14,
+ ),
+ align="center",
+ showarrow=False
+ ))
+ hover_line.append(text.format(name="Testcase Name"))
+ hovertext.append(hover_line)
+
+ traces = [
+ plgo.Heatmap(x=nodes,
+ y=chains,
+ z=data,
+ colorbar=dict(
+ title="Packet Throughput [Mpps]",
+ titleside="right",
+ titlefont=dict(
+ size=14
+ ),
+ ),
+ showscale=True,
+ colorscale="Reds",
+ text=hovertext,
+ hoverinfo="text")
+ ]
+
+ for idx, item in enumerate(txt_nodes):
+ annotations.append(dict(
+ x=idx+1,
+ y=0,
+ xref="x",
+ yref="y",
+ xanchor="center",
+ yanchor="top",
+ text=item,
+ font=dict(
+ size=16,
+ ),
+ align="center",
+ showarrow=False
+ ))
+ for idx, item in enumerate(txt_chains):
+ annotations.append(dict(
+ x=0.3,
+ y=idx+1,
+ xref="x",
+ yref="y",
+ xanchor="right",
+ yanchor="middle",
+ text=item,
+ font=dict(
+ size=16,
+ ),
+ align="center",
+ showarrow=False
+ ))
+ # X-axis:
+ annotations.append(dict(
+ x=0.55,
+ y=1.05,
+ xref="paper",
+ yref="paper",
+ xanchor="center",
+ yanchor="middle",
+ text="<b>No. of Network Functions per Service Instance</b>",
+ font=dict(
+ size=16,
+ ),
+ align="center",
+ showarrow=False
+ ))
+ # Y-axis:
+ annotations.append(dict(
+ x=-0.04,
+ y=0.5,
+ xref="paper",
+ yref="paper",
+ xanchor="center",
+ yanchor="middle",
+ text="<b>No. of Service Instances</b>",
+ font=dict(
+ size=16,
+ ),
+ align="center",
+ textangle=270,
+ showarrow=False
+ ))
+ updatemenus = list([
+ dict(
+ x=1.0,
+ y=0.0,
+ xanchor='right',
+ yanchor='bottom',
+ direction='up',
+ buttons=list([
+ dict(
+ args=[{"colorscale": "Reds", "reversescale": False}],
+ label="Red",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Blues", "reversescale": True}],
+ label="Blue",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Greys", "reversescale": True}],
+ label="Grey",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Greens", "reversescale": True}],
+ label="Green",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "RdBu", "reversescale": False}],
+ label="RedBlue",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Picnic", "reversescale": False}],
+ label="Picnic",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Rainbow", "reversescale": False}],
+ label="Rainbow",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Portland", "reversescale": False}],
+ label="Portland",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Jet", "reversescale": False}],
+ label="Jet",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Hot", "reversescale": True}],
+ label="Hot",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Blackbody", "reversescale": True}],
+ label="Blackbody",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Earth", "reversescale": True}],
+ label="Earth",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Electric", "reversescale": True}],
+ label="Electric",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Viridis", "reversescale": True}],
+ label="Viridis",
+ method="update"
+ ),
+ dict(
+ args=[{"colorscale": "Cividis", "reversescale": True}],
+ label="Cividis",
+ method="update"
+ ),
+ ])
+ )
+ ])
+
+ try:
+ layout = deepcopy(plot["layout"])
+ except KeyError as err:
+ logging.error("Finished with error: No layout defined")
+ logging.error(repr(err))
+ return
+
+ layout["annotations"] = annotations
+ layout['updatemenus'] = updatemenus
+
+ try:
+ # Create plot
+ plpl = plgo.Figure(data=traces, layout=layout)
+
+ # Export Plot
+ logging.info(" Writing file '{0}{1}'.".
+ format(plot["output-file"], plot["output-file-type"]))
+ ploff.plot(plpl, show_link=False, auto_open=False,
+ filename='{0}{1}'.format(plot["output-file"],
+ plot["output-file-type"]))
+ except PlotlyError as err:
+ logging.error(" Finished with error: {}".
+ format(str(err).replace("\n", " ")))
+ return
diff --git a/resources/tools/presentation/specification.yaml b/resources/tools/presentation/specification.yaml
index 832f54d574..8dc4df7a84 100644
--- a/resources/tools/presentation/specification.yaml
+++ b/resources/tools/presentation/specification.yaml
@@ -126,6 +126,11 @@
data-sets:
+ # Example
+ plot-vpp-service-density-3n-hsw:
+ csit-vpp-perf-verify-1810-3n-hsw:
+ - 28
+
# Denverton:
intel-dnv-vpp:
intel-dnv-vpp-release-1810:
@@ -805,6 +810,34 @@
width: 700
height: 900
+ plot-service-density:
+ titlefont:
+ size: 18
+ xaxis:
+ side: "top"
+ autorange: True
+ fixedrange: False
+ showgrid: False
+ showline: False
+ showticklabels: False
+ ticks: ""
+ ticklen: 0
+ tickwidth: 0
+ zeroline: False
+ yaxis:
+ autorange: "reversed"
+ showgrid: False
+ showline: False
+ showticklabels: False
+ ticks: ""
+ ticklen: 0
+ tickwidth: 0
+ zeroline: False
+ autosize: True
+ showlegend: False
+ width: 700
+ height: 700
+
plot-cps:
titlefont:
size: 18
@@ -5302,6 +5335,31 @@
title: "example-30min-bars"
layout: "plot-soak-throughput"
+# Heatmap - example
+-
+ type: "plot"
+ title: "Service Density: l2sw-3n-hsw-x520-64b-1t1c-base_and_scale-ndr"
+ algorithm: "plot_service_density_heatmap"
+ output-file-type: ".html"
+ output-file: "{DIR[STATIC,VPP]}/l2sw-3n-hsw-x520-64b-1t1c-base_and_scale-sd-ndr"
+ data: "plot-vpp-service-density-3n-hsw"
+ filter: "'NIC_Intel-X520-DA2' and
+ '64B' and
+ ('BASE' or 'SCALE') and
+ 'NDRPDR' and
+ 'ETH' and
+ '1T1C' and
+ ('L2BDMACSTAT' or 'L2BDMACLRN' or 'L2XCFWD' or 'L2PATCH') and
+ not 'VHOST' and
+ not 'MEMIF'"
+ parameters:
+ - "throughput"
+ - "parent"
+ - "tags"
+ layout:
+ title: "<b>Network Service Density Matrix: Packet Throughput View</b>"
+ layout: "plot-service-density"
+
################################################################################
# Plots VPP HTTP Server Performance
-