diff options
author | Sander Vrijders <sander.vrijders@ugent.be> | 2018-05-30 16:22:56 +0200 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@ugent.be> | 2018-06-05 10:09:20 +0200 |
commit | 0baf4da9e699170fc64a9436f7fb2498c0599081 (patch) | |
tree | 1b5d500f979be8e59c28fbdfac03c5dad04de834 /rumba/prototypes/ouroboros.py | |
parent | a389849c5b827fa5aac8ff93a1241c642cd300e6 (diff) | |
download | rumba-0baf4da9e699170fc64a9436f7fb2498c0599081.tar.gz rumba-0baf4da9e699170fc64a9436f7fb2498c0599081.zip |
storyboard: Add function to export flows stats
This adds a function to export the bytes sent by flows in a certain
DIF. It is implemented within the storyboard, which calls an abstract
function in the Experiment class so that every prototype can implement
it in its own specific way. This commit adds the implementation for
Ouroboros. It exports it to a csv, with the first item the source
IPCP, the second the destination IPCP and then the bytes sent on the
flow.
Diffstat (limited to 'rumba/prototypes/ouroboros.py')
-rw-r--r-- | rumba/prototypes/ouroboros.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/rumba/prototypes/ouroboros.py b/rumba/prototypes/ouroboros.py index a7a7fc9..653f564 100644 --- a/rumba/prototypes/ouroboros.py +++ b/rumba/prototypes/ouroboros.py @@ -26,6 +26,7 @@ import time import subprocess +import re import rumba.ssh_support as ssh import rumba.model as mod @@ -250,3 +251,69 @@ class Experiment(mod.Experiment): def destroy_dif(self, dif): for ipcp in dif.ipcps: ipcp.node.execute_command('irm i d n ' + ipcp.name) + + def parse_stats(self, lines, spaces=0): + d = {} + + while len(lines): + line = lines[0] + + if not re.match(" {%i}.*" % spaces, line): + return d + + lines.pop(0) + + line = line.strip() + + if re.match(".*:.*", line): + head, tail = line.split(":", 1) + + if len(tail) == 0: + d[head] = self.parse_stats(lines, spaces+1) + else: + d[head] = tail.strip() + + return d + + + def export_dif_bandwidth(self, filename, dif): + f = open(filename, 'w') + + for node in dif.members: + ipcp = node.get_ipcp_by_dif(dif) + + # Get IPCP address + if not hasattr(ipcp, 'address'): + path = '/tmp/ouroboros/'+ ipcp.name + '/dt*' + dt_path = node.execute_command('ls -d %s' % path) + dts = dt_path.split('.') + ipcp.address = int(dts[-1]) + logger.info('IPCP %s has dt component ' + 'with address %d' % (ipcp.name, ipcp.address)) + + for node in dif.members: + ipcp = node.get_ipcp_by_dif(dif) + + dt_path = '/tmp/ouroboros/' + ipcp.name + '/dt.' + \ + str(ipcp.address) + '/' + + # Get flows to other endpoints + fd = node.execute_command('ls --ignore=[01] %s' % dt_path) + fds = fd.split('\n') + for fd in fds: + fd_path = dt_path + fd + fd_file = node.execute_command('cat %s' % fd_path) + + d = self.parse_stats(fd_file.splitlines()) + remote = d["Endpoint address"] + ipcp2_name = '' + for ipcp2 in dif.ipcps: + if ipcp2.address == int(remote): + ipcp2_name = ipcp2.name + + nr = d["Qos cube 0"]["sent (bytes)"] + + f.write('%s;%s;%s\n' % (ipcp.name, ipcp2_name, nr)) + + f.close() + logger.info('Wrote stats to %s', filename) |