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

urls="http://localhost:8080/wm/core/topology/switches/all/json http://localhost:8080/wm/core/topology/links/json http://localhost:8080/wm/registry/controllers/json http://localhost:8080/wm/registry/switches/json"
RestIP=os.environ.get("ONOS_CLUSTER_BASENAME")+"1"
RestPort="8080"

core_switches=["00:00:00:00:ba:5e:ba:11", "00:00:00:00:00:00:ba:12", "00:00:20:4e:7f:51:8a:35", "00:00:00:00:ba:5e:ba:13", "00:00:00:08:a2:08:f9:01", "00:00:00:16:97:08:9a:46"]
correct_nr_switch=[6,50,25,25,25,25,25,25]
correct_intra_link=[16, 98, 48, 48, 48, 48, 48, 48]


#nr_links=(switch[1]+switch[2]+switch[3]+switch[4]+switch[5]+switch[6]+switch[7]+len(switch)-1+8)*2
nr_links= (49 + 24 * 6 + 7 + 8) * 2

def get_json(url):
  print url
  try:
    command = "curl -s %s" % (url)
    result = os.popen(command).read()
    parsedResult = json.loads(result)
  except:
    print "REST IF %s has issue" % command
    parsedResult = ""

  if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
    print "REST %s returned code %s" % (command, parsedResult['code'])
    parsedResult = ""

  return parsedResult 

def check_switch():
  url="http://%s:%s/wm/core/topology/switches/all/json" % (RestIP, RestPort)
  parsedResult = get_json(url)

  if parsedResult == "":
    return

  print "switch: total %d switches" % len(parsedResult)
  cnt = []
  active = []
  for r in range(8):
    cnt.append(0)
    active.append(0)
  for s in parsedResult:
    if s['dpid'] in core_switches:
      nw_index = 0
    else:
      nw_index =int(s['dpid'].split(':')[-2], 16) - 1
    cnt[nw_index] += 1

    if s['state']  == "ACTIVE":
      active[nw_index] += 1

  for r in range(8):
    print "switch: network %d : %d switches %d active" % (r+1, cnt[r], active[r])
    if correct_nr_switch[r] != cnt[r]:
      print "switch fail: network %d should have %d switches but has %d" % (r+1, correct_nr_switch[r], cnt[r])

    if correct_nr_switch[r] != active[r]:
      print "switch fail: network %d should have %d active switches but has %d" % (r+1, correct_nr_switch[r], active[r])

def check_link():
  url = "http://%s:%s/wm/core/topology/links/json" % (RestIP, RestPort)
  parsedResult = get_json(url)

  if parsedResult == "":
    return

  print "link: total %d links (correct : %d)" % (len(parsedResult), nr_links)
  intra = []
  interlink=0
  for r in range(8):
    intra.append(0)

  for s in parsedResult:
    if s['src-switch'] in core_switches:
      src_nw = 1
    else:
      src_nw =int(s['src-switch'].split(':')[-2], 16)
    
    if s['dst-switch'] in core_switches:
      dst_nw = 1
    else:
      dst_nw =int(s['dst-switch'].split(':')[-2], 16)

    src_swid =int(s['src-switch'].split(':')[-1], 16)
    dst_swid =int(s['dst-switch'].split(':')[-1], 16)
    if src_nw == dst_nw:
      intra[src_nw - 1] = intra[src_nw - 1] + 1 
    else:
      inter += 1

  for r in range(8):
    if intra[r] != correct_intra_link[r]:
      print "link fail: network %d should have %d intra links but has %d" % (r+1, correct_intra_link[r], intra[r])

  if interlink != 14:
      print "link fail: There should be %d intra links (uni-directional) but %d" % (14, interlink)

def check_mastership():
  url = "http://%s:%s/wm/registry/switches/json" % (RestIP, RestPort)
  parsedResult = get_json(url)

  if parsedResult == "":
    return

  for s in parsedResult:
    #print s,len(s),s[0]['controllerId']
    ctrl=parsedResult[s][0]['controllerId']
    if s in core_switches:
      nw = 1
    else:
      nw =int(s.split(':')[-2], 16)

    if len(parsedResult[s]) > 1:
      print "ownership fail: switch %s has more than 1 ownership" % (s)
    elif int(ctrl[-1]) != nw:
      print "ownership fail: switch %s is owened by %s" % (s, ctrl)

def check_controllers():
  url = "http://%s:%s/wm/registry/controllers/json" % (RestIP, RestPort)
  parsedResult = get_json(url)

  if parsedResult == "":
    return

  unique=list(set(parsedResult))
  if len(unique) != 8:
    print "controller fail: there are %d controllers" % (len(parsedResult))

if __name__ == "__main__":
  check_switch()
  check_link()
  check_mastership()
  check_controllers()
