blob: cdc8a4d800f81d36b300c2adcb13772f9525a236 [file] [log] [blame]
Ubuntu82b8a832013-02-06 22:00:11 +00001#! /usr/bin/env python
2import pprint
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
13## Global Var ##
Ubuntuf6ce96c2013-02-07 01:45:07 +000014RestIP="localhost"
Ubuntu82b8a832013-02-06 22:00:11 +000015RestPort=8080
16#DBName="onos-network-map"
17
18DEBUG=1
19pp = pprint.PrettyPrinter(indent=4)
20
21app = Flask(__name__)
22
23## Worker Functions ##
24def log_error(txt):
25 print '%s' % (txt)
26
27def debug(txt):
28 if DEBUG:
29 print '%s' % (txt)
30
31## Rest APIs ##
32### File Fetch ###
33@app.route('/ui/img/<filename>', methods=['GET'])
34@app.route('/img/<filename>', methods=['GET'])
35@app.route('/css/<filename>', methods=['GET'])
36@app.route('/js/models/<filename>', methods=['GET'])
37@app.route('/js/views/<filename>', methods=['GET'])
38@app.route('/js/<filename>', methods=['GET'])
39@app.route('/lib/<filename>', methods=['GET'])
40@app.route('/', methods=['GET'])
41@app.route('/<filename>', methods=['GET'])
42@app.route('/tpl/<filename>', methods=['GET'])
43def return_file(filename="index.html"):
44 if request.path == "/":
45 fullpath = "./index.html"
46 else:
47 fullpath = str(request.path)[1:]
48
49 response = make_response(open(fullpath).read())
50 suffix = fullpath.split(".")[-1]
51
52 if suffix == "html" or suffix == "htm":
53 response.headers["Content-type"] = "text/html"
54 elif suffix == "js":
55 response.headers["Content-type"] = "application/javascript"
56 elif suffix == "css":
57 response.headers["Content-type"] = "text/css"
58 elif suffix == "png":
59 response.headers["Content-type"] = "image/png"
60
61 return response
62
63init_topo1 = {
64 "nodes" : [
65 {"name" : "sw0", "group" : 0},
66 {"name" : "sw1", "group" : 0},
67 {"name" : "sw2", "group" : 0},
68 {"name" : "sw3", "group" : 0},
69 {"name" : "sw4", "group" : 0},
70 {"name" : "sw5", "group" : 0},
71 {"name" : "host0", "group" : 1}
72 ],
73 "links" : [
74 {"source" :0, "target": 1},
75 {"source" :1, "target": 0},
76 {"source" :0, "target": 2},
77 {"source" :2, "target": 0},
78 {"source" :1, "target": 3},
79 {"source" :3, "target": 1},
80 {"source" :2, "target": 3},
81 {"source" :3, "target": 2},
82 {"source" :2, "target": 4},
83 {"source" :4, "target": 2},
84 {"source" :3, "target": 5},
85 {"source" :5, "target": 3},
86 {"source" :4, "target": 5},
87 {"source" :5, "target": 4},
88 {"source" :6, "target": 0},
89 {"source" :0, "target": 6}
90 ]
91}
92
93def node_id(switch_array, dpid):
94 id = -1
95 for i, val in enumerate(switch_array):
96 if val['name'] == dpid:
97 id = i
98 break
99
100 return id
101
102@app.route("/topology")
103def topology_for_gui():
104 try:
105 command = "curl -s \'http://%s:%s/wm/core/topology/switches/all/json\'" % (RestIP, RestPort)
106 result = os.popen(command).read()
107 parsedResult = json.loads(result)
108 except:
109 log_error("REST IF has issue: %s" % command)
110 log_error("%s" % result)
111 sys.exit(0)
112
113 topo = {}
114 switches = []
115 links = []
116
117 for v in parsedResult:
118 if v.has_key('dpid'):
119# if v.has_key('dpid') and str(v['state']) == "ACTIVE":#;if you want only ACTIVE nodes
120 dpid = str(v['dpid'])
121 state = str(v['state'])
122 sw = {}
123 sw['name']=dpid
124 if str(v['state']) == "ACTIVE":
125 sw['group']=0
126 if str(v['state']) == "INACTIVE":
127 sw['group']=1
128
129 switches.append(sw)
130
131 try:
132 command = "curl -s \'http://%s:%s/wm/core/topology/links/json\'" % (RestIP, RestPort)
133 result = os.popen(command).read()
134 parsedResult = json.loads(result)
135 except:
136 log_error("REST IF has issue: %s" % command)
137 log_error("%s" % result)
138 sys.exit(0)
139
140 for v in parsedResult:
141 link = {}
142 if v.has_key('dst-switch'):
143 dst_dpid = str(v['dst-switch'])
144 dst_id = node_id(switches, dst_dpid)
145 if v.has_key('src-switch'):
146 src_dpid = str(v['src-switch'])
147 src_id = node_id(switches, src_dpid)
148 link['source'] = src_id
149 link['target'] = dst_id
150 links.append(link)
151
152 topo['nodes'] = switches
153 topo['links'] = links
154
155 pp.pprint(topo)
156 js = json.dumps(topo)
157 resp = Response(js, status=200, mimetype='application/json')
158 return resp
159
160
Ubuntuaea2a682013-02-08 08:30:10 +0000161#@app.route("/wm/topology/toporoute/00:00:00:00:00:a1/2/00:00:00:00:00:c1/3/json")
162#@app.route("/wm/topology/toporoute/<srcdpid>/<srcport>/<destdpid>/<destport>/json")
163@app.route("/wm/topology/toporoute/<v1>/<p1>/<v2>/<p2>/json")
164def shortest_path(v1, p1, v2, p2):
165 try:
166 command = "curl -s \'http://%s:%s/wm/core/topology/switches/all/json\'" % (RestIP, RestPort)
167 result = os.popen(command).read()
168 parsedResult = json.loads(result)
169 except:
170 log_error("REST IF has issue: %s" % command)
171 log_error("%s" % result)
172 sys.exit(0)
173
174 topo = {}
175 switches = []
176 links = []
177
178 for v in parsedResult:
179 if v.has_key('dpid'):
180 dpid = str(v['dpid'])
181 state = str(v['state'])
182 sw = {}
183 sw['name']=dpid
184 if str(v['state']) == "ACTIVE":
185 if dpid[-2:-1] == "a":
186 sw['group']=1
187 if dpid[-2:-1] == "b":
188 sw['group']=2
189 if dpid[-2:-1] == "c":
190 sw['group']=3
191 if str(v['state']) == "INACTIVE":
192 sw['group']=0
193
194 switches.append(sw)
195
196 try:
197 command = "curl -s http://%s:%s/wm/topology/route/%s/%s/%s/%s/json" % (RestIP, RestPort, v1, p1, v2, p2)
198 result = os.popen(command).read()
199 parsedResult = json.loads(result)
200 except:
201 log_error("No route")
202 parsedResult = []
203# exit(1)
204
205 path = [];
206 for i, v in enumerate(parsedResult):
207 if i < len(parsedResult) - 1:
208 sdpid= parsedResult[i]['switch']
209 ddpid = parsedResult[i+1]['switch']
210 path.append( (sdpid, ddpid))
211
212 try:
213 command = "curl -s \'http://%s:%s/wm/core/topology/links/json\'" % (RestIP, RestPort)
214 result = os.popen(command).read()
215 parsedResult = json.loads(result)
216 except:
217 log_error("REST IF has issue: %s" % command)
218 log_error("%s" % result)
219 sys.exit(0)
220
221 for v in parsedResult:
222 link = {}
223 if v.has_key('dst-switch'):
224 dst_dpid = str(v['dst-switch'])
225 dst_id = node_id(switches, dst_dpid)
226 if v.has_key('src-switch'):
227 src_dpid = str(v['src-switch'])
228 src_id = node_id(switches, src_dpid)
229 link['source'] = src_id
230 link['target'] = dst_id
231 onpath = 0
232 for (s,d) in path:
233 if s == v['src-switch'] and d == v['dst-switch']:
234 onpath = 1
235 break
236
237 link['type'] = onpath
238 links.append(link)
239
240 topo['nodes'] = switches
241 topo['links'] = links
242
243 pp.pprint(topo)
244 js = json.dumps(topo)
245 resp = Response(js, status=200, mimetype='application/json')
246 return resp
247
248
249
250
251
Ubuntu82b8a832013-02-06 22:00:11 +0000252@app.route("/wm/core/controller/switches/json")
253def query_switch():
254 try:
255 command = "curl -s \'http://%s:%s/wm/core/topology/switches/all/json\'" % (RestIP, RestPort)
256# http://localhost:8080/wm/core/topology/switches/active/json
257 result = os.popen(command).read()
258 parsedResult = json.loads(result)
259 except:
260 log_error("REST IF has issue: %s" % command)
261 log_error("%s" % result)
262 sys.exit(0)
263
264# print command
265# print result
266 switches_ = []
267 for v in parsedResult:
268 if v.has_key('dpid'):
269 if v.has_key('dpid') and str(v['state']) == "ACTIVE":#;if you want only ACTIVE nodes
270 dpid = str(v['dpid'])
271 state = str(v['state'])
272 sw = {}
273 sw['dpid']=dpid
274 sw['active']=state
275 switches_.append(sw)
276
277 pp.pprint(switches_)
278 js = json.dumps(switches_)
279 resp = Response(js, status=200, mimetype='application/json')
280 return resp
281
282@app.route("/wm/device/")
283def devices():
284 try:
285 command = "curl -s http://%s:%s/graphs/%s/vertices\?key=type\&value=device" % (RestIP, RestPort, DBName)
286 result = os.popen(command).read()
287 parsedResult = json.loads(result)['results']
288 except:
289 log_error("REST IF has issue: %s" % command)
290 log_error("%s" % result)
291 sys.exit(0)
292
293 devices = []
294 for v in parsedResult:
295 dl_addr = v['dl_addr']
296 nw_addr = v['nw_addr']
297 vertex = v['_id']
298 mac = []
299 mac.append(dl_addr)
300 ip = []
301 ip.append(nw_addr)
302 device = {}
303 device['entryClass']="DefaultEntryClass"
304 device['mac']=mac
305 device['ipv4']=ip
306 device['vlan']=[]
307 device['lastSeen']=0
308 attachpoints =[]
309
310 port, dpid = deviceV_to_attachpoint(vertex)
311 attachpoint = {}
312 attachpoint['port']=port
313 attachpoint['switchDPID']=dpid
314 attachpoints.append(attachpoint)
315 device['attachmentPoint']=attachpoints
316 devices.append(device)
317
318 print devices
319 js = json.dumps(devices)
320 resp = Response(js, status=200, mimetype='application/json')
321 return resp
322
323#{"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}
324
325
326## return fake stat for now
327@app.route("/wm/core/switch/<switchId>/<statType>/json")
328def switch_stat(switchId, statType):
329 if statType == "desc":
330 desc=[{"length":1056,"serialNumber":"None","manufacturerDescription":"Nicira Networks, Inc.","hardwareDescription":"Open vSwitch","softwareDescription":"1.4.0+build0","datapathDescription":"None"}]
331 ret = {}
332 ret[switchId]=desc
333 elif statType == "aggregate":
334 aggr = {"packetCount":0,"byteCount":0,"flowCount":0}
335 ret = {}
336 ret[switchId]=aggr
337 else:
338 ret = {}
339
340 js = json.dumps(ret)
341 resp = Response(js, status=200, mimetype='application/json')
342 return resp
343
344
345@app.route("/wm/topology/links/json")
346def query_links():
347 try:
348 command = 'curl -s http://%s:%s/graphs/%s/vertices?key=type\&value=port' % (RestIP, RestPort, DBName)
349 result = os.popen(command).read()
350 parsedResult = json.loads(result)['results']
351 except:
352 log_error("REST IF has issue: %s" % command)
353 log_error("%s" % result)
354 sys.exit(0)
355
356 debug("query_links %s" % command)
357 pp.pprint(parsedResult)
358 sport = []
359 links = []
360 for v in parsedResult:
361 srcport = v['_id']
362 try:
363 command = "curl -s http://%s:%s/graphs/%s/vertices/%d/out?_label=link" % (RestIP, RestPort, DBName, srcport)
364 print command
365 result = os.popen(command).read()
366 linkResults = json.loads(result)['results']
367 except:
368 log_error("REST IF has issue: %s" % command)
369 log_error("%s" % result)
370 sys.exit(0)
371
372 for p in linkResults:
373 if p.has_key('type') and p['type'] == "port":
374 dstport = p['_id']
375 (sport, sdpid) = portV_to_port_dpid(srcport)
376 (dport, ddpid) = portV_to_port_dpid(dstport)
377 link = {}
378 link["src-switch"]=sdpid
379 link["src-port"]=sport
380 link["src-port-state"]=0
381 link["dst-switch"]=ddpid
382 link["dst-port"]=dport
383 link["dst-port-state"]=0
384 link["type"]="internal"
385 links.append(link)
386
387 pp.pprint(links)
388 js = json.dumps(links)
389 resp = Response(js, status=200, mimetype='application/json')
390 return resp
391
392if __name__ == "__main__":
393 if len(sys.argv) > 1 and sys.argv[1] == "-d":
394 print "-- query all switches --"
395 query_switch()
396 print "-- query topo --"
397 topology_for_gui()
398# print "-- query all links --"
399# query_links()
400# print "-- query all devices --"
401# devices()
402 else:
403 app.debug = True
Ubuntuf6ce96c2013-02-07 01:45:07 +0000404# app.run(host="10.0.1.29", port=9000)
Ubuntu82b8a832013-02-06 22:00:11 +0000405 app.run(host="0.0.0.0", port=9000)