#! /usr/bin/env python
import os
import re
import json
import sys
import os

status=0

pid=os.getpid()
basename=os.getenv("ONOS_CLUSTER_BASENAME")
RestPort=8080

def dump_switch_table(filename):
  cmd="dsh \"cd ONOS/scripts; ./showflow.sh\""
  f=open(filename, 'w')
  result=os.popen(cmd).read()

  f.write(result)
  f.close()

def dump_network_map(filename):
  url="http://%s1:%d/wm/flow/getall/json" % (basename, RestPort)
  cmd="curl -s %s" % url
  f=open(filename, 'w')
  try:
    result=os.popen(cmd).read()
  except:
    print "REST has issue"
    sys.exit(1)

  json.dump(result, f, indent=2, sort_keys=True)
  f.close()
    
def make_key(*kargs):
  key=""
  for k in kargs:
    key += str(k)+"_"
  return key[:-1]

def fdb_nmap(filename):
  json_flow = json.load(open(filename, 'r'))
  nr_flow_entries = 0
  fdb_nmap={}
  for flow in json_flow:
    fid = flow['flowId']['value']
    dl_src = flow['flowEntryMatch']['srcMac']['value'].lower()
    dl_dst = flow['flowEntryMatch']['dstMac']['value'].lower()
    e = {}
    for entry in flow['dataPath']['flowEntries']:
       dpid = entry['dpid']['value'].replace(":","").lower()
       cookie = entry['flowEntryId']
       in_port = entry['flowEntryMatch']['inPort']['value']

       outport = []
       for p in entry['flowEntryActions']:
         outport.append(p['actionOutput']['port']['value'])
       outport.sort()

       e['dpid']=dpid  
       e['cookie']=cookie
       e['in_port']=in_port
       e['dl_src']=dl_src
       e['dl_dst']=dl_dst
       e['actions']=outport
       e['fid']=fid
       key = make_key(dpid, in_port, dl_src, dl_dst, outport[0])

       fdb_nmap[key]=e
       nr_flow_entries += 1

  print "nmap contained %d flow entries" % nr_flow_entries
  return fdb_nmap

def fdb_raw(filename):
  f = open(filename, 'r')
  fdb_raw={}
  nr_flow_entries = 0
  for line in f:
    e = {}
    if line[0] == '#':
      continue
    dpid=re.search("dpid=([0-9]|[a-f])*", line.strip()).group().split("=")[1]
    cookie=re.search("cookie=0x([0-9]|[a-f])*", line.strip()).group().split("=")[1]
    in_port=re.search("in_port=[0-9]*", line.strip()).group().split("=")[1]
    dl_src=re.search("dl_src=([0-9]|[a-f]|:)*", line.strip()).group().split("=")[1]
    dl_dst=re.search("dl_dst=([0-9]|[a-f]|:)*", line.strip()).group().split("=")[1]
    outport_list=re.search("actions=(output:[0-9]*,*)*", line.strip()).group().split("=")[1].split(",")
    outport=[]
    for i in outport_list:
      outport.append(int(i.split(":")[1]))
    outport.sort()

    e['dpid']=dpid  
    e['cookie']=cookie
    e['in_port']=in_port
    e['dl_src']=dl_src
    e['dl_dst']=dl_dst
    e['actions']=outport
    key = make_key(dpid, in_port, dl_src, dl_dst, outport[0])
    fdb_raw[key]=e
    nr_flow_entries += 1

  print "real switches contained %d flow entries" % nr_flow_entries
  f.close()
  return fdb_raw

if __name__ == "__main__":
  argvs = sys.argv 
  if len(argvs) != 2:
    f1=".nmap.%d.txt" % pid
    f2=".rawflow.%d.txt" % pid
    dump_network_map(f1)
    dump_switch_table(f2)

  else:
    f1 = sys.argv[1]
    f2 = sys.argv[2]


  fdb_nmap = fdb_nmap(f1)
  fdb_raw = fdb_raw(f2)

  nr_not_found_in_switch = 0
  for f in fdb_nmap:
    if not fdb_raw.has_key(f):
      nr_not_found_in_switch += 1
      print "fid=%s dpid=%s cookie=%s in_port=%s dl_src=%s dl_dst=%s outport=%s not found in switch" % (fdb_nmap[f]['fid'],fdb_nmap[f]['dpid'],fdb_nmap[f]['cookie'],fdb_nmap[f]['in_port'],fdb_nmap[f]['dl_src'],fdb_nmap[f]['dl_dst'],fdb_nmap[f]['actions'])

  nr_not_found_in_nmap = 0
  for f in fdb_raw:
    if not fdb_nmap.has_key(f):
      nr_not_found_in_nmap += 1
      print "dpid=%s cookie=%s in_port=%s dl_src=%s dl_dst=%s outport=%s not found in nmap" % (fdb_raw[f]['dpid'],fdb_raw[f]['cookie'],fdb_raw[f]['in_port'],fdb_raw[f]['dl_src'],fdb_raw[f]['dl_dst'],fdb_raw[f]['actions'])
  
  print "Network Map has %d flow entries,  %d not found in switch" % (len(fdb_nmap), nr_not_found_in_switch)
  print "Switches have %d flow entries, %d not found in network map" % (len(fdb_raw), nr_not_found_in_nmap)
  print "dumpfiles: %s %s" % (f1, f2)
