blob: 615bf2adf358b809a50e85f98e83d2d439817404 [file] [log] [blame]
andrewonlab95ce8322014-10-13 14:12:04 -04001#!/usr/bin/env python
2
3'''
4This driver enters the onos> prompt to issue commands.
5
6Please follow the coding style demonstrated by existing
7functions and document properly.
8
9If you are a contributor to the driver, please
10list your email here for future contact:
11
12jhall@onlab.us
13andrew@onlab.us
Jon Halle8217482014-10-17 13:49:14 -040014shreya@onlab.us
andrewonlab95ce8322014-10-13 14:12:04 -040015
16OCT 13 2014
17
18'''
19
20import sys
21import time
22import pexpect
23import re
24import traceback
25import os.path
26import pydoc
Jon Halla001c392014-10-17 18:50:59 -040027import re
andrewonlab95ce8322014-10-13 14:12:04 -040028sys.path.append("../")
29from drivers.common.clidriver import CLI
30
31class OnosCliDriver(CLI):
32
33 def __init__(self):
34 '''
35 Initialize client
36 '''
37 super(CLI, self).__init__()
38
39 def connect(self,**connectargs):
40 '''
41 Creates ssh handle for ONOS cli.
42 '''
43 try:
44 for key in connectargs:
45 vars(self)[key] = connectargs[key]
46 self.home = "~/ONOS"
47 for key in self.options:
48 if key == "home":
49 self.home = self.options['home']
50 break
51
52
53 self.name = self.options['name']
54 self.handle = super(OnosCliDriver,self).connect(
55 user_name = self.user_name,
56 ip_address = self.ip_address,
57 port = self.port,
58 pwd = self.pwd,
59 home = self.home)
60
61 self.handle.sendline("cd "+ self.home)
62 self.handle.expect("\$")
63 if self.handle:
64 return self.handle
65 else :
66 main.log.info("NO ONOS HANDLE")
67 return main.FALSE
68 except pexpect.EOF:
69 main.log.error(self.name + ": EOF exception found")
70 main.log.error(self.name + ": " + self.handle.before)
71 main.cleanup()
72 main.exit()
73 except:
andrewonlab9627f432014-11-14 12:45:10 -050074 main.log.info(self.name + ":::::::::::::::::::::::")
andrewonlab95ce8322014-10-13 14:12:04 -040075 main.log.error( traceback.print_exc() )
andrewonlab9627f432014-11-14 12:45:10 -050076 main.log.info(":::::::::::::::::::::::")
andrewonlab95ce8322014-10-13 14:12:04 -040077 main.cleanup()
78 main.exit()
79
80 def disconnect(self):
81 '''
82 Called when Test is complete to disconnect the ONOS handle.
83 '''
84 response = ''
85 try:
andrewonlab2a6c9342014-10-16 13:40:15 -040086 self.handle.sendline("")
Jon Hall7e5b9172014-10-22 12:32:47 -040087 i = self.handle.expect(["onos>","\$"])
88 if i == 0:
89 self.handle.sendline("system:shutdown")
90 self.handle.expect("Confirm")
91 self.handle.sendline("yes")
92 self.handle.expect("\$")
93 self.handle.sendline("\n")
andrewonlabc2d05aa2014-10-13 16:51:10 -040094 self.handle.expect("\$")
Jon Hall7e5b9172014-10-22 12:32:47 -040095 self.handle.sendline("exit")
96 self.handle.expect("closed")
andrewonlabc2d05aa2014-10-13 16:51:10 -040097
andrewonlab95ce8322014-10-13 14:12:04 -040098 except pexpect.EOF:
99 main.log.error(self.name + ": EOF exception found")
100 main.log.error(self.name + ": " + self.handle.before)
101 except:
102 main.log.error(self.name + ": Connection failed to the host")
103 response = main.FALSE
104 return response
105
andrewonlab38d2b4a2014-11-13 16:28:47 -0500106 def logout(self):
107 '''
108 Sends 'logout' command to ONOS cli
109 '''
110 try:
andrewonlab9627f432014-11-14 12:45:10 -0500111 self.handle.sendline("")
112 i = self.handle.expect([
113 "onos>",
114 "\$"], timeout=10)
115 if i == 0:
116 self.handle.sendline("logout")
117 self.handle.expect("\$")
118 elif i == 1:
119 return main.TRUE
120
andrewonlab38d2b4a2014-11-13 16:28:47 -0500121 except pexpect.EOF:
122 main.log.error(self.name + ": eof exception found")
andrewonlab9627f432014-11-14 12:45:10 -0500123 main.log.error(self.name + ": " +
124 self.handle.before)
andrewonlab38d2b4a2014-11-13 16:28:47 -0500125 main.cleanup()
126 main.exit()
127 except:
128 main.log.info(self.name+" ::::::")
129 main.log.error( traceback.print_exc())
130 main.log.info(self.name+" ::::::")
131 main.cleanup()
132 main.exit()
133
andrewonlab95ce8322014-10-13 14:12:04 -0400134 def set_cell(self, cellname):
135 '''
136 Calls 'cell <name>' to set the environment variables on ONOSbench
137
138 Before issuing any cli commands, set the environment variable first.
139 '''
140 try:
141 if not cellname:
142 main.log.error("Must define cellname")
143 main.cleanup()
144 main.exit()
145 else:
146 self.handle.sendline("cell "+str(cellname))
147 #Expect the cellname in the ONOS_CELL variable.
148 #Note that this variable name is subject to change
149 # and that this driver will have to change accordingly
150 self.handle.expect("ONOS_CELL="+str(cellname))
151 handle_before = self.handle.before
152 handle_after = self.handle.after
153 #Get the rest of the handle
154 self.handle.sendline("")
155 self.handle.expect("\$")
156 handle_more = self.handle.before
157
158 main.log.info("Cell call returned: "+handle_before+
159 handle_after + handle_more)
160
161 return main.TRUE
162
163 except pexpect.EOF:
andrewonlab38d2b4a2014-11-13 16:28:47 -0500164 main.log.error(self.name + ": eof exception found")
andrewonlab95ce8322014-10-13 14:12:04 -0400165 main.log.error(self.name + ": " + self.handle.before)
166 main.cleanup()
167 main.exit()
168 except:
169 main.log.info(self.name+" ::::::")
170 main.log.error( traceback.print_exc())
171 main.log.info(self.name+" ::::::")
172 main.cleanup()
173 main.exit()
174
andrewonlabc2d05aa2014-10-13 16:51:10 -0400175 def start_onos_cli(self, ONOS_ip):
andrewonlab95ce8322014-10-13 14:12:04 -0400176 try:
177 self.handle.sendline("")
andrewonlab48829f62014-11-17 13:49:01 -0500178 x = self.handle.expect([
179 "\$", "onos>"], timeout=10)
180
181 if x == 1:
182 main.log.info("ONOS cli is already running")
183 return main.TRUE
andrewonlab95ce8322014-10-13 14:12:04 -0400184
185 #Wait for onos start (-w) and enter onos cli
andrewonlabc2d05aa2014-10-13 16:51:10 -0400186 self.handle.sendline("onos -w "+str(ONOS_ip))
andrewonlab2a7ea9b2014-10-24 12:21:05 -0400187 i = self.handle.expect([
188 "onos>",
189 pexpect.TIMEOUT],timeout=60)
190
191 if i == 0:
192 main.log.info(str(ONOS_ip)+" CLI Started successfully")
193 return main.TRUE
194 else:
andrewonlab3a7c3c72014-10-24 17:21:03 -0400195 #If failed, send ctrl+c to process and try again
andrewonlabf47993a2014-10-24 17:56:01 -0400196 main.log.info("Starting CLI failed. Retrying...")
andrewonlab3a7c3c72014-10-24 17:21:03 -0400197 self.handle.sendline("\x03")
198 self.handle.sendline("onos -w "+str(ONOS_ip))
199 i = self.handle.expect(["onos>",pexpect.TIMEOUT],
200 timeout=30)
201 if i == 0:
202 return main.TRUE
203 else:
204 main.log.error("Connection to CLI "+\
andrewonlab2a7ea9b2014-10-24 12:21:05 -0400205 str(ONOS_ip)+" timeout")
andrewonlab3a7c3c72014-10-24 17:21:03 -0400206 return main.FALSE
andrewonlab95ce8322014-10-13 14:12:04 -0400207
208 except pexpect.EOF:
209 main.log.error(self.name + ": EOF exception found")
210 main.log.error(self.name + ": " + self.handle.before)
211 main.cleanup()
212 main.exit()
213 except:
214 main.log.info(self.name+" ::::::")
215 main.log.error( traceback.print_exc())
216 main.log.info(self.name+" ::::::")
217 main.cleanup()
218 main.exit()
219
andrewonlaba18f6bf2014-10-13 19:31:54 -0400220 def sendline(self, cmd_str):
221 '''
222 Send a completely user specified string to
223 the onos> prompt. Use this function if you have
224 a very specific command to send.
225
226 Warning: There are no sanity checking to commands
227 sent using this method.
228 '''
229 try:
230 self.handle.sendline("")
231 self.handle.expect("onos>")
232
233 self.handle.sendline(cmd_str)
234 self.handle.expect("onos>")
235
236 handle = self.handle.before
237
238 self.handle.sendline("")
239 self.handle.expect("onos>")
240
241 handle += self.handle.before
242 handle += self.handle.after
243
244 main.log.info("Command sent.")
Jon Hall42db6dc2014-10-24 19:03:48 -0400245 ansi_escape = re.compile(r'\x1b[^m]*m')
246 handle = ansi_escape.sub('', handle)
andrewonlaba18f6bf2014-10-13 19:31:54 -0400247
248 return handle
249 except pexpect.EOF:
250 main.log.error(self.name + ": EOF exception found")
251 main.log.error(self.name + ": " + self.handle.before)
252 main.cleanup()
253 main.exit()
254 except:
255 main.log.info(self.name+" ::::::")
256 main.log.error( traceback.print_exc())
257 main.log.info(self.name+" ::::::")
258 main.cleanup()
259 main.exit()
260
andrewonlab95ce8322014-10-13 14:12:04 -0400261 #IMPORTANT NOTE:
262 #For all cli commands, naming convention should match
263 #the cli command replacing ':' with '_'.
264 #Ex) onos:topology > onos_topology
265 # onos:links > onos_links
266 # feature:list > feature_list
andrewonlabc2d05aa2014-10-13 16:51:10 -0400267
268 def add_node(self, node_id, ONOS_ip, tcp_port=""):
269 '''
270 Adds a new cluster node by ID and address information.
271 Required:
272 * node_id
273 * ONOS_ip
274 Optional:
275 * tcp_port
276 '''
277 try:
278 self.handle.sendline("")
279 self.handle.expect("onos>")
280
281 self.handle.sendline("add-node "+
282 str(node_id)+" "+
283 str(ONOS_ip)+" "+
284 str(tcp_port))
285
286 i = self.handle.expect([
287 "Error",
288 "onos>" ])
289
290 #Clear handle to get previous output
291 self.handle.sendline("")
292 self.handle.expect("onos>")
293
294 handle = self.handle.before
295
296 if i == 0:
297 main.log.error("Error in adding node")
298 main.log.error(handle)
299 return main.FALSE
300 else:
301 main.log.info("Node "+str(ONOS_ip)+" added")
302 return main.TRUE
303
304 except pexpect.EOF:
305 main.log.error(self.name + ": EOF exception found")
306 main.log.error(self.name + ": " + self.handle.before)
307 main.cleanup()
308 main.exit()
309 except:
310 main.log.info(self.name+" ::::::")
311 main.log.error( traceback.print_exc())
312 main.log.info(self.name+" ::::::")
313 main.cleanup()
314 main.exit()
315
andrewonlab86dc3082014-10-13 18:18:38 -0400316 def remove_node(self, node_id):
317 '''
318 Removes a cluster by ID
319 Issues command: 'remove-node [<node-id>]'
320 Required:
321 * node_id
322 '''
323 try:
324 self.handle.sendline("")
325 self.handle.expect("onos>")
326
327 self.handle.sendline("remove-node "+str(node_id))
328 self.handle.expect("onos>")
329
330 return main.TRUE
331
332 except pexpect.EOF:
333 main.log.error(self.name + ": EOF exception found")
334 main.log.error(self.name + ": " + self.handle.before)
335 main.cleanup()
336 main.exit()
337 except:
338 main.log.info(self.name+" ::::::")
339 main.log.error( traceback.print_exc())
340 main.log.info(self.name+" ::::::")
341 main.cleanup()
342 main.exit()
andrewonlabc2d05aa2014-10-13 16:51:10 -0400343
andrewonlab7c211572014-10-15 16:45:20 -0400344 def nodes(self):
345 '''
346 List the nodes currently visible
347 Issues command: 'nodes'
348 Returns: entire handle of list of nodes
349 '''
350 try:
351 self.handle.sendline("")
352 self.handle.expect("onos>")
353
354 self.handle.sendline("nodes")
355 self.handle.expect("onos>")
356
357 self.handle.sendline("")
358 self.handle.expect("onos>")
359
360 handle = self.handle.before
361
362 return handle
363
364 except pexpect.EOF:
365 main.log.error(self.name + ": EOF exception found")
366 main.log.error(self.name + ": " + self.handle.before)
367 main.cleanup()
368 main.exit()
369 except:
370 main.log.info(self.name+" ::::::")
371 main.log.error( traceback.print_exc())
372 main.log.info(self.name+" ::::::")
373 main.cleanup()
374 main.exit()
375
andrewonlab38d6ae22014-10-15 14:23:45 -0400376 def topology(self):
andrewonlabc2d05aa2014-10-13 16:51:10 -0400377 '''
378 Shows the current state of the topology
379 by issusing command: 'onos> onos:topology'
380 '''
andrewonlab95ce8322014-10-13 14:12:04 -0400381 try:
382 self.handle.sendline("")
383 self.handle.expect("onos>")
andrewonlab38d6ae22014-10-15 14:23:45 -0400384 #either onos:topology or 'topology' will work in CLI
andrewonlab95ce8322014-10-13 14:12:04 -0400385 self.handle.sendline("onos:topology")
386 self.handle.expect("onos>")
387
388 handle = self.handle.before
389
390 main.log.info("onos:topology returned: " +
391 str(handle))
392
393 return handle
394
395 except pexpect.EOF:
396 main.log.error(self.name + ": EOF exception found")
397 main.log.error(self.name + ": " + self.handle.before)
398 main.cleanup()
399 main.exit()
400 except:
401 main.log.info(self.name+" ::::::")
402 main.log.error( traceback.print_exc())
403 main.log.info(self.name+" ::::::")
404 main.cleanup()
405 main.exit()
andrewonlabc2d05aa2014-10-13 16:51:10 -0400406
407 def feature_install(self, feature_str):
408 '''
409 Installs a specified feature
410 by issuing command: 'onos> feature:install <feature_str>'
411 '''
412 try:
413 self.handle.sendline("")
414 self.handle.expect("onos>")
415
416 self.handle.sendline("feature:install "+str(feature_str))
417 self.handle.expect("onos>")
418
419 return main.TRUE
420
421 except pexpect.EOF:
422 main.log.error(self.name + ": EOF exception found")
423 main.log.error(self.name + ": " + self.handle.before)
andrewonlabbf225b02014-11-12 12:14:05 -0500424 main.log.report("Failed to install feature")
425 main.log.report("Exiting test")
andrewonlabc2d05aa2014-10-13 16:51:10 -0400426 main.cleanup()
427 main.exit()
428 except:
429 main.log.info(self.name+" ::::::")
430 main.log.error( traceback.print_exc())
andrewonlabbf225b02014-11-12 12:14:05 -0500431 main.log.report("Failed to install feature")
432 main.log.report("Exiting test")
andrewonlabc2d05aa2014-10-13 16:51:10 -0400433 main.log.info(self.name+" ::::::")
434 main.cleanup()
435 main.exit()
436
437 def feature_uninstall(self, feature_str):
438 '''
439 Uninstalls a specified feature
440 by issuing command: 'onos> feature:uninstall <feature_str>'
441 '''
442 try:
443 self.handle.sendline("")
444 self.handle.expect("onos>")
445
446 self.handle.sendline("feature:uninstall "+str(feature_str))
447 self.handle.expect("onos>")
448
449 return main.TRUE
450
451 except pexpect.EOF:
452 main.log.error(self.name + ": EOF exception found")
453 main.log.error(self.name + ": " + self.handle.before)
454 main.cleanup()
455 main.exit()
456 except:
457 main.log.info(self.name+" ::::::")
458 main.log.error( traceback.print_exc())
459 main.log.info(self.name+" ::::::")
460 main.cleanup()
461 main.exit()
andrewonlab95ce8322014-10-13 14:12:04 -0400462
Jon Halle8217482014-10-17 13:49:14 -0400463 def devices(self, json_format=True, grep_str=""):
andrewonlab86dc3082014-10-13 18:18:38 -0400464 '''
Jon Hall7b02d952014-10-17 20:14:54 -0400465 Lists all infrastructure devices or switches
andrewonlab86dc3082014-10-13 18:18:38 -0400466 Optional argument:
467 * grep_str - pass in a string to grep
468 '''
469 try:
470 self.handle.sendline("")
471 self.handle.expect("onos>")
Jon Halle8217482014-10-17 13:49:14 -0400472
473 if json_format:
474 if not grep_str:
475 self.handle.sendline("devices -j")
476 self.handle.expect("devices -j")
477 self.handle.expect("onos>")
478 else:
479 self.handle.sendline("devices -j | grep '"+
andrewonlab86dc3082014-10-13 18:18:38 -0400480 str(grep_str)+"'")
Jon Halle8217482014-10-17 13:49:14 -0400481 self.handle.expect("devices -j | grep '"+str(grep_str)+"'")
482 self.handle.expect("onos>")
Jon Halla001c392014-10-17 18:50:59 -0400483 handle = self.handle.before
Jon Halld815ce42014-10-17 19:52:30 -0400484 '''
485 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
486 To make that escape sequence visible, use repr() function. The repr(handle) output when printed shows the ANSI escape sequences.
Jon Hall5227ce82014-10-17 20:09:51 -0400487 In json.loads(somestring), this somestring variable is actually repr(somestring) and json.loads would fail with the escape sequence.
Jon Hall983a1702014-10-28 18:44:22 -0400488 So we take off that escape sequence using
Jon Halld815ce42014-10-17 19:52:30 -0400489 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
Jon Hall983a1702014-10-28 18:44:22 -0400490 handle1 = ansi_escape.sub('', handle)
Jon Halld815ce42014-10-17 19:52:30 -0400491 '''
492 #print "repr(handle) =", repr(handle)
Jon Halla001c392014-10-17 18:50:59 -0400493 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
494 handle1 = ansi_escape.sub('', handle)
Jon Halld815ce42014-10-17 19:52:30 -0400495 #print "repr(handle1) = ", repr(handle1)
Jon Halla001c392014-10-17 18:50:59 -0400496 return handle1
Jon Halle8217482014-10-17 13:49:14 -0400497 else:
498 if not grep_str:
499 self.handle.sendline("devices")
andrewonlab9a50dfe2014-10-17 17:22:31 -0400500 self.handle.expect("onos>")
Jon Halle8217482014-10-17 13:49:14 -0400501 else:
502 self.handle.sendline("devices | grep '"+
503 str(grep_str)+"'")
Jon Halle8217482014-10-17 13:49:14 -0400504 self.handle.expect("onos>")
Jon Hallcd707292014-10-17 19:06:17 -0400505 handle = self.handle.before
Jon Hall983a1702014-10-28 18:44:22 -0400506 #print "handle =",handle
Jon Hallcd707292014-10-17 19:06:17 -0400507 return handle
andrewonlab7c211572014-10-15 16:45:20 -0400508 except pexpect.EOF:
509 main.log.error(self.name + ": EOF exception found")
510 main.log.error(self.name + ": " + self.handle.before)
511 main.cleanup()
512 main.exit()
513 except:
514 main.log.info(self.name+" ::::::")
515 main.log.error( traceback.print_exc())
516 main.log.info(self.name+" ::::::")
517 main.cleanup()
518 main.exit()
519
Jon Halle8217482014-10-17 13:49:14 -0400520 def links(self, json_format=True, grep_str=""):
521 '''
522 Lists all core links
523 Optional argument:
524 * grep_str - pass in a string to grep
525 '''
526 try:
527 self.handle.sendline("")
528 self.handle.expect("onos>")
529
530 if json_format:
531 if not grep_str:
532 self.handle.sendline("links -j")
533 self.handle.expect("links -j")
534 self.handle.expect("onos>")
535 else:
536 self.handle.sendline("links -j | grep '"+
537 str(grep_str)+"'")
538 self.handle.expect("links -j | grep '"+str(grep_str)+"'")
539 self.handle.expect("onos>")
Jon Hallcd707292014-10-17 19:06:17 -0400540 handle = self.handle.before
Jon Halld815ce42014-10-17 19:52:30 -0400541 '''
542 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
543 To make that escape sequence visible, use repr() function. The repr(handle) output when printed shows the ANSI escape sequences.
Jon Hall5227ce82014-10-17 20:09:51 -0400544 In json.loads(somestring), this somestring variable is actually repr(somestring) and json.loads would fail with the escape sequence.
Jon Halld815ce42014-10-17 19:52:30 -0400545 So we take off that escape sequence using
546 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
547 handle1 = ansi_escape.sub('', handle)
548 '''
549 #print "repr(handle) =", repr(handle)
Jon Halla001c392014-10-17 18:50:59 -0400550 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
551 handle1 = ansi_escape.sub('', handle)
Jon Halld815ce42014-10-17 19:52:30 -0400552 #print "repr(handle1) = ", repr(handle1)
Jon Halla001c392014-10-17 18:50:59 -0400553 return handle1
Jon Halle8217482014-10-17 13:49:14 -0400554 else:
555 if not grep_str:
556 self.handle.sendline("links")
andrewonlab9a50dfe2014-10-17 17:22:31 -0400557 self.handle.expect("onos>")
Jon Halle8217482014-10-17 13:49:14 -0400558 else:
559 self.handle.sendline("links | grep '"+
560 str(grep_str)+"'")
andrewonlab9a50dfe2014-10-17 17:22:31 -0400561 self.handle.expect("onos>")
Jon Halla001c392014-10-17 18:50:59 -0400562 handle = self.handle.before
Jon Hall983a1702014-10-28 18:44:22 -0400563 #print "handle =",handle
Jon Halla001c392014-10-17 18:50:59 -0400564 return handle
Jon Halle8217482014-10-17 13:49:14 -0400565 except pexpect.EOF:
566 main.log.error(self.name + ": EOF exception found")
567 main.log.error(self.name + ": " + self.handle.before)
568 main.cleanup()
569 main.exit()
570 except:
571 main.log.info(self.name+" ::::::")
572 main.log.error( traceback.print_exc())
573 main.log.info(self.name+" ::::::")
574 main.cleanup()
575 main.exit()
576
577
578 def ports(self, json_format=True, grep_str=""):
579 '''
580 Lists all ports
581 Optional argument:
582 * grep_str - pass in a string to grep
583 '''
584 try:
585 self.handle.sendline("")
586 self.handle.expect("onos>")
587
588 if json_format:
589 if not grep_str:
590 self.handle.sendline("ports -j")
591 self.handle.expect("ports -j")
592 self.handle.expect("onos>")
593 else:
594 self.handle.sendline("ports -j | grep '"+
595 str(grep_str)+"'")
596 self.handle.expect("ports -j | grep '"+str(grep_str)+"'")
597 self.handle.expect("onos>")
Jon Hallcd707292014-10-17 19:06:17 -0400598 handle = self.handle.before
Jon Halld815ce42014-10-17 19:52:30 -0400599 '''
600 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
601 To make that escape sequence visible, use repr() function. The repr(handle) output when printed shows the ANSI escape sequences.
Jon Hall5227ce82014-10-17 20:09:51 -0400602 In json.loads(somestring), this somestring variable is actually repr(somestring) and json.loads would fail with the escape sequence.
Shreya Shah0c525cc2014-10-17 20:20:24 -0400603 So we take off that escape sequence using the following commads:
Jon Halld815ce42014-10-17 19:52:30 -0400604 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
605 handle1 = ansi_escape.sub('', handle)
606 '''
607 #print "repr(handle) =", repr(handle)
Jon Halla001c392014-10-17 18:50:59 -0400608 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
609 handle1 = ansi_escape.sub('', handle)
Jon Halld815ce42014-10-17 19:52:30 -0400610 #print "repr(handle1) = ", repr(handle1)
Jon Halla001c392014-10-17 18:50:59 -0400611 return handle1
612
Jon Halle8217482014-10-17 13:49:14 -0400613 else:
614 if not grep_str:
615 self.handle.sendline("ports")
andrewonlab9a50dfe2014-10-17 17:22:31 -0400616 self.handle.expect("onos>")
617 self.handle.sendline("")
Jon Halle8217482014-10-17 13:49:14 -0400618 self.handle.expect("onos>")
619 else:
620 self.handle.sendline("ports | grep '"+
621 str(grep_str)+"'")
Jon Halle8217482014-10-17 13:49:14 -0400622 self.handle.expect("onos>")
andrewonlab9a50dfe2014-10-17 17:22:31 -0400623 self.handle.sendline("")
Jon Halle8217482014-10-17 13:49:14 -0400624 self.handle.expect("onos>")
Jon Halla001c392014-10-17 18:50:59 -0400625 handle = self.handle.before
Jon Hall983a1702014-10-28 18:44:22 -0400626 #print "handle =",handle
Jon Hallcd707292014-10-17 19:06:17 -0400627 return handle
Jon Halle8217482014-10-17 13:49:14 -0400628 except pexpect.EOF:
629 main.log.error(self.name + ": EOF exception found")
630 main.log.error(self.name + ": " + self.handle.before)
631 main.cleanup()
632 main.exit()
633 except:
634 main.log.info(self.name+" ::::::")
635 main.log.error( traceback.print_exc())
636 main.log.info(self.name+" ::::::")
637 main.cleanup()
638 main.exit()
639
640
Jon Hall983a1702014-10-28 18:44:22 -0400641 def roles(self, json_format=True, grep_str=""):
andrewonlab7c211572014-10-15 16:45:20 -0400642 '''
Jon Hall983a1702014-10-28 18:44:22 -0400643 Lists all devices and the controllers with roles assigned to them
644 Optional argument:
645 * grep_str - pass in a string to grep
andrewonlab7c211572014-10-15 16:45:20 -0400646 '''
647 try:
648 self.handle.sendline("")
649 self.handle.expect("onos>")
andrewonlab7c211572014-10-15 16:45:20 -0400650
Jon Hall983a1702014-10-28 18:44:22 -0400651 if json_format:
652 if not grep_str:
653 self.handle.sendline("roles -j")
654 self.handle.expect("roles -j")
655 self.handle.expect("onos>")
656 else:
657 self.handle.sendline("roles -j | grep '"+
658 str(grep_str)+"'")
659 self.handle.expect("roles -j | grep '"+str(grep_str)+"'")
660 self.handle.expect("onos>")
661 handle = self.handle.before
662 '''
663 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
664 To make that escape sequence visible, use repr() function. The repr(handle) output when printed shows the ANSI escape sequences.
665 In json.loads(somestring), this somestring variable is actually repr(somestring) and json.loads would fail with the escape sequence.
666 So we take off that escape sequence using the following commads:
667 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
668 handle1 = ansi_escape.sub('', handle)
669 '''
670 #print "repr(handle) =", repr(handle)
671 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
672 handle1 = ansi_escape.sub('', handle)
673 #print "repr(handle1) = ", repr(handle1)
674 return handle1
andrewonlab7c211572014-10-15 16:45:20 -0400675
andrewonlab7c211572014-10-15 16:45:20 -0400676 else:
Jon Hall983a1702014-10-28 18:44:22 -0400677 if not grep_str:
678 self.handle.sendline("roles")
679 self.handle.expect("onos>")
680 self.handle.sendline("")
681 self.handle.expect("onos>")
682 else:
683 self.handle.sendline("roles | grep '"+
684 str(grep_str)+"'")
685 self.handle.expect("onos>")
686 self.handle.sendline("")
687 self.handle.expect("onos>")
688 handle = self.handle.before
689 #print "handle =",handle
690 return handle
691 except pexpect.EOF:
692 main.log.error(self.name + ": EOF exception found")
693 main.log.error(self.name + ": " + self.handle.before)
694 main.cleanup()
695 main.exit()
696 except:
697 main.log.info(self.name+" ::::::")
698 main.log.error( traceback.print_exc())
699 main.log.info(self.name+" ::::::")
700 main.cleanup()
701 main.exit()
702
703 def get_role(self, device_id):
704 '''
705 Given the a string containing the json representation of the "roles" cli command and a
706 partial or whole device id, returns a json object containing the
707 roles output for the first device whose id contains "device_id"
708
709 Returns:
710 Dict of the role assignments for the given device or
711 None if not match
712 '''
713 try:
714 import json
715 if device_id == None:
716 return None
717 else:
718 raw_roles = self.roles()
719 roles_json = json.loads(raw_roles)
720 #search json for the device with id then return the device
721 for device in roles_json:
Jon Hall720653a2014-10-28 19:02:37 -0400722 #print device
Jon Hall983a1702014-10-28 18:44:22 -0400723 if str(device_id) in device['id']:
724 return device
725 return None
andrewonlab7c211572014-10-15 16:45:20 -0400726
andrewonlab86dc3082014-10-13 18:18:38 -0400727 except pexpect.EOF:
728 main.log.error(self.name + ": EOF exception found")
729 main.log.error(self.name + ": " + self.handle.before)
730 main.cleanup()
731 main.exit()
732 except:
733 main.log.info(self.name+" ::::::")
734 main.log.error( traceback.print_exc())
735 main.log.info(self.name+" ::::::")
736 main.cleanup()
737 main.exit()
andrewonlab2a6c9342014-10-16 13:40:15 -0400738
andrewonlab3e15ead2014-10-15 14:21:34 -0400739 def paths(self, src_id, dst_id):
740 '''
741 Returns string of paths, and the cost.
742 Issues command: onos:paths <src> <dst>
743 '''
744 try:
745 self.handle.sendline("")
746 self.handle.expect("onos>")
747
748 self.handle.sendline("onos:paths "+
749 str(src_id) + " " + str(dst_id))
750 i = self.handle.expect([
751 "Error",
752 "onos>"])
753
754 self.handle.sendline("")
755 self.handle.expect("onos>")
756
757 handle = self.handle.before
758
759 if i == 0:
760 main.log.error("Error in getting paths")
andrewonlab7c211572014-10-15 16:45:20 -0400761 return (handle, "Error")
andrewonlab3e15ead2014-10-15 14:21:34 -0400762 else:
763 path = handle.split(";")[0]
764 cost = handle.split(";")[1]
765 return (path, cost)
766
767 except pexpect.EOF:
768 main.log.error(self.name + ": EOF exception found")
769 main.log.error(self.name + ": " + self.handle.before)
770 main.cleanup()
771 main.exit()
772 except:
773 main.log.info(self.name+" ::::::")
774 main.log.error( traceback.print_exc())
775 main.log.info(self.name+" ::::::")
776 main.cleanup()
777 main.exit()
andrewonlab3f0a4af2014-10-17 12:25:14 -0400778
Jon Hall42db6dc2014-10-24 19:03:48 -0400779 def hosts(self, json_format=True, grep_str=""):
780 '''
781 Lists all discovered hosts
782 Optional argument:
783 * grep_str - pass in a string to grep
784 '''
785 try:
786 self.handle.sendline("")
787 self.handle.expect("onos>")
788
789 if json_format:
790 if not grep_str:
791 self.handle.sendline("hosts -j")
792 self.handle.expect("hosts -j")
793 self.handle.expect("onos>")
794 else:
795 self.handle.sendline("hosts -j | grep '"+
796 str(grep_str)+"'")
797 self.handle.expect("hosts -j | grep '"+str(grep_str)+"'")
798 self.handle.expect("onos>")
799 handle = self.handle.before
800 '''
801 handle variable here contains some ANSI escape color code sequences at the end which are invisible in the print command output
802 To make that escape sequence visible, use repr() function. The repr(handle) output when printed shows the ANSI escape sequences.
803 In json.loads(somestring), this somestring variable is actually repr(somestring) and json.loads would fail with the escape sequence.
804 So we take off that escape sequence using
805 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
806 handle1 = ansi_escape.sub('', handle)
807 '''
808 #print "repr(handle) =", repr(handle)
809 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
810 handle1 = ansi_escape.sub('', handle)
811 #print "repr(handle1) = ", repr(handle1)
812 return handle1
813 else:
814 if not grep_str:
815 self.handle.sendline("hosts")
816 self.handle.expect("onos>")
817 else:
818 self.handle.sendline("hosts | grep '"+
819 str(grep_str)+"'")
820 self.handle.expect("onos>")
821 handle = self.handle.before
Jon Hall983a1702014-10-28 18:44:22 -0400822 #print "handle =",handle
Jon Hall42db6dc2014-10-24 19:03:48 -0400823 return handle
824 except pexpect.EOF:
825 main.log.error(self.name + ": EOF exception found")
826 main.log.error(self.name + ": " + self.handle.before)
827 main.cleanup()
828 main.exit()
829 except:
830 main.log.info(self.name+" ::::::")
831 main.log.error( traceback.print_exc())
832 main.log.info(self.name+" ::::::")
833 main.cleanup()
834 main.exit()
835
836 def get_host(self, mac):
837 '''
838 Return the first host from the hosts api whose 'id' contains 'mac'
839 Note: mac must be a colon seperated mac address, but could be a partial mac address
840 Return None if there is no match
841 '''
842 import json
843 try:
844 if mac == None:
845 return None
846 else:
847 mac = mac
848 raw_hosts = self.hosts()
849 hosts_json = json.loads(raw_hosts)
850 #search json for the host with mac then return the device
851 for host in hosts_json:
Jon Hall983a1702014-10-28 18:44:22 -0400852 #print "%s in %s?" % (mac, host['id'])
Jon Hall42db6dc2014-10-24 19:03:48 -0400853 if mac in host['id']:
854 return host
855 return None
856 except pexpect.EOF:
857 main.log.error(self.name + ": EOF exception found")
858 main.log.error(self.name + ": " + self.handle.before)
859 main.cleanup()
860 main.exit()
861 except:
862 main.log.info(self.name+" ::::::")
863 main.log.error( traceback.print_exc())
864 main.log.info(self.name+" ::::::")
865 main.cleanup()
866 main.exit()
867
andrewonlab3f0a4af2014-10-17 12:25:14 -0400868
869 def get_hosts_id(self, host_list):
870 '''
871 Obtain list of hosts
872 Issues command: 'onos> hosts'
873
874 Required:
875 * host_list: List of hosts obtained by Mininet
876 IMPORTANT:
877 This function assumes that you started your
878 topology with the option '--mac'.
879 Furthermore, it assumes that value of VLAN is '-1'
880 Description:
881 Converts mininet hosts (h1, h2, h3...) into
882 ONOS format (00:00:00:00:00:01/-1 , ...)
883 '''
884
885 try:
andrewonlab3f0a4af2014-10-17 12:25:14 -0400886 onos_host_list = []
887
888 for host in host_list:
889 host = host.replace("h", "")
890 host_hex = hex(int(host)).zfill(12)
891 host_hex = str(host_hex).replace('x','0')
892 i = iter(str(host_hex))
893 host_hex = ":".join(a+b for a,b in zip(i,i))
894 host_hex = host_hex + "/-1"
895 onos_host_list.append(host_hex)
896
897 return onos_host_list
898
899 except pexpect.EOF:
900 main.log.error(self.name + ": EOF exception found")
901 main.log.error(self.name + ": " + self.handle.before)
902 main.cleanup()
903 main.exit()
904 except:
905 main.log.info(self.name+" ::::::")
906 main.log.error( traceback.print_exc())
907 main.log.info(self.name+" ::::::")
908 main.cleanup()
909 main.exit()
andrewonlab3e15ead2014-10-15 14:21:34 -0400910
andrewonlabe6745342014-10-17 14:29:13 -0400911 def add_host_intent(self, host_id_one, host_id_two):
912 '''
913 Required:
914 * host_id_one: ONOS host id for host1
915 * host_id_two: ONOS host id for host2
916 Description:
917 Adds a host-to-host intent (bidrectional) by
918 specifying the two hosts.
919 '''
920 try:
921 self.handle.sendline("")
922 self.handle.expect("onos>")
923
924 self.handle.sendline("add-host-intent "+
925 str(host_id_one) + " " + str(host_id_two))
926 self.handle.expect("onos>")
927
andrewonlabe6745342014-10-17 14:29:13 -0400928 handle = self.handle.before
Shreya Shah4f25fdf2014-10-29 19:55:35 -0400929 print "handle =", handle
andrewonlabe6745342014-10-17 14:29:13 -0400930
931 main.log.info("Intent installed between "+
932 str(host_id_one) + " and " + str(host_id_two))
933
934 return handle
935
936 except pexpect.EOF:
937 main.log.error(self.name + ": EOF exception found")
938 main.log.error(self.name + ": " + self.handle.before)
939 main.cleanup()
940 main.exit()
941 except:
942 main.log.info(self.name+" ::::::")
943 main.log.error( traceback.print_exc())
944 main.log.info(self.name+" ::::::")
945 main.cleanup()
946 main.exit()
947
andrewonlab7b31d232014-10-24 13:31:47 -0400948 def add_optical_intent(self, ingress_device, egress_device):
949 '''
950 Required:
951 * ingress_device: device id of ingress device
952 * egress_device: device id of egress device
953 Optional:
954 TODO: Still needs to be implemented via dev side
955 '''
956 try:
957 self.handle.sendline("add-optical-intent "+
958 str(ingress_device) + " " + str(egress_device))
959 self.handle.expect("add-optical-intent")
960 i = self.handle.expect([
961 "Error",
962 "onos>"])
963
964 handle = self.handle.before
965
966 #If error, return error message
967 if i == 0:
968 return handle
969 else:
970 return main.TRUE
971
972 except pexpect.EOF:
973 main.log.error(self.name + ": EOF exception found")
974 main.log.error(self.name + ": " + self.handle.before)
975 main.cleanup()
976 main.exit()
977 except:
978 main.log.info(self.name+" ::::::")
979 main.log.error( traceback.print_exc())
980 main.log.info(self.name+" ::::::")
981 main.cleanup()
982 main.exit()
983
andrewonlab36af3822014-11-18 17:48:18 -0500984 def add_point_intent(self, ingress_device, egress_device,
985 port_ingress="", port_egress="", ethType="", ethSrc="",
andrewonlabfa4ff502014-11-11 16:41:30 -0500986 ethDst="", bandwidth="", lambda_alloc=False,
987 ipProto="", ipSrc="", ipDst="", tcpSrc="", tcpDst=""):
andrewonlab4dbb4d82014-10-17 18:22:31 -0400988 '''
989 Required:
990 * ingress_device: device id of ingress device
991 * egress_device: device id of egress device
andrewonlab289e4b72014-10-21 21:24:18 -0400992 Optional:
993 * ethType: specify ethType
994 * ethSrc: specify ethSrc (i.e. src mac addr)
995 * ethDst: specify ethDst (i.e. dst mac addr)
andrewonlab0dbb6ec2014-11-06 13:46:55 -0500996 * bandwidth: specify bandwidth capacity of link
andrewonlab40ccd8b2014-11-06 16:23:34 -0500997 * lambda_alloc: if True, intent will allocate lambda
998 for the specified intent
andrewonlabf77e0cb2014-11-11 17:17:59 -0500999 * ipProto: specify ip protocol
1000 * ipSrc: specify ip source address
1001 * ipDst: specify ip destination address
1002 * tcpSrc: specify tcp source port
1003 * tcpDst: specify tcp destination port
andrewonlab4dbb4d82014-10-17 18:22:31 -04001004 Description:
1005 Adds a point-to-point intent (uni-directional) by
andrewonlab289e4b72014-10-21 21:24:18 -04001006 specifying device id's and optional fields
1007
andrewonlab4dbb4d82014-10-17 18:22:31 -04001008 NOTE: This function may change depending on the
1009 options developers provide for point-to-point
1010 intent via cli
1011 '''
1012 try:
andrewonlab289e4b72014-10-21 21:24:18 -04001013 cmd = ""
1014
1015 #If there are no optional arguments
andrewonlab0dbb6ec2014-11-06 13:46:55 -05001016 if not ethType and not ethSrc and not ethDst\
andrewonlabfa4ff502014-11-11 16:41:30 -05001017 and not bandwidth and not lambda_alloc \
1018 and not ipProto and not ipSrc and not ipDst \
1019 and not tcpSrc and not tcpDst:
andrewonlab36af3822014-11-18 17:48:18 -05001020 cmd = "add-point-intent"
1021
1022
andrewonlab289e4b72014-10-21 21:24:18 -04001023 else:
andrewonlab36af3822014-11-18 17:48:18 -05001024 cmd = "add-point-intent"
andrewonlab9a130be2014-10-22 12:44:56 -04001025
andrewonlab0c0a6772014-10-22 12:31:18 -04001026 if ethType:
andrewonlab289e4b72014-10-21 21:24:18 -04001027 cmd += " --ethType " + str(ethType)
1028 if ethSrc:
1029 cmd += " --ethSrc " + str(ethSrc)
1030 if ethDst:
1031 cmd += " --ethDst " + str(ethDst)
andrewonlab0dbb6ec2014-11-06 13:46:55 -05001032 if bandwidth:
1033 cmd += " --bandwidth " + str(bandwidth)
1034 if lambda_alloc:
andrewonlabfa4ff502014-11-11 16:41:30 -05001035 cmd += " --lambda "
1036 if ipProto:
1037 cmd += " --ipProto " + str(ipProto)
1038 if ipSrc:
1039 cmd += " --ipSrc " + str(ipSrc)
1040 if ipDst:
1041 cmd += " --ipDst " + str(ipDst)
1042 if tcpSrc:
1043 cmd += " --tcpSrc " + str(tcpSrc)
1044 if tcpDst:
1045 cmd += " --tcpDst " + str(tcpDst)
andrewonlab289e4b72014-10-21 21:24:18 -04001046
andrewonlab36af3822014-11-18 17:48:18 -05001047 #Check whether the user appended the port
1048 #or provided it as an input
1049 if "/" in ingress_device:
1050 cmd += " "+str(ingress_device)
1051 else:
1052 if not port_ingress:
1053 main.log.error("You must specify "+
1054 "the ingress port")
1055 #TODO: perhaps more meaningful return
1056 return main.FALSE
1057
1058 cmd += " "+ \
1059 str(ingress_device) + "/" +\
1060 str(port_ingress) + " "
1061
1062 if "/" in egress_device:
1063 cmd += " "+str(egress_device)
1064 else:
1065 if not port_egress:
1066 main.log.error("You must specify "+
1067 "the egress port")
1068 return main.FALSE
1069
1070 cmd += " "+\
1071 str(egress_device) + "/" +\
1072 str(port_egress)
andrewonlab4dbb4d82014-10-17 18:22:31 -04001073
andrewonlab289e4b72014-10-21 21:24:18 -04001074 self.handle.sendline(cmd)
andrewonlab36af3822014-11-18 17:48:18 -05001075
1076 main.log.info(cmd + " sent")
andrewonlab4dbb4d82014-10-17 18:22:31 -04001077 i = self.handle.expect([
1078 "Error",
1079 "onos>"])
andrewonlab4dbb4d82014-10-17 18:22:31 -04001080
1081 if i == 0:
1082 main.log.error("Error in adding point-to-point intent")
1083 return handle
1084 else:
1085 return main.TRUE
andrewonlab289e4b72014-10-21 21:24:18 -04001086
andrewonlab4dbb4d82014-10-17 18:22:31 -04001087 except pexpect.EOF:
1088 main.log.error(self.name + ": EOF exception found")
1089 main.log.error(self.name + ": " + self.handle.before)
1090 main.cleanup()
1091 main.exit()
1092 except:
1093 main.log.info(self.name+" ::::::")
1094 main.log.error( traceback.print_exc())
1095 main.log.info(self.name+" ::::::")
1096 main.cleanup()
1097 main.exit()
1098
andrewonlab9a50dfe2014-10-17 17:22:31 -04001099 def remove_intent(self, intent_id):
1100 '''
1101 Remove intent for specified intent id
1102 '''
1103 try:
1104 self.handle.sendline("")
1105 self.handle.expect("onos>")
1106
1107 self.handle.sendline("remove-intent "+str(intent_id))
1108 i = self.handle.expect([
1109 "Error",
1110 "onos>"])
1111
1112 handle = self.handle.before
1113
1114 if i == 0:
1115 main.log.error("Error in removing intent")
1116 return handle
1117 else:
1118 return handle
1119
1120 except pexpect.EOF:
1121 main.log.error(self.name + ": EOF exception found")
1122 main.log.error(self.name + ": " + self.handle.before)
1123 main.cleanup()
1124 main.exit()
1125 except:
1126 main.log.info(self.name+" ::::::")
1127 main.log.error( traceback.print_exc())
1128 main.log.info(self.name+" ::::::")
1129 main.cleanup()
1130 main.exit()
1131
andrewonlab377693f2014-10-21 16:00:30 -04001132 def intents(self, json_format = False):
andrewonlabe6745342014-10-17 14:29:13 -04001133 '''
andrewonlab377693f2014-10-21 16:00:30 -04001134 Optional:
1135 * json_format: enable output formatting in json
andrewonlabe6745342014-10-17 14:29:13 -04001136 Description:
1137 Obtain intents currently installed
1138 '''
1139 try:
andrewonlab377693f2014-10-21 16:00:30 -04001140 if json_format:
1141 self.handle.sendline("intents -j")
1142 self.handle.expect("intents -j")
1143 self.handle.expect("onos>")
andrewonlab377693f2014-10-21 16:00:30 -04001144 handle = self.handle.before
andrewonlab0dbb6ec2014-11-06 13:46:55 -05001145
1146 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
1147 handle = ansi_escape.sub('', handle)
andrewonlab377693f2014-10-21 16:00:30 -04001148 else:
1149 self.handle.sendline("")
1150 self.handle.expect("onos>")
andrewonlabe6745342014-10-17 14:29:13 -04001151
andrewonlab377693f2014-10-21 16:00:30 -04001152 self.handle.sendline("intents")
1153 self.handle.expect("onos>")
andrewonlab377693f2014-10-21 16:00:30 -04001154 handle = self.handle.before
andrewonlabe6745342014-10-17 14:29:13 -04001155
1156 return handle
1157
1158 except pexpect.EOF:
1159 main.log.error(self.name + ": EOF exception found")
1160 main.log.error(self.name + ": " + self.handle.before)
1161 main.cleanup()
1162 main.exit()
1163 except:
1164 main.log.info(self.name+" ::::::")
1165 main.log.error( traceback.print_exc())
1166 main.log.info(self.name+" ::::::")
1167 main.cleanup()
1168 main.exit()
1169
Shreya Shah0f01c812014-10-26 20:15:28 -04001170 def flows(self, json_format = False):
1171 '''
1172 Optional:
1173 * json_format: enable output formatting in json
1174 Description:
1175 Obtain flows currently installed
1176 '''
1177 try:
1178 if json_format:
1179 self.handle.sendline("flows -j")
1180 self.handle.expect("flows -j")
1181 self.handle.expect("onos>")
1182 handle = self.handle.before
1183
1184 else:
1185 self.handle.sendline("")
1186 self.handle.expect("onos>")
1187 self.handle.sendline("flows")
1188 self.handle.expect("onos>")
1189 handle = self.handle.before
1190
1191 return handle
1192
1193 except pexpect.EOF:
1194 main.log.error(self.name + ": EOF exception found")
1195 main.log.error(self.name + ": " + self.handle.before)
1196 main.cleanup()
1197 main.exit()
1198 except:
1199 main.log.info(self.name+" ::::::")
1200 main.log.error( traceback.print_exc())
1201 main.log.info(self.name+" ::::::")
1202 main.cleanup()
1203 main.exit()
1204
andrewonlab0dbb6ec2014-11-06 13:46:55 -05001205 def intents_events_metrics(self, json_format=True):
1206 '''
1207 Description:Returns topology metrics
1208 Optional:
1209 * json_format: enable json formatting of output
1210 '''
1211 try:
1212 if json_format:
1213 self.handle.sendline("intents-events-metrics -j")
1214 self.handle.expect("intents-events-metrics -j")
1215 self.handle.expect("onos>")
1216
1217 handle = self.handle.before
1218
1219 #Some color thing that we want to escape
1220 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
1221 handle = ansi_escape.sub('', handle)
1222
1223 else:
1224 self.handle.sendline("intents-events-metrics")
1225 self.handle.expect("intents-events-metrics")
1226 self.handle.expect("onos>")
1227
1228 handle = self.handle.before
Shreya Shah0f01c812014-10-26 20:15:28 -04001229
andrewonlab0dbb6ec2014-11-06 13:46:55 -05001230 return handle
1231
1232 except pexpect.EOF:
1233 main.log.error(self.name + ": EOF exception found")
1234 main.log.error(self.name + ": " + self.handle.before)
1235 main.cleanup()
1236 main.exit()
1237 except:
1238 main.log.info(self.name+" ::::::")
1239 main.log.error( traceback.print_exc())
1240 main.log.info(self.name+" ::::::")
1241 main.cleanup()
1242 main.exit()
Shreya Shah0f01c812014-10-26 20:15:28 -04001243
andrewonlab867212a2014-10-22 20:13:38 -04001244 def topology_events_metrics(self, json_format=True):
1245 '''
1246 Description:Returns topology metrics
1247 Optional:
1248 * json_format: enable json formatting of output
1249 '''
1250 try:
1251 if json_format:
1252 self.handle.sendline("topology-events-metrics -j")
1253 self.handle.expect("topology-events-metrics -j")
1254 self.handle.expect("onos>")
1255
1256 handle = self.handle.before
1257
1258 #Some color thing that we want to escape
1259 ansi_escape = re.compile(r'\r\r\n\x1b[^m]*m')
1260 handle = ansi_escape.sub('', handle)
1261
1262 else:
1263 self.handle.sendline("topology-events-metrics")
1264 self.handle.expect("topology-events-metrics")
1265 self.handle.expect("onos>")
1266
1267 handle = self.handle.before
1268
1269 return handle
1270
1271 except pexpect.EOF:
1272 main.log.error(self.name + ": EOF exception found")
1273 main.log.error(self.name + ": " + self.handle.before)
1274 main.cleanup()
1275 main.exit()
1276 except:
1277 main.log.info(self.name+" ::::::")
1278 main.log.error( traceback.print_exc())
1279 main.log.info(self.name+" ::::::")
1280 main.cleanup()
1281 main.exit()
1282
andrewonlab3e15ead2014-10-15 14:21:34 -04001283 #Wrapper functions ****************
andrewonlab7e4d2d32014-10-15 13:23:21 -04001284 #Wrapper functions use existing driver
1285 #functions and extends their use case.
1286 #For example, we may use the output of
1287 #a normal driver function, and parse it
1288 #using a wrapper function
andrewonlabc2d05aa2014-10-13 16:51:10 -04001289
andrewonlab9a50dfe2014-10-17 17:22:31 -04001290 def get_all_intents_id(self):
1291 '''
1292 Description:
1293 Obtain all intent id's in a list
1294 '''
1295 try:
1296 #Obtain output of intents function
1297 intents_str = self.intents()
1298 all_intent_list = []
1299 intent_id_list = []
1300
1301 #Parse the intents output for ID's
1302 intents_list = [s.strip() for s in intents_str.splitlines()]
1303 for intents in intents_list:
1304 if "onos>" in intents:
1305 continue
1306 elif "intents" in intents:
1307 continue
1308 else:
1309 line_list = intents.split(" ")
1310 all_intent_list.append(line_list[0])
1311
1312 all_intent_list = all_intent_list[1:-2]
1313
1314 for intents in all_intent_list:
1315 if not intents:
1316 continue
1317 else:
1318 intent_id_list.append(intents)
1319
1320 return intent_id_list
1321
1322 except pexpect.EOF:
1323 main.log.error(self.name + ": EOF exception found")
1324 main.log.error(self.name + ": " + self.handle.before)
1325 main.cleanup()
1326 main.exit()
1327 except:
1328 main.log.info(self.name+" ::::::")
1329 main.log.error( traceback.print_exc())
1330 main.log.info(self.name+" ::::::")
1331 main.cleanup()
1332 main.exit()
1333
andrewonlab7e4d2d32014-10-15 13:23:21 -04001334 def get_all_devices_id(self):
1335 '''
1336 Use 'devices' function to obtain list of all devices
1337 and parse the result to obtain a list of all device
1338 id's. Returns this list. Returns empty list if no
1339 devices exist
1340 List is ordered sequentially
andrewonlab3e15ead2014-10-15 14:21:34 -04001341
1342 This function may be useful if you are not sure of the
1343 device id, and wish to execute other commands using
1344 the ids. By obtaining the list of device ids on the fly,
1345 you can iterate through the list to get mastership, etc.
andrewonlab7e4d2d32014-10-15 13:23:21 -04001346 '''
1347 try:
1348 #Call devices and store result string
andrewonlab9a50dfe2014-10-17 17:22:31 -04001349 devices_str = self.devices(json_format=False)
andrewonlab7e4d2d32014-10-15 13:23:21 -04001350 id_list = []
1351
1352 if not devices_str:
1353 main.log.info("There are no devices to get id from")
1354 return id_list
1355
1356 #Split the string into list by comma
1357 device_list = devices_str.split(",")
1358 #Get temporary list of all arguments with string 'id='
1359 temp_list = [dev for dev in device_list if "id=" in dev]
1360 #Split list further into arguments before and after string
1361 # 'id='. Get the latter portion (the actual device id) and
1362 # append to id_list
1363 for arg in temp_list:
1364 id_list.append(arg.split("id=")[1])
andrewonlab7e4d2d32014-10-15 13:23:21 -04001365 return id_list
1366
1367 except pexpect.EOF:
1368 main.log.error(self.name + ": EOF exception found")
1369 main.log.error(self.name + ": " + self.handle.before)
1370 main.cleanup()
1371 main.exit()
1372 except:
1373 main.log.info(self.name+" ::::::")
1374 main.log.error( traceback.print_exc())
1375 main.log.info(self.name+" ::::::")
1376 main.cleanup()
1377 main.exit()
1378
andrewonlab7c211572014-10-15 16:45:20 -04001379 def get_all_nodes_id(self):
1380 '''
1381 Uses 'nodes' function to obtain list of all nodes
1382 and parse the result of nodes to obtain just the
1383 node id's.
1384 Returns:
1385 list of node id's
1386 '''
1387 try:
1388 nodes_str = self.nodes()
1389 id_list = []
1390
1391 if not nodes_str:
1392 main.log.info("There are no nodes to get id from")
1393 return id_list
1394
1395 #Sample nodes_str output
1396 #id=local, address=127.0.0.1:9876, state=ACTIVE *
1397
1398 #Split the string into list by comma
1399 nodes_list = nodes_str.split(",")
1400 temp_list = [node for node in nodes_list if "id=" in node]
1401 for arg in temp_list:
1402 id_list.append(arg.split("id=")[1])
1403
1404 return id_list
1405
1406 except pexpect.EOF:
1407 main.log.error(self.name + ": EOF exception found")
1408 main.log.error(self.name + ": " + self.handle.before)
1409 main.cleanup()
1410 main.exit()
1411 except:
1412 main.log.info(self.name+" ::::::")
1413 main.log.error( traceback.print_exc())
1414 main.log.info(self.name+" ::::::")
1415 main.cleanup()
1416 main.exit()
andrewonlab7e4d2d32014-10-15 13:23:21 -04001417
Jon Halla91c4dc2014-10-22 12:57:04 -04001418 def get_device(self, dpid=None):
1419 '''
1420 Return the first device from the devices api whose 'id' contains 'dpid'
1421 Return None if there is no match
1422 '''
1423 import json
1424 try:
1425 if dpid == None:
1426 return None
1427 else:
1428 dpid = dpid.replace(':', '')
1429 raw_devices = self.devices()
1430 devices_json = json.loads(raw_devices)
1431 #search json for the device with dpid then return the device
1432 for device in devices_json:
1433 #print "%s in %s?" % (dpid, device['id'])
1434 if dpid in device['id']:
1435 return device
1436 return None
1437 except pexpect.EOF:
1438 main.log.error(self.name + ": EOF exception found")
1439 main.log.error(self.name + ": " + self.handle.before)
1440 main.cleanup()
1441 main.exit()
1442 except:
1443 main.log.info(self.name+" ::::::")
1444 main.log.error( traceback.print_exc())
1445 main.log.info(self.name+" ::::::")
1446 main.cleanup()
1447 main.exit()
1448
Jon Hall42db6dc2014-10-24 19:03:48 -04001449 def check_status(self, ip, numoswitch, numolink, log_level="info"):
1450 '''
1451 Checks the number of swithes & links that ONOS sees against the
1452 supplied values. By default this will report to main.log, but the
1453 log level can be specifid.
1454
1455 Params: ip = ip used for the onos cli
1456 numoswitch = expected number of switches
1457 numlink = expected number of links
1458 log_level = level to log to. Currently accepts 'info', 'warn' and 'report'
1459
1460
1461 log_level can
1462
1463 Returns: main.TRUE if the number of switchs and links are correct,
1464 main.FALSE if the numer of switches and links is incorrect,
1465 and main.ERROR otherwise
1466 '''
1467
1468 try:
1469 topology = self.get_topology(ip)
1470 if topology == {}:
1471 return main.ERROR
1472 output = ""
1473 #Is the number of switches is what we expected
1474 devices = topology.get('devices',False)
1475 links = topology.get('links',False)
1476 if devices == False or links == False:
1477 return main.ERROR
1478 switch_check = ( int(devices) == int(numoswitch) )
1479 #Is the number of links is what we expected
1480 link_check = ( int(links) == int(numolink) )
1481 if (switch_check and link_check):
1482 #We expected the correct numbers
1483 output = output + "The number of links and switches match "\
1484 + "what was expected"
1485 result = main.TRUE
1486 else:
1487 output = output + \
1488 "The number of links and switches does not match what was expected"
1489 result = main.FALSE
1490 output = output + "\n ONOS sees %i devices (%i expected) and %i links (%i expected)"\
1491 % ( int(devices), int(numoswitch), int(links), int(numolink) )
1492 if log_level == "report":
1493 main.log.report(output)
1494 elif log_level == "warn":
1495 main.log.warn(output)
1496 else:
1497 main.log.info(output)
1498 return result
1499 except pexpect.EOF:
1500 main.log.error(self.name + ": EOF exception found")
1501 main.log.error(self.name + ": " + self.handle.before)
1502 main.cleanup()
1503 main.exit()
1504 except:
1505 main.log.info(self.name+" ::::::")
1506 main.log.error( traceback.print_exc())
1507 main.log.info(self.name+" ::::::")
1508 main.cleanup()
1509 main.exit()
Jon Hall1c9e8732014-10-27 19:29:27 -04001510
1511 def device_role(self, device_id, onos_node, role="master"):
1512 '''
1513 Calls the device-role cli command.
1514 device_id must be the id of a device as seen in the onos devices command
1515 onos_node is the ip of one of the onos nodes in the cluster
1516 role must be either master, standby, or none
1517
Jon Hall983a1702014-10-28 18:44:22 -04001518 Returns main.TRUE or main.FALSE based argument varification.
1519 When device-role supports errors this should be extended to
Jon Hall1c9e8732014-10-27 19:29:27 -04001520 support that output
1521 '''
Jon Hall1c9e8732014-10-27 19:29:27 -04001522 try:
Jon Hall983a1702014-10-28 18:44:22 -04001523 #print "beginning device_role... \n\tdevice_id:" + device_id
1524 #print "\tonos_node: " + onos_node
1525 #print "\trole: "+ role
Jon Hall1c9e8732014-10-27 19:29:27 -04001526 if role.lower() == "master" or \
1527 role.lower() == "standby" or \
1528 role.lower() == "none":
1529 self.handle.sendline("")
1530 self.handle.expect("onos>")
Jon Hall983a1702014-10-28 18:44:22 -04001531 self.handle.sendline("device-role " +
1532 str(device_id) + " " +
1533 str(onos_node) + " " +
1534 str(role))
1535 i= self.handle.expect(["Error","onos>"])
1536 if i == 0:
1537 output = str(self.handle.before)
1538 self.handle.expect("onos>")
1539 output = output + str(self.handle.before)
1540 main.log.error(self.name + ": " +
1541 output + '\033[0m')#end color output to escape any colours from the cli
1542 return main.ERROR
1543 self.handle.sendline("")
Jon Hall1c9e8732014-10-27 19:29:27 -04001544 self.handle.expect("onos>")
1545 return main.TRUE
1546 else:
1547 return main.FALSE
1548
1549 except pexpect.EOF:
1550 main.log.error(self.name + ": EOF exception found")
1551 main.log.error(self.name + ": " + self.handle.before)
1552 main.cleanup()
1553 main.exit()
1554 except:
1555 main.log.info(self.name+" ::::::")
1556 main.log.error( traceback.print_exc())
1557 main.log.info(self.name+" ::::::")
1558 main.cleanup()
1559 main.exit()
1560
1561
andrewonlab7e4d2d32014-10-15 13:23:21 -04001562 #***********************************