blob: ca9fa01fda7b99a4f24eb47637d91c2941d3671d [file] [log] [blame]
Jon Hall05b2b432014-10-08 19:53:25 -04001#!/usr/bin/env python
andrewonlabe8e56fd2014-10-09 17:12:44 -04002
Jon Hall05b2b432014-10-08 19:53:25 -04003'''
andrewonlabe8e56fd2014-10-09 17:12:44 -04004This driver interacts with ONOS bench, the OSGi platform
5that configures the ONOS nodes. (aka ONOS-next)
6
7Please follow the coding style demonstrated by existing
8functions and document properly.
9
10If you are a contributor to the driver, please
11list your email here for future contact:
12
13jhall@onlab.us
14andrew@onlab.us
15
16OCT 9 2014
17
Jon Hall05b2b432014-10-08 19:53:25 -040018'''
andrewonlabe8e56fd2014-10-09 17:12:44 -040019
andrewonlab7735d852014-10-09 13:02:47 -040020import sys
Jon Hall05b2b432014-10-08 19:53:25 -040021import time
22import pexpect
23import re
24import traceback
andrewonlab7735d852014-10-09 13:02:47 -040025import os.path
andrewonlab6e20c342014-10-10 18:08:48 -040026import pydoc
Jon Hall05b2b432014-10-08 19:53:25 -040027sys.path.append("../")
28from drivers.common.clidriver import CLI
29
30class OnosDriver(CLI):
31
32 def __init__(self):
andrewonlab6e20c342014-10-10 18:08:48 -040033 '''
34 Initialize client
35 '''
Jon Hall05b2b432014-10-08 19:53:25 -040036 super(CLI, self).__init__()
37
38 def connect(self,**connectargs):
39 '''
40 Creates ssh handle for ONOS "bench".
41 '''
42 try:
43 for key in connectargs:
44 vars(self)[key] = connectargs[key]
45 self.home = "~/ONOS"
46 for key in self.options:
47 if key == "home":
48 self.home = self.options['home']
49 break
50
51
52 self.name = self.options['name']
Jon Hallea7818b2014-10-09 14:30:59 -040053 self.handle = super(OnosDriver,self).connect(
54 user_name = self.user_name,
55 ip_address = self.ip_address,
56 port = self.port,
57 pwd = self.pwd,
58 home = self.home)
Jon Hallea7818b2014-10-09 14:30:59 -040059
60 self.handle.sendline("cd "+ self.home)
61 self.handle.expect("\$")
Jon Hall05b2b432014-10-08 19:53:25 -040062 if self.handle:
63 return self.handle
64 else :
65 main.log.info("NO ONOS HANDLE")
66 return main.FALSE
67 except pexpect.EOF:
68 main.log.error(self.name + ": EOF exception found")
69 main.log.error(self.name + ": " + self.handle.before)
70 main.cleanup()
71 main.exit()
72 except:
73 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
74 main.log.error( traceback.print_exc() )
75 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
76 main.cleanup()
77 main.exit()
78
79 def disconnect(self):
80 '''
81 Called when Test is complete to disconnect the ONOS handle.
82 '''
83 response = ''
84 try:
Jon Hallf8d10982014-10-22 12:23:38 -040085 self.handle.sendline("\n")
86 self.handle.expect("\$")
Jon Hall05b2b432014-10-08 19:53:25 -040087 self.handle.sendline("exit")
88 self.handle.expect("closed")
89 except pexpect.EOF:
90 main.log.error(self.name + ": EOF exception found")
91 main.log.error(self.name + ": " + self.handle.before)
92 except:
93 main.log.error(self.name + ": Connection failed to the host")
94 response = main.FALSE
95 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040096
97 def onos_package(self):
98 '''
99 Produce a self-contained tar.gz file that can be deployed
100 and executed on any platform with Java 7 JRE.
101 '''
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400102
103 try:
104 self.handle.sendline("onos-package")
Jon Hallea7818b2014-10-09 14:30:59 -0400105 self.handle.expect("onos-package")
andrewonlab0748d2a2014-10-09 13:24:17 -0400106 self.handle.expect("tar.gz",timeout=10)
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400107 handle = str(self.handle.before)
108 main.log.info("onos-package command returned: "+
109 handle)
andrewonlab0748d2a2014-10-09 13:24:17 -0400110 #As long as the sendline does not time out,
111 #return true. However, be careful to interpret
112 #the results of the onos-package command return
113 return main.TRUE
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400114
andrewonlab7735d852014-10-09 13:02:47 -0400115 except pexpect.EOF:
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400116 main.log.error(self.name + ": EOF exception found")
117 main.log.error(self.name + ": " + self.handle.before)
118 except:
119 main.log.error("Failed to package ONOS")
120 main.cleanup()
121 main.exit()
122
andrewonlab8790abb2014-11-06 13:51:54 -0500123 def onos_build(self):
124 '''
125 Use the pre defined script to build onos via mvn
126 '''
127
128 try:
129 self.handle.sendline("onos-build")
130 self.handle.expect("onos-build")
131 i = self.handle.expect([
132 "BUILD SUCCESS",
133 "ERROR",
134 "BUILD FAILED"], timeout=120)
135 handle = str(self.handle.before)
136
137 main.log.info("onos-build command returned: "+
138 handle)
139
140 if i == 0:
141 return main.TRUE
142 else:
143 return handle
144
145 except pexpect.EOF:
146 main.log.error(self.name + ": EOF exception found")
147 main.log.error(self.name + ": " + self.handle.before)
148 except:
149 main.log.error("Failed to build ONOS")
150 main.cleanup()
151 main.exit()
152
Jon Hallde9d9aa2014-10-08 20:36:02 -0400153 def clean_install(self):
154 '''
155 Runs mvn clean install in the root of the ONOS directory.
156 This will clean all ONOS artifacts then compile each module
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400157
Jon Hallde9d9aa2014-10-08 20:36:02 -0400158 Returns: main.TRUE on success
159 On Failure, exits the test
160 '''
161 try:
Jon Hallea7818b2014-10-09 14:30:59 -0400162 main.log.info("Running 'mvn clean install' on " + str(self.name) +
163 ". This may take some time.")
164 self.handle.sendline("cd "+ self.home)
165 self.handle.expect("\$")
166
167 self.handle.sendline("\n")
168 self.handle.expect("\$")
Jon Hallde9d9aa2014-10-08 20:36:02 -0400169 self.handle.sendline("mvn clean install")
Jon Hallea7818b2014-10-09 14:30:59 -0400170 self.handle.expect("mvn clean install")
Jon Hallde9d9aa2014-10-08 20:36:02 -0400171 while 1:
172 i=self.handle.expect([
173 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s\
174 Runtime\sEnvironment\sto\scontinue',
175 'BUILD\sFAILURE',
176 'BUILD\sSUCCESS',
177 'ONOS\$',
178 pexpect.TIMEOUT],timeout=600)
179 if i == 0:
180 main.log.error(self.name + ":There is insufficient memory \
181 for the Java Runtime Environment to continue.")
182 #return main.FALSE
183 main.cleanup()
184 main.exit()
185 if i == 1:
186 main.log.error(self.name + ": Build failure!")
187 #return main.FALSE
188 main.cleanup()
189 main.exit()
190 elif i == 2:
191 main.log.info(self.name + ": Build success!")
192 elif i == 3:
193 main.log.info(self.name + ": Build complete")
Jon Hallf8ef52c2014-10-09 19:37:33 -0400194 #Print the build time
195 for line in self.handle.before.splitlines():
196 if "Total time:" in line:
197 main.log.info(line)
Jon Hallea7818b2014-10-09 14:30:59 -0400198 self.handle.sendline("\n")
Jon Hallde9d9aa2014-10-08 20:36:02 -0400199 self.handle.expect("\$", timeout=60)
200 return main.TRUE
201 elif i == 4:
202 main.log.error(self.name + ": mvn clean install TIMEOUT!")
203 #return main.FALSE
204 main.cleanup()
205 main.exit()
206 else:
207 main.log.error(self.name + ": unexpected response from \
208 mvn clean install")
209 #return main.FALSE
210 main.cleanup()
211 main.exit()
212 except pexpect.EOF:
213 main.log.error(self.name + ": EOF exception found")
214 main.log.error(self.name + ": " + self.handle.before)
215 main.cleanup()
216 main.exit()
217 except:
218 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
219 main.log.error( traceback.print_exc() )
220 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
221 main.cleanup()
222 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400223
224 def git_pull(self, comp1=""):
225 '''
226 Assumes that "git pull" works without login
227
228 This function will perform a git pull on the ONOS instance.
229 If used as git_pull("NODE") it will do git pull + NODE. This is
230 for the purpose of pulling from other nodes if necessary.
231
232 Otherwise, this function will perform a git pull in the
233 ONOS repository. If it has any problems, it will return main.ERROR
Shreya Shahee15f6c2014-10-28 18:12:30 -0400234 If it successfully does a git_pull, it will return a 1 (main.TRUE)
235 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400236
237 '''
238 try:
239 # main.log.info(self.name + ": Stopping ONOS")
240 #self.stop()
241 self.handle.sendline("cd " + self.home)
242 self.handle.expect("ONOS\$")
243 if comp1=="":
244 self.handle.sendline("git pull")
245 else:
246 self.handle.sendline("git pull " + comp1)
247
248 uptodate = 0
249 i=self.handle.expect(['fatal',
250 'Username\sfor\s(.*):\s',
251 '\sfile(s*) changed,\s',
252 'Already up-to-date',
253 'Aborting',
254 'You\sare\snot\scurrently\son\sa\sbranch',
255 'You\sasked\sme\sto\spull\swithout\stelling\sme\swhich\sbranch\syou',
256 'Pull\sis\snot\spossible\sbecause\syou\shave\sunmerged\sfiles',
257 pexpect.TIMEOUT],
258 timeout=300)
259 #debug
Jon Hall81e29af2014-11-04 20:41:23 -0500260 #main.log.report(self.name +": DEBUG: \n"+"git pull response: " + str(self.handle.before) + str(self.handle.after))
Jon Hallacabffd2014-10-09 12:36:53 -0400261 if i==0:
262 main.log.error(self.name + ": Git pull had some issue...")
263 return main.ERROR
264 elif i==1:
265 main.log.error(self.name + ": Git Pull Asking for username. ")
266 return main.ERROR
267 elif i==2:
268 main.log.info(self.name + ": Git Pull - pulling repository now")
269 self.handle.expect("ONOS\$", 120)
Shreya Shahee15f6c2014-10-28 18:12:30 -0400270 return main.TRUE # So that only when git pull is done, we do mvn clean compile
Jon Hallacabffd2014-10-09 12:36:53 -0400271 elif i==3:
272 main.log.info(self.name + ": Git Pull - Already up to date")
Shreya Shahee15f6c2014-10-28 18:12:30 -0400273 return i
Jon Hallacabffd2014-10-09 12:36:53 -0400274 elif i==4:
275 main.log.info(self.name + ": Git Pull - Aborting... Are there conflicting git files?")
276 return main.ERROR
277 elif i==5:
278 main.log.info(self.name + ": Git Pull - You are not currently on a branch so git pull failed!")
279 return main.ERROR
280 elif i==6:
281 main.log.info(self.name + ": Git Pull - You have not configured an upstream branch to pull from. Git pull failed!")
282 return main.ERROR
283 elif i==7:
284 main.log.info(self.name + ": Git Pull - Pull is not possible because you have unmerged files.")
285 return main.ERROR
286 elif i==8:
287 main.log.error(self.name + ": Git Pull - TIMEOUT")
288 main.log.error(self.name + " Response was: " + str(self.handle.before))
289 return main.ERROR
290 else:
291 main.log.error(self.name + ": Git Pull - Unexpected response, check for pull errors")
292 return main.ERROR
293 except pexpect.EOF:
294 main.log.error(self.name + ": EOF exception found")
295 main.log.error(self.name + ": " + self.handle.before)
296 main.cleanup()
297 main.exit()
298 except:
299 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
300 main.log.error( traceback.print_exc() )
301 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
302 main.cleanup()
303 main.exit()
304
305 def git_checkout(self, branch="master"):
306 '''
307 Assumes that "git pull" works without login
308
309 This function will perform a git git checkout on the ONOS instance.
310 If used as git_checkout("branch") it will do git checkout of the "branch".
311
312 Otherwise, this function will perform a git checkout of the master
313 branch of the ONOS repository. If it has any problems, it will return
314 main.ERROR.
315 If the branch was already the specified branch, or the git checkout was
316 successful then the function will return main.TRUE.
317
318 '''
319 try:
Jon Hallacabffd2014-10-09 12:36:53 -0400320 self.handle.sendline("cd " + self.home)
321 self.handle.expect("ONOS\$")
Jon Hall81e29af2014-11-04 20:41:23 -0500322 main.log.info(self.name + ": Checking out git branch: " + branch + "...")
323 cmd = "git checkout "+branch
324 self.handle.sendline(cmd)
325 self.handle.expect(cmd)
326 i=self.handle.expect(['fatal',
327 'Username\sfor\s(.*):\s',
328 'Already\son\s\'',
329 'Switched\sto\sbranch\s\'' + str(branch),
330 pexpect.TIMEOUT,
331 'error: Your local changes to the following files would be overwritten by checkout:',
332 'error: you need to resolve your current index first'],timeout=60)
Jon Hallacabffd2014-10-09 12:36:53 -0400333
334 if i==0:
335 main.log.error(self.name + ": Git checkout had some issue...")
Jon Hall81e29af2014-11-04 20:41:23 -0500336 main.log.error(self.name + ": " + self.handle.before)
Jon Hallacabffd2014-10-09 12:36:53 -0400337 return main.ERROR
338 elif i==1:
Jon Hall81e29af2014-11-04 20:41:23 -0500339 main.log.error(self.name + ": Git checkout asking for username."\
340 +" Please configure your local git repository to be able "\
341 +"to access your remote repository passwordlessly")
Jon Hallacabffd2014-10-09 12:36:53 -0400342 return main.ERROR
343 elif i==2:
344 main.log.info(self.name + ": Git Checkout %s : Already on this branch" %branch)
345 self.handle.expect("ONOS\$")
Jon Hall81e29af2014-11-04 20:41:23 -0500346 #main.log.info("DEBUG: after checkout cmd = "+ self.handle.before)
Jon Hallacabffd2014-10-09 12:36:53 -0400347 return main.TRUE
348 elif i==3:
349 main.log.info(self.name + ": Git checkout %s - Switched to this branch" %branch)
350 self.handle.expect("ONOS\$")
Jon Hall81e29af2014-11-04 20:41:23 -0500351 #main.log.info("DEBUG: after checkout cmd = "+ self.handle.before)
Jon Hallacabffd2014-10-09 12:36:53 -0400352 return main.TRUE
353 elif i==4:
354 main.log.error(self.name + ": Git Checkout- TIMEOUT")
355 main.log.error(self.name + " Response was: " + str(self.handle.before))
356 return main.ERROR
Jon Hall81e29af2014-11-04 20:41:23 -0500357 elif i==5:
358 self.handle.expect("Aborting")
359 main.log.error(self.name + ": Git checkout error: \n" + \
360 "Your local changes to the following files would be overwritten by checkout:" + \
361 str(self.handle.before))
362 self.handle.expect("ONOS\$")
363 return main.ERROR
364 elif i==6:
365 main.log.error(self.name + ": Git checkout error: \n" + \
366 "You need to resolve your current index first:" + \
367 str(self.handle.before))
368 self.handle.expect("ONOS\$")
369 return main.ERROR
Jon Hallacabffd2014-10-09 12:36:53 -0400370 else:
371 main.log.error(self.name + ": Git Checkout - Unexpected response, check for pull errors")
Jon Hall81e29af2014-11-04 20:41:23 -0500372 main.log.error(self.name + ": " + self.handle.before)
Jon Hallacabffd2014-10-09 12:36:53 -0400373 return main.ERROR
374
375 except pexpect.EOF:
376 main.log.error(self.name + ": EOF exception found")
377 main.log.error(self.name + ": " + self.handle.before)
378 main.cleanup()
379 main.exit()
380 except:
381 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
382 main.log.error( traceback.print_exc() )
383 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
384 main.cleanup()
385 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400386
Jon Hallfd191202014-11-07 18:36:09 -0500387 def get_version(self, report=False):
Jon Hall45ec0922014-10-10 19:33:49 -0400388 '''
389 Writes the COMMIT number to the report to be parsed by Jenkins data collecter.
390 '''
391 try:
392 self.handle.sendline("export TERM=xterm-256color")
393 self.handle.expect("xterm-256color")
394 self.handle.expect("\$")
Jon Hall42db6dc2014-10-24 19:03:48 -0400395 self.handle.sendline("\n")
396 self.handle.expect("\$")
397 self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller --decorate=short | grep -A 6 \"commit\" --color=never")
398 self.handle.expect("--color=never")
Jon Hall45ec0922014-10-10 19:33:49 -0400399 self.handle.expect("\$")
400 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
Jon Hall42db6dc2014-10-24 19:03:48 -0400401 self.handle.sendline("cd " + self.home)
402 self.handle.expect("\$")
Jon Hall45ec0922014-10-10 19:33:49 -0400403 lines=response.splitlines()
404 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500405 print line
406 if report:
407 for line in lines[2:-1]:
andrewonlabac5810a2014-11-18 14:33:03 -0500408 #Bracket replacement is for Wiki-compliant
409 #formatting. '<' or '>' are interpreted
410 #as xml specific tags that cause errors
411 line = line.replace("<","[")
412 line = line.replace(">","]")
Jon Hallfd191202014-11-07 18:36:09 -0500413 main.log.report(line)
414 return lines[2]
Jon Hall45ec0922014-10-10 19:33:49 -0400415 except pexpect.EOF:
416 main.log.error(self.name + ": EOF exception found")
417 main.log.error(self.name + ": " + self.handle.before)
418 main.cleanup()
419 main.exit()
420 except:
421 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
422 main.log.error( traceback.print_exc() )
423 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
424 main.cleanup()
425 main.exit()
426
andrewonlabba44bcf2014-10-16 16:54:41 -0400427 def create_cell_file(self, bench_ip, file_name, mn_ip_addrs,
andrewonlab3f0a4af2014-10-17 12:25:14 -0400428 extra_feature_string, *onos_ip_addrs):
andrewonlab94282092014-10-10 13:00:11 -0400429 '''
430 Creates a cell file based on arguments
431 Required:
432 * Bench IP address (bench_ip)
433 - Needed to copy the cell file over
434 * File name of the cell file (file_name)
435 * Mininet IP address (mn_ip_addrs)
436 - Note that only 1 ip address is
437 supported currently
438 * ONOS IP addresses (onos_ip_addrs)
439 - Must be passed in as last arguments
440
441 NOTE: Assumes cells are located at:
442 ~/<self.home>/tools/test/cells/
443 '''
444
445 #Variable initialization
446 cell_directory = self.home + "/tools/test/cells/"
447 #We want to create the cell file in the dependencies directory
448 #of TestON first, then copy over to ONOS bench
449 temp_directory = "/tmp/"
450 #Create the cell file in the directory for writing (w+)
451 cell_file = open(temp_directory+file_name , 'w+')
andrewonlabd4940492014-10-24 12:21:27 -0400452
453 comment = ""
454 comment_string = "#"+ comment
andrewonlab7e4d2d32014-10-15 13:23:21 -0400455 #Feature string is hardcoded environment variables
456 #That you may wish to use by default on startup.
457 #Note that you may not want certain features listed
458 #on here.
andrewonlabba44bcf2014-10-16 16:54:41 -0400459 core_feature_string = "export ONOS_FEATURES=webconsole,onos-api,"+\
460 "onos-cli,onos-openflow,onos-app-mobility,onos-app-tvue,"+\
461 "onos-app-proxyarp,"+extra_feature_string
andrewonlab94282092014-10-10 13:00:11 -0400462 mn_string = "export OCN="
463 onos_string = "export OC"
464 temp_count = 1
465
466 #Create ONOS_NIC ip address prefix
467 temp_onos_ip = onos_ip_addrs[0]
468 temp_list = []
469 temp_list = temp_onos_ip.split(".")
andrewonlab7e4d2d32014-10-15 13:23:21 -0400470 #Omit last element of list to format for NIC
andrewonlab94282092014-10-10 13:00:11 -0400471 temp_list = temp_list[:-1]
472 #Structure the nic string ip
andrewonlabd4940492014-10-24 12:21:27 -0400473 nic_addr = ".".join(temp_list) + ".*"
andrewonlab94282092014-10-10 13:00:11 -0400474 onos_nic_string = "export ONOS_NIC="+nic_addr
475
476 try:
477 #Start writing to file
andrewonlabd4940492014-10-24 12:21:27 -0400478 cell_file.write(onos_nic_string + "\n")
andrewonlab94282092014-10-10 13:00:11 -0400479
480 for arg in onos_ip_addrs:
481 #For each argument in onos_ip_addrs, write to file
482 #Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400483 # export OC1="10.128.20.11"
484 # export OC2="10.128.20.12"
andrewonlab94282092014-10-10 13:00:11 -0400485 cell_file.write(onos_string + str(temp_count) +
andrewonlabd4940492014-10-24 12:21:27 -0400486 "=" + "\"" + arg + "\"" + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400487 temp_count = temp_count + 1
488
andrewonlabd4940492014-10-24 12:21:27 -0400489 cell_file.write(mn_string +"\""+ mn_ip_addrs +"\""+ "\n")
490 cell_file.write(core_feature_string + "\n")
andrewonlab94282092014-10-10 13:00:11 -0400491 cell_file.close()
492
493 #We use os.system to send the command to TestON cluster
494 #to account for the case in which TestON is not located
495 #on the same cluster as the ONOS bench
496 #Note that even if TestON is located on the same cluster
497 #as ONOS bench, you must setup passwordless ssh
andrewonlab7e4d2d32014-10-15 13:23:21 -0400498 #between TestON and ONOS bench in order to automate the test.
andrewonlab94282092014-10-10 13:00:11 -0400499 os.system("scp "+temp_directory+file_name+
500 " admin@"+bench_ip+":"+cell_directory)
501
andrewonlab2a6c9342014-10-16 13:40:15 -0400502 return main.TRUE
503
andrewonlab94282092014-10-10 13:00:11 -0400504 except pexpect.EOF:
505 main.log.error(self.name + ": EOF exception found")
506 main.log.error(self.name + ": " + self.handle.before)
507 main.cleanup()
508 main.exit()
509 except:
510 main.log.info(self.name + ":::::::::")
511 main.log.error( traceback.print_exc() )
512 main.log.info(":::::::")
513 main.cleanup()
514 main.exit()
515
andrewonlab95ca1462014-10-09 14:04:24 -0400516 def set_cell(self, cellname):
517 '''
518 Calls 'cell <name>' to set the environment variables on ONOSbench
519 '''
520 try:
521 if not cellname:
522 main.log.error("Must define cellname")
523 main.cleanup()
524 main.exit()
525 else:
526 self.handle.sendline("cell "+str(cellname))
527 #Expect the cellname in the ONOS_CELL variable.
528 #Note that this variable name is subject to change
529 # and that this driver will have to change accordingly
530 self.handle.expect("ONOS_CELL="+str(cellname))
531 handle_before = self.handle.before
532 handle_after = self.handle.after
andrewonlabc03bf6c2014-10-09 14:56:18 -0400533 #Get the rest of the handle
534 self.handle.sendline("")
535 self.handle.expect("\$")
536 handle_more = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400537
538 main.log.info("Cell call returned: "+handle_before+
andrewonlabc03bf6c2014-10-09 14:56:18 -0400539 handle_after + handle_more)
andrewonlab95ca1462014-10-09 14:04:24 -0400540
541 return main.TRUE
542
543 except pexpect.EOF:
544 main.log.error(self.name + ": EOF exception found")
545 main.log.error(self.name + ": " + self.handle.before)
546 main.cleanup()
547 main.exit()
548 except:
549 main.log.info(self.name+" ::::::")
550 main.log.error( traceback.print_exc())
551 main.log.info(self.name+" ::::::")
552 main.cleanup()
553 main.exit()
554
andrewonlabc03bf6c2014-10-09 14:56:18 -0400555 def verify_cell(self):
556 '''
557 Calls 'onos-verify-cell' to check for cell installation
558 '''
andrewonlab8d0d7d72014-10-09 16:33:15 -0400559 #TODO: Add meaningful expect value
560
andrewonlabc03bf6c2014-10-09 14:56:18 -0400561 try:
562 #Clean handle by sending empty and expecting $
563 self.handle.sendline("")
564 self.handle.expect("\$")
565 self.handle.sendline("onos-verify-cell")
566 self.handle.expect("\$")
567 handle_before = self.handle.before
568 handle_after = self.handle.after
569 #Get the rest of the handle
570 self.handle.sendline("")
571 self.handle.expect("\$")
572 handle_more = self.handle.before
573
574 main.log.info("Verify cell returned: "+handle_before+
575 handle_after + handle_more)
576
577 return main.TRUE
Jon Hall7993bfc2014-10-09 16:30:14 -0400578 except pexpect.EOF:
579 main.log.error(self.name + ": EOF exception found")
580 main.log.error(self.name + ": " + self.handle.before)
581 main.cleanup()
582 main.exit()
583 except:
584 main.log.info(self.name+" ::::::")
585 main.log.error( traceback.print_exc())
586 main.log.info(self.name+" ::::::")
587 main.cleanup()
588 main.exit()
589
andrewonlab05e362f2014-10-10 00:40:57 -0400590 def onos_cli(self, ONOS_ip, cmdstr):
591 '''
592 Uses 'onos' command to send various ONOS CLI arguments.
593 Required:
594 * ONOS_ip: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400595 * cmdstr: specify the command string to send
andrewonlab6e20c342014-10-10 18:08:48 -0400596
597 This function is intended to expose the entire karaf
598 CLI commands for ONOS. Try to use this function first
599 before attempting to write a ONOS CLI specific driver
600 function.
601 You can see a list of available 'cmdstr' arguments
602 by starting onos, and typing in 'onos' to enter the
603 onos> CLI. Then, type 'help' to see the list of
604 available commands.
andrewonlab05e362f2014-10-10 00:40:57 -0400605 '''
606 try:
607 if not ONOS_ip:
608 main.log.error("You must specify the IP address")
609 return main.FALSE
610 if not cmdstr:
611 main.log.error("You must specify the command string")
612 return main.FALSE
613
614 cmdstr = str(cmdstr)
615 self.handle.sendline("")
616 self.handle.expect("\$")
617
618 self.handle.sendline("onos -w " + ONOS_ip + " " + cmdstr)
619 self.handle.expect("\$")
620
Shreya Shaha73aaad2014-10-27 18:03:09 -0400621 handle_before = self.handle.before
622 print "handle_before = ", self.handle.before
andrewonlab05e362f2014-10-10 00:40:57 -0400623 handle_after = str(self.handle.after)
624
Shreya Shaha73aaad2014-10-27 18:03:09 -0400625 #self.handle.sendline("")
626 #self.handle.expect("\$")
627 #handle_more = str(self.handle.before)
andrewonlab05e362f2014-10-10 00:40:57 -0400628
629 main.log.info("Command sent successfully")
630
andrewonlab94282092014-10-10 13:00:11 -0400631 #Obtain return handle that consists of result from
632 #the onos command. The string may need to be
633 #configured further.
Shreya Shaha73aaad2014-10-27 18:03:09 -0400634 #return_string = handle_before + handle_after
635 return_string = handle_before
636 print "return_string = ", return_string
andrewonlab05e362f2014-10-10 00:40:57 -0400637 return return_string
638
639 except pexpect.EOF:
640 main.log.error(self.name + ": EOF exception found")
641 main.log.error(self.name + ": " + self.handle.before)
642 main.cleanup()
643 main.exit()
644 except:
645 main.log.info(self.name+" ::::::")
646 main.log.error( traceback.print_exc())
647 main.log.info(self.name+" ::::::")
648 main.cleanup()
649 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400650
651 def onos_install(self, options="-f", node = ""):
652 '''
653 Installs ONOS bits on the designated cell machine.
654 If -f option is provided, it also forces an uninstall.
655 Presently, install also includes onos-push-bits and
656 onos-config within.
657 The node option allows you to selectively only push the jar
658 files to certain onos nodes
659
660 Returns: main.TRUE on success and main.FALSE on failure
661 '''
662 try:
andrewonlab114768a2014-11-14 12:44:44 -0500663 if options:
664 self.handle.sendline("onos-install " + options + " " + node)
665 else:
666 self.handle.sendline("onos-install "+node)
Jon Hall7993bfc2014-10-09 16:30:14 -0400667 self.handle.expect("onos-install ")
668 #NOTE: this timeout may need to change depending on the network and size of ONOS
669 i=self.handle.expect(["Network\sis\sunreachable",
670 "onos\sstart/running,\sprocess",
andrewonlabd9a73a72014-11-14 17:28:21 -0500671 "ONOS\sis\salready\sinstalled",
Jon Hall7993bfc2014-10-09 16:30:14 -0400672 pexpect.TIMEOUT],timeout=60)
673
Jon Hall7993bfc2014-10-09 16:30:14 -0400674 if i == 0:
675 main.log.warn("Network is unreachable")
676 return main.FALSE
677 elif i == 1:
Jon Hall42db6dc2014-10-24 19:03:48 -0400678 main.log.info("ONOS was installed on " + node + " and started")
Jon Hall7993bfc2014-10-09 16:30:14 -0400679 return main.TRUE
andrewonlabd9a73a72014-11-14 17:28:21 -0500680 elif i == 2:
681 main.log.info("ONOS is already installed on "+node)
682 return main.TRUE
683 elif i == 3:
Jon Hall42db6dc2014-10-24 19:03:48 -0400684 main.log.info("Installation of ONOS on " + node + " timed out")
Jon Hall7993bfc2014-10-09 16:30:14 -0400685 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -0400686
andrewonlabd9a73a72014-11-14 17:28:21 -0500687
andrewonlabc03bf6c2014-10-09 14:56:18 -0400688 except pexpect.EOF:
689 main.log.error(self.name + ": EOF exception found")
690 main.log.error(self.name + ": " + self.handle.before)
691 main.cleanup()
692 main.exit()
693 except:
694 main.log.info(self.name+" ::::::")
695 main.log.error( traceback.print_exc())
696 main.log.info(self.name+" ::::::")
697 main.cleanup()
698 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400699
andrewonlab8d0d7d72014-10-09 16:33:15 -0400700 def onos_start(self, node_ip):
701 '''
702 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400703 This command is a remote management of the ONOS upstart daemon
andrewonlab8d0d7d72014-10-09 16:33:15 -0400704 '''
705
706 try:
707 self.handle.sendline("")
708 self.handle.expect("\$")
709 self.handle.sendline("onos-service "+str(node_ip)+
710 " start")
711 i = self.handle.expect([
712 "Job\sis\salready\srunning",
713 "start/running",
714 "Unknown\sinstance",
Shreya Shahd01153d2014-10-23 15:08:56 -0400715 pexpect.TIMEOUT],timeout=120)
andrewonlab8d0d7d72014-10-09 16:33:15 -0400716
717 if i == 0:
718 main.log.info("Service is already running")
719 return main.TRUE
720 elif i == 1:
721 main.log.info("ONOS service started")
722 return main.TRUE
723 else:
724 main.log.error("ONOS service failed to start")
725 main.cleanup()
726 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -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()
738
andrewonlab2b30bd32014-10-09 16:48:55 -0400739 def onos_stop(self, node_ip):
740 '''
741 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400742 This command is a remote management of the ONOS upstart daemon
andrewonlab2b30bd32014-10-09 16:48:55 -0400743 '''
744 try:
745 self.handle.sendline("")
746 self.handle.expect("\$")
747 self.handle.sendline("onos-service "+str(node_ip)+
748 " stop")
749 i = self.handle.expect([
750 "stop/waiting",
751 "Unknown\sinstance",
752 pexpect.TIMEOUT],timeout=60)
753
754 if i == 0:
755 main.log.info("ONOS service stopped")
756 return main.TRUE
757 elif i == 1:
758 main.log.info("Unknown ONOS instance specified: "+
759 str(node_ip))
760 return main.FALSE
761 else:
762 main.log.error("ONOS service failed to stop")
763 return main.FALSE
764
765 except pexpect.EOF:
766 main.log.error(self.name + ": EOF exception found")
767 main.log.error(self.name + ": " + self.handle.before)
768 main.cleanup()
769 main.exit()
770 except:
771 main.log.info(self.name+" ::::::")
772 main.log.error( traceback.print_exc())
773 main.log.info(self.name+" ::::::")
774 main.cleanup()
775 main.exit()
andrewonlab99d3f7f2014-11-13 17:45:08 -0500776
andrewonlaba6f7d882014-11-13 17:32:24 -0500777 def onos_uninstall(self, node_ip=""):
andrewonlabc8d47972014-10-09 16:52:36 -0400778 '''
779 Calls the command: 'onos-uninstall'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400780 Uninstalls ONOS from the designated cell machine, stopping
781 if needed
andrewonlabc8d47972014-10-09 16:52:36 -0400782 '''
783 try:
784 self.handle.sendline("")
785 self.handle.expect("\$")
andrewonlab85f4ed32014-11-13 17:31:06 -0500786 self.handle.sendline("onos-uninstall "+str(node_ip))
andrewonlabc8d47972014-10-09 16:52:36 -0400787 self.handle.expect("\$")
788
andrewonlab9dfd2082014-11-13 17:44:03 -0500789 main.log.info("ONOS "+node_ip+" was uninstalled")
790
andrewonlabc8d47972014-10-09 16:52:36 -0400791 #onos-uninstall command does not return any text
792 return main.TRUE
793
794 except pexpect.EOF:
795 main.log.error(self.name + ": EOF exception found")
796 main.log.error(self.name + ": " + self.handle.before)
797 main.cleanup()
798 main.exit()
799 except:
800 main.log.info(self.name+" ::::::")
801 main.log.error( traceback.print_exc())
802 main.log.info(self.name+" ::::::")
803 main.cleanup()
804 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -0400805
andrewonlabe8e56fd2014-10-09 17:12:44 -0400806 def onos_kill(self, node_ip):
807 '''
808 Calls the command: 'onos-kill [<node-ip>]'
809 "Remotely, and unceremoniously kills the ONOS instance running on
810 the specified cell machine" - Tom V
811 '''
812
813 try:
814 self.handle.sendline("")
815 self.handle.expect("\$")
816 self.handle.sendline("onos-kill " + str(node_ip))
817 i = self.handle.expect([
818 "\$",
819 "No\sroute\sto\shost",
820 "password:",
821 pexpect.TIMEOUT], timeout=20)
822
823 if i == 0:
824 main.log.info("ONOS instance "+str(node_ip)+" was killed")
825 return main.TRUE
826 elif i == 1:
827 main.log.info("No route to host")
828 return main.FALSE
829 elif i == 2:
830 main.log.info("Passwordless login for host: "+str(node_ip)+
831 " not configured")
832 return main.FALSE
833 else:
834 main.log.info("ONOS instasnce was not killed")
835 return main.FALSE
836
837 except pexpect.EOF:
838 main.log.error(self.name + ": EOF exception found")
839 main.log.error(self.name + ": " + self.handle.before)
840 main.cleanup()
841 main.exit()
842 except:
843 main.log.info(self.name+" ::::::")
844 main.log.error( traceback.print_exc())
845 main.log.info(self.name+" ::::::")
846 main.cleanup()
847 main.exit()
848
andrewonlab19fbdca2014-11-14 12:55:59 -0500849 def onos_remove_raft_logs(self):
850 '''
851 Removes Raft / Copy cat files from ONOS to ensure
852 a cleaner environment.
853
854 Description:
855 Stops all ONOS defined in the cell,
856 wipes the raft / copycat log files
857 '''
858 try:
859 self.handle.sendline("")
860 self.handle.expect("\$")
861 self.handle.sendline("onos-remove-raft-logs")
862 self.handle.expect("\$")
863
864 return main.TRUE
865
866 except pexpect.EOF:
867 main.log.error(self.name + ": EOF exception found")
868 main.log.error(self.name + ": " + self.handle.before)
869 main.cleanup()
870 main.exit()
871 except:
872 main.log.info(self.name+" ::::::")
873 main.log.error( traceback.print_exc())
874 main.log.info(self.name+" ::::::")
875 main.cleanup()
876 main.exit()
877
andrewonlab94282092014-10-10 13:00:11 -0400878 def onos_start_network(self, mntopo):
879 '''
880 Calls the command 'onos-start-network [<mininet-topo>]
881 "remotely starts the specified topology on the cell's
882 mininet machine against all controllers configured in the
883 cell."
884 * Specify mininet topology file name for mntopo
885 * Topo files should be placed at:
886 ~/<your-onos-directory>/tools/test/topos
887
888 NOTE: This function will take you to the mininet prompt
889 '''
890 try:
891 if not mntopo:
892 main.log.error("You must specify a topo file to execute")
893 return main.FALSE
894
895 mntopo = str(mntopo)
896 self.handle.sendline("")
897 self.handle.expect("\$")
898
899 self.handle.sendline("onos-start-network " + mntopo)
900 self.handle.expect("mininet>")
901 main.log.info("Network started, entered mininet prompt")
902
903 #TODO: Think about whether return is necessary or not
904
905 except pexpect.EOF:
906 main.log.error(self.name + ": EOF exception found")
907 main.log.error(self.name + ": " + self.handle.before)
908 main.cleanup()
909 main.exit()
910 except:
911 main.log.info(self.name+" ::::::")
912 main.log.error( traceback.print_exc())
913 main.log.info(self.name+" ::::::")
914 main.cleanup()
915 main.exit()
916
917
Jon Hall7993bfc2014-10-09 16:30:14 -0400918 def isup(self, node = ""):
919 '''
Jon Hall77f53ce2014-10-13 18:02:06 -0400920 Run's onos-wait-for-start which only returns once ONOS is at run
921 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -0400922
Jon Hall7993bfc2014-10-09 16:30:14 -0400923 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
924 '''
925 try:
926 self.handle.sendline("onos-wait-for-start " + node )
927 self.handle.expect("onos-wait-for-start")
928 #NOTE: this timeout is arbitrary"
shahshreya4d79aab2014-11-07 15:20:41 -0800929 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout = 300)
Jon Hall7993bfc2014-10-09 16:30:14 -0400930 if i == 0:
931 main.log.info(self.name + ": " + node + " is up")
932 return main.TRUE
933 elif i == 1:
934 #NOTE: since this function won't return until ONOS is ready,
935 # we will kill it on timeout
936 self.handle.sendline("\003") #Control-C
937 self.handle.expect("\$")
938 return main.FALSE
939 except pexpect.EOF:
940 main.log.error(self.name + ": EOF exception found")
941 main.log.error(self.name + ": " + self.handle.before)
942 main.cleanup()
943 main.exit()
944 except:
945 main.log.info(self.name+" ::::::")
946 main.log.error( traceback.print_exc())
947 main.log.info(self.name+" ::::::")
948 main.cleanup()
949 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -0400950
951
Shreya Shaha73aaad2014-10-27 18:03:09 -0400952 def get_topology(self,topology_output):
Jon Hall77f53ce2014-10-13 18:02:06 -0400953 '''
954 parses the onos:topology output
955 Returns: a topology dict populated by the key values found in
956 the cli command.
957 '''
958
959 try:
960 #call the cli to get the topology summary
Shreya Shaha73aaad2014-10-27 18:03:09 -0400961 #cmdstr = "onos:topology"
962 #cli_result = self.onos_cli(ip, cmdstr)
963 #print "cli_result = ", cli_result
Jon Hall77f53ce2014-10-13 18:02:06 -0400964
965 #Parse the output
966 topology = {}
967 #for line in cli_result.split("\n"):
Shreya Shaha73aaad2014-10-27 18:03:09 -0400968 for line in topology_output.splitlines():
Jon Hall77f53ce2014-10-13 18:02:06 -0400969 if not line.startswith("time="):
970 continue
971 #else
972 print line
973 for var in line.split(","):
Shreya Shaha73aaad2014-10-27 18:03:09 -0400974 #print "'"+var+"'"
975 #print "'"+var.strip()+"'"
Jon Hall77f53ce2014-10-13 18:02:06 -0400976 key, value = var.strip().split("=")
977 topology[key] = value
Shreya Shaha73aaad2014-10-27 18:03:09 -0400978 print "topology = ", topology
Jon Hall77f53ce2014-10-13 18:02:06 -0400979 devices = topology.get('devices', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -0400980 print "devices = ", devices
Jon Hall77f53ce2014-10-13 18:02:06 -0400981 links = topology.get('links', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -0400982 print "links = ", links
Jon Hall77f53ce2014-10-13 18:02:06 -0400983 clusters = topology.get('clusters', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -0400984 print "clusters = ", clusters
Jon Hall77f53ce2014-10-13 18:02:06 -0400985 paths = topology.get('paths', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -0400986 print "paths = ", paths
Jon Hall77f53ce2014-10-13 18:02:06 -0400987
988 return topology
989 except pexpect.EOF:
990 main.log.error(self.name + ": EOF exception found")
991 main.log.error(self.name + ": " + self.handle.before)
992 main.cleanup()
993 main.exit()
994 except:
995 main.log.info(self.name+" ::::::")
996 main.log.error( traceback.print_exc())
997 main.log.info(self.name+" ::::::")
998 main.cleanup()
999 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001000
1001
Jon Hall77f53ce2014-10-13 18:02:06 -04001002
Shreya Shaha73aaad2014-10-27 18:03:09 -04001003 def check_status(self, topology_result, numoswitch, numolink, log_level="info"):
Jon Hall77f53ce2014-10-13 18:02:06 -04001004 '''
1005 Checks the number of swithes & links that ONOS sees against the
1006 supplied values. By default this will report to main.log, but the
1007 log level can be specifid.
1008
1009 Params: ip = ip used for the onos cli
1010 numoswitch = expected number of switches
1011 numlink = expected number of links
1012 log_level = level to log to. Currently accepts 'info', 'warn' and 'report'
1013
1014
1015 log_level can
1016
1017 Returns: main.TRUE if the number of switchs and links are correct,
1018 main.FALSE if the numer of switches and links is incorrect,
1019 and main.ERROR otherwise
1020 '''
1021
1022 try:
Shreya Shaha73aaad2014-10-27 18:03:09 -04001023 topology = self.get_topology(topology_result)
Jon Hall77f53ce2014-10-13 18:02:06 -04001024 if topology == {}:
1025 return main.ERROR
1026 output = ""
1027 #Is the number of switches is what we expected
1028 devices = topology.get('devices',False)
1029 links = topology.get('links',False)
1030 if devices == False or links == False:
1031 return main.ERROR
1032 switch_check = ( int(devices) == int(numoswitch) )
1033 #Is the number of links is what we expected
1034 link_check = ( int(links) == int(numolink) )
1035 if (switch_check and link_check):
1036 #We expected the correct numbers
1037 output = output + "The number of links and switches match "\
1038 + "what was expected"
1039 result = main.TRUE
1040 else:
1041 output = output + \
1042 "The number of links and switches does not match what was expected"
1043 result = main.FALSE
1044 output = output + "\n ONOS sees %i devices (%i expected) and %i links (%i expected)"\
1045 % ( int(devices), int(numoswitch), int(links), int(numolink) )
1046 if log_level == "report":
1047 main.log.report(output)
1048 elif log_level == "warn":
1049 main.log.warn(output)
1050 else:
1051 main.log.info(output)
1052 return result
1053 except pexpect.EOF:
1054 main.log.error(self.name + ": EOF exception found")
1055 main.log.error(self.name + ": " + self.handle.before)
1056 main.cleanup()
1057 main.exit()
1058 except:
1059 main.log.info(self.name+" ::::::")
1060 main.log.error( traceback.print_exc())
1061 main.log.info(self.name+" ::::::")
1062 main.cleanup()
1063 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001064
andrewonlab970399c2014-11-07 13:09:32 -05001065 def tshark_pcap(self, interface, dir_file):
1066 '''
1067 Capture all packet activity and store in specified
1068 directory/file
1069
1070 Required:
1071 * interface: interface to capture
1072 * dir: directory/filename to store pcap
1073 '''
1074 self.handle.sendline("")
1075 self.handle.expect("\$")
1076
1077 self.handle.sendline("tshark -i "+str(interface)+
andrewonlab5d7a8f32014-11-10 13:07:56 -05001078 " -t e -w "+str(dir_file)+ " &")
1079 self.handle.sendline("\r")
andrewonlab970399c2014-11-07 13:09:32 -05001080 self.handle.expect("Capturing on")
andrewonlab5d7a8f32014-11-10 13:07:56 -05001081 self.handle.sendline("\r")
1082 self.handle.expect("\$")
andrewonlab970399c2014-11-07 13:09:32 -05001083
1084 main.log.info("Tshark started capturing files on "+
1085 str(interface)+ " and saving to directory: "+
andrewonlab5d7a8f32014-11-10 13:07:56 -05001086 str(dir_file))
Shreya Shaha73aaad2014-10-27 18:03:09 -04001087
shahshreya4d79aab2014-11-07 15:20:41 -08001088
1089 def run_onos_topo_cfg(self):
1090 '''
1091 On ONOS bench, run this command: ./~/ONOS/tools/test/bin/onos-topo-cfg
1092 which starts the rest and copies the json file to the onos instance
1093 '''
1094 self.handle.sendline("")
1095 self.handle.expect("\$")
1096 self.handle.sendline("cd ~/ONOS/tools/test/bin")
1097 self.handle.expect("/bin$")
1098 self.handle.sendline("./onos-topo-cfg")
shahshreyadf73d762014-11-11 13:58:56 -08001099 self.handle.expect("{}")
shahshreya4d79aab2014-11-07 15:20:41 -08001100 self.handle.sendline("cd ~")
1101 self.handle.expect("\$")
1102
1103
andrewonlabba44bcf2014-10-16 16:54:41 -04001104 def tshark_grep(self, grep, directory, interface='eth0'):
1105 '''
1106 Required:
1107 * grep string
1108 * directory to store results
1109 Optional:
1110 * interface - default: eth0
1111 Description:
1112 Uses tshark command to grep specific group of packets
1113 and stores the results to specified directory.
1114 The timestamp is hardcoded to be in epoch
1115 '''
1116 self.handle.sendline("")
1117 self.handle.expect("\$")
andrewonlabefd7f3d2014-10-21 16:02:31 -04001118 self.handle.sendline("")
andrewonlabba44bcf2014-10-16 16:54:41 -04001119 self.handle.sendline("tshark -i "+str(interface)+
andrewonlabd4940492014-10-24 12:21:27 -04001120 " -t e | grep --line-buffered \""+str(grep)+"\" >"+directory+" &")
andrewonlabba44bcf2014-10-16 16:54:41 -04001121 self.handle.sendline("\r")
1122 self.handle.expect("Capturing on")
1123 self.handle.sendline("\r")
1124 self.handle.expect("\$")
1125
1126 def tshark_stop(self):
1127 '''
1128 Removes wireshark files from /tmp and kills all tshark processes
1129 '''
andrewonlab5ba0d9e2014-10-24 13:32:23 -04001130 #Remove all pcap from previous captures
1131 self.execute(cmd="sudo rm /tmp/wireshark*")
andrewonlabba44bcf2014-10-16 16:54:41 -04001132 self.handle.sendline("")
1133 self.handle.sendline("sudo kill -9 `ps -ef | grep \"tshark -i\" |"+
1134 " grep -v grep | awk '{print $2}'`")
1135 self.handle.sendline("")
1136 main.log.info("Tshark stopped")
1137
andrewonlab0c38a4a2014-10-28 18:35:35 -04001138 def ptpd(self, args):
1139 '''
1140 Initiate ptp with user-specified args.
1141 Required:
1142 * args: specify string of args after command
1143 'sudo ptpd'
1144 '''
1145 try:
1146 self.handle.sendline("sudo ptpd "+str(args))
andrewonlab978dff62014-10-29 16:53:35 -04001147 i = self.handle.expect([
andrewonlab0c38a4a2014-10-28 18:35:35 -04001148 "Multiple",
1149 "Error",
1150 "\$"])
1151 self.handle.expect("\$")
andrewonlabba44bcf2014-10-16 16:54:41 -04001152
andrewonlab0c38a4a2014-10-28 18:35:35 -04001153 if i == 0:
1154 handle = self.handle.before
1155 main.log.info("ptpd returned an error: "+
1156 str(handle))
1157 return handle
1158 elif i == 1:
1159 handle = self.handle.before
1160 main.log.error("ptpd returned an error: "+
1161 str(handle))
1162 return handle
1163 else:
1164 return main.TRUE
1165
1166 except pexpect.EOF:
1167 main.log.error(self.name + ": EOF exception found")
1168 main.log.error(self.name + ": " + self.handle.before)
1169 main.cleanup()
1170 main.exit()
1171 except:
1172 main.log.info(self.name+" ::::::")
1173 main.log.error( traceback.print_exc())
1174 main.log.info(self.name+" ::::::")
1175 main.cleanup()
1176 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001177
andrewonlab5d7a8f32014-11-10 13:07:56 -05001178 def cp_logs_to_dir(self, log_to_copy,
1179 dest_dir, copy_file_name=""):
1180 '''
1181 Copies logs to a desired directory.
1182 Current implementation of ONOS deletes its karaf
1183 logs on every iteration. For debugging purposes,
1184 you may want to use this function to capture
1185 certain karaf logs. (or any other logs if needed)
1186 Localtime will be attached to the filename
1187
1188 Required:
1189 * log_to_copy: specify directory and log name to
1190 copy.
1191 ex) /opt/onos/log/karaf.log.1
1192 For copying multiple files, leave copy_file_name
1193 empty and only specify dest_dir -
1194 ex) /opt/onos/log/karaf*
1195 * dest_dir: specify directory to copy to.
1196 ex) /tmp/
1197 Optional:
1198 * copy_file_name: If you want to rename the log
1199 file, specify copy_file_name. This will not work
1200 with multiple file copying
1201 '''
1202 try:
1203 localtime = time.strftime('%x %X')
1204 localtime = localtime.replace("/","")
1205 localtime = localtime.replace(" ","_")
1206 localtime = localtime.replace(":","")
1207 if dest_dir[-1:] != "/":
1208 dest_dir += "/"
1209
1210 if copy_file_name:
1211 self.handle.sendline("cp "+str(log_to_copy)+
1212 " "+str(dest_dir)+str(copy_file_name)+
1213 localtime)
1214 self.handle.expect("cp")
1215 self.handle.expect("\$")
1216 else:
1217 self.handle.sendline("cp "+str(log_to_copy)+
1218 " "+str(dest_dir))
1219 self.handle.expect("cp")
1220 self.handle.expect("\$")
1221
1222 return self.handle.before
1223
1224 except pexpect.EOF:
1225 main.log.error("Copying files failed")
1226 main.log.error(self.name + ": EOF exception found")
1227 main.log.error(self.name + ": " + self.handle.before)
1228 except:
1229 main.log.error("Copying files failed")
1230 main.log.info(self.name+" ::::::")
1231 main.log.error( traceback.print_exc())
1232 main.log.info(self.name+" ::::::")
1233
1234
andrewonlabba44bcf2014-10-16 16:54:41 -04001235