diff options
author | Tibor Frank <tifrank@cisco.com> | 2018-05-14 14:35:46 +0200 |
---|---|---|
committer | Tibor Frank <tifrank@cisco.com> | 2018-05-14 14:36:43 +0200 |
commit | 9964155b56020914494f7341c2d1162f2ac9d720 (patch) | |
tree | bf60e93fb4aca7cbbc81e919cf2d91e9abf2ff29 /resources/tools/report_gen/run_plot.py | |
parent | fd6fedc983a7d1796eb2531782be8a37b6d0921d (diff) |
CSIT-1078: Optimize input data files download and processing
Change-Id: I973238d98d549555c0d43c91f9fd96a9209065ac
Signed-off-by: Tibor Frank <tifrank@cisco.com>
Diffstat (limited to 'resources/tools/report_gen/run_plot.py')
-rw-r--r-- | resources/tools/report_gen/run_plot.py | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/resources/tools/report_gen/run_plot.py b/resources/tools/report_gen/run_plot.py deleted file mode 100644 index 0a95396ac9..0000000000 --- a/resources/tools/report_gen/run_plot.py +++ /dev/null @@ -1,276 +0,0 @@ -#!/usr/bin/python - -# Copyright (c) 2016 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Plot the performance data""" - -import argparse -import operator -import os -import sys -import math - -import plotly.offline as ploff -import plotly.graph_objs as plgo -from lxml import etree - - -def select_files_in_subfolders(directory, ext='xml'): - """Get all files in folder and its subfolders. - - :param dir: Input folder. - :param ext: File extension. - :type dir: str - :type ext: str - :return: List of filex matching the parameters. - :rtype list - """ - for _, _, files in os.walk(directory): - for file in files: - if file.endswith('.%s' % ext): - yield os.path.join(directory, file) - - -def select_files_in_folder(directory, ext='xml'): - """Get all files in folder. - - :param dir: Input folder. - :param ext: File extension. - :type dir: str - :type ext: str - :return: List of filex matching the parameters. - :rtype list - """ - for file in os.listdir(directory): - if file.endswith('.%s' % ext): - yield os.path.join(directory, file) - - -def combine_dicts(first, second, oper=operator.add): - """Combine two dictionaries. - - :param first: First dict. - :param second: Second dict. - :param oper: Operator. - :type first: dict - :type second: dict - :type oper: operator - :return: Combined dictionary. - :rtype dict - """ - - return dict(first.items() + second.items() +\ - [(k, oper(first[k], second[k])) for k in set(second) & set(first)]) - - -def parse_data_pps(args): - """Get PPS data out of XML file into array. - - :param args: Command line parameters. - :type suite: ArgumentParser - :return: X-data and Y-data dictionaries. - :rtype tuple of dict - """ - xdata = [] - ydata_pps = {} - - for i, file in enumerate(sorted(select_files_in_folder(args.input))): - xml_tree = etree.parse(file) - sel = xml_tree.xpath(args.xpath) - if sel: - ydata_pps = combine_dicts(ydata_pps, dict((elem.attrib['name'],\ - (i, float(elem.text))) for elem in sel)) - xdata.append(xml_tree.getroot().attrib['vdevice']) - return xdata, ydata_pps - - -def parse_data_lat(args): - """Get latency data out of XML file into array. - - :param args: Command line parameters. - :type suite: ArgumentParser - :return: X-data and Y-data dictionaries. - :rtype tuple of dict - """ - xdata = [] - ydata_lat = {} - - for i, file in enumerate(sorted(select_files_in_folder(args.input))): - xml_tree = etree.parse(file) - sel = xml_tree.xpath(args.xpath) - if sel: - try: - ydata_lat = combine_dicts(ydata_lat, dict((elem.attrib['name'],\ - (i, elem.attrib[args.latency])) for elem in sel)) - except KeyError: - raise RuntimeError('Retrieving latency data error (PDR?)') - xdata.append(xml_tree.getroot().attrib['vdevice']) - return xdata, ydata_lat - - -def parse_args(): - """Parse arguments from cmd line. - - :return: Parsed arguments. - :rtype ArgumentParser - """ - - parser = argparse.ArgumentParser() - parser.add_argument("-x", "--xpath", required=True, - help="Xpath filter") - parser.add_argument("-t", "--title", required=True, - help="Plot title") - parser.add_argument("-l", "--lower", - default=False, - help="Lower boudary of Y-axis") - parser.add_argument("-u", "--upper", - default=False, - help="Upper boudary of Y-axis") - parser.add_argument("-e", "--errorbar", - default=False, - help="Errorbar for Y-axis") - parser.add_argument("-d", "--latency", - choices=['lat_10', 'lat_50', 'lat_100'], - help="Latency to draw") - parser.add_argument("-p", "--plot", - choices=['box', 'scatter'], - default='box', - help="Throughput plot type") - parser.add_argument("-i", "--input", - help="Input folder") - parser.add_argument("-o", "--output", required=True, - help="Output image file name") - return parser.parse_args() - - -def main(): - """Main function.""" - - args = parse_args() - if args.latency: - xdata, ydata = parse_data_lat(args) - else: - xdata, ydata = parse_data_pps(args) - - # Print data into console for debug - print args.title - for data in ydata: - print data + ";" + ";".join(str(val) for val in ydata[data][1::2]) - - if xdata and ydata: - traces = [] - # Add plot traces - for i, suite in enumerate(ydata): - if args.latency: - y_extract = [] - _ = [y_extract.extend([l, l]) for l in ydata[suite][1::2][0].split('/')] - traces.append(plgo.Box( - x=['TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint1-to-SUT1-to-SUT2-to-TGint2', - 'TGint2-to-SUT2-to-SUT1-to-TGint1', - 'TGint2-to-SUT2-to-SUT1-to-TGint1', - 'TGint2-to-SUT2-to-SUT1-to-TGint1', - 'TGint2-to-SUT2-to-SUT1-to-TGint1', - 'TGint2-to-SUT2-to-SUT1-to-TGint1', - 'TGint2-to-SUT2-to-SUT1-to-TGint1'], - y=y_extract, - name=str(i+1)+'. '+suite.lower().replace('-ndrdisc',''), - boxmean=False, - )) - else: - if args.plot == 'box': - traces.append(plgo.Box( - x=[str(i+1)+'.'] * len(ydata[suite][1::2]), - y=ydata[suite][1::2], - name=str(i+1)+'. '+suite.lower().replace('-ndrdisc',''), - hoverinfo='x+y', - boxpoints='outliers', - whiskerwidth=0, - )) - elif args.plot == 'scatter': - traces.append(plgo.Scatter( - x=ydata[suite][0::2], - y=ydata[suite][1::2], - mode='lines+markers', - name=str(i+1)+'. '+suite.lower().replace('-ndrdisc',''), - )) - else: - pass - - # Add plot layout - layout = plgo.Layout( - title='{0}'.format(args.title), - xaxis=dict( - autorange=True, - autotick=False, - fixedrange=False, - gridcolor='rgb(238, 238, 238)', - linecolor='rgb(238, 238, 238)', - linewidth=1, - showgrid=True, - showline=True, - showticklabels=True, - tickcolor='rgb(238, 238, 238)', - tickmode='linear', - title='Indexed Test Cases' if args.plot == 'box'\ - else '', - zeroline=False, - ), - yaxis=dict( - gridcolor='rgb(238, 238, 238)', - hoverformat='' if args.latency else '.4s', - linecolor='rgb(238, 238, 238)', - linewidth=1, - range=[args.lower, args.upper] if args.lower and args.upper\ - else [], - showgrid=True, - showline=True, - showticklabels=True, - tickcolor='rgb(238, 238, 238)', - title='Latency min/avg/max [uSec]' if args.latency\ - else 'Packets Per Second [pps]', - zeroline=False, - ), - boxmode='group', - boxgroupgap=0.5, - autosize=False, - margin=dict( - t=50, - b=20, - l=50, - r=20, - ), - showlegend=True, - legend=dict( - orientation='h', - ), - width=700, - height=1000, - ) - # Create plot - plpl = plgo.Figure(data=traces, layout=layout) - # Export Plot - ploff.plot(plpl, - show_link=False, auto_open=False, - filename='{0}.html'.format(args.output)) - else: - sys.stderr.write('No data found!\n') - - -if __name__ == "__main__": - sys.exit(main()) |