Added webservices forwarding script for UI
diff --git a/web/restapi.py b/web/restapi.py
new file mode 100755
index 0000000..a3bd51c
--- /dev/null
+++ b/web/restapi.py
@@ -0,0 +1,204 @@
+#! /usr/bin/python
+
+import os
+import sys
+import subprocess
+import json
+import argparse
+import io
+import time
+
+from flask import Flask, json, Response, render_template, make_response, request
+
+RestIP="127.0.0.1"
+RestPort=8182
+DBName="titan-netmap"
+
+app = Flask(__name__)
+
+## Define static link and switch data for now (will be replaced by the one dynamically quering Network DB ## 
+#links_=[{"src-switch":"00:00:00:00:00:00:00:06","src-port":3,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:09","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:08","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:06","dst-port":2,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:07","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:06","dst-port":1,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:06","src-port":1,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:07","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:03","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:02","dst-port":1,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0b","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0a","dst-port":1,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:01","src-port":1,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:02","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:01","src-port":2,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:06","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0d","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0a","dst-port":3,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:06","src-port":2,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:08","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:02","src-port":2,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:04","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:09","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:06","dst-port":3,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:04","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:02","dst-port":2,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0c","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0a","dst-port":2,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:06","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:01","dst-port":2,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:01","src-port":3,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0a","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0a","src-port":1,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0b","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:05","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:02","dst-port":3,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:02","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:01","dst-port":1,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0a","src-port":4,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:01","dst-port":3,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:02","src-port":3,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:05","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0a","src-port":2,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0c","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:02","src-port":1,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:03","dst-port":4,"dst-port-state":0,"type":"internal"},{"src-switch":"00:00:00:00:00:00:00:0a","src-port":3,"src-port-state":0,"dst-switch":"00:00:00:00:00:00:00:0d","dst-port":4,"dst-port-state":0,"type":"internal"}]
+
+#switches_= [{"dpid":"00:00:00:00:00:00:00:0c"},{"dpid":"00:00:00:00:00:00:00:06"},{"dpid":"00:00:00:00:00:00:00:0d"},{"dpid":"00:00:00:00:00:00:00:05"},{"dpid":"00:00:00:00:00:00:00:07"},{"dpid":"00:00:00:00:00:00:00:08"},{"dpid":"00:00:00:00:00:00:00:09"},{"dpid":"00:00:00:00:00:00:00:02"},{"dpid":"00:00:00:00:00:00:00:0a"},{"dpid":"00:00:00:00:00:00:00:01"},{"dpid":"00:00:00:00:00:00:00:03"},{"dpid":"00:00:00:00:00:00:00:0b"},{"dpid":"00:00:00:00:00:00:00:04"}]
+
+
+## File Fetch ##
+@app.route('/ui/img/<filename>', methods=['GET'])
+@app.route('/img/<filename>', methods=['GET'])
+@app.route('/css/<filename>', methods=['GET'])
+@app.route('/js/models/<filename>', methods=['GET'])
+@app.route('/js/views/<filename>', methods=['GET'])
+@app.route('/js/<filename>', methods=['GET'])
+@app.route('/lib/<filename>', methods=['GET'])
+@app.route('/', methods=['GET'])
+@app.route('/<filename>', methods=['GET'])
+@app.route('/tpl/<filename>', methods=['GET'])
+def return_file(filename="index.html"):
+  if request.path == "/":
+    fullpath = "./index.html"
+  else:
+    fullpath = str(request.path)[1:]
+
+  response = make_response(open(fullpath).read())
+  suffix = fullpath.split(".")[-1]
+
+  if suffix == "html" or suffix == "htm":
+    response.headers["Content-type"] = "text/html"
+  elif suffix == "js":
+    response.headers["Content-type"] = "application/javascript"
+  elif suffix == "css":
+    response.headers["Content-type"] = "text/css"
+  elif suffix == "png":
+    response.headers["Content-type"] = "image/png"
+
+  return response
+
+## REST API ##
+#@app.route("/wm/topology/links/json")
+#def links():
+#    global links_
+#    js = json.dumps(links_)
+#    resp = Response(js, status=200, mimetype='application/json')
+#    return resp
+
+#@app.route("/wm/core/controller/switches/json")
+#def switches():
+#    global switches_
+#    js = json.dumps(switches_)
+#    resp = Response(js, status=200, mimetype='application/json')
+#    return resp
+
+@app.route("/wm/device/")
+def devices():
+  ret = []
+  js = json.dumps(ret)
+  resp = Response(js, status=200, mimetype='application/json')
+  return resp
+
+## return fake stat for now
+@app.route("/wm/core/switch/<switchId>/<statType>/json")
+def switch_stat(switchId, statType):
+    if statType == "desc":
+        desc=[{"length":1056,"serialNumber":"None","manufacturerDescription":"Nicira Networks, Inc.","hardwareDescription":"Open vSwitch","softwareDescription":"1.4.0+build0","datapathDescription":"None"}]
+        ret = {}
+        ret[switchId]=desc
+    elif statType == "aggregate":
+        aggr = {"packetCount":0,"byteCount":0,"flowCount":0}
+        ret = {}
+        ret[switchId]=aggr
+    else:
+        ret = {} 
+
+    js = json.dumps(ret)
+    resp = Response(js, status=200, mimetype='application/json')
+    return resp
+
+@app.route("/wm/core/controller/switches/json")
+def query_switch():
+  try:
+    command = "curl -s http://%s:%s/graphs/%s/vertices" % (RestIP, RestPort, DBName)
+    result = os.popen(command).read()
+    parsedResult = json.loads(result)['results']
+  except:
+    log_error("REST IF has issue")
+    exit
+
+  switches_ = []
+  for v in parsedResult:
+    if v['type'] == "switch":
+      dpid = str(v['dpid'])[1:-1] ;# removing quotation
+      sw = {}
+      sw['dpid']=dpid
+      switches_.append(sw)
+
+  print switches_
+  js = json.dumps(switches_)
+  resp = Response(js, status=200, mimetype='application/json')
+  return resp
+
+@app.route("/wm/topology/links/json")
+def query_links():
+  try:
+    command = "curl -s http://%s:%s/graphs/%s/edges" % (RestIP, RestPort, DBName)
+    result = os.popen(command).read()
+    parsedResult = json.loads(result)['results']
+  except:
+    log_error("REST IF has issue")
+    exit
+
+  switches_ = []
+  for v in parsedResult:
+    if v['_label'] == "link":
+      srcport = v['_inV']
+      dstport = v['_outV']
+      (sport, sdpid) = get_port_switch(srcport)
+      (dport, ddpid) = get_port_switch(dstport)
+      link = {}
+      link["src-switch"]=sdpid[1:-1]
+      link["src-port"]=sport
+      link["src-port-state"]=0
+      link["dst-switch"]=ddpid[1:-1]
+      link["dst-port"]=dport
+      link["dst-port-state"]=0
+      link["type"]="internal"
+      switches_.append(link)
+
+  print switches_
+  js = json.dumps(switches_)
+  resp = Response(js, status=200, mimetype='application/json')
+  return resp
+
+def get_port_switch(vertex):
+  try:
+    command = "curl -s http://%s:%s/graphs/%s/vertices/%d" % (RestIP, RestPort, DBName, vertex)
+    result = os.popen(command).read()
+    parsedResult = json.loads(result)['results']
+  except:
+    log_error("REST IF has issue")
+    exit
+
+  port_number = parsedResult['number']
+  vertex_id = parsedResult['_id']
+  switch_dpid = portid_to_switch_dpid(vertex_id)
+
+  return (port_number, switch_dpid)
+
+def portid_to_switch_dpid(vertex):
+  try:
+    command = "curl -s http://%s:%s/graphs/%s/vertices/%d/in" % (RestIP, RestPort, DBName, vertex)
+    result = os.popen(command).read()
+    parsedResult = json.loads(result)['results']
+  except:
+    log_error("REST IF has issue")
+    exit
+
+  for v in parsedResult:
+    if v['type'] == "switch":
+      sw_dpid = v['dpid']
+      break
+
+  return sw_dpid
+
+def id_to_dpid(vertex):
+  try:
+    command = "curl -s http://%s:%s/graphs/%s/vertices/%d" % (RestIP, RestPort, DBName, vertex)
+    result = os.popen(command).read()
+    parsedResult = json.loads(result)['results']
+  except:
+    log_error("REST IF has issue")
+    exit
+
+  if parsedResult['type'] != "switch":
+    print "not a switch vertex"
+    exit
+  else:
+    sw_dpid = parsedResult['dpid']
+
+  return sw_dpid
+  
+
+if __name__ == "__main__":
+    app.debug = True
+    app.run(host="0.0.0.0", port=9000)
+#  query_switch()
+#   query_links()