blob: 42c15ad829a5e7f4bb92b0b003fa1ab760d30c8a [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 ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070043 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040044 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
48
kelvin8ec71442015-01-15 16:57:00 -080049 self.name = self.options[ 'name' ]
50 self.handle = super( OnosDriver, self ).connect(
kelvin-onlabd3b64892015-01-20 13:26:24 -080051 userName=self.userName,
52 ipAddress=self.ipAddress,
53 port=self.port,
54 pwd=self.pwd,
55 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -040056
kelvin8ec71442015-01-15 16:57:00 -080057 self.handle.sendline( "cd " + self.home )
58 self.handle.expect( "\$" )
Jon Hall05b2b432014-10-08 19:53:25 -040059 if self.handle:
60 return self.handle
kelvin8ec71442015-01-15 16:57:00 -080061 else:
62 main.log.info( "NO ONOS HANDLE" )
Jon Hall05b2b432014-10-08 19:53:25 -040063 return main.FALSE
64 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080065 main.log.error( self.name + ": EOF exception found" )
66 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -040067 main.cleanup()
68 main.exit()
69 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -080070 main.log.info( self.name + ":" * 30 )
kelvin-onlab64b33712015-01-21 15:26:15 -080071 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -080072 main.log.info( ":" * 30 )
Jon Hall05b2b432014-10-08 19:53:25 -040073 main.cleanup()
74 main.exit()
75
kelvin8ec71442015-01-15 16:57:00 -080076 def disconnect( self ):
77 """
Jon Hall05b2b432014-10-08 19:53:25 -040078 Called when Test is complete to disconnect the ONOS handle.
kelvin8ec71442015-01-15 16:57:00 -080079 """
Jon Hall05b2b432014-10-08 19:53:25 -040080 response = ''
81 try:
kelvin8ec71442015-01-15 16:57:00 -080082 self.handle.sendline( "" )
83 self.handle.expect( "\$" )
84 self.handle.sendline( "exit" )
85 self.handle.expect( "closed" )
Jon Hall05b2b432014-10-08 19:53:25 -040086 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080087 main.log.error( self.name + ": EOF exception found" )
88 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -040089 except:
kelvin8ec71442015-01-15 16:57:00 -080090 main.log.error( self.name + ": Connection failed to the host" )
Jon Hall05b2b432014-10-08 19:53:25 -040091 response = main.FALSE
92 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040093
kelvin-onlabd3b64892015-01-20 13:26:24 -080094 def onosPackage( self ):
kelvin8ec71442015-01-15 16:57:00 -080095 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040096 Produce a self-contained tar.gz file that can be deployed
kelvin8ec71442015-01-15 16:57:00 -080097 and executed on any platform with Java 7 JRE.
98 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -040099 try:
kelvin8ec71442015-01-15 16:57:00 -0800100 self.handle.sendline( "onos-package" )
101 self.handle.expect( "onos-package" )
102 self.handle.expect( "tar.gz", timeout=30 )
103 handle = str( self.handle.before )
104 main.log.info( "onos-package command returned: " +
105 handle )
106 # As long as the sendline does not time out,
107 # return true. However, be careful to interpret
108 # the results of the onos-package command return
andrewonlab0748d2a2014-10-09 13:24:17 -0400109 return main.TRUE
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400110
andrewonlab7735d852014-10-09 13:02:47 -0400111 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800112 main.log.error( self.name + ": EOF exception found" )
113 main.log.error( self.name + ": " + self.handle.before )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400114 except:
kelvin8ec71442015-01-15 16:57:00 -0800115 main.log.error( "Failed to package ONOS" )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400116 main.cleanup()
117 main.exit()
118
kelvin-onlabd3b64892015-01-20 13:26:24 -0800119 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800120 """
andrewonlab8790abb2014-11-06 13:51:54 -0500121 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800122 """
andrewonlab8790abb2014-11-06 13:51:54 -0500123 try:
kelvin8ec71442015-01-15 16:57:00 -0800124 self.handle.sendline( "onos-build" )
125 self.handle.expect( "onos-build" )
126 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800127 "BUILD SUCCESS",
128 "ERROR",
129 "BUILD FAILED" ],
130 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800131 handle = str( self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500132
kelvin8ec71442015-01-15 16:57:00 -0800133 main.log.info( "onos-build command returned: " +
134 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500135
136 if i == 0:
137 return main.TRUE
138 else:
139 return handle
140
141 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800142 main.log.error( self.name + ": EOF exception found" )
143 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500144 except:
kelvin8ec71442015-01-15 16:57:00 -0800145 main.log.error( "Failed to build ONOS" )
andrewonlab8790abb2014-11-06 13:51:54 -0500146 main.cleanup()
147 main.exit()
148
kelvin-onlabd3b64892015-01-20 13:26:24 -0800149 def cleanInstall( self ):
kelvin8ec71442015-01-15 16:57:00 -0800150 """
151 Runs mvn clean install in the root of the ONOS directory.
152 This will clean all ONOS artifacts then compile each module
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400153
kelvin8ec71442015-01-15 16:57:00 -0800154 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400155 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800156 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400157 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800158 main.log.info( "Running 'mvn clean install' on " +
159 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800160 ". This may take some time." )
161 self.handle.sendline( "cd " + self.home )
162 self.handle.expect( "\$" )
Jon Hallea7818b2014-10-09 14:30:59 -0400163
kelvin8ec71442015-01-15 16:57:00 -0800164 self.handle.sendline( "" )
165 self.handle.expect( "\$" )
166 self.handle.sendline( "mvn clean install" )
167 self.handle.expect( "mvn clean install" )
168 while True:
169 i = self.handle.expect( [
Jon Hallde9d9aa2014-10-08 20:36:02 -0400170 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s\
171 Runtime\sEnvironment\sto\scontinue',
172 'BUILD\sFAILURE',
173 'BUILD\sSUCCESS',
174 'ONOS\$',
kelvin8ec71442015-01-15 16:57:00 -0800175 pexpect.TIMEOUT ], timeout=600 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400176 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800177 main.log.error( self.name + ":There is insufficient memory \
178 for the Java Runtime Environment to continue." )
179 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400180 main.cleanup()
181 main.exit()
182 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800183 main.log.error( self.name + ": Build failure!" )
184 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400185 main.cleanup()
186 main.exit()
187 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800188 main.log.info( self.name + ": Build success!" )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400189 elif i == 3:
kelvin8ec71442015-01-15 16:57:00 -0800190 main.log.info( self.name + ": Build complete" )
191 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400192 for line in self.handle.before.splitlines():
193 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800194 main.log.info( line )
195 self.handle.sendline( "" )
196 self.handle.expect( "\$", timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400197 return main.TRUE
198 elif i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800199 main.log.error(
200 self.name +
201 ": mvn clean install TIMEOUT!" )
202 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400203 main.cleanup()
204 main.exit()
205 else:
kelvin8ec71442015-01-15 16:57:00 -0800206 main.log.error( self.name + ": unexpected response from \
207 mvn clean install" )
208 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400209 main.cleanup()
210 main.exit()
211 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800212 main.log.error( self.name + ": EOF exception found" )
213 main.log.error( self.name + ": " + self.handle.before )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400214 main.cleanup()
215 main.exit()
216 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800217 main.log.info( self.name + ":" * 60 )
kelvin-onlab64b33712015-01-21 15:26:15 -0800218 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800219 main.log.info( ":" * 60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400220 main.cleanup()
221 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400222
kelvin-onlabd3b64892015-01-20 13:26:24 -0800223 def gitPull( self, comp1="" ):
kelvin8ec71442015-01-15 16:57:00 -0800224 """
Jon Hallacabffd2014-10-09 12:36:53 -0400225 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800226
Jon Hallacabffd2014-10-09 12:36:53 -0400227 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800228 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400229 for the purpose of pulling from other nodes if necessary.
230
Jon Hall47a93fb2015-01-06 16:46:06 -0800231 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400232 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800233 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400234 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400235
kelvin8ec71442015-01-15 16:57:00 -0800236 """
Jon Hallacabffd2014-10-09 12:36:53 -0400237 try:
kelvin8ec71442015-01-15 16:57:00 -0800238 # main.log.info( self.name + ": Stopping ONOS" )
239 # self.stop()
240 self.handle.sendline( "cd " + self.home )
241 self.handle.expect( "ONOS\$" )
242 if comp1 == "":
243 self.handle.sendline( "git pull" )
Jon Hallacabffd2014-10-09 12:36:53 -0400244 else:
kelvin8ec71442015-01-15 16:57:00 -0800245 self.handle.sendline( "git pull " + comp1 )
Jon Hall47a93fb2015-01-06 16:46:06 -0800246
kelvin-onlabd3b64892015-01-20 13:26:24 -0800247 i = self.handle.expect(
248 [
249 '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\
256 \sbranch\syou',
257 'Pull\sis\snot\spossible\sbecause\syou\shave\sunmerged\
258 \sfiles',
259 pexpect.TIMEOUT ],
260 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800261 # debug
kelvin-onlabd3b64892015-01-20 13:26:24 -0800262 # main.log.report( self.name +": DEBUG: \n"+
263 # "git pull response: " +
264 # str( self.handle.before ) + str( self.handle.after ) )
kelvin8ec71442015-01-15 16:57:00 -0800265 if i == 0:
266 main.log.error( self.name + ": Git pull had some issue..." )
Jon Hallacabffd2014-10-09 12:36:53 -0400267 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800268 elif i == 1:
269 main.log.error(
270 self.name +
271 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400272 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800273 elif i == 2:
274 main.log.info(
275 self.name +
276 ": Git Pull - pulling repository now" )
277 self.handle.expect( "ONOS\$", 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800278 # So that only when git pull is done, we do mvn clean compile
279 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800280 elif i == 3:
281 main.log.info( self.name + ": Git Pull - Already up to date" )
Jon Hall47a93fb2015-01-06 16:46:06 -0800282 return i
kelvin8ec71442015-01-15 16:57:00 -0800283 elif i == 4:
284 main.log.info(
285 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800286 ": Git Pull - Aborting...\
287 Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400288 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800289 elif i == 5:
290 main.log.info(
291 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800292 ": Git Pull - You are not currently\
293 on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400294 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800295 elif i == 6:
296 main.log.info(
297 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800298 ": Git Pull - You have not configured\
299 an upstream branch to pull from\
300 . Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400301 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800302 elif i == 7:
303 main.log.info(
304 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800305 ": Git Pull - Pull is not possible\
306 because you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400307 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800308 elif i == 8:
309 main.log.error( self.name + ": Git Pull - TIMEOUT" )
310 main.log.error(
311 self.name + " Response was: " + str(
312 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400313 return main.ERROR
314 else:
kelvin8ec71442015-01-15 16:57:00 -0800315 main.log.error(
316 self.name +
317 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400318 return main.ERROR
319 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800320 main.log.error( self.name + ": EOF exception found" )
321 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400322 main.cleanup()
323 main.exit()
324 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800325 main.log.info( self.name + ":" * 60 )
kelvin-onlab64b33712015-01-21 15:26:15 -0800326 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800327 main.log.info( ":" * 80 )
Jon Hallacabffd2014-10-09 12:36:53 -0400328 main.cleanup()
329 main.exit()
330
kelvin-onlabd3b64892015-01-20 13:26:24 -0800331 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800332 """
Jon Hallacabffd2014-10-09 12:36:53 -0400333 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800334
Jon Hallacabffd2014-10-09 12:36:53 -0400335 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800336 If used as gitCheckout( "branch" ) it will do git checkout
337 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400338
339 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800340 branch of the ONOS repository. If it has any problems, it will return
341 main.ERROR.
342 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400343 successful then the function will return main.TRUE.
344
kelvin8ec71442015-01-15 16:57:00 -0800345 """
Jon Hallacabffd2014-10-09 12:36:53 -0400346 try:
kelvin8ec71442015-01-15 16:57:00 -0800347 self.handle.sendline( "cd " + self.home )
348 self.handle.expect( "ONOS\$" )
349 main.log.info(
350 self.name +
351 ": Checking out git branch: " +
352 branch +
353 "..." )
354 cmd = "git checkout " + branch
355 self.handle.sendline( cmd )
356 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800357 i = self.handle.expect(
358 [
359 'fatal',
360 'Username\sfor\s(.*):\s',
361 'Already\son\s\'',
362 'Switched\sto\sbranch\s\'' +
363 str( branch ),
364 pexpect.TIMEOUT,
365 'error: Your local changes to the following files\
366 would be overwritten by checkout:',
367 'error: you need to resolve your current index first' ],
368 timeout=60 )
Jon Hallacabffd2014-10-09 12:36:53 -0400369
kelvin8ec71442015-01-15 16:57:00 -0800370 if i == 0:
371 main.log.error(
372 self.name +
373 ": Git checkout had some issue..." )
374 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400375 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800376 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800377 main.log.error(
378 self.name +
379 ": Git checkout asking for username." +
380 " Please configure your local git repository to be able " +
381 "to access your remote repository passwordlessly" )
Jon Hallacabffd2014-10-09 12:36:53 -0400382 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800383 elif i == 2:
384 main.log.info(
385 self.name +
386 ": Git Checkout %s : Already on this branch" %
387 branch )
388 self.handle.expect( "ONOS\$" )
389 # main.log.info( "DEBUG: after checkout cmd = "+
390 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400391 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800392 elif i == 3:
393 main.log.info(
394 self.name +
395 ": Git checkout %s - Switched to this branch" %
396 branch )
397 self.handle.expect( "ONOS\$" )
398 # main.log.info( "DEBUG: after checkout cmd = "+
399 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400400 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800401 elif i == 4:
402 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
403 main.log.error(
404 self.name + " Response was: " + str(
405 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400406 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800407 elif i == 5:
408 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800409 main.log.error(
410 self.name +
411 ": Git checkout error: \n" +
412 "Your local changes to the following\
413 files would be overwritten by checkout:" +
414 str(
415 self.handle.before ) )
kelvin8ec71442015-01-15 16:57:00 -0800416 self.handle.expect( "ONOS\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500417 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800418 elif i == 6:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800419 main.log.error( self.name +
420 ": Git checkout error: \n" +
421 "You need to resolve your\
422 current index first:" +
kelvin8ec71442015-01-15 16:57:00 -0800423 str( self.handle.before ) )
424 self.handle.expect( "ONOS\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500425 return main.ERROR
Jon Hallacabffd2014-10-09 12:36:53 -0400426 else:
kelvin8ec71442015-01-15 16:57:00 -0800427 main.log.error(
428 self.name +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800429 ": Git Checkout - Unexpected response,\
430 check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800431 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400432 return main.ERROR
433
434 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800435 main.log.error( self.name + ": EOF exception found" )
436 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400437 main.cleanup()
438 main.exit()
439 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800440 main.log.info( self.name + ":" * 60 )
kelvin-onlab64b33712015-01-21 15:26:15 -0800441 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800442 main.log.info( ":" * 80 )
Jon Hallacabffd2014-10-09 12:36:53 -0400443 main.cleanup()
444 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400445
kelvin-onlabd3b64892015-01-20 13:26:24 -0800446 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800447 """
kelvin-onlabd3b64892015-01-20 13:26:24 -0800448 Writes the COMMIT number to the report to be parsed\
449 by Jenkins data collecter.
kelvin8ec71442015-01-15 16:57:00 -0800450 """
Jon Hall45ec0922014-10-10 19:33:49 -0400451 try:
kelvin8ec71442015-01-15 16:57:00 -0800452 self.handle.sendline( "export TERM=xterm-256color" )
453 self.handle.expect( "xterm-256color" )
454 self.handle.expect( "\$" )
455 self.handle.sendline( "" )
456 self.handle.expect( "\$" )
457 self.handle.sendline(
458 "cd " +
459 self.home +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800460 "; git log -1 --pretty=fuller --decorate=short | grep -A 6\
461 \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800462 # NOTE: for some reason there are backspaces inserted in this
463 # phrase when run from Jenkins on some tests
464 self.handle.expect( "never" )
465 self.handle.expect( "\$" )
466 response = ( self.name + ": \n" + str(
467 self.handle.before + self.handle.after ) )
468 self.handle.sendline( "cd " + self.home )
469 self.handle.expect( "\$" )
470 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400471 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500472 print line
473 if report:
kelvin8ec71442015-01-15 16:57:00 -0800474 for line in lines[ 2:-1 ]:
475 # Bracket replacement is for Wiki-compliant
476 # formatting. '<' or '>' are interpreted
477 # as xml specific tags that cause errors
478 line = line.replace( "<", "[" )
479 line = line.replace( ">", "]" )
480 main.log.report( "\t" + line )
481 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400482 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800483 main.log.error( self.name + ": EOF exception found" )
484 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400485 main.cleanup()
486 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800487 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800488 main.log.error( self.name + ": TIMEOUT exception found" )
489 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800490 main.cleanup()
491 main.exit()
Jon Hall45ec0922014-10-10 19:33:49 -0400492 except:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800493 main.log.info( self.name + ":" * 60 )
kelvin-onlab64b33712015-01-21 15:26:15 -0800494 main.log.error( traceback.print_exc() )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800495 main.log.info( ":" * 80 )
Jon Hall45ec0922014-10-10 19:33:49 -0400496 main.cleanup()
497 main.exit()
498
andrew@onlab.us3b087132015-03-11 15:00:08 -0700499 def createCellFile( self, benchIp, fileName, mnIpAddrs,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.
andrew@onlab.us3b087132015-03-11 15:00:08 -0700527 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 + ":::::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800577 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
Cameron Franke9c94fb02015-01-21 10:20:20 -0800596 self.handle.expect(str(cellname))
andrew@onlab.us98eab872015-01-22 14:41:34 -0800597 handleBefore = self.handle.before
598 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800599 # Get the rest of the handle
Cameron Franke9c94fb02015-01-21 10:20:20 -0800600 self.handle.sendline("")
601 self.handle.expect("\$")
andrew@onlab.us98eab872015-01-22 14:41:34 -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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800616 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800617 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800651 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800652 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800712 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800713 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800767 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800768 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800805 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800806 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800843 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800844 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800872 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800873 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800905 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800906 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800951 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800952 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -0800988 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -0800989 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001027 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001028 main.log.info( self.name + " ::::::" )
andrewonlab94282092014-10-10 13:00:11 -04001029 main.cleanup()
1030 main.exit()
1031
Cameron Franke9c94fb02015-01-21 10:20:20 -08001032 def isup(self, node = "", timeout = 120):
kelvin8ec71442015-01-15 16:57:00 -08001033 """
1034 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001035 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:
Cameron Franke9c94fb02015-01-21 10:20:20 -08001040 self.handle.sendline("onos-wait-for-start " + node )
1041 self.handle.expect("onos-wait-for-start")
kelvin8ec71442015-01-15 16:57:00 -08001042 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001043 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001061 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001062 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001125 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001126 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001173 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001174 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001243 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001244 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001368 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001369 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001430 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001431 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 + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001452 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001453 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" )
kelvin8ec71442015-01-15 16:57:00 -08001474 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001475 main.cleanup()
1476 main.exit()
1477 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001478 main.log.error( self.name + ": EOF exception found" )
1479 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001480 main.cleanup()
1481 main.exit()
1482 except:
kelvin8ec71442015-01-15 16:57:00 -08001483 main.log.info( self.name + " ::::::" )
kelvin-onlab64b33712015-01-21 15:26:15 -08001484 main.log.error( traceback.print_exc() )
kelvin8ec71442015-01-15 16:57:00 -08001485 main.log.info( self.name + " ::::::" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001486 main.cleanup()
1487 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07001488
1489 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1490 '''
1491 Create/formats the LinkGraph.cfg file based on arguments
1492 -only creates a linear topology and connects islands
1493 -evenly distributes devices
1494 -must be called by ONOSbench
1495
1496 ONOSIpList - list of all of the node IPs to be used
1497
1498 deviceCount - number of switches to be assigned
1499 '''
1500 main.log.step("Creating link graph configuration file." )
1501 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
1502 tempFile = "/tmp/linkGraph.cfg"
1503
1504 linkGraph = open(tempFile, 'w+')
1505 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1506 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1507 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
1508
1509 clusterCount = len(ONOSIpList)
1510
1511 if type(deviceCount) is int or type(deviceCount) is str:
1512 deviceCount = int(deviceCount)
1513 switchList = [0]*(clusterCount+1)
1514 baselineSwitchCount = deviceCount/clusterCount
1515
1516 for node in range(1, clusterCount + 1):
1517 switchList[node] = baselineSwitchCount
1518
1519 for node in range(1, (deviceCount%clusterCount)+1):
1520 switchList[node] += 1
1521
1522 if type(deviceCount) is list:
1523 main.log.info("Using provided device distribution")
1524 switchList = [0]
1525 for i in deviceCount:
1526 switchList.append(int(i))
1527
1528 tempList = ['0']
1529 tempList.extend(ONOSIpList)
1530 ONOSIpList = tempList
1531
1532 myPort = 6
1533 lastSwitch = 0
1534 for node in range(1, clusterCount+1):
1535 if switchList[node] == 0:
1536 continue
1537
1538 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
1539
1540 if node > 1:
1541 #connect to last device on previous node
1542 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1543 linkGraph.write(line)
1544
1545 lastSwitch = 0
1546 for switch in range (0, switchList[node]-1):
1547 line = ""
1548 line = ("\t" + str(switch) + ":" + str(myPort))
1549 line += " -- "
1550 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1551 linkGraph.write(line)
1552 lastSwitch = switch+1
1553 lastIp = ONOSIpList[node]
1554
1555 #lastSwitch += 1
1556 if node < (clusterCount):
1557 #connect to first device on the next node
1558 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
1559 linkGraph.write(line)
1560
1561 linkGraph.write("}\n")
1562 linkGraph.close()
1563
1564 #SCP
1565 os.system( "scp " + tempFile + " admin@" + benchIp + ":" + linkGraphPath)
1566 main.log.info("linkGraph.cfg creation complete")
1567
1568 def createNullDevProviderFile( self, benchIp, ONOSIpList, deviceCount, numPorts=10):
1569
1570 '''
1571 benchIp = Ip address of the test bench
1572 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
1573 deviceCount = number of switches to distribute
1574 numPorts = number of ports per device, when not specified in file it defaults to 10, optional arg
1575 '''
1576
1577 main.log.step("Creating null device provider configuration file." )
1578 nullDevicePath = self.home + "/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
1579 tempFile = "/tmp/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
1580 configFile = open(tempFile, 'w+')
1581 clusterCount = len(ONOSIpList)
1582
1583 if type(deviceCount) is int or type(deviceCount) is str:
1584 main.log.info("Creating device distribution")
1585 deviceCount = int(deviceCount)
1586 switchList = [0]*(clusterCount+1)
1587 baselineSwitchCount = deviceCount/clusterCount
1588
1589 for node in range(1, clusterCount + 1):
1590 switchList[node] = baselineSwitchCount
1591
1592 for node in range(1, (deviceCount%clusterCount)+1):
1593 switchList[node] += 1
1594
1595 if type(deviceCount) is list:
1596 main.log.info("Using provided device distribution")
1597 switchList = ['0']
1598 switchList.extend(deviceCount)
1599
1600 ONOSIp = [0]
1601 ONOSIp.extend(ONOSIpList)
1602
1603 devicesString = "devConfigs = "
1604 for node in range(1, len(ONOSIp)):
1605 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
1606 if node < clusterCount:
1607 devicesString += (",")
1608
1609 configFile.write(devicesString + "\n")
1610 if numPorts == 10:
1611 configFile.write("#numPorts = 10")
1612 else:
1613 configFile.write("numPorts = " + str(numPorts))
1614
1615 configFile.close()
1616 os.system( "scp " + tempFile + " admin@" + benchIp + ":" + nullDevicePath)
1617
1618 def createNullLinkProviderFile( self, benchIp, neighborIpList=0, eventRate=0, onNode=False):
1619 '''
1620 neighbor list is an optional list of neighbors to be written directly to the file
1621 onNode - bool, if true, alternate file path will be used to scp, inteneded
1622 for use on cell
1623 '''
1624
1625 main.log.step("Creating Null Link Provider config file")
1626 nullLinkPath = self.home + "/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
1627 if onNode == True:
1628 nullLinkPath = "/opt/onos/apache-karaf-3.0.2/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
1629 tempFile = "/tmp/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
1630 configFile = open(tempFile, 'w+')
1631
1632 eventRate = int(eventRate)
1633
1634 if eventRate == 0:
1635 configFile.write("#eventRate = \n")
1636 else:
1637 configFile.write("eventRate = " + str(eventRate) + "\n")
1638
1639 configFile.write("#cfgFile = /tmp/foo.cfg #If enabled, points to the full path to the topology file.\n")
1640
1641 if neighborIpList != 0:
1642 configFile.write("neighbors = ")
1643 for n in range (0, len(neighborIpList)):
1644 configFile.write(neighborIpList[n])
1645 if n < (len(neighborIpList) - 1):
1646 configFile.write(",")
1647 else:
1648 configFile.write("#neighbors = ")
1649
1650 configFile.close()
1651 if onNode == False:
1652 os.system( "scp " + tempFile + " admin@" + benchIp + ":" + nullLinkPath)
1653 if onNode == True:
1654 os.system( "scp " + tempFile + " sdn@" + benchIp + ":" + nullLinkPath)
1655
1656
1657
1658