blob: 7efbf88fb2657f199f5c3127e4e44226c8eb782b [file] [log] [blame]
Pankaj Berdec4ae4b82013-01-12 09:56:47 -08001#! /usr/bin/python
2
3import os
4import sys
5import subprocess
6import json
7import argparse
8import io
9import time
10
11from flask import Flask, json, Response, render_template, make_response, request
12
13RestIP="127.0.0.1"
14RestPort=8182
15DBName="Cassandra-Netmap"
16
17app = Flask(__name__)
18
19
20## File Fetch ##
21@app.route('/ui/img/<filename>', methods=['GET'])
22@app.route('/img/<filename>', methods=['GET'])
23@app.route('/css/<filename>', methods=['GET'])
24@app.route('/js/models/<filename>', methods=['GET'])
25@app.route('/js/views/<filename>', methods=['GET'])
26@app.route('/js/<filename>', methods=['GET'])
27@app.route('/lib/<filename>', methods=['GET'])
28@app.route('/', methods=['GET'])
29@app.route('/<filename>', methods=['GET'])
30@app.route('/tpl/<filename>', methods=['GET'])
Paul Greysond9872392013-03-18 12:04:15 -070031@app.route('/ons-demo/<filename>', methods=['GET'])
32@app.route('/ons-demo/js/<filename>', methods=['GET'])
33@app.route('/ons-demo/css/<filename>', methods=['GET'])
34@app.route('/ons-demo/assets/<filename>', methods=['GET'])
Pankaj Berdec4ae4b82013-01-12 09:56:47 -080035def return_file(filename="index.html"):
36 if request.path == "/":
37 fullpath = "./index.html"
38 else:
39 fullpath = str(request.path)[1:]
40
41 response = make_response(open(fullpath).read())
42 suffix = fullpath.split(".")[-1]
43
44 if suffix == "html" or suffix == "htm":
45 response.headers["Content-type"] = "text/html"
46 elif suffix == "js":
47 response.headers["Content-type"] = "application/javascript"
48 elif suffix == "css":
49 response.headers["Content-type"] = "text/css"
50 elif suffix == "png":
51 response.headers["Content-type"] = "image/png"
52
53 return response
54
55## REST API ##
56#@app.route("/wm/topology/links/json")
57#def links():
58# global links_
59# js = json.dumps(links_)
60# resp = Response(js, status=200, mimetype='application/json')
61# return resp
62
63#@app.route("/wm/core/controller/switches/json")
64#def switches():
65# global switches_
66# js = json.dumps(switches_)
67# resp = Response(js, status=200, mimetype='application/json')
68# return resp
69
70@app.route("/wm/device/")
71def devices():
72 try:
73 command = "curl -s http://%s:%s/graphs/%s/vertices?key=type\&value=device" % (RestIP, RestPort, DBName)
74 result = os.popen(command).read()
75 parsedResult = json.loads(result)['results']
76 except:
77 log_error("REST IF has issue")
78 exit
79
80 devices_ = []
81 for v in parsedResult:
82 if v['type'] == "device":
83 dl_addr = v['dl_addr']
84 nw_addr = v['nw_addr']
85 vertex = v['_id']
86 mac = []
87 mac.append(dl_addr)
88 ip = []
89 ip.append(nw_addr)
90 device = {}
91 device['entryClass']="DefaultEntryClass"
92 device['mac']=mac
93 device['ipv4']=ip
94 device['vlan']=[]
95 device['lastSeen']=0
96 attachpoints =[]
97 try:
98 command = "curl -s http://%s:%s/graphs/%s/vertices/%d/in" % (RestIP, RestPort, DBName, vertex)
99 result = os.popen(command).read()
100 parsedResult = json.loads(result)['results']
101 except:
102 log_error("REST IF has issue")
103 exit
104
105 port = parsedResult[0]['number']
106 vertex = parsedResult[0]['_id']
107 dpid = portid_to_switch_dpid(vertex)
108 attachpoint = {}
109 attachpoint['port']=port
110 attachpoint['switchDPID']=dpid
111 attachpoints.append(attachpoint)
112 device['attachmentPoint']=attachpoints
113 devices_.append(device)
114
115 print devices_
116 js = json.dumps(devices_)
117 resp = Response(js, status=200, mimetype='application/json')
118 return resp
119
120#{"entityClass":"DefaultEntityClass","mac":["7c:d1:c3:e0:8c:a3"],"ipv4":["192.168.2.102","10.1.10.35"],"vlan":[],"attachmentPoint":[{"port":13,"switchDPID":"00:01:00:12:e2:78:32:44","errorStatus":null}],"lastSeen":1357333593496}
121
122## return fake stat for now
123@app.route("/wm/core/switch/<switchId>/<statType>/json")
124def switch_stat(switchId, statType):
125 if statType == "desc":
126 desc=[{"length":1056,"serialNumber":"None","manufacturerDescription":"Nicira Networks, Inc.","hardwareDescription":"Open vSwitch","softwareDescription":"1.4.0+build0","datapathDescription":"None"}]
127 ret = {}
128 ret[switchId]=desc
129 elif statType == "aggregate":
130 aggr = {"packetCount":0,"byteCount":0,"flowCount":0}
131 ret = {}
132 ret[switchId]=aggr
133 else:
Paul Greysond9872392013-03-18 12:04:15 -0700134 ret = {}
Pankaj Berdec4ae4b82013-01-12 09:56:47 -0800135
136 js = json.dumps(ret)
137 resp = Response(js, status=200, mimetype='application/json')
138 return resp
139
140@app.route("/wm/core/controller/switches/json")
141def query_switch():
142 try:
143 command = "curl -s http://%s:%s/graphs/%s/vertices?key=type\&value=switch" % (RestIP, RestPort, DBName)
144 result = os.popen(command).read()
145 parsedResult = json.loads(result)['results']
146 except:
147 log_error("REST IF has issue")
148 exit
149
150 switches_ = []
151 for v in parsedResult:
152 if v['type'] == "switch":
153 dpid = str(v['dpid']) ;# removing quotation
154 sw = {}
155 sw['dpid']=dpid
156 switches_.append(sw)
157
158 print switches_
159 js = json.dumps(switches_)
160 resp = Response(js, status=200, mimetype='application/json')
161 return resp
162
163@app.route("/wm/topology/links/json")
164def query_links():
165 try:
166 command = "curl -s http://%s:%s/graphs/%s/vertices?key=type\&value=port" % (RestIP, RestPort, DBName)
167 result = os.popen(command).read()
168 parsedResult = json.loads(result)['results']
169 except:
170 log_error("REST IF has issue")
171 exit
172
173 sport = []
174 switches_ = []
175 for v in parsedResult:
176 srcport = v['_id']
177 try:
178 command = "curl -s http://%s:%s/graphs/%s/vertices/%d/out?_label=link" % (RestIP, RestPort, DBName, srcport)
179 result = os.popen(command).read()
180 linkResults = json.loads(result)['results']
181 except:
182 log_error("REST IF has issue")
183 exit
184
185 for p in linkResults:
186 dstport = p['_id']
187 (sport, sdpid) = get_port_switch(srcport)
188 (dport, ddpid) = get_port_switch(dstport)
189 link = {}
190 link["src-switch"]=sdpid
191 link["src-port"]=sport
192 link["src-port-state"]=0
193 link["dst-switch"]=ddpid
194 link["dst-port"]=dport
195 link["dst-port-state"]=0
196 link["type"]="internal"
197 switches_.append(link)
198
199 print switches_
200 js = json.dumps(switches_)
201 resp = Response(js, status=200, mimetype='application/json')
202 return resp
203
204def get_port_switch(vertex):
205 try:
206 command = "curl -s http://%s:%s/graphs/%s/vertices/%d" % (RestIP, RestPort, DBName, vertex)
207 result = os.popen(command).read()
208 parsedResult = json.loads(result)['results']
209 except:
210 log_error("REST IF has issue")
211 exit
212
213 port_number = parsedResult['number']
214 vertex_id = parsedResult['_id']
215 switch_dpid = portid_to_switch_dpid(vertex_id)
216
217 return (port_number, switch_dpid)
218
219def portid_to_switch_dpid(vertex):
220 try:
221 command = "curl -s http://%s:%s/graphs/%s/vertices/%d/in" % (RestIP, RestPort, DBName, vertex)
222 result = os.popen(command).read()
223 parsedResult = json.loads(result)['results']
224 except:
225 log_error("REST IF has issue")
226 exit
227
228 for v in parsedResult:
229 if v['type'] == "switch":
230 sw_dpid = v['dpid']
231 break
232
233 return sw_dpid
234
235def id_to_dpid(vertex):
236 try:
237 command = "curl -s http://%s:%s/graphs/%s/vertices/%d" % (RestIP, RestPort, DBName, vertex)
238 result = os.popen(command).read()
239 parsedResult = json.loads(result)['results']
240 except:
241 log_error("REST IF has issue")
242 exit
243
244 if parsedResult['type'] != "switch":
245 print "not a switch vertex"
246 exit
247 else:
248 sw_dpid = parsedResult['dpid']
249
250 return sw_dpid
Paul Greysond9872392013-03-18 12:04:15 -0700251
Pankaj Berdec4ae4b82013-01-12 09:56:47 -0800252
253if __name__ == "__main__":
254 app.debug = True
255 app.run(host="0.0.0.0", port=9000)
256# query_switch()
257# query_links()
258# devices()