blob: 0c01e9f223415ca92959d73d83a82c74265be09b [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")
andrewonlabe9907902014-11-25 15:49:06 -0500106 self.handle.expect("tar.gz",timeout=30)
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")
andrewonlabe9907902014-11-25 15:49:06 -0500398 #self.handle.expect("--color=never")
399 #self.handle.sendline("")
Jon Hall45ec0922014-10-10 19:33:49 -0400400 self.handle.expect("\$")
401 response=(self.name +": \n"+ str(self.handle.before + self.handle.after))
Jon Hall42db6dc2014-10-24 19:03:48 -0400402 self.handle.sendline("cd " + self.home)
403 self.handle.expect("\$")
Jon Hall45ec0922014-10-10 19:33:49 -0400404 lines=response.splitlines()
405 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500406 print line
407 if report:
408 for line in lines[2:-1]:
andrewonlabac5810a2014-11-18 14:33:03 -0500409 #Bracket replacement is for Wiki-compliant
410 #formatting. '<' or '>' are interpreted
411 #as xml specific tags that cause errors
412 line = line.replace("<","[")
413 line = line.replace(">","]")
Jon Hallfd191202014-11-07 18:36:09 -0500414 main.log.report(line)
415 return lines[2]
Jon Hall45ec0922014-10-10 19:33:49 -0400416 except pexpect.EOF:
417 main.log.error(self.name + ": EOF exception found")
418 main.log.error(self.name + ": " + self.handle.before)
419 main.cleanup()
420 main.exit()
421 except:
422 main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
423 main.log.error( traceback.print_exc() )
424 main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
425 main.cleanup()
426 main.exit()
427
andrewonlabba44bcf2014-10-16 16:54:41 -0400428 def create_cell_file(self, bench_ip, file_name, mn_ip_addrs,
andrewonlab3f0a4af2014-10-17 12:25:14 -0400429 extra_feature_string, *onos_ip_addrs):
andrewonlab94282092014-10-10 13:00:11 -0400430 '''
431 Creates a cell file based on arguments
432 Required:
433 * Bench IP address (bench_ip)
434 - Needed to copy the cell file over
435 * File name of the cell file (file_name)
436 * Mininet IP address (mn_ip_addrs)
437 - Note that only 1 ip address is
438 supported currently
439 * ONOS IP addresses (onos_ip_addrs)
440 - Must be passed in as last arguments
441
442 NOTE: Assumes cells are located at:
443 ~/<self.home>/tools/test/cells/
444 '''
445
446 #Variable initialization
447 cell_directory = self.home + "/tools/test/cells/"
448 #We want to create the cell file in the dependencies directory
449 #of TestON first, then copy over to ONOS bench
450 temp_directory = "/tmp/"
451 #Create the cell file in the directory for writing (w+)
452 cell_file = open(temp_directory+file_name , 'w+')
andrewonlabd4940492014-10-24 12:21:27 -0400453
454 comment = ""
455 comment_string = "#"+ comment
andrewonlab7e4d2d32014-10-15 13:23:21 -0400456 #Feature string is hardcoded environment variables
457 #That you may wish to use by default on startup.
458 #Note that you may not want certain features listed
459 #on here.
andrewonlabba44bcf2014-10-16 16:54:41 -0400460 core_feature_string = "export ONOS_FEATURES=webconsole,onos-api,"+\
461 "onos-cli,onos-openflow,onos-app-mobility,onos-app-tvue,"+\
462 "onos-app-proxyarp,"+extra_feature_string
andrewonlab94282092014-10-10 13:00:11 -0400463 mn_string = "export OCN="
464 onos_string = "export OC"
465 temp_count = 1
466
467 #Create ONOS_NIC ip address prefix
468 temp_onos_ip = onos_ip_addrs[0]
469 temp_list = []
470 temp_list = temp_onos_ip.split(".")
andrewonlab7e4d2d32014-10-15 13:23:21 -0400471 #Omit last element of list to format for NIC
andrewonlab94282092014-10-10 13:00:11 -0400472 temp_list = temp_list[:-1]
473 #Structure the nic string ip
andrewonlabd4940492014-10-24 12:21:27 -0400474 nic_addr = ".".join(temp_list) + ".*"
andrewonlab94282092014-10-10 13:00:11 -0400475 onos_nic_string = "export ONOS_NIC="+nic_addr
476
477 try:
478 #Start writing to file
andrewonlabd4940492014-10-24 12:21:27 -0400479 cell_file.write(onos_nic_string + "\n")
andrewonlab94282092014-10-10 13:00:11 -0400480
481 for arg in onos_ip_addrs:
482 #For each argument in onos_ip_addrs, write to file
483 #Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400484 # export OC1="10.128.20.11"
485 # export OC2="10.128.20.12"
andrewonlab94282092014-10-10 13:00:11 -0400486 cell_file.write(onos_string + str(temp_count) +
andrewonlabd4940492014-10-24 12:21:27 -0400487 "=" + "\"" + arg + "\"" + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400488 temp_count = temp_count + 1
489
andrewonlabd4940492014-10-24 12:21:27 -0400490 cell_file.write(mn_string +"\""+ mn_ip_addrs +"\""+ "\n")
491 cell_file.write(core_feature_string + "\n")
andrewonlab94282092014-10-10 13:00:11 -0400492 cell_file.close()
493
494 #We use os.system to send the command to TestON cluster
495 #to account for the case in which TestON is not located
496 #on the same cluster as the ONOS bench
497 #Note that even if TestON is located on the same cluster
498 #as ONOS bench, you must setup passwordless ssh
andrewonlab7e4d2d32014-10-15 13:23:21 -0400499 #between TestON and ONOS bench in order to automate the test.
andrewonlab94282092014-10-10 13:00:11 -0400500 os.system("scp "+temp_directory+file_name+
501 " admin@"+bench_ip+":"+cell_directory)
502
andrewonlab2a6c9342014-10-16 13:40:15 -0400503 return main.TRUE
504
andrewonlab94282092014-10-10 13:00:11 -0400505 except pexpect.EOF:
506 main.log.error(self.name + ": EOF exception found")
507 main.log.error(self.name + ": " + self.handle.before)
508 main.cleanup()
509 main.exit()
510 except:
511 main.log.info(self.name + ":::::::::")
512 main.log.error( traceback.print_exc() )
513 main.log.info(":::::::")
514 main.cleanup()
515 main.exit()
516
andrewonlab95ca1462014-10-09 14:04:24 -0400517 def set_cell(self, cellname):
518 '''
519 Calls 'cell <name>' to set the environment variables on ONOSbench
520 '''
521 try:
522 if not cellname:
523 main.log.error("Must define cellname")
524 main.cleanup()
525 main.exit()
526 else:
527 self.handle.sendline("cell "+str(cellname))
528 #Expect the cellname in the ONOS_CELL variable.
529 #Note that this variable name is subject to change
530 # and that this driver will have to change accordingly
531 self.handle.expect("ONOS_CELL="+str(cellname))
532 handle_before = self.handle.before
533 handle_after = self.handle.after
andrewonlabc03bf6c2014-10-09 14:56:18 -0400534 #Get the rest of the handle
535 self.handle.sendline("")
536 self.handle.expect("\$")
537 handle_more = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400538
539 main.log.info("Cell call returned: "+handle_before+
andrewonlabc03bf6c2014-10-09 14:56:18 -0400540 handle_after + handle_more)
andrewonlab95ca1462014-10-09 14:04:24 -0400541
542 return main.TRUE
543
544 except pexpect.EOF:
545 main.log.error(self.name + ": EOF exception found")
546 main.log.error(self.name + ": " + self.handle.before)
547 main.cleanup()
548 main.exit()
549 except:
550 main.log.info(self.name+" ::::::")
551 main.log.error( traceback.print_exc())
552 main.log.info(self.name+" ::::::")
553 main.cleanup()
554 main.exit()
555
andrewonlabc03bf6c2014-10-09 14:56:18 -0400556 def verify_cell(self):
557 '''
558 Calls 'onos-verify-cell' to check for cell installation
559 '''
andrewonlab8d0d7d72014-10-09 16:33:15 -0400560 #TODO: Add meaningful expect value
561
andrewonlabc03bf6c2014-10-09 14:56:18 -0400562 try:
563 #Clean handle by sending empty and expecting $
564 self.handle.sendline("")
565 self.handle.expect("\$")
566 self.handle.sendline("onos-verify-cell")
567 self.handle.expect("\$")
568 handle_before = self.handle.before
569 handle_after = self.handle.after
570 #Get the rest of the handle
571 self.handle.sendline("")
572 self.handle.expect("\$")
573 handle_more = self.handle.before
574
575 main.log.info("Verify cell returned: "+handle_before+
576 handle_after + handle_more)
577
578 return main.TRUE
Jon Hall7993bfc2014-10-09 16:30:14 -0400579 except pexpect.EOF:
580 main.log.error(self.name + ": EOF exception found")
581 main.log.error(self.name + ": " + self.handle.before)
582 main.cleanup()
583 main.exit()
584 except:
585 main.log.info(self.name+" ::::::")
586 main.log.error( traceback.print_exc())
587 main.log.info(self.name+" ::::::")
588 main.cleanup()
589 main.exit()
590
andrewonlab05e362f2014-10-10 00:40:57 -0400591 def onos_cli(self, ONOS_ip, cmdstr):
592 '''
593 Uses 'onos' command to send various ONOS CLI arguments.
594 Required:
595 * ONOS_ip: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400596 * cmdstr: specify the command string to send
andrewonlab6e20c342014-10-10 18:08:48 -0400597
598 This function is intended to expose the entire karaf
599 CLI commands for ONOS. Try to use this function first
600 before attempting to write a ONOS CLI specific driver
601 function.
602 You can see a list of available 'cmdstr' arguments
603 by starting onos, and typing in 'onos' to enter the
604 onos> CLI. Then, type 'help' to see the list of
605 available commands.
andrewonlab05e362f2014-10-10 00:40:57 -0400606 '''
607 try:
608 if not ONOS_ip:
609 main.log.error("You must specify the IP address")
610 return main.FALSE
611 if not cmdstr:
612 main.log.error("You must specify the command string")
613 return main.FALSE
614
615 cmdstr = str(cmdstr)
616 self.handle.sendline("")
617 self.handle.expect("\$")
618
619 self.handle.sendline("onos -w " + ONOS_ip + " " + cmdstr)
620 self.handle.expect("\$")
621
Shreya Shaha73aaad2014-10-27 18:03:09 -0400622 handle_before = self.handle.before
623 print "handle_before = ", self.handle.before
andrewonlab05e362f2014-10-10 00:40:57 -0400624 handle_after = str(self.handle.after)
625
Shreya Shaha73aaad2014-10-27 18:03:09 -0400626 #self.handle.sendline("")
627 #self.handle.expect("\$")
628 #handle_more = str(self.handle.before)
andrewonlab05e362f2014-10-10 00:40:57 -0400629
630 main.log.info("Command sent successfully")
631
andrewonlab94282092014-10-10 13:00:11 -0400632 #Obtain return handle that consists of result from
633 #the onos command. The string may need to be
634 #configured further.
Shreya Shaha73aaad2014-10-27 18:03:09 -0400635 #return_string = handle_before + handle_after
636 return_string = handle_before
637 print "return_string = ", return_string
andrewonlab05e362f2014-10-10 00:40:57 -0400638 return return_string
639
640 except pexpect.EOF:
641 main.log.error(self.name + ": EOF exception found")
642 main.log.error(self.name + ": " + self.handle.before)
643 main.cleanup()
644 main.exit()
645 except:
646 main.log.info(self.name+" ::::::")
647 main.log.error( traceback.print_exc())
648 main.log.info(self.name+" ::::::")
649 main.cleanup()
650 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400651
652 def onos_install(self, options="-f", node = ""):
653 '''
654 Installs ONOS bits on the designated cell machine.
655 If -f option is provided, it also forces an uninstall.
656 Presently, install also includes onos-push-bits and
657 onos-config within.
658 The node option allows you to selectively only push the jar
659 files to certain onos nodes
660
661 Returns: main.TRUE on success and main.FALSE on failure
662 '''
663 try:
andrewonlab114768a2014-11-14 12:44:44 -0500664 if options:
665 self.handle.sendline("onos-install " + options + " " + node)
666 else:
667 self.handle.sendline("onos-install "+node)
Jon Hall7993bfc2014-10-09 16:30:14 -0400668 self.handle.expect("onos-install ")
669 #NOTE: this timeout may need to change depending on the network and size of ONOS
670 i=self.handle.expect(["Network\sis\sunreachable",
671 "onos\sstart/running,\sprocess",
andrewonlabd9a73a72014-11-14 17:28:21 -0500672 "ONOS\sis\salready\sinstalled",
Jon Hall7993bfc2014-10-09 16:30:14 -0400673 pexpect.TIMEOUT],timeout=60)
674
Jon Hall7993bfc2014-10-09 16:30:14 -0400675 if i == 0:
676 main.log.warn("Network is unreachable")
677 return main.FALSE
678 elif i == 1:
Jon Hall42db6dc2014-10-24 19:03:48 -0400679 main.log.info("ONOS was installed on " + node + " and started")
Jon Hall7993bfc2014-10-09 16:30:14 -0400680 return main.TRUE
andrewonlabd9a73a72014-11-14 17:28:21 -0500681 elif i == 2:
682 main.log.info("ONOS is already installed on "+node)
683 return main.TRUE
684 elif i == 3:
Jon Hall42db6dc2014-10-24 19:03:48 -0400685 main.log.info("Installation of ONOS on " + node + " timed out")
Jon Hall7993bfc2014-10-09 16:30:14 -0400686 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -0400687
andrewonlabd9a73a72014-11-14 17:28:21 -0500688
andrewonlabc03bf6c2014-10-09 14:56:18 -0400689 except pexpect.EOF:
690 main.log.error(self.name + ": EOF exception found")
691 main.log.error(self.name + ": " + self.handle.before)
692 main.cleanup()
693 main.exit()
694 except:
695 main.log.info(self.name+" ::::::")
696 main.log.error( traceback.print_exc())
697 main.log.info(self.name+" ::::::")
698 main.cleanup()
699 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400700
andrewonlab8d0d7d72014-10-09 16:33:15 -0400701 def onos_start(self, node_ip):
702 '''
703 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400704 This command is a remote management of the ONOS upstart daemon
andrewonlab8d0d7d72014-10-09 16:33:15 -0400705 '''
706
707 try:
708 self.handle.sendline("")
709 self.handle.expect("\$")
710 self.handle.sendline("onos-service "+str(node_ip)+
711 " start")
712 i = self.handle.expect([
713 "Job\sis\salready\srunning",
714 "start/running",
715 "Unknown\sinstance",
Shreya Shahd01153d2014-10-23 15:08:56 -0400716 pexpect.TIMEOUT],timeout=120)
andrewonlab8d0d7d72014-10-09 16:33:15 -0400717
718 if i == 0:
719 main.log.info("Service is already running")
720 return main.TRUE
721 elif i == 1:
722 main.log.info("ONOS service started")
723 return main.TRUE
724 else:
725 main.log.error("ONOS service failed to start")
726 main.cleanup()
727 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -0400728 except pexpect.EOF:
729 main.log.error(self.name + ": EOF exception found")
730 main.log.error(self.name + ": " + self.handle.before)
731 main.cleanup()
732 main.exit()
733 except:
734 main.log.info(self.name+" ::::::")
735 main.log.error( traceback.print_exc())
736 main.log.info(self.name+" ::::::")
737 main.cleanup()
738 main.exit()
739
andrewonlab2b30bd32014-10-09 16:48:55 -0400740 def onos_stop(self, node_ip):
741 '''
742 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400743 This command is a remote management of the ONOS upstart daemon
andrewonlab2b30bd32014-10-09 16:48:55 -0400744 '''
745 try:
746 self.handle.sendline("")
747 self.handle.expect("\$")
748 self.handle.sendline("onos-service "+str(node_ip)+
749 " stop")
750 i = self.handle.expect([
751 "stop/waiting",
752 "Unknown\sinstance",
753 pexpect.TIMEOUT],timeout=60)
754
755 if i == 0:
756 main.log.info("ONOS service stopped")
757 return main.TRUE
758 elif i == 1:
759 main.log.info("Unknown ONOS instance specified: "+
760 str(node_ip))
761 return main.FALSE
762 else:
763 main.log.error("ONOS service failed to stop")
764 return main.FALSE
765
766 except pexpect.EOF:
767 main.log.error(self.name + ": EOF exception found")
768 main.log.error(self.name + ": " + self.handle.before)
769 main.cleanup()
770 main.exit()
771 except:
772 main.log.info(self.name+" ::::::")
773 main.log.error( traceback.print_exc())
774 main.log.info(self.name+" ::::::")
775 main.cleanup()
776 main.exit()
andrewonlab99d3f7f2014-11-13 17:45:08 -0500777
andrewonlaba6f7d882014-11-13 17:32:24 -0500778 def onos_uninstall(self, node_ip=""):
andrewonlabc8d47972014-10-09 16:52:36 -0400779 '''
780 Calls the command: 'onos-uninstall'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400781 Uninstalls ONOS from the designated cell machine, stopping
782 if needed
andrewonlabc8d47972014-10-09 16:52:36 -0400783 '''
784 try:
785 self.handle.sendline("")
786 self.handle.expect("\$")
andrewonlab85f4ed32014-11-13 17:31:06 -0500787 self.handle.sendline("onos-uninstall "+str(node_ip))
andrewonlabc8d47972014-10-09 16:52:36 -0400788 self.handle.expect("\$")
789
andrewonlab9dfd2082014-11-13 17:44:03 -0500790 main.log.info("ONOS "+node_ip+" was uninstalled")
791
andrewonlabc8d47972014-10-09 16:52:36 -0400792 #onos-uninstall command does not return any text
793 return main.TRUE
794
795 except pexpect.EOF:
796 main.log.error(self.name + ": EOF exception found")
797 main.log.error(self.name + ": " + self.handle.before)
798 main.cleanup()
799 main.exit()
800 except:
801 main.log.info(self.name+" ::::::")
802 main.log.error( traceback.print_exc())
803 main.log.info(self.name+" ::::::")
804 main.cleanup()
805 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -0400806
andrewonlabe8e56fd2014-10-09 17:12:44 -0400807 def onos_kill(self, node_ip):
808 '''
809 Calls the command: 'onos-kill [<node-ip>]'
810 "Remotely, and unceremoniously kills the ONOS instance running on
811 the specified cell machine" - Tom V
812 '''
813
814 try:
815 self.handle.sendline("")
816 self.handle.expect("\$")
817 self.handle.sendline("onos-kill " + str(node_ip))
818 i = self.handle.expect([
819 "\$",
820 "No\sroute\sto\shost",
821 "password:",
822 pexpect.TIMEOUT], timeout=20)
823
824 if i == 0:
825 main.log.info("ONOS instance "+str(node_ip)+" was killed")
826 return main.TRUE
827 elif i == 1:
828 main.log.info("No route to host")
829 return main.FALSE
830 elif i == 2:
831 main.log.info("Passwordless login for host: "+str(node_ip)+
832 " not configured")
833 return main.FALSE
834 else:
835 main.log.info("ONOS instasnce was not killed")
836 return main.FALSE
837
838 except pexpect.EOF:
839 main.log.error(self.name + ": EOF exception found")
840 main.log.error(self.name + ": " + self.handle.before)
841 main.cleanup()
842 main.exit()
843 except:
844 main.log.info(self.name+" ::::::")
845 main.log.error( traceback.print_exc())
846 main.log.info(self.name+" ::::::")
847 main.cleanup()
848 main.exit()
849
andrewonlab19fbdca2014-11-14 12:55:59 -0500850 def onos_remove_raft_logs(self):
851 '''
852 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -0500853 a cleaner environment.
854
andrewonlab19fbdca2014-11-14 12:55:59 -0500855 Description:
Jon Hallfcc88622014-11-25 13:09:54 -0500856 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -0500857 wipes the raft / copycat log files
858 '''
859 try:
860 self.handle.sendline("")
861 self.handle.expect("\$")
862 self.handle.sendline("onos-remove-raft-logs")
Jon Hallfcc88622014-11-25 13:09:54 -0500863 #Sometimes this command hangs
andrewonlabeb7b1072014-11-25 15:50:07 -0500864 i = self.handle.expect(["\$", pexpect.TIMEOUT],
865 timeout=120)
Jon Hallfcc88622014-11-25 13:09:54 -0500866 if i == 1:
andrewonlabeb7b1072014-11-25 15:50:07 -0500867 i = self.handle.expect(["\$", pexpect.TIMEOUT],
868 timeout=120)
Jon Hallfcc88622014-11-25 13:09:54 -0500869 if i == 1:
870 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -0500871 return main.TRUE
872
873 except pexpect.EOF:
874 main.log.error(self.name + ": EOF exception found")
875 main.log.error(self.name + ": " + self.handle.before)
876 main.cleanup()
877 main.exit()
878 except:
879 main.log.info(self.name+" ::::::")
880 main.log.error( traceback.print_exc())
881 main.log.info(self.name+" ::::::")
882 main.cleanup()
883 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -0500884
andrewonlab94282092014-10-10 13:00:11 -0400885 def onos_start_network(self, mntopo):
886 '''
887 Calls the command 'onos-start-network [<mininet-topo>]
888 "remotely starts the specified topology on the cell's
889 mininet machine against all controllers configured in the
890 cell."
891 * Specify mininet topology file name for mntopo
892 * Topo files should be placed at:
893 ~/<your-onos-directory>/tools/test/topos
894
895 NOTE: This function will take you to the mininet prompt
896 '''
897 try:
898 if not mntopo:
899 main.log.error("You must specify a topo file to execute")
900 return main.FALSE
901
902 mntopo = str(mntopo)
903 self.handle.sendline("")
904 self.handle.expect("\$")
905
906 self.handle.sendline("onos-start-network " + mntopo)
907 self.handle.expect("mininet>")
908 main.log.info("Network started, entered mininet prompt")
909
910 #TODO: Think about whether return is necessary or not
911
912 except pexpect.EOF:
913 main.log.error(self.name + ": EOF exception found")
914 main.log.error(self.name + ": " + self.handle.before)
915 main.cleanup()
916 main.exit()
917 except:
918 main.log.info(self.name+" ::::::")
919 main.log.error( traceback.print_exc())
920 main.log.info(self.name+" ::::::")
921 main.cleanup()
922 main.exit()
923
924
Jon Hall7993bfc2014-10-09 16:30:14 -0400925 def isup(self, node = ""):
926 '''
Jon Hall77f53ce2014-10-13 18:02:06 -0400927 Run's onos-wait-for-start which only returns once ONOS is at run
928 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -0400929
Jon Hall7993bfc2014-10-09 16:30:14 -0400930 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
931 '''
932 try:
933 self.handle.sendline("onos-wait-for-start " + node )
934 self.handle.expect("onos-wait-for-start")
935 #NOTE: this timeout is arbitrary"
shahshreya4d79aab2014-11-07 15:20:41 -0800936 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout = 300)
Jon Hall7993bfc2014-10-09 16:30:14 -0400937 if i == 0:
938 main.log.info(self.name + ": " + node + " is up")
939 return main.TRUE
940 elif i == 1:
941 #NOTE: since this function won't return until ONOS is ready,
942 # we will kill it on timeout
943 self.handle.sendline("\003") #Control-C
944 self.handle.expect("\$")
945 return main.FALSE
946 except pexpect.EOF:
947 main.log.error(self.name + ": EOF exception found")
948 main.log.error(self.name + ": " + self.handle.before)
949 main.cleanup()
950 main.exit()
951 except:
952 main.log.info(self.name+" ::::::")
953 main.log.error( traceback.print_exc())
954 main.log.info(self.name+" ::::::")
955 main.cleanup()
956 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -0400957
andrewonlabb66dfa12014-12-02 15:51:10 -0500958 def push_test_intents_shell(self, dpid_src, dpid_dst, num_intents,
959 dir_file, onos_ip, num_mult="", app_id="", report=True):
960 '''
961 Description:
962 Use the linux prompt to push test intents to
963 better parallelize the results than the CLI
964 Required:
965 * dpid_src: specify source dpid
966 * dpid_dst: specify destination dpid
967 * num_intents: specify number of intents to push
968 * dir_file: specify directory and file name to save
969 results
970 * onos_ip: specify the IP of ONOS to install on
971 NOTE:
972 You must invoke this command at linux shell prompt
973 '''
974 try:
975 #Create the string to sendline
976 base_cmd = "onos "+str(onos_ip)+" push-test-intents "
977 add_dpid = base_cmd + str(dpid_src) + " " + str(dpid_dst)
978 if not num_mult:
979 add_intents = add_dpid + " " + str(num_intents)
980 elif num_mult:
981 add_intents = add_dpid + " " + str(num_intents) + " " +\
982 str(num_mult)
983 if app_id:
984 add_app = add_intents + " " + str(app_id)
985 else:
986 add_app = add_intents
987
988 send_cmd = add_app + " > " + str(dir_file) + " &"
989 main.log.info("Send cmd: "+send_cmd)
990
991 self.handle.sendline(send_cmd)
992
993 except pexpect.EOF:
994 main.log.error(self.name + ": EOF exception found")
995 main.log.error(self.name + ": " + self.handle.before)
996 main.cleanup()
997 main.exit()
998 except:
999 main.log.info(self.name+" ::::::")
1000 main.log.error( traceback.print_exc())
1001 main.log.info(self.name+" ::::::")
1002 main.cleanup()
1003 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001004
Shreya Shaha73aaad2014-10-27 18:03:09 -04001005 def get_topology(self,topology_output):
Jon Hall77f53ce2014-10-13 18:02:06 -04001006 '''
1007 parses the onos:topology output
1008 Returns: a topology dict populated by the key values found in
1009 the cli command.
1010 '''
1011
1012 try:
1013 #call the cli to get the topology summary
Shreya Shaha73aaad2014-10-27 18:03:09 -04001014 #cmdstr = "onos:topology"
1015 #cli_result = self.onos_cli(ip, cmdstr)
1016 #print "cli_result = ", cli_result
Jon Hall77f53ce2014-10-13 18:02:06 -04001017
1018 #Parse the output
1019 topology = {}
1020 #for line in cli_result.split("\n"):
Shreya Shaha73aaad2014-10-27 18:03:09 -04001021 for line in topology_output.splitlines():
Jon Hall77f53ce2014-10-13 18:02:06 -04001022 if not line.startswith("time="):
1023 continue
1024 #else
1025 print line
1026 for var in line.split(","):
Shreya Shaha73aaad2014-10-27 18:03:09 -04001027 #print "'"+var+"'"
1028 #print "'"+var.strip()+"'"
Jon Hall77f53ce2014-10-13 18:02:06 -04001029 key, value = var.strip().split("=")
1030 topology[key] = value
Shreya Shaha73aaad2014-10-27 18:03:09 -04001031 print "topology = ", topology
Jon Hall77f53ce2014-10-13 18:02:06 -04001032 devices = topology.get('devices', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -04001033 print "devices = ", devices
Jon Hall77f53ce2014-10-13 18:02:06 -04001034 links = topology.get('links', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -04001035 print "links = ", links
Jon Hall77f53ce2014-10-13 18:02:06 -04001036 clusters = topology.get('clusters', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -04001037 print "clusters = ", clusters
Jon Hall77f53ce2014-10-13 18:02:06 -04001038 paths = topology.get('paths', False)
Shreya Shaha73aaad2014-10-27 18:03:09 -04001039 print "paths = ", paths
Jon Hall77f53ce2014-10-13 18:02:06 -04001040
1041 return topology
1042 except pexpect.EOF:
1043 main.log.error(self.name + ": EOF exception found")
1044 main.log.error(self.name + ": " + self.handle.before)
1045 main.cleanup()
1046 main.exit()
1047 except:
1048 main.log.info(self.name+" ::::::")
1049 main.log.error( traceback.print_exc())
1050 main.log.info(self.name+" ::::::")
1051 main.cleanup()
1052 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001053
1054
Jon Hall77f53ce2014-10-13 18:02:06 -04001055
Shreya Shaha73aaad2014-10-27 18:03:09 -04001056 def check_status(self, topology_result, numoswitch, numolink, log_level="info"):
Jon Hall77f53ce2014-10-13 18:02:06 -04001057 '''
1058 Checks the number of swithes & links that ONOS sees against the
1059 supplied values. By default this will report to main.log, but the
1060 log level can be specifid.
1061
1062 Params: ip = ip used for the onos cli
1063 numoswitch = expected number of switches
1064 numlink = expected number of links
1065 log_level = level to log to. Currently accepts 'info', 'warn' and 'report'
1066
1067
1068 log_level can
1069
1070 Returns: main.TRUE if the number of switchs and links are correct,
1071 main.FALSE if the numer of switches and links is incorrect,
1072 and main.ERROR otherwise
1073 '''
1074
1075 try:
Shreya Shaha73aaad2014-10-27 18:03:09 -04001076 topology = self.get_topology(topology_result)
Jon Hall77f53ce2014-10-13 18:02:06 -04001077 if topology == {}:
1078 return main.ERROR
1079 output = ""
1080 #Is the number of switches is what we expected
1081 devices = topology.get('devices',False)
1082 links = topology.get('links',False)
1083 if devices == False or links == False:
1084 return main.ERROR
1085 switch_check = ( int(devices) == int(numoswitch) )
1086 #Is the number of links is what we expected
1087 link_check = ( int(links) == int(numolink) )
1088 if (switch_check and link_check):
1089 #We expected the correct numbers
1090 output = output + "The number of links and switches match "\
1091 + "what was expected"
1092 result = main.TRUE
1093 else:
1094 output = output + \
1095 "The number of links and switches does not match what was expected"
1096 result = main.FALSE
1097 output = output + "\n ONOS sees %i devices (%i expected) and %i links (%i expected)"\
1098 % ( int(devices), int(numoswitch), int(links), int(numolink) )
1099 if log_level == "report":
1100 main.log.report(output)
1101 elif log_level == "warn":
1102 main.log.warn(output)
1103 else:
1104 main.log.info(output)
1105 return result
1106 except pexpect.EOF:
1107 main.log.error(self.name + ": EOF exception found")
1108 main.log.error(self.name + ": " + self.handle.before)
1109 main.cleanup()
1110 main.exit()
1111 except:
1112 main.log.info(self.name+" ::::::")
1113 main.log.error( traceback.print_exc())
1114 main.log.info(self.name+" ::::::")
1115 main.cleanup()
1116 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001117
andrewonlab970399c2014-11-07 13:09:32 -05001118 def tshark_pcap(self, interface, dir_file):
1119 '''
1120 Capture all packet activity and store in specified
1121 directory/file
1122
1123 Required:
1124 * interface: interface to capture
1125 * dir: directory/filename to store pcap
1126 '''
1127 self.handle.sendline("")
1128 self.handle.expect("\$")
1129
1130 self.handle.sendline("tshark -i "+str(interface)+
andrewonlab5d7a8f32014-11-10 13:07:56 -05001131 " -t e -w "+str(dir_file)+ " &")
1132 self.handle.sendline("\r")
andrewonlab970399c2014-11-07 13:09:32 -05001133 self.handle.expect("Capturing on")
andrewonlab5d7a8f32014-11-10 13:07:56 -05001134 self.handle.sendline("\r")
1135 self.handle.expect("\$")
andrewonlab970399c2014-11-07 13:09:32 -05001136
1137 main.log.info("Tshark started capturing files on "+
1138 str(interface)+ " and saving to directory: "+
andrewonlab5d7a8f32014-11-10 13:07:56 -05001139 str(dir_file))
Shreya Shaha73aaad2014-10-27 18:03:09 -04001140
shahshreya4d79aab2014-11-07 15:20:41 -08001141
1142 def run_onos_topo_cfg(self):
1143 '''
1144 On ONOS bench, run this command: ./~/ONOS/tools/test/bin/onos-topo-cfg
1145 which starts the rest and copies the json file to the onos instance
1146 '''
1147 self.handle.sendline("")
1148 self.handle.expect("\$")
1149 self.handle.sendline("cd ~/ONOS/tools/test/bin")
1150 self.handle.expect("/bin$")
1151 self.handle.sendline("./onos-topo-cfg")
shahshreyadf73d762014-11-11 13:58:56 -08001152 self.handle.expect("{}")
shahshreya4d79aab2014-11-07 15:20:41 -08001153 self.handle.sendline("cd ~")
1154 self.handle.expect("\$")
1155
1156
andrewonlabba44bcf2014-10-16 16:54:41 -04001157 def tshark_grep(self, grep, directory, interface='eth0'):
1158 '''
1159 Required:
1160 * grep string
1161 * directory to store results
1162 Optional:
1163 * interface - default: eth0
1164 Description:
1165 Uses tshark command to grep specific group of packets
1166 and stores the results to specified directory.
1167 The timestamp is hardcoded to be in epoch
1168 '''
1169 self.handle.sendline("")
1170 self.handle.expect("\$")
andrewonlabefd7f3d2014-10-21 16:02:31 -04001171 self.handle.sendline("")
andrewonlabba44bcf2014-10-16 16:54:41 -04001172 self.handle.sendline("tshark -i "+str(interface)+
andrewonlabd4940492014-10-24 12:21:27 -04001173 " -t e | grep --line-buffered \""+str(grep)+"\" >"+directory+" &")
andrewonlabba44bcf2014-10-16 16:54:41 -04001174 self.handle.sendline("\r")
1175 self.handle.expect("Capturing on")
1176 self.handle.sendline("\r")
1177 self.handle.expect("\$")
1178
1179 def tshark_stop(self):
1180 '''
1181 Removes wireshark files from /tmp and kills all tshark processes
1182 '''
andrewonlab5ba0d9e2014-10-24 13:32:23 -04001183 #Remove all pcap from previous captures
1184 self.execute(cmd="sudo rm /tmp/wireshark*")
andrewonlabba44bcf2014-10-16 16:54:41 -04001185 self.handle.sendline("")
1186 self.handle.sendline("sudo kill -9 `ps -ef | grep \"tshark -i\" |"+
1187 " grep -v grep | awk '{print $2}'`")
1188 self.handle.sendline("")
1189 main.log.info("Tshark stopped")
1190
andrewonlab0c38a4a2014-10-28 18:35:35 -04001191 def ptpd(self, args):
1192 '''
1193 Initiate ptp with user-specified args.
1194 Required:
1195 * args: specify string of args after command
1196 'sudo ptpd'
1197 '''
1198 try:
1199 self.handle.sendline("sudo ptpd "+str(args))
andrewonlab978dff62014-10-29 16:53:35 -04001200 i = self.handle.expect([
andrewonlab0c38a4a2014-10-28 18:35:35 -04001201 "Multiple",
1202 "Error",
1203 "\$"])
1204 self.handle.expect("\$")
andrewonlabba44bcf2014-10-16 16:54:41 -04001205
andrewonlab0c38a4a2014-10-28 18:35:35 -04001206 if i == 0:
1207 handle = self.handle.before
1208 main.log.info("ptpd returned an error: "+
1209 str(handle))
1210 return handle
1211 elif i == 1:
1212 handle = self.handle.before
1213 main.log.error("ptpd returned an error: "+
1214 str(handle))
1215 return handle
1216 else:
1217 return main.TRUE
1218
1219 except pexpect.EOF:
1220 main.log.error(self.name + ": EOF exception found")
1221 main.log.error(self.name + ": " + self.handle.before)
1222 main.cleanup()
1223 main.exit()
1224 except:
1225 main.log.info(self.name+" ::::::")
1226 main.log.error( traceback.print_exc())
1227 main.log.info(self.name+" ::::::")
1228 main.cleanup()
1229 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001230
andrewonlab5d7a8f32014-11-10 13:07:56 -05001231 def cp_logs_to_dir(self, log_to_copy,
1232 dest_dir, copy_file_name=""):
1233 '''
1234 Copies logs to a desired directory.
1235 Current implementation of ONOS deletes its karaf
1236 logs on every iteration. For debugging purposes,
1237 you may want to use this function to capture
1238 certain karaf logs. (or any other logs if needed)
1239 Localtime will be attached to the filename
1240
1241 Required:
1242 * log_to_copy: specify directory and log name to
1243 copy.
1244 ex) /opt/onos/log/karaf.log.1
1245 For copying multiple files, leave copy_file_name
1246 empty and only specify dest_dir -
1247 ex) /opt/onos/log/karaf*
1248 * dest_dir: specify directory to copy to.
1249 ex) /tmp/
1250 Optional:
1251 * copy_file_name: If you want to rename the log
1252 file, specify copy_file_name. This will not work
1253 with multiple file copying
1254 '''
1255 try:
1256 localtime = time.strftime('%x %X')
1257 localtime = localtime.replace("/","")
1258 localtime = localtime.replace(" ","_")
1259 localtime = localtime.replace(":","")
1260 if dest_dir[-1:] != "/":
1261 dest_dir += "/"
1262
1263 if copy_file_name:
1264 self.handle.sendline("cp "+str(log_to_copy)+
1265 " "+str(dest_dir)+str(copy_file_name)+
1266 localtime)
1267 self.handle.expect("cp")
1268 self.handle.expect("\$")
1269 else:
1270 self.handle.sendline("cp "+str(log_to_copy)+
1271 " "+str(dest_dir))
1272 self.handle.expect("cp")
1273 self.handle.expect("\$")
1274
1275 return self.handle.before
1276
1277 except pexpect.EOF:
1278 main.log.error("Copying files failed")
1279 main.log.error(self.name + ": EOF exception found")
1280 main.log.error(self.name + ": " + self.handle.before)
1281 except:
1282 main.log.error("Copying files failed")
1283 main.log.info(self.name+" ::::::")
1284 main.log.error( traceback.print_exc())
1285 main.log.info(self.name+" ::::::")
1286
1287
andrewonlabba44bcf2014-10-16 16:54:41 -04001288