diff options
author | Sander Vrijders <sander.vrijders@ugent.be> | 2018-05-30 16:24:58 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@ugent.be> | 2018-06-05 10:09:21 +0200 |
commit | 63cc59cc42b22788801d20c1a6d9ca68cea8dc37 (patch) | |
tree | 62b385ee2c30f3661ee415e2b22915c237e7a1eb /tools | |
parent | 0baf4da9e699170fc64a9436f7fb2498c0599081 (diff) | |
download | rumba-63cc59cc42b22788801d20c1a6d9ca68cea8dc37.tar.gz rumba-63cc59cc42b22788801d20c1a6d9ca68cea8dc37.zip |
tools: Add script to generate bandwidth graphs
This adds a script to generate bandwidth graphs from an exported
bandwidth csv. It will color the nodes and links depending on the load
and also adjust the thickness of the edges.
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/bw_graph.py | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tools/bw_graph.py b/tools/bw_graph.py new file mode 100755 index 0000000..ab772d4 --- /dev/null +++ b/tools/bw_graph.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python + +import argparse +import csv +import math +import sys + +try: + from colour import Color +except: + print('Colour module not installed, please install it') + sys.exit(1) + +try: + import pydot +except: + print('Pydot module not installed, please install it') + sys.exit(1) + +color_range = list(Color("DarkGreen").range_to(Color("DarkRed"), 20)) +multiplier = float(len(color_range)) + +def get_color(value, max): + if value < max: + val = math.floor(multiplier * value / (max)) + else: + val = math.floor(multiplier - 1) + + color = color_range[val] + + return color.get_hex() + +def get_penwidth(value, max): + if max == 0: + return "1.0" + + r = (4.0 * float(value) / (0.5 * max)) + 1 + return str(r) + +description = "CSV to bandwidth graph script" +epilog = "2018 Sander Vrijders <sander.vrijders@ugent.be>" + +parser = argparse.ArgumentParser(description=description, + epilog=epilog) + +parser.add_argument('-o', '--output', type=str, required=True, + help='Output PDF filename.') + +parser.add_argument('-i', '--input', type=str, required=True, + help='Input CSV filename.') + +parser.add_argument('-m', '--max', type=int, default=10000, required=False, + help='Maximum bandwidth in the network.') + +args = parser.parse_args() + +gvizg = pydot.Dot(graph_type='graph', layout='fdp') + +csvfile = open(args.input, 'r') +reader = csv.reader(csvfile, delimiter=';', quotechar='|') + +bandwidth = {} +nodes = set() +for row in reader: + nodes.add(row[0]) + if (row[1], row[0]) in bandwidth: + bandwidth[row[1], row[0]] += int(row[2]) + else: + bandwidth[row[0], row[1]] = int(row[2]) + +node_bandwidth = {} +for key, value in bandwidth.items(): + n0, n1 = key + if n0 in node_bandwidth: + node_bandwidth[n0] += value + else: + node_bandwidth[n0] = value + if n1 in node_bandwidth: + node_bandwidth[n1] += value + else: + node_bandwidth[n1] = value + +max_b = args.max +for key, value in bandwidth.items(): + max_b = max(value, max_b) + +for node in nodes: + try: + color = get_color(value, 2 * max_b) + g_node = pydot.Node(node, + label=node, + style="filled", + fillcolor=color, + color='white', + fontcolor='white') + gvizg.add_node(g_node) + except Exception as e: + print('Failed to create pydot Node: ' + str(e)) + +for key, value in bandwidth.items(): + try: + color = get_color(value, max_b) + pw = get_penwidth(value, max_b) + edge = pydot.Edge(key[0], key[1], + color = color, + penwidth=pw) + gvizg.add_edge(edge) + except Exception as e: + print('Failed to create pydot Edge: ' + str(e)) + +try: + gvizg.write_pdf(args.output) + print('Generated PDF of bandwidth graph') +except Exception as e: + print('Failed to write PDF: ' + str(e)) + +csvfile.close() |