blob: b4493f83d5acf4cf6c76c8310c13168646d539fd [file] [log] [blame]
Jon Hall05b2b432014-10-08 19:53:25 -04001#!/usr/bin/env python
andrewonlabe8e56fd2014-10-09 17:12:44 -04002
kelvin8ec71442015-01-15 16:57:00 -08003"""
4This driver interacts with ONOS bench, the OSGi platform
5that configures the ONOS nodes. ( aka ONOS-next )
andrewonlabe8e56fd2014-10-09 17:12:44 -04006
kelvin8ec71442015-01-15 16:57:00 -08007Please follow the coding style demonstrated by existing
andrewonlabe8e56fd2014-10-09 17:12:44 -04008functions 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
kelvin8ec71442015-01-15 16:57:00 -080018"""
andrewonlab7735d852014-10-09 13:02:47 -040019import sys
Jon Hall05b2b432014-10-08 19:53:25 -040020import time
21import pexpect
Jon Hall05b2b432014-10-08 19:53:25 -040022import traceback
andrewonlab7735d852014-10-09 13:02:47 -040023import os.path
kelvin8ec71442015-01-15 16:57:00 -080024sys.path.append( "../" )
Jon Hall05b2b432014-10-08 19:53:25 -040025from drivers.common.clidriver import CLI
26
Jon Hall05b2b432014-10-08 19:53:25 -040027
kelvin8ec71442015-01-15 16:57:00 -080028class OnosDriver( CLI ):
Jon Hall05b2b432014-10-08 19:53:25 -040029
kelvin8ec71442015-01-15 16:57:00 -080030 def __init__( self ):
31 """
32 Initialize client
33 """
34 super( CLI, self ).__init__()
35
36 def connect( self, **connectargs ):
37 """
Jon Hall05b2b432014-10-08 19:53:25 -040038 Creates ssh handle for ONOS "bench".
kelvin8ec71442015-01-15 16:57:00 -080039 """
Jon Hall05b2b432014-10-08 19:53:25 -040040 try:
41 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080042 vars( self )[ key ] = connectargs[ key ]
Jon Hall05b2b432014-10-08 19:53:25 -040043 self.home = "~/ONOS"
44 for key in self.options:
45 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080046 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040047 break
kelvin-onlaba1484582015-02-02 15:46:20 -080048 if self.home == None or self.home == "":
49 self.home = "~/ONOS"
50
kelvin8ec71442015-01-15 16:57:00 -080051 self.name = self.options[ 'name' ]
52 self.handle = super( OnosDriver, self ).connect(
53 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -080054 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -080055 port=self.port,
56 pwd=self.pwd,
57 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -040058
kelvin8ec71442015-01-15 16:57:00 -080059 self.handle.sendline( "cd " + self.home )
60 self.handle.expect( "\$" )
Jon Hall05b2b432014-10-08 19:53:25 -040061 if self.handle:
62 return self.handle
kelvin8ec71442015-01-15 16:57:00 -080063 else:
64 main.log.info( "NO ONOS HANDLE" )
Jon Hall05b2b432014-10-08 19:53:25 -040065 return main.FALSE
66 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080067 main.log.error( self.name + ": EOF exception found" )
68 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -040069 main.cleanup()
70 main.exit()
71 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -080072 main.log.info( self.name + ":" * 30 )
Jon Hall05b2b432014-10-08 19:53:25 -040073 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -080074 main.log.info( ":" * 30 )
Jon Hall05b2b432014-10-08 19:53:25 -040075 main.cleanup()
76 main.exit()
77
kelvin8ec71442015-01-15 16:57:00 -080078 def disconnect( self ):
79 """
Jon Hall05b2b432014-10-08 19:53:25 -040080 Called when Test is complete to disconnect the ONOS handle.
kelvin8ec71442015-01-15 16:57:00 -080081 """
Jon Hall05b2b432014-10-08 19:53:25 -040082 response = ''
83 try:
kelvin8ec71442015-01-15 16:57:00 -080084 self.handle.sendline( "" )
85 self.handle.expect( "\$" )
86 self.handle.sendline( "exit" )
87 self.handle.expect( "closed" )
Jon Hall05b2b432014-10-08 19:53:25 -040088 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080089 main.log.error( self.name + ": EOF exception found" )
90 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -040091 except:
kelvin8ec71442015-01-15 16:57:00 -080092 main.log.error( self.name + ": Connection failed to the host" )
Jon Hall05b2b432014-10-08 19:53:25 -040093 response = main.FALSE
94 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040095
kelvin-onlabd3b64892015-01-20 13:26:24 -080096 def onosPackage( self ):
kelvin8ec71442015-01-15 16:57:00 -080097 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040098 Produce a self-contained tar.gz file that can be deployed
kelvin8ec71442015-01-15 16:57:00 -080099 and executed on any platform with Java 7 JRE.
100 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400101 try:
kelvin8ec71442015-01-15 16:57:00 -0800102 self.handle.sendline( "onos-package" )
103 self.handle.expect( "onos-package" )
104 self.handle.expect( "tar.gz", timeout=30 )
105 handle = str( self.handle.before )
106 main.log.info( "onos-package command returned: " +
107 handle )
108 # As long as the sendline does not time out,
109 # return true. However, be careful to interpret
110 # the results of the onos-package command return
andrewonlab0748d2a2014-10-09 13:24:17 -0400111 return main.TRUE
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400112
andrewonlab7735d852014-10-09 13:02:47 -0400113 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800114 main.log.error( self.name + ": EOF exception found" )
115 main.log.error( self.name + ": " + self.handle.before )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400116 except:
kelvin8ec71442015-01-15 16:57:00 -0800117 main.log.error( "Failed to package ONOS" )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400118 main.cleanup()
119 main.exit()
120
kelvin-onlabd3b64892015-01-20 13:26:24 -0800121 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800122 """
andrewonlab8790abb2014-11-06 13:51:54 -0500123 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800124 """
andrewonlab8790abb2014-11-06 13:51:54 -0500125 try:
kelvin8ec71442015-01-15 16:57:00 -0800126 self.handle.sendline( "onos-build" )
127 self.handle.expect( "onos-build" )
128 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800129 "BUILD SUCCESS",
130 "ERROR",
131 "BUILD FAILED" ],
132 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800133 handle = str( self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500134
kelvin8ec71442015-01-15 16:57:00 -0800135 main.log.info( "onos-build command returned: " +
136 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500137
138 if i == 0:
139 return main.TRUE
140 else:
141 return handle
142
143 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800144 main.log.error( self.name + ": EOF exception found" )
145 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500146 except:
kelvin8ec71442015-01-15 16:57:00 -0800147 main.log.error( "Failed to build ONOS" )
andrewonlab8790abb2014-11-06 13:51:54 -0500148 main.cleanup()
149 main.exit()
150
kelvin-onlabd3b64892015-01-20 13:26:24 -0800151 def cleanInstall( self ):
kelvin8ec71442015-01-15 16:57:00 -0800152 """
153 Runs mvn clean install in the root of the ONOS directory.
154 This will clean all ONOS artifacts then compile each module
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400155
kelvin8ec71442015-01-15 16:57:00 -0800156 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400157 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800158 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400159 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800160 main.log.info( "Running 'mvn clean install' on " +
161 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800162 ". This may take some time." )
163 self.handle.sendline( "cd " + self.home )
164 self.handle.expect( "\$" )
Jon Hallea7818b2014-10-09 14:30:59 -0400165
kelvin8ec71442015-01-15 16:57:00 -0800166 self.handle.sendline( "" )
167 self.handle.expect( "\$" )
168 self.handle.sendline( "mvn clean install" )
169 self.handle.expect( "mvn clean install" )
170 while True:
171 i = self.handle.expect( [
Jon Hallde9d9aa2014-10-08 20:36:02 -0400172 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s\
173 Runtime\sEnvironment\sto\scontinue',
174 'BUILD\sFAILURE',
175 'BUILD\sSUCCESS',
176 'ONOS\$',
kelvin8ec71442015-01-15 16:57:00 -0800177 pexpect.TIMEOUT ], timeout=600 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400178 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800179 main.log.error( self.name + ":There is insufficient memory \
180 for the Java Runtime Environment to continue." )
181 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400182 main.cleanup()
183 main.exit()
184 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800185 main.log.error( self.name + ": Build failure!" )
186 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400187 main.cleanup()
188 main.exit()
189 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800190 main.log.info( self.name + ": Build success!" )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400191 elif i == 3:
kelvin8ec71442015-01-15 16:57:00 -0800192 main.log.info( self.name + ": Build complete" )
193 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400194 for line in self.handle.before.splitlines():
195 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800196 main.log.info( line )
197 self.handle.sendline( "" )
198 self.handle.expect( "\$", timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400199 return main.TRUE
200 elif i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800201 main.log.error(
202 self.name +
203 ": mvn clean install TIMEOUT!" )
204 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400205 main.cleanup()
206 main.exit()
207 else:
kelvin8ec71442015-01-15 16:57:00 -0800208 main.log.error( self.name + ": unexpected response from \
209 mvn clean install" )
210 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400211 main.cleanup()
212 main.exit()
213 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800214 main.log.error( self.name + ": EOF exception found" )
215 main.log.error( self.name + ": " + self.handle.before )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400216 main.cleanup()
217 main.exit()
218 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800219 main.log.info( self.name + ":" * 60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400220 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800221 main.log.info( ":" * 60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400222 main.cleanup()
223 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400224
kelvin-onlabd3b64892015-01-20 13:26:24 -0800225 def gitPull( self, comp1="" ):
kelvin8ec71442015-01-15 16:57:00 -0800226 """
Jon Hallacabffd2014-10-09 12:36:53 -0400227 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800228
Jon Hallacabffd2014-10-09 12:36:53 -0400229 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800230 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400231 for the purpose of pulling from other nodes if necessary.
232
Jon Hall47a93fb2015-01-06 16:46:06 -0800233 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400234 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800235 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400236 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400237
kelvin8ec71442015-01-15 16:57:00 -0800238 """
Jon Hallacabffd2014-10-09 12:36:53 -0400239 try:
kelvin8ec71442015-01-15 16:57:00 -0800240 # main.log.info( self.name + ": Stopping ONOS" )
241 # self.stop()
242 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800243 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800244 if comp1 == "":
245 self.handle.sendline( "git pull" )
Jon Hallacabffd2014-10-09 12:36:53 -0400246 else:
kelvin8ec71442015-01-15 16:57:00 -0800247 self.handle.sendline( "git pull " + comp1 )
Jon Hall47a93fb2015-01-06 16:46:06 -0800248
kelvin-onlabd3b64892015-01-20 13:26:24 -0800249 i = self.handle.expect(
250 [
251 'fatal',
252 'Username\sfor\s(.*):\s',
253 '\sfile(s*) changed,\s',
254 'Already up-to-date',
255 'Aborting',
256 'You\sare\snot\scurrently\son\sa\sbranch',
257 'You\sasked\sme\sto\spull\swithout\stelling\sme\swhich\
258 \sbranch\syou',
259 'Pull\sis\snot\spossible\sbecause\syou\shave\sunmerged\
260 \sfiles',
261 pexpect.TIMEOUT ],
262 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800263 # debug
kelvin-onlabd3b64892015-01-20 13:26:24 -0800264 # main.log.report( self.name +": DEBUG: \n"+
265 # "git pull response: " +
266 # str( self.handle.before ) + str( self.handle.after ) )
kelvin8ec71442015-01-15 16:57:00 -0800267 if i == 0:
268 main.log.error( self.name + ": Git pull had some issue..." )
Jon Hallacabffd2014-10-09 12:36:53 -0400269 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800270 elif i == 1:
271 main.log.error(
272 self.name +
273 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400274 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800275 elif i == 2:
276 main.log.info(
277 self.name +
278 ": Git Pull - pulling repository now" )
kelvin-onlaba1484582015-02-02 15:46:20 -0800279 self.handle.expect( self.home + "\$", 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800280 # So that only when git pull is done, we do mvn clean compile
281 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800282 elif i == 3:
283 main.log.info( self.name + ": Git Pull - Already up to date" )
Jon Hall47a93fb2015-01-06 16:46:06 -0800284 return i
kelvin8ec71442015-01-15 16:57:00 -0800285 elif i == 4:
286 main.log.info(
287 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800288 ": Git Pull - Aborting...\
289 Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400290 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800291 elif i == 5:
292 main.log.info(
293 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800294 ": Git Pull - You are not currently\
295 on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400296 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800297 elif i == 6:
298 main.log.info(
299 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800300 ": Git Pull - You have not configured\
301 an upstream branch to pull from\
302 . Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400303 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800304 elif i == 7:
305 main.log.info(
306 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800307 ": Git Pull - Pull is not possible\
308 because you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400309 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800310 elif i == 8:
311 main.log.error( self.name + ": Git Pull - TIMEOUT" )
312 main.log.error(
313 self.name + " Response was: " + str(
314 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400315 return main.ERROR
316 else:
kelvin8ec71442015-01-15 16:57:00 -0800317 main.log.error(
318 self.name +
319 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400320 return main.ERROR
321 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800322 main.log.error( self.name + ": EOF exception found" )
323 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400324 main.cleanup()
325 main.exit()
326 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800327 main.log.info( self.name + ":" * 60 )
Jon Hallacabffd2014-10-09 12:36:53 -0400328 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800329 main.log.info( ":" * 80 )
Jon Hallacabffd2014-10-09 12:36:53 -0400330 main.cleanup()
331 main.exit()
332
kelvin-onlabd3b64892015-01-20 13:26:24 -0800333 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800334 """
Jon Hallacabffd2014-10-09 12:36:53 -0400335 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800336
Jon Hallacabffd2014-10-09 12:36:53 -0400337 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800338 If used as gitCheckout( "branch" ) it will do git checkout
339 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400340
341 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800342 branch of the ONOS repository. If it has any problems, it will return
343 main.ERROR.
344 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400345 successful then the function will return main.TRUE.
346
kelvin8ec71442015-01-15 16:57:00 -0800347 """
Jon Hallacabffd2014-10-09 12:36:53 -0400348 try:
kelvin8ec71442015-01-15 16:57:00 -0800349 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800350 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800351 main.log.info(
352 self.name +
353 ": Checking out git branch: " +
354 branch +
355 "..." )
356 cmd = "git checkout " + branch
357 self.handle.sendline( cmd )
358 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800359 i = self.handle.expect(
360 [
361 'fatal',
362 'Username\sfor\s(.*):\s',
363 'Already\son\s\'',
364 'Switched\sto\sbranch\s\'' +
365 str( branch ),
366 pexpect.TIMEOUT,
367 'error: Your local changes to the following files\
368 would be overwritten by checkout:',
369 'error: you need to resolve your current index first' ],
370 timeout=60 )
Jon Hallacabffd2014-10-09 12:36:53 -0400371
kelvin8ec71442015-01-15 16:57:00 -0800372 if i == 0:
373 main.log.error(
374 self.name +
375 ": Git checkout had some issue..." )
376 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400377 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800378 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800379 main.log.error(
380 self.name +
381 ": Git checkout asking for username." +
382 " Please configure your local git repository to be able " +
383 "to access your remote repository passwordlessly" )
Jon Hallacabffd2014-10-09 12:36:53 -0400384 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800385 elif i == 2:
386 main.log.info(
387 self.name +
388 ": Git Checkout %s : Already on this branch" %
389 branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800390 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800391 # main.log.info( "DEBUG: after checkout cmd = "+
392 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400393 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800394 elif i == 3:
395 main.log.info(
396 self.name +
397 ": Git checkout %s - Switched to this branch" %
398 branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800399 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800400 # main.log.info( "DEBUG: after checkout cmd = "+
401 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400402 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800403 elif i == 4:
404 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
405 main.log.error(
406 self.name + " Response was: " + str(
407 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400408 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800409 elif i == 5:
410 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800411 main.log.error(
412 self.name +
413 ": Git checkout error: \n" +
414 "Your local changes to the following\
415 files would be overwritten by checkout:" +
416 str(
417 self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800418 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500419 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800420 elif i == 6:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800421 main.log.error( self.name +
422 ": Git checkout error: \n" +
423 "You need to resolve your\
424 current index first:" +
kelvin8ec71442015-01-15 16:57:00 -0800425 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800426 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500427 return main.ERROR
Jon Hallacabffd2014-10-09 12:36:53 -0400428 else:
kelvin8ec71442015-01-15 16:57:00 -0800429 main.log.error(
430 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800431 ": Git Checkout - Unexpected response,\
432 check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800433 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400434 return main.ERROR
435
436 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800437 main.log.error( self.name + ": EOF exception found" )
438 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400439 main.cleanup()
440 main.exit()
441 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800442 main.log.info( self.name + ":" * 60 )
Jon Hallacabffd2014-10-09 12:36:53 -0400443 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800444 main.log.info( ":" * 80 )
Jon Hallacabffd2014-10-09 12:36:53 -0400445 main.cleanup()
446 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400447
kelvin-onlabd3b64892015-01-20 13:26:24 -0800448 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800449 """
kelvin-onlabd3b64892015-01-20 13:26:24 -0800450 Writes the COMMIT number to the report to be parsed\
451 by Jenkins data collecter.
kelvin8ec71442015-01-15 16:57:00 -0800452 """
Jon Hall45ec0922014-10-10 19:33:49 -0400453 try:
kelvin8ec71442015-01-15 16:57:00 -0800454 self.handle.sendline( "" )
455 self.handle.expect( "\$" )
456 self.handle.sendline(
457 "cd " +
458 self.home +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800459 "; git log -1 --pretty=fuller --decorate=short | grep -A 6\
460 \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800461 # NOTE: for some reason there are backspaces inserted in this
462 # phrase when run from Jenkins on some tests
463 self.handle.expect( "never" )
464 self.handle.expect( "\$" )
465 response = ( self.name + ": \n" + str(
466 self.handle.before + self.handle.after ) )
467 self.handle.sendline( "cd " + self.home )
468 self.handle.expect( "\$" )
469 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400470 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500471 print line
472 if report:
kelvin8ec71442015-01-15 16:57:00 -0800473 for line in lines[ 2:-1 ]:
474 # Bracket replacement is for Wiki-compliant
475 # formatting. '<' or '>' are interpreted
476 # as xml specific tags that cause errors
477 line = line.replace( "<", "[" )
478 line = line.replace( ">", "]" )
479 main.log.report( "\t" + line )
480 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400481 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800482 main.log.error( self.name + ": EOF exception found" )
483 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400484 main.cleanup()
485 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800486 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800487 main.log.error( self.name + ": TIMEOUT exception found" )
488 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800489 main.cleanup()
490 main.exit()
Jon Hall45ec0922014-10-10 19:33:49 -0400491 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800492 main.log.info( self.name + ":" * 60 )
Jon Hall45ec0922014-10-10 19:33:49 -0400493 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800494 main.log.info( ":" * 80 )
Jon Hall45ec0922014-10-10 19:33:49 -0400495 main.cleanup()
496 main.exit()
497
kelvin-onlabd3b64892015-01-20 13:26:24 -0800498 def createCellFile( self, benchIp, fileName, mnIpAddrs,
499 extraFeatureString, *onosIpAddrs ):
kelvin8ec71442015-01-15 16:57:00 -0800500 """
andrewonlab94282092014-10-10 13:00:11 -0400501 Creates a cell file based on arguments
502 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800503 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400504 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800505 * File name of the cell file ( fileName )
506 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800507 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400508 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800509 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400510 - Must be passed in as last arguments
kelvin8ec71442015-01-15 16:57:00 -0800511
andrewonlab94282092014-10-10 13:00:11 -0400512 NOTE: Assumes cells are located at:
513 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800514 """
515 # Variable initialization
kelvin-onlabd3b64892015-01-20 13:26:24 -0800516 cellDirectory = self.home + "/tools/test/cells/"
kelvin8ec71442015-01-15 16:57:00 -0800517 # We want to create the cell file in the dependencies directory
518 # of TestON first, then copy over to ONOS bench
kelvin-onlabd3b64892015-01-20 13:26:24 -0800519 tempDirectory = "/tmp/"
kelvin8ec71442015-01-15 16:57:00 -0800520 # Create the cell file in the directory for writing ( w+ )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800521 cellFile = open( tempDirectory + fileName, 'w+' )
kelvin8ec71442015-01-15 16:57:00 -0800522
523 # Feature string is hardcoded environment variables
524 # That you may wish to use by default on startup.
525 # Note that you may not want certain features listed
526 # on here.
jenkinsbd0e7532015-02-10 14:32:54 -0800527 coreFeatureString = "export ONOS_FEATURES=" + extraFeatureString
kelvin-onlabd3b64892015-01-20 13:26:24 -0800528 mnString = "export OCN="
529 onosString = "export OC"
530 tempCount = 1
kelvin8ec71442015-01-15 16:57:00 -0800531
kelvin-onlabd3b64892015-01-20 13:26:24 -0800532 # Create ONOSNIC ip address prefix
533 tempOnosIp = onosIpAddrs[ 0 ]
534 tempList = []
535 tempList = tempOnosIp.split( "." )
kelvin8ec71442015-01-15 16:57:00 -0800536 # Omit last element of list to format for NIC
kelvin-onlabd3b64892015-01-20 13:26:24 -0800537 tempList = tempList[ :-1 ]
kelvin8ec71442015-01-15 16:57:00 -0800538 # Structure the nic string ip
kelvin-onlabd3b64892015-01-20 13:26:24 -0800539 nicAddr = ".".join( tempList ) + ".*"
540 onosNicString = "export ONOS_NIC=" + nicAddr
andrewonlab94282092014-10-10 13:00:11 -0400541
542 try:
kelvin8ec71442015-01-15 16:57:00 -0800543 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800544 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400545
kelvin-onlabd3b64892015-01-20 13:26:24 -0800546 for arg in onosIpAddrs:
547 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800548 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400549 # export OC1="10.128.20.11"
550 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800551 cellFile.write( onosString + str( tempCount ) +
552 "=" + "\"" + arg + "\"" + "\n" )
553 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800554
kelvin-onlabd3b64892015-01-20 13:26:24 -0800555 cellFile.write( mnString + "\"" + mnIpAddrs + "\"" + "\n" )
556 cellFile.write( coreFeatureString + "\n" )
557 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400558
kelvin8ec71442015-01-15 16:57:00 -0800559 # We use os.system to send the command to TestON cluster
560 # to account for the case in which TestON is not located
561 # on the same cluster as the ONOS bench
562 # Note that even if TestON is located on the same cluster
563 # as ONOS bench, you must setup passwordless ssh
564 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800565 os.system( "scp " + tempDirectory + fileName +
566 " admin@" + benchIp + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400567
andrewonlab2a6c9342014-10-16 13:40:15 -0400568 return main.TRUE
569
andrewonlab94282092014-10-10 13:00:11 -0400570 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800571 main.log.error( self.name + ": EOF exception found" )
572 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400573 main.cleanup()
574 main.exit()
575 except:
kelvin8ec71442015-01-15 16:57:00 -0800576 main.log.info( self.name + ":::::::::" )
andrewonlab94282092014-10-10 13:00:11 -0400577 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800578 main.log.info( ":::::::" )
andrewonlab94282092014-10-10 13:00:11 -0400579 main.cleanup()
580 main.exit()
581
kelvin-onlabd3b64892015-01-20 13:26:24 -0800582 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800583 """
andrewonlab95ca1462014-10-09 14:04:24 -0400584 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800585 """
andrewonlab95ca1462014-10-09 14:04:24 -0400586 try:
587 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800588 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400589 main.cleanup()
590 main.exit()
591 else:
kelvin8ec71442015-01-15 16:57:00 -0800592 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800593 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800594 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400595 # and that this driver will have to change accordingly
jenkinsbd0e7532015-02-10 14:32:54 -0800596 self.handle.expect( "ONOS_CELL" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800597 handleBefore = self.handle.before
598 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800599 # Get the rest of the handle
600 self.handle.sendline( "" )
601 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800602 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400603
kelvin-onlabd3b64892015-01-20 13:26:24 -0800604 main.log.info( "Cell call returned: " + handleBefore +
605 handleAfter + handleMore )
andrewonlab95ca1462014-10-09 14:04:24 -0400606
607 return main.TRUE
608
609 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800610 main.log.error( self.name + ": EOF exception found" )
611 main.log.error( self.name + ": " + self.handle.before )
andrewonlab95ca1462014-10-09 14:04:24 -0400612 main.cleanup()
613 main.exit()
614 except:
kelvin8ec71442015-01-15 16:57:00 -0800615 main.log.info( self.name + " ::::::" )
616 main.log.error( traceback.print_exc() )
617 main.log.info( self.name + " ::::::" )
andrewonlab95ca1462014-10-09 14:04:24 -0400618 main.cleanup()
619 main.exit()
620
kelvin-onlabd3b64892015-01-20 13:26:24 -0800621 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800622 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400623 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800624 """
625 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400626
andrewonlabc03bf6c2014-10-09 14:56:18 -0400627 try:
kelvin8ec71442015-01-15 16:57:00 -0800628 # Clean handle by sending empty and expecting $
629 self.handle.sendline( "" )
630 self.handle.expect( "\$" )
631 self.handle.sendline( "onos-verify-cell" )
632 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800633 handleBefore = self.handle.before
634 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800635 # Get the rest of the handle
636 self.handle.sendline( "" )
637 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800638 handleMore = self.handle.before
andrewonlabc03bf6c2014-10-09 14:56:18 -0400639
kelvin-onlabd3b64892015-01-20 13:26:24 -0800640 main.log.info( "Verify cell returned: " + handleBefore +
641 handleAfter + handleMore )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400642
643 return main.TRUE
Jon Hall7993bfc2014-10-09 16:30:14 -0400644 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800645 main.log.error( self.name + ": EOF exception found" )
646 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400647 main.cleanup()
648 main.exit()
649 except:
kelvin8ec71442015-01-15 16:57:00 -0800650 main.log.info( self.name + " ::::::" )
651 main.log.error( traceback.print_exc() )
652 main.log.info( self.name + " ::::::" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400653 main.cleanup()
654 main.exit()
655
kelvin-onlabd3b64892015-01-20 13:26:24 -0800656 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800657 """
andrewonlab05e362f2014-10-10 00:40:57 -0400658 Uses 'onos' command to send various ONOS CLI arguments.
659 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800660 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400661 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800662
663 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400664 CLI commands for ONOS. Try to use this function first
665 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800666 function.
667 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400668 by starting onos, and typing in 'onos' to enter the
669 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800670 available commands.
671 """
andrewonlab05e362f2014-10-10 00:40:57 -0400672 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800673 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800674 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400675 return main.FALSE
676 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800677 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400678 return main.FALSE
679
kelvin8ec71442015-01-15 16:57:00 -0800680 cmdstr = str( cmdstr )
681 self.handle.sendline( "" )
682 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400683
kelvin-onlabd3b64892015-01-20 13:26:24 -0800684 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800685 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400686
kelvin-onlabd3b64892015-01-20 13:26:24 -0800687 handleBefore = self.handle.before
Shreya Shaha73aaad2014-10-27 18:03:09 -0400688 print "handle_before = ", self.handle.before
kelvin-onlabd3b64892015-01-20 13:26:24 -0800689 # handleAfter = str( self.handle.after )
Jon Hall47a93fb2015-01-06 16:46:06 -0800690
kelvin8ec71442015-01-15 16:57:00 -0800691 # self.handle.sendline( "" )
692 # self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800693 # handleMore = str( self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400694
kelvin8ec71442015-01-15 16:57:00 -0800695 main.log.info( "Command sent successfully" )
andrewonlab05e362f2014-10-10 00:40:57 -0400696
kelvin8ec71442015-01-15 16:57:00 -0800697 # Obtain return handle that consists of result from
698 # the onos command. The string may need to be
699 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800700 # returnString = handleBefore + handleAfter
701 returnString = handleBefore
702 print "return_string = ", returnString
703 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400704
705 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800706 main.log.error( self.name + ": EOF exception found" )
707 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400708 main.cleanup()
709 main.exit()
710 except:
kelvin8ec71442015-01-15 16:57:00 -0800711 main.log.info( self.name + " ::::::" )
712 main.log.error( traceback.print_exc() )
713 main.log.info( self.name + " ::::::" )
andrewonlab05e362f2014-10-10 00:40:57 -0400714 main.cleanup()
715 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400716
kelvin-onlabd3b64892015-01-20 13:26:24 -0800717 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -0800718 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400719 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -0800720 If -f option is provided, it also forces an uninstall.
721 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -0400722 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -0800723 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -0400724 files to certain onos nodes
725
726 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -0800727 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400728 try:
andrewonlab114768a2014-11-14 12:44:44 -0500729 if options:
kelvin8ec71442015-01-15 16:57:00 -0800730 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -0500731 else:
kelvin8ec71442015-01-15 16:57:00 -0800732 self.handle.sendline( "onos-install " + node )
733 self.handle.expect( "onos-install " )
734 # NOTE: this timeout may need to change depending on the network
735 # and size of ONOS
736 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -0800737 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -0800738 "ONOS\sis\salready\sinstalled",
739 pexpect.TIMEOUT ], timeout=60 )
Jon Hall7993bfc2014-10-09 16:30:14 -0400740
Jon Hall7993bfc2014-10-09 16:30:14 -0400741 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800742 main.log.warn( "Network is unreachable" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400743 return main.FALSE
744 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800745 main.log.info(
746 "ONOS was installed on " +
747 node +
748 " and started" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400749 return main.TRUE
andrewonlabd9a73a72014-11-14 17:28:21 -0500750 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800751 main.log.info( "ONOS is already installed on " + node )
andrewonlabd9a73a72014-11-14 17:28:21 -0500752 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800753 elif i == 3:
754 main.log.info(
755 "Installation of ONOS on " +
756 node +
757 " timed out" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400758 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -0400759
760 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800761 main.log.error( self.name + ": EOF exception found" )
762 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400763 main.cleanup()
764 main.exit()
765 except:
kelvin8ec71442015-01-15 16:57:00 -0800766 main.log.info( self.name + " ::::::" )
767 main.log.error( traceback.print_exc() )
768 main.log.info( self.name + " ::::::" )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400769 main.cleanup()
770 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400771
kelvin-onlabd3b64892015-01-20 13:26:24 -0800772 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800773 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400774 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400775 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -0800776 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400777 try:
kelvin8ec71442015-01-15 16:57:00 -0800778 self.handle.sendline( "" )
779 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800780 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800781 " start" )
782 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -0400783 "Job\sis\salready\srunning",
784 "start/running",
785 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -0800786 pexpect.TIMEOUT ], timeout=120 )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400787
788 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800789 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400790 return main.TRUE
791 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800792 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400793 return main.TRUE
794 else:
kelvin8ec71442015-01-15 16:57:00 -0800795 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400796 main.cleanup()
797 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -0400798 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800799 main.log.error( self.name + ": EOF exception found" )
800 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400801 main.cleanup()
802 main.exit()
803 except:
kelvin8ec71442015-01-15 16:57:00 -0800804 main.log.info( self.name + " ::::::" )
805 main.log.error( traceback.print_exc() )
806 main.log.info( self.name + " ::::::" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400807 main.cleanup()
808 main.exit()
809
kelvin-onlabd3b64892015-01-20 13:26:24 -0800810 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800811 """
andrewonlab2b30bd32014-10-09 16:48:55 -0400812 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400813 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -0800814 """
andrewonlab2b30bd32014-10-09 16:48:55 -0400815 try:
kelvin8ec71442015-01-15 16:57:00 -0800816 self.handle.sendline( "" )
817 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800818 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800819 " stop" )
820 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -0400821 "stop/waiting",
822 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -0800823 pexpect.TIMEOUT ], timeout=60 )
andrewonlab2b30bd32014-10-09 16:48:55 -0400824
825 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800826 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400827 return main.TRUE
828 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800829 main.log.info( "Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800830 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -0400831 return main.FALSE
832 else:
kelvin8ec71442015-01-15 16:57:00 -0800833 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400834 return main.FALSE
835
836 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800837 main.log.error( self.name + ": EOF exception found" )
838 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -0400839 main.cleanup()
840 main.exit()
841 except:
kelvin8ec71442015-01-15 16:57:00 -0800842 main.log.info( self.name + " ::::::" )
843 main.log.error( traceback.print_exc() )
844 main.log.info( self.name + " ::::::" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400845 main.cleanup()
846 main.exit()
kelvin8ec71442015-01-15 16:57:00 -0800847
kelvin-onlabd3b64892015-01-20 13:26:24 -0800848 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -0800849 """
andrewonlabc8d47972014-10-09 16:52:36 -0400850 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -0800851 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -0400852 if needed
kelvin8ec71442015-01-15 16:57:00 -0800853 """
andrewonlabc8d47972014-10-09 16:52:36 -0400854 try:
kelvin8ec71442015-01-15 16:57:00 -0800855 self.handle.sendline( "" )
856 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800857 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -0800858 self.handle.expect( "\$" )
andrewonlabc8d47972014-10-09 16:52:36 -0400859
kelvin-onlabd3b64892015-01-20 13:26:24 -0800860 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
andrewonlab9dfd2082014-11-13 17:44:03 -0500861
kelvin8ec71442015-01-15 16:57:00 -0800862 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -0400863 return main.TRUE
864
865 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800866 main.log.error( self.name + ": EOF exception found" )
867 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -0400868 main.cleanup()
869 main.exit()
870 except:
kelvin8ec71442015-01-15 16:57:00 -0800871 main.log.info( self.name + " ::::::" )
872 main.log.error( traceback.print_exc() )
873 main.log.info( self.name + " ::::::" )
andrewonlabc8d47972014-10-09 16:52:36 -0400874 main.cleanup()
875 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -0400876
kelvin-onlabd3b64892015-01-20 13:26:24 -0800877 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800878 """
andrewonlabaedc8332014-12-04 12:43:03 -0500879 Issues the command 'onos-die <node-ip>'
880 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -0800881 """
andrewonlabaedc8332014-12-04 12:43:03 -0500882 try:
kelvin8ec71442015-01-15 16:57:00 -0800883 self.handle.sendline( "" )
884 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800885 cmdStr = "onos-kill " + str( nodeIp )
886 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -0800887 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -0500888 "Killing\sONOS",
889 "ONOS\sprocess\sis\snot\srunning",
kelvin8ec71442015-01-15 16:57:00 -0800890 pexpect.TIMEOUT ], timeout=20 )
andrewonlabaedc8332014-12-04 12:43:03 -0500891 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800892 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800893 " was killed and stopped" )
andrewonlabaedc8332014-12-04 12:43:03 -0500894 return main.TRUE
895 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800896 main.log.info( "ONOS process was not running" )
andrewonlabaedc8332014-12-04 12:43:03 -0500897 return main.FALSE
898 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800899 main.log.error( self.name + ": EOF exception found" )
900 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -0500901 main.cleanup()
902 main.exit()
903 except:
kelvin8ec71442015-01-15 16:57:00 -0800904 main.log.info( self.name + " ::::::" )
905 main.log.error( traceback.print_exc() )
906 main.log.info( self.name + " ::::::" )
andrewonlabaedc8332014-12-04 12:43:03 -0500907 main.cleanup()
908 main.exit()
909
kelvin-onlabd3b64892015-01-20 13:26:24 -0800910 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800911 """
andrewonlabe8e56fd2014-10-09 17:12:44 -0400912 Calls the command: 'onos-kill [<node-ip>]'
913 "Remotely, and unceremoniously kills the ONOS instance running on
914 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -0800915 """
andrewonlabe8e56fd2014-10-09 17:12:44 -0400916 try:
kelvin8ec71442015-01-15 16:57:00 -0800917 self.handle.sendline( "" )
918 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800919 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -0800920 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -0400921 "\$",
922 "No\sroute\sto\shost",
923 "password:",
kelvin8ec71442015-01-15 16:57:00 -0800924 pexpect.TIMEOUT ], timeout=20 )
925
andrewonlabe8e56fd2014-10-09 17:12:44 -0400926 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800927 main.log.info(
928 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -0800929 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400930 return main.TRUE
931 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800932 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400933 return main.FALSE
934 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800935 main.log.info(
936 "Passwordless login for host: " +
937 str( nodeIp ) +
938 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400939 return main.FALSE
940 else:
kelvin8ec71442015-01-15 16:57:00 -0800941 main.log.info( "ONOS instasnce was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400942 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -0800943
andrewonlabe8e56fd2014-10-09 17:12:44 -0400944 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800945 main.log.error( self.name + ": EOF exception found" )
946 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400947 main.cleanup()
948 main.exit()
949 except:
kelvin8ec71442015-01-15 16:57:00 -0800950 main.log.info( self.name + " ::::::" )
951 main.log.error( traceback.print_exc() )
952 main.log.info( self.name + " ::::::" )
andrewonlabe8e56fd2014-10-09 17:12:44 -0400953 main.cleanup()
954 main.exit()
955
kelvin-onlabd3b64892015-01-20 13:26:24 -0800956 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -0800957 """
andrewonlab19fbdca2014-11-14 12:55:59 -0500958 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -0500959 a cleaner environment.
960
andrewonlab19fbdca2014-11-14 12:55:59 -0500961 Description:
Jon Hallfcc88622014-11-25 13:09:54 -0500962 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -0500963 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -0800964 """
andrewonlab19fbdca2014-11-14 12:55:59 -0500965 try:
kelvin8ec71442015-01-15 16:57:00 -0800966 self.handle.sendline( "" )
967 self.handle.expect( "\$" )
968 self.handle.sendline( "onos-remove-raft-logs" )
969 # Sometimes this command hangs
970 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
971 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -0500972 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800973 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
974 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -0500975 if i == 1:
976 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -0800977 self.handle.sendline( "" )
978 self.handle.expect( "\$" )
andrewonlab19fbdca2014-11-14 12:55:59 -0500979 return main.TRUE
980
981 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800982 main.log.error( self.name + ": EOF exception found" )
983 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -0500984 main.cleanup()
985 main.exit()
986 except:
kelvin8ec71442015-01-15 16:57:00 -0800987 main.log.info( self.name + " ::::::" )
988 main.log.error( traceback.print_exc() )
989 main.log.info( self.name + " ::::::" )
andrewonlab19fbdca2014-11-14 12:55:59 -0500990 main.cleanup()
991 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -0500992
kelvin-onlabd3b64892015-01-20 13:26:24 -0800993 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -0800994 """
995 Calls the command 'onos-start-network [ <mininet-topo> ]
996 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -0400997 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -0800998 cell."
andrewonlab94282092014-10-10 13:00:11 -0400999 * Specify mininet topology file name for mntopo
1000 * Topo files should be placed at:
1001 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001002
andrewonlab94282092014-10-10 13:00:11 -04001003 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001004 """
andrewonlab94282092014-10-10 13:00:11 -04001005 try:
1006 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001007 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001008 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001009
kelvin8ec71442015-01-15 16:57:00 -08001010 mntopo = str( mntopo )
1011 self.handle.sendline( "" )
1012 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001013
kelvin8ec71442015-01-15 16:57:00 -08001014 self.handle.sendline( "onos-start-network " + mntopo )
1015 self.handle.expect( "mininet>" )
1016 main.log.info( "Network started, entered mininet prompt" )
1017
1018 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001019
1020 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001021 main.log.error( self.name + ": EOF exception found" )
1022 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001023 main.cleanup()
1024 main.exit()
1025 except:
kelvin8ec71442015-01-15 16:57:00 -08001026 main.log.info( self.name + " ::::::" )
1027 main.log.error( traceback.print_exc() )
1028 main.log.info( self.name + " ::::::" )
andrewonlab94282092014-10-10 13:00:11 -04001029 main.cleanup()
1030 main.exit()
1031
kelvin8ec71442015-01-15 16:57:00 -08001032 def isup( self, node="" ):
1033 """
1034 Run's onos-wait-for-start which only returns once ONOS is at run
1035 level 100( ready for use )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001036
Jon Hall7993bfc2014-10-09 16:30:14 -04001037 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001038 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001039 try:
kelvin8ec71442015-01-15 16:57:00 -08001040 self.handle.sendline( "onos-wait-for-start " + node )
1041 self.handle.expect( "onos-wait-for-start" )
1042 # NOTE: this timeout is arbitrary"
1043 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ], timeout=120 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001044 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001045 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001046 return main.TRUE
1047 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001048 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001049 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001050 main.log.error( "ONOS has not started yet" )
1051 self.handle.send( "\x03" ) # Control-C
1052 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001053 return main.FALSE
1054 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001055 main.log.error( self.name + ": EOF exception found" )
1056 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001057 main.cleanup()
1058 main.exit()
1059 except:
kelvin8ec71442015-01-15 16:57:00 -08001060 main.log.info( self.name + " ::::::" )
1061 main.log.error( traceback.print_exc() )
1062 main.log.info( self.name + " ::::::" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001063 main.cleanup()
1064 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001065
kelvin-onlabd3b64892015-01-20 13:26:24 -08001066 def pushTestIntentsShell(
1067 self,
1068 dpidSrc,
1069 dpidDst,
1070 numIntents,
1071 dirFile,
1072 onosIp,
1073 numMult="",
1074 appId="",
1075 report=True,
1076 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001077 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001078 Description:
kelvin8ec71442015-01-15 16:57:00 -08001079 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001080 better parallelize the results than the CLI
1081 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001082 * dpidSrc: specify source dpid
1083 * dpidDst: specify destination dpid
1084 * numIntents: specify number of intents to push
1085 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001086 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001087 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001088 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001089 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001090 """
1091 try:
1092 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001093 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001094 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001095 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001096 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001097 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001098
kelvin-onlabd3b64892015-01-20 13:26:24 -08001099 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1100 if not numMult:
1101 addIntents = addDpid + " " + str( numIntents )
1102 elif numMult:
1103 addIntents = addDpid + " " + str( numIntents ) + " " +\
1104 str( numMult )
1105 if appId:
1106 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001107 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001108 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001109
andrewonlabaedc8332014-12-04 12:43:03 -05001110 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001111 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001112 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001113 sendCmd = addApp + " &"
1114 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001115
kelvin-onlabd3b64892015-01-20 13:26:24 -08001116 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001117
1118 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001119 main.log.error( self.name + ": EOF exception found" )
1120 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001121 main.cleanup()
1122 main.exit()
1123 except:
kelvin8ec71442015-01-15 16:57:00 -08001124 main.log.info( self.name + " ::::::" )
1125 main.log.error( traceback.print_exc() )
1126 main.log.info( self.name + " ::::::" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001127 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001128 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001129
kelvin-onlabd3b64892015-01-20 13:26:24 -08001130 def getTopology( self, topologyOutput ):
kelvin8ec71442015-01-15 16:57:00 -08001131 """
Jon Hall77f53ce2014-10-13 18:02:06 -04001132 parses the onos:topology output
kelvin8ec71442015-01-15 16:57:00 -08001133 Returns: a topology dict populated by the key values found in
Jon Hall77f53ce2014-10-13 18:02:06 -04001134 the cli command.
kelvin8ec71442015-01-15 16:57:00 -08001135 """
Jon Hall77f53ce2014-10-13 18:02:06 -04001136 try:
kelvin8ec71442015-01-15 16:57:00 -08001137 # call the cli to get the topology summary
1138 # cmdstr = "onos:topology"
kelvin-onlabd3b64892015-01-20 13:26:24 -08001139 # cliResult = self.onosCli( ip, cmdstr )
1140 # print "cli_result = ", cliResult
Jon Hall77f53ce2014-10-13 18:02:06 -04001141
kelvin8ec71442015-01-15 16:57:00 -08001142 # Parse the output
Jon Hall77f53ce2014-10-13 18:02:06 -04001143 topology = {}
kelvin-onlabd3b64892015-01-20 13:26:24 -08001144 # for line in cliResult.split( "\n" ):
1145 for line in topologyOutput.splitlines():
kelvin8ec71442015-01-15 16:57:00 -08001146 if not line.startswith( "time=" ):
Jon Hall77f53ce2014-10-13 18:02:06 -04001147 continue
kelvin8ec71442015-01-15 16:57:00 -08001148 # else
1149 # print line
1150 for var in line.split( "," ):
1151 # print "'"+var+"'"
1152 # print "'"+var.strip()+"'"
1153 key, value = var.strip().split( "=" )
1154 topology[ key ] = value
1155 # print "topology = ", topology
1156 # devices = topology.get( 'devices', False )
1157 # print "devices = ", devices
1158 # links = topology.get( 'links', False )
1159 # print "links = ", links
1160 # SCCs = topology.get( 'SCC(s)', False )
1161 # print "SCCs = ", SCCs
1162 # paths = topology.get( 'paths', False )
1163 # print "paths = ", paths
Jon Hall77f53ce2014-10-13 18:02:06 -04001164
1165 return topology
1166 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001167 main.log.error( self.name + ": EOF exception found" )
1168 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001169 main.cleanup()
1170 main.exit()
1171 except:
kelvin8ec71442015-01-15 16:57:00 -08001172 main.log.info( self.name + " ::::::" )
1173 main.log.error( traceback.print_exc() )
1174 main.log.info( self.name + " ::::::" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001175 main.cleanup()
1176 main.exit()
1177
kelvin-onlabd3b64892015-01-20 13:26:24 -08001178 def checkStatus(
1179 self,
1180 topologyResult,
1181 numoswitch,
1182 numolink,
1183 logLevel="info" ):
kelvin8ec71442015-01-15 16:57:00 -08001184 """
1185 Checks the number of swithes & links that ONOS sees against the
1186 supplied values. By default this will report to main.log, but the
Jon Hall77f53ce2014-10-13 18:02:06 -04001187 log level can be specifid.
kelvin8ec71442015-01-15 16:57:00 -08001188
Jon Hall77f53ce2014-10-13 18:02:06 -04001189 Params: ip = ip used for the onos cli
1190 numoswitch = expected number of switches
1191 numlink = expected number of links
kelvin-onlabd3b64892015-01-20 13:26:24 -08001192 logLevel = level to log to.
1193 Currently accepts 'info', 'warn' and 'report'
Jon Hall77f53ce2014-10-13 18:02:06 -04001194
1195
kelvin-onlabd3b64892015-01-20 13:26:24 -08001196 logLevel can
Jon Hall77f53ce2014-10-13 18:02:06 -04001197
kelvin8ec71442015-01-15 16:57:00 -08001198 Returns: main.TRUE if the number of switchs and links are correct,
Jon Hall77f53ce2014-10-13 18:02:06 -04001199 main.FALSE if the numer of switches and links is incorrect,
1200 and main.ERROR otherwise
kelvin8ec71442015-01-15 16:57:00 -08001201 """
Jon Hall77f53ce2014-10-13 18:02:06 -04001202 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001203 topology = self.getTopology( topologyResult )
Jon Hall77f53ce2014-10-13 18:02:06 -04001204 if topology == {}:
1205 return main.ERROR
1206 output = ""
kelvin8ec71442015-01-15 16:57:00 -08001207 # Is the number of switches is what we expected
1208 devices = topology.get( 'devices', False )
1209 links = topology.get( 'links', False )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001210 if not devices or not links:
Jon Hall77f53ce2014-10-13 18:02:06 -04001211 return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -08001212 switchCheck = ( int( devices ) == int( numoswitch ) )
kelvin8ec71442015-01-15 16:57:00 -08001213 # Is the number of links is what we expected
kelvin-onlabd3b64892015-01-20 13:26:24 -08001214 linkCheck = ( int( links ) == int( numolink ) )
1215 if ( switchCheck and linkCheck ):
kelvin8ec71442015-01-15 16:57:00 -08001216 # We expected the correct numbers
Jon Hall77f53ce2014-10-13 18:02:06 -04001217 output = output + "The number of links and switches match "\
kelvin8ec71442015-01-15 16:57:00 -08001218 + "what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001219 result = main.TRUE
1220 else:
1221 output = output + \
kelvin-onlabd3b64892015-01-20 13:26:24 -08001222 "The number of links and switches does not match\
1223 what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001224 result = main.FALSE
kelvin-onlabd3b64892015-01-20 13:26:24 -08001225 output = output + "\n ONOS sees %i devices (%i expected)\
1226 and %i links (%i expected)" %\
1227 ( int( devices ), int( numoswitch ),
1228 int( links ), int( numolink ) )
1229 if logLevel == "report":
kelvin8ec71442015-01-15 16:57:00 -08001230 main.log.report( output )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001231 elif logLevel == "warn":
kelvin8ec71442015-01-15 16:57:00 -08001232 main.log.warn( output )
Jon Hall77f53ce2014-10-13 18:02:06 -04001233 else:
kelvin8ec71442015-01-15 16:57:00 -08001234 main.log.info( output )
1235 return result
Jon Hall77f53ce2014-10-13 18:02:06 -04001236 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001237 main.log.error( self.name + ": EOF exception found" )
1238 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001239 main.cleanup()
1240 main.exit()
1241 except:
kelvin8ec71442015-01-15 16:57:00 -08001242 main.log.info( self.name + " ::::::" )
1243 main.log.error( traceback.print_exc() )
1244 main.log.info( self.name + " ::::::" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001245 main.cleanup()
1246 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001247
kelvin-onlabd3b64892015-01-20 13:26:24 -08001248 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001249 """
andrewonlab970399c2014-11-07 13:09:32 -05001250 Capture all packet activity and store in specified
1251 directory/file
1252
1253 Required:
1254 * interface: interface to capture
1255 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001256 """
1257 self.handle.sendline( "" )
1258 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001259
kelvin8ec71442015-01-15 16:57:00 -08001260 self.handle.sendline( "tshark -i " + str( interface ) +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001261 " -t e -w " + str( dirFile ) + " &" )
kelvin8ec71442015-01-15 16:57:00 -08001262 self.handle.sendline( "\r" )
1263 self.handle.expect( "Capturing on" )
1264 self.handle.sendline( "\r" )
1265 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001266
kelvin8ec71442015-01-15 16:57:00 -08001267 main.log.info( "Tshark started capturing files on " +
1268 str( interface ) + " and saving to directory: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001269 str( dirFile ) )
Shreya Shaha73aaad2014-10-27 18:03:09 -04001270
kelvin-onlabd3b64892015-01-20 13:26:24 -08001271 def runOnosTopoCfg( self, instanceName, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001272 """
kelvin-onlabd3b64892015-01-20 13:26:24 -08001273 On ONOS bench, run this command:
1274 ./~/ONOS/tools/test/bin/onos-topo-cfg $OC1 filename
1275 which starts the rest and copies
1276 the json file to the onos instance
kelvin8ec71442015-01-15 16:57:00 -08001277 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001278 try:
kelvin8ec71442015-01-15 16:57:00 -08001279 self.handle.sendline( "" )
1280 self.handle.expect( "\$" )
1281 self.handle.sendline( "cd ~/ONOS/tools/test/bin" )
1282 self.handle.expect( "/bin$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001283 cmd = "./onos-topo-cfg " + instanceName + " " + jsonFile
shahshreyae6c7cf42014-11-26 16:39:01 -08001284 print "cmd = ", cmd
kelvin8ec71442015-01-15 16:57:00 -08001285 self.handle.sendline( cmd )
1286 self.handle.expect( "\$" )
1287 self.handle.sendline( "cd ~" )
1288 self.handle.expect( "\$" )
shahshreyae6c7cf42014-11-26 16:39:01 -08001289 return main.TRUE
1290 except:
1291 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001292
kelvin-onlabd3b64892015-01-20 13:26:24 -08001293 def tsharkGrep( self, grep, directory, interface='eth0' ):
kelvin8ec71442015-01-15 16:57:00 -08001294 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001295 Required:
kelvin8ec71442015-01-15 16:57:00 -08001296 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001297 * directory to store results
1298 Optional:
1299 * interface - default: eth0
1300 Description:
1301 Uses tshark command to grep specific group of packets
1302 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001303 The timestamp is hardcoded to be in epoch
1304 """
1305 self.handle.sendline( "" )
1306 self.handle.expect( "\$" )
1307 self.handle.sendline( "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001308 self.handle.sendline(
1309 "tshark -i " +
1310 str( interface ) +
1311 " -t e | grep --line-buffered \"" +
1312 str(grep) +
1313 "\" >" +
1314 directory +
1315 " &" )
kelvin8ec71442015-01-15 16:57:00 -08001316 self.handle.sendline( "\r" )
1317 self.handle.expect( "Capturing on" )
1318 self.handle.sendline( "\r" )
1319 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001320
kelvin-onlabd3b64892015-01-20 13:26:24 -08001321 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001322 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001323 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001324 """
1325 # Remove all pcap from previous captures
1326 self.execute( cmd="sudo rm /tmp/wireshark*" )
1327 self.handle.sendline( "" )
1328 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\" |" +
1329 " grep -v grep | awk '{print $2}'`" )
1330 self.handle.sendline( "" )
1331 main.log.info( "Tshark stopped" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001332
kelvin8ec71442015-01-15 16:57:00 -08001333 def ptpd( self, args ):
1334 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001335 Initiate ptp with user-specified args.
1336 Required:
1337 * args: specify string of args after command
1338 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001339 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001340 try:
kelvin8ec71442015-01-15 16:57:00 -08001341 self.handle.sendline( "sudo ptpd " + str( args ) )
1342 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001343 "Multiple",
1344 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001345 "\$" ] )
1346 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001347
andrewonlab0c38a4a2014-10-28 18:35:35 -04001348 if i == 0:
1349 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001350 main.log.info( "ptpd returned an error: " +
1351 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001352 return handle
1353 elif i == 1:
1354 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001355 main.log.error( "ptpd returned an error: " +
1356 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001357 return handle
1358 else:
1359 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001360
andrewonlab0c38a4a2014-10-28 18:35:35 -04001361 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001362 main.log.error( self.name + ": EOF exception found" )
1363 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001364 main.cleanup()
1365 main.exit()
1366 except:
kelvin8ec71442015-01-15 16:57:00 -08001367 main.log.info( self.name + " ::::::" )
1368 main.log.error( traceback.print_exc() )
1369 main.log.info( self.name + " ::::::" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001370 main.cleanup()
1371 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001372
kelvin-onlabd3b64892015-01-20 13:26:24 -08001373 def cpLogsToDir( self, logToCopy,
1374 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001375 """
1376 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001377 Current implementation of ONOS deletes its karaf
1378 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001379 you may want to use this function to capture
1380 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001381 Localtime will be attached to the filename
1382
1383 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001384 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001385 copy.
kelvin8ec71442015-01-15 16:57:00 -08001386 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001387 For copying multiple files, leave copyFileName
1388 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001389 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001390 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001391 ex ) /tmp/
1392 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001393 * copyFileName: If you want to rename the log
1394 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001395 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001396 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001397 try:
kelvin8ec71442015-01-15 16:57:00 -08001398 localtime = time.strftime( '%x %X' )
1399 localtime = localtime.replace( "/", "" )
1400 localtime = localtime.replace( " ", "_" )
1401 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001402 if destDir[ -1: ] != "/":
1403 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001404
kelvin-onlabd3b64892015-01-20 13:26:24 -08001405 if copyFileName:
1406 self.handle.sendline(
1407 "cp " +
1408 str( logToCopy ) +
1409 " " +
1410 str( destDir ) +
1411 str( copyFileName ) +
1412 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001413 self.handle.expect( "cp" )
1414 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001415 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001416 self.handle.sendline( "cp " + str( logToCopy ) +
1417 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001418 self.handle.expect( "cp" )
1419 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001420
kelvin8ec71442015-01-15 16:57:00 -08001421 return self.handle.before
1422
1423 except pexpect.EOF:
1424 main.log.error( "Copying files failed" )
1425 main.log.error( self.name + ": EOF exception found" )
1426 main.log.error( self.name + ": " + self.handle.before )
1427 except:
1428 main.log.error( "Copying files failed" )
1429 main.log.info( self.name + " ::::::" )
1430 main.log.error( traceback.print_exc() )
1431 main.log.info( self.name + " ::::::" )
1432
kelvin-onlabd3b64892015-01-20 13:26:24 -08001433 def checkLogs( self, onosIp ):
kelvin8ec71442015-01-15 16:57:00 -08001434 """
Jon Hall94fd0472014-12-08 11:52:42 -08001435 runs onos-check-logs on the given onos node
1436 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001437 """
Jon Hall94fd0472014-12-08 11:52:42 -08001438 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001439 cmd = "onos-check-logs " + str( onosIp )
kelvin8ec71442015-01-15 16:57:00 -08001440 self.handle.sendline( cmd )
1441 self.handle.expect( cmd )
1442 self.handle.expect( "\$" )
Jon Hall94fd0472014-12-08 11:52:42 -08001443 response = self.handle.before
1444 return response
1445 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001446 main.log.error( "Lost ssh connection" )
1447 main.log.error( self.name + ": EOF exception found" )
1448 main.log.error( self.name + ": " + self.handle.before )
Jon Hall94fd0472014-12-08 11:52:42 -08001449 except:
kelvin8ec71442015-01-15 16:57:00 -08001450 main.log.error( "Some error in check_logs:" )
1451 main.log.info( self.name + " ::::::" )
1452 main.log.error( traceback.print_exc() )
1453 main.log.info( self.name + " ::::::" )
Jon Hall94fd0472014-12-08 11:52:42 -08001454
kelvin-onlabd3b64892015-01-20 13:26:24 -08001455 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001456 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001457 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001458 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001459 try:
kelvin8ec71442015-01-15 16:57:00 -08001460 self.handle.sendline( "" )
1461 self.handle.expect( "\$" )
1462 self.handle.sendline( "onos-service " + str( node ) +
1463 " status" )
1464 i = self.handle.expect( [
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001465 "start/running",
1466 "stop/waiting",
kelvin8ec71442015-01-15 16:57:00 -08001467 pexpect.TIMEOUT ], timeout=120 )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001468
1469 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001470 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001471 return main.TRUE
1472 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001473 main.log.info( "ONOS is stopped" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001474 return main.FALSE
1475 else:
kelvin8ec71442015-01-15 16:57:00 -08001476 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001477 main.cleanup()
1478 main.exit()
1479 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001480 main.log.error( self.name + ": EOF exception found" )
1481 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001482 main.cleanup()
1483 main.exit()
1484 except:
kelvin8ec71442015-01-15 16:57:00 -08001485 main.log.info( self.name + " ::::::" )
1486 main.log.error( traceback.print_exc() )
1487 main.log.info( self.name + " ::::::" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001488 main.cleanup()
1489 main.exit()