| #! /usr/bin/env python |
| import sys |
| import time |
| import os |
| import re |
| import json |
| |
| ping_cnt=10 |
| wait1=ping_cnt |
| wait2=10 |
| |
| CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json" |
| |
| def read_config(): |
| global controllers, cluster_basename |
| f = open(CONFIG_FILE) |
| conf = json.load(f) |
| controllers = conf['controllers'] |
| cluster_basename = conf['cluster_basename'] |
| f.close() |
| |
| def do_pingall(nwid): |
| pid=os.getpid() |
| os.popen("rm -f /tmp/ping.*") |
| |
| filename = sys.argv[1] |
| f = open(filename, 'r') |
| nr_ping = 0 |
| fids=[] |
| for line in f: |
| if line[0] != "#": |
| fid=int(line.strip().split()[0]) |
| logfile="/tmp/ping.%d" % (fid) |
| src_dpid=line.strip().split()[2] |
| dst_dpid=line.strip().split()[4] |
| src_nwid=int(src_dpid.split(':')[-2], 16) |
| dst_nwid=int(dst_dpid.split(':')[-2], 16) |
| src_hostid=int(src_dpid.split(':')[-1], 16) |
| dst_hostid=int(dst_dpid.split(':')[-1], 16) |
| |
| if src_nwid == nwid: |
| cmd="echo \"Pingall flow %d : 192.168.%d.%d -> 192.168.%d.%d\" > %s" % (fid, src_nwid, src_hostid, dst_nwid, dst_hostid,logfile) |
| os.popen(cmd) |
| # cmd="ssh %s \'${HOME}/ONOS/test-network/mininet/mrun host%d \'ping -c %d -W 1 192.168.%d.%d\'\' >> %s 2>&1 &" % (controllers[src_nwid-1], src_hostid, ping_cnt, dst_nwid, dst_hostid,logfile) |
| cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'ping -c %d -W 1 192.168.%d.%d\' >> %s 2>&1 &" % (src_hostid, ping_cnt, dst_nwid, dst_hostid,logfile) |
| print cmd |
| result = os.popen(cmd).read() |
| # time.sleep(0.2) |
| fids.append(fid) |
| nr_ping = nr_ping + 1 |
| |
| f.close() |
| return fids |
| |
| def wait_ping_finish(nr_ping): |
| print "all pings started.. waiting for completion (%d sec)" % (wait1) |
| time.sleep(wait1) |
| cmd="cat /tmp/ping.* | grep \"packet loss\" |wc -l" |
| for i in range(wait2): |
| nr_done = int(os.popen(cmd).read()) |
| if nr_done == nr_ping: |
| break |
| print "%d ping finished" % nr_done |
| time.sleep(1) |
| |
| return nr_done |
| |
| def report(fids, nr_done): |
| cmd='cat /tmp/ping.* | grep " 0% packet loss" |wc -l' |
| nr_success = int(os.popen('cat /tmp/ping.* | grep " 0% packet loss" |wc -l').read()) |
| nr_incomplete = len(fids) - nr_done |
| nr_fail = nr_done - nr_success |
| |
| print "Pingall Result: success %d fail %d incomplete %d" % (nr_success, nr_fail, nr_incomplete) |
| if nr_fail > 0 or nr_incomplete > 0: |
| for i in fids: |
| cmd="cat /tmp/ping.%d | head -n 1" % (i) |
| flow_desc = os.popen(cmd).read().strip() |
| |
| cmd="cat /tmp/ping.%d | grep \"packet loss\"" % (i) |
| result = os.popen(cmd).read().strip() |
| |
| if not re.search(" 0% packet loss", result): |
| print "flow # %d %s : %s" % (i, flow_desc, result) |
| |
| if __name__ == "__main__": |
| read_config() |
| hostname=os.popen('hostname').read().strip() |
| nwid=int(hostname.replace("%s" % cluster_basename, "")) |
| fids=do_pingall(nwid) |
| nr_done=wait_ping_finish(len(fids)) |
| report(fids, nr_done) |