aboutsummaryrefslogtreecommitdiffstats
path: root/resources/tools/presentation/generator_plots.py
diff options
context:
space:
mode:
authorTibor Frank <tifrank@cisco.com>2019-09-11 11:55:13 +0200
committerTibor Frank <tifrank@cisco.com>2019-09-12 14:28:43 +0200
commit5979e1020d4e41e08f1fe4e6d195a0a5bc020bb1 (patch)
tree605eb5d5e7d53cc713aba6fbbdfaa5a195db2e3b /resources/tools/presentation/generator_plots.py
parentc77230ed462b0a79ca0200fabdba41b78e8d7923 (diff)
PAL: Add NFV reconf tests
Change-Id: I6fe36f05423c3c43081872153adf0f1a899381b6 Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources/tools/presentation/generator_plots.py')
-rw-r--r--resources/tools/presentation/generator_plots.py105
1 files changed, 103 insertions, 2 deletions
diff --git a/resources/tools/presentation/generator_plots.py b/resources/tools/presentation/generator_plots.py
index f5bcb0abfa..6fe1f287de 100644
--- a/resources/tools/presentation/generator_plots.py
+++ b/resources/tools/presentation/generator_plots.py
@@ -61,8 +61,109 @@ def generate_plots(spec, data):
logging.info("Done.")
-def plot_performance_name_box(plot, input_data):
- """Generate the plot(s) with algorithm: plot_performance_name_box
+def plot_service_density_reconf_box_name(plot, input_data):
+ """Generate the plot(s) with algorithm: plot_service_density_reconf_box_name
+ specified in the specification file.
+
+ :param plot: Plot to generate.
+ :param input_data: Data to process.
+ :type plot: pandas.Series
+ :type input_data: InputData
+ """
+
+ # Transform the data
+ plot_title = plot.get("title", "")
+ logging.info(" Creating the data set for the {0} '{1}'.".
+ format(plot.get("type", ""), plot_title))
+ data = input_data.filter_tests_by_name(
+ plot, params=["result", "parent", "tags", "type"])
+ if data is None:
+ logging.error("No data.")
+ return
+
+ # Prepare the data for the plot
+ y_vals = OrderedDict()
+ loss = dict()
+ for job in data:
+ for build in job:
+ for test in build:
+ if y_vals.get(test["parent"], None) is None:
+ y_vals[test["parent"]] = list()
+ loss[test["parent"]] = list()
+ try:
+ y_vals[test["parent"]].append(test["result"]["time"])
+ loss[test["parent"]].append(test["result"]["loss"])
+ except (KeyError, TypeError):
+ y_vals[test["parent"]].append(None)
+
+ # Add None to the lists with missing data
+ max_len = 0
+ nr_of_samples = list()
+ for val in y_vals.values():
+ if len(val) > max_len:
+ max_len = len(val)
+ nr_of_samples.append(len(val))
+ for key, val in y_vals.items():
+ if len(val) < max_len:
+ val.extend([None for _ in range(max_len - len(val))])
+
+ # Add plot traces
+ traces = list()
+ df = pd.DataFrame(y_vals)
+ df.head()
+ y_max = list()
+ for i, col in enumerate(df.columns):
+ tst_name = re.sub(REGEX_NIC, "",
+ col.lower().replace('-ndrpdr', '').
+ replace('2n1l-', ''))
+ tst_name = "-".join(tst_name.split("-")[3:-2])
+ name = "{nr}. ({samples:02d} run{plural}, avg pkt loss: {loss:.1f}, " \
+ "stdev: {stdev:.2f}) {name}".format(
+ nr=(i + 1),
+ samples=nr_of_samples[i],
+ plural='s' if nr_of_samples[i] > 1 else '',
+ name=tst_name,
+ loss=mean(loss[col]) / 1000000,
+ stdev=stdev(loss[col]) / 1000000)
+
+ traces.append(plgo.Box(x=[str(i + 1) + '.'] * len(df[col]),
+ y=[y if y else None for y in df[col]],
+ name=name,
+ hoverinfo="x+y",
+ boxpoints="outliers",
+ whiskerwidth=0))
+ try:
+ val_max = max(df[col])
+ except ValueError as err:
+ logging.error(repr(err))
+ continue
+ if val_max:
+ y_max.append(int(val_max) + 1)
+
+ try:
+ # Create plot
+ layout = deepcopy(plot["layout"])
+ layout["title"] = "<b>Time Lost:</b> {0}".format(layout["title"])
+ layout["yaxis"]["title"] = "<b>Implied Time Lost [s]</b>"
+ layout["legend"]["font"]["size"] = 14
+ if y_max:
+ layout["yaxis"]["range"] = [0, max(y_max)]
+ plpl = plgo.Figure(data=traces, layout=layout)
+
+ # Export Plot
+ file_type = plot.get("output-file-type", ".html")
+ logging.info(" Writing file '{0}{1}'.".
+ format(plot["output-file"], file_type))
+ ploff.plot(plpl, show_link=False, auto_open=False,
+ filename='{0}{1}'.format(plot["output-file"], file_type))
+ except PlotlyError as err:
+ logging.error(" Finished with error: {}".
+ format(repr(err).replace("\n", " ")))
+ return
+
+
+def plot_performance_box_name(plot, input_data):
+ """Generate the plot(s) with algorithm: plot_performance_box_name
specified in the specification file.
:param plot: Plot to generate.