blob: 8bc266677322c95ab07ee5e4e396f77240899ea9 [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
andrewonlab7735d852014-10-09 13:02:47 -040022import os.path
pingping-lin6d23d9e2015-02-02 16:54:24 -080023from requests.models import Response
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 """
Jon Hallefbd9792015-03-05 16:11:36 -080034 self.name = None
35 self.home = None
36 self.handle = None
kelvin8ec71442015-01-15 16:57:00 -080037 super( CLI, self ).__init__()
38
39 def connect( self, **connectargs ):
40 """
Jon Hall05b2b432014-10-08 19:53:25 -040041 Creates ssh handle for ONOS "bench".
kelvin8ec71442015-01-15 16:57:00 -080042 """
Jon Hall05b2b432014-10-08 19:53:25 -040043 try:
44 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080045 vars( self )[ key ] = connectargs[ key ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070046 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040047 for key in self.options:
48 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080049 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040050 break
Jon Hall274b6642015-02-17 11:57:17 -080051 if self.home is None or self.home == "":
Jon Halle94919c2015-03-23 11:42:57 -070052 self.home = "~/onos"
Jon Hall21270ac2015-02-16 17:59:55 -080053
kelvin8ec71442015-01-15 16:57:00 -080054 self.name = self.options[ 'name' ]
55 self.handle = super( OnosDriver, self ).connect(
56 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -080057 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -080058 port=self.port,
59 pwd=self.pwd,
60 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -040061
kelvin8ec71442015-01-15 16:57:00 -080062 self.handle.sendline( "cd " + self.home )
63 self.handle.expect( "\$" )
Jon Hall05b2b432014-10-08 19:53:25 -040064 if self.handle:
65 return self.handle
kelvin8ec71442015-01-15 16:57:00 -080066 else:
67 main.log.info( "NO ONOS HANDLE" )
Jon Hall05b2b432014-10-08 19:53:25 -040068 return main.FALSE
69 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080070 main.log.error( self.name + ": EOF exception found" )
71 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -040072 main.cleanup()
73 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -080074 except Exception:
75 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall05b2b432014-10-08 19:53:25 -040076 main.cleanup()
77 main.exit()
78
kelvin8ec71442015-01-15 16:57:00 -080079 def disconnect( self ):
80 """
Jon Hall05b2b432014-10-08 19:53:25 -040081 Called when Test is complete to disconnect the ONOS handle.
kelvin8ec71442015-01-15 16:57:00 -080082 """
Jon Halld61331b2015-02-17 16:35:47 -080083 response = main.TRUE
Jon Hall05b2b432014-10-08 19:53:25 -040084 try:
Jon Hall61282e32015-03-19 11:34:11 -070085 if self.handle:
86 self.handle.sendline( "" )
87 self.handle.expect( "\$" )
88 self.handle.sendline( "exit" )
89 self.handle.expect( "closed" )
Jon Hall05b2b432014-10-08 19:53:25 -040090 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -080091 main.log.error( self.name + ": EOF exception found" )
92 main.log.error( self.name + ": " + self.handle.before )
Jon Hall61282e32015-03-19 11:34:11 -070093 except ValueError:
Jon Hall1a77a1e2015-04-06 10:41:13 -070094 main.log.exception( "Exception in disconnect of " + self.name )
Jon Hall61282e32015-03-19 11:34:11 -070095 response = main.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -080096 except Exception:
97 main.log.exception( self.name + ": Connection failed to the host" )
Jon Hall05b2b432014-10-08 19:53:25 -040098 response = main.FALSE
99 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400100
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400101 def getEpochMs( self ):
102 """
103 Returns milliseconds since epoch
104
105 When checking multiple nodes in a for loop,
106 around a hundred milliseconds of difference (ascending) is
107 generally acceptable due to calltime of the function.
108 Few seconds, however, is not and it means clocks
109 are off sync.
110 """
111 try:
112 self.handle.sendline( 'date +%s.%N' )
113 self.handle.expect( 'date \+\%s\.\%N' )
114 self.handle.expect( '\$' )
115 epochMs = self.handle.before
116 return epochMs
117 except Exception:
118 main.log.exception( 'Uncaught exception getting epoch time' )
119 main.cleanup()
120 main.exit()
121
pingping-lin57a56ce2015-05-20 16:43:48 -0700122 def onosPackage( self, opTimeout=30 ):
kelvin8ec71442015-01-15 16:57:00 -0800123 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400124 Produce a self-contained tar.gz file that can be deployed
kelvin8ec71442015-01-15 16:57:00 -0800125 and executed on any platform with Java 7 JRE.
126 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400127 try:
kelvin8ec71442015-01-15 16:57:00 -0800128 self.handle.sendline( "onos-package" )
129 self.handle.expect( "onos-package" )
pingping-lin57a56ce2015-05-20 16:43:48 -0700130 self.handle.expect( "tar.gz", opTimeout )
kelvin8ec71442015-01-15 16:57:00 -0800131 handle = str( self.handle.before )
132 main.log.info( "onos-package command returned: " +
133 handle )
134 # As long as the sendline does not time out,
135 # return true. However, be careful to interpret
136 # the results of the onos-package command return
andrewonlab0748d2a2014-10-09 13:24:17 -0400137 return main.TRUE
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400138
andrewonlab7735d852014-10-09 13:02:47 -0400139 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800140 main.log.error( self.name + ": EOF exception found" )
141 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800142 except Exception:
143 main.log.exception( "Failed to package ONOS" )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400144 main.cleanup()
145 main.exit()
146
kelvin-onlabd3b64892015-01-20 13:26:24 -0800147 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800148 """
andrewonlab8790abb2014-11-06 13:51:54 -0500149 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800150 """
andrewonlab8790abb2014-11-06 13:51:54 -0500151 try:
kelvin8ec71442015-01-15 16:57:00 -0800152 self.handle.sendline( "onos-build" )
153 self.handle.expect( "onos-build" )
154 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800155 "BUILD SUCCESS",
156 "ERROR",
157 "BUILD FAILED" ],
158 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800159 handle = str( self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500160
kelvin8ec71442015-01-15 16:57:00 -0800161 main.log.info( "onos-build command returned: " +
162 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500163
164 if i == 0:
165 return main.TRUE
166 else:
167 return handle
168
169 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800170 main.log.error( self.name + ": EOF exception found" )
171 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800172 except Exception:
173 main.log.exception( "Failed to build ONOS" )
andrewonlab8790abb2014-11-06 13:51:54 -0500174 main.cleanup()
175 main.exit()
176
shahshreya9f531fe2015-06-10 12:03:51 -0700177 def cleanInstall( self, skipTest=False, mciTimeout=600 ):
kelvin8ec71442015-01-15 16:57:00 -0800178 """
179 Runs mvn clean install in the root of the ONOS directory.
180 This will clean all ONOS artifacts then compile each module
shahshreya9f531fe2015-06-10 12:03:51 -0700181 Optional:
182 skipTest - Does "-DskipTests -Dcheckstyle.skip -U -T 1C" which
183 skip the test. This will make the building faster.
184 Disregarding the credibility of the build
kelvin8ec71442015-01-15 16:57:00 -0800185 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400186 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800187 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400188 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800189 main.log.info( "Running 'mvn clean install' on " +
190 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800191 ". This may take some time." )
192 self.handle.sendline( "cd " + self.home )
193 self.handle.expect( "\$" )
Jon Hallea7818b2014-10-09 14:30:59 -0400194
kelvin8ec71442015-01-15 16:57:00 -0800195 self.handle.sendline( "" )
196 self.handle.expect( "\$" )
shahshreya9f531fe2015-06-10 12:03:51 -0700197
198 if not skipTest:
199 self.handle.sendline( "mvn clean install" )
200 self.handle.expect( "mvn clean install" )
201 else:
202 self.handle.sendline( "mvn clean install -DskipTests" +
203 " -Dcheckstyle.skip -U -T 1C" )
204 self.handle.expect( "mvn clean install -DskipTests" +
205 " -Dcheckstyle.skip -U -T 1C" )
kelvin8ec71442015-01-15 16:57:00 -0800206 while True:
207 i = self.handle.expect( [
Jon Hall274b6642015-02-17 11:57:17 -0800208 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
Jon Hallefbd9792015-03-05 16:11:36 -0800209 'Runtime\sEnvironment\sto\scontinue',
Jon Hallde9d9aa2014-10-08 20:36:02 -0400210 'BUILD\sFAILURE',
211 'BUILD\sSUCCESS',
Jon Halle94919c2015-03-23 11:42:57 -0700212 'onos\$', #TODO: fix this to be more generic?
Jon Hallde9d9aa2014-10-08 20:36:02 -0400213 'ONOS\$',
pingping-lin57a56ce2015-05-20 16:43:48 -0700214 pexpect.TIMEOUT ], mciTimeout )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400215 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800216 main.log.error( self.name + ":There is insufficient memory \
217 for the Java Runtime Environment to continue." )
218 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400219 main.cleanup()
220 main.exit()
221 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800222 main.log.error( self.name + ": Build failure!" )
223 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400224 main.cleanup()
225 main.exit()
226 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800227 main.log.info( self.name + ": Build success!" )
Jon Halle94919c2015-03-23 11:42:57 -0700228 elif i == 3 or i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800229 main.log.info( self.name + ": Build complete" )
230 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400231 for line in self.handle.before.splitlines():
232 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800233 main.log.info( line )
234 self.handle.sendline( "" )
235 self.handle.expect( "\$", timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400236 return main.TRUE
Jon Halle94919c2015-03-23 11:42:57 -0700237 elif i == 5:
kelvin8ec71442015-01-15 16:57:00 -0800238 main.log.error(
239 self.name +
240 ": mvn clean install TIMEOUT!" )
241 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400242 main.cleanup()
243 main.exit()
244 else:
Jon Hall274b6642015-02-17 11:57:17 -0800245 main.log.error( self.name + ": unexpected response from " +
Jon Hallefbd9792015-03-05 16:11:36 -0800246 "mvn clean install" )
kelvin8ec71442015-01-15 16:57:00 -0800247 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400248 main.cleanup()
249 main.exit()
250 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800251 main.log.error( self.name + ": EOF exception found" )
252 main.log.error( self.name + ": " + self.handle.before )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400253 main.cleanup()
254 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800255 except Exception:
256 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400257 main.cleanup()
258 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400259
Jon Hall61282e32015-03-19 11:34:11 -0700260 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800261 """
Jon Hallacabffd2014-10-09 12:36:53 -0400262 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800263
Jon Hall61282e32015-03-19 11:34:11 -0700264 If the fastForward boolean is set to true, only git pulls that can
265 be fast forwarded will be performed. IE if you have not local commits
266 in your branch.
267
Jon Hallacabffd2014-10-09 12:36:53 -0400268 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800269 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400270 for the purpose of pulling from other nodes if necessary.
271
Jon Hall47a93fb2015-01-06 16:46:06 -0800272 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400273 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800274 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400275 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400276
kelvin8ec71442015-01-15 16:57:00 -0800277 """
Jon Hallacabffd2014-10-09 12:36:53 -0400278 try:
kelvin8ec71442015-01-15 16:57:00 -0800279 # main.log.info( self.name + ": Stopping ONOS" )
280 # self.stop()
281 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800282 self.handle.expect( self.home + "\$" )
Jon Hall61282e32015-03-19 11:34:11 -0700283 cmd = "git pull"
284 if comp1 != "":
285 cmd += ' ' + comp1
286 if fastForward:
287 cmd += ' ' + " --ff-only"
288 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800289 i = self.handle.expect(
290 [
291 'fatal',
292 'Username\sfor\s(.*):\s',
293 '\sfile(s*) changed,\s',
294 'Already up-to-date',
295 'Aborting',
296 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800297 'You asked me to pull without telling me which branch you',
298 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700299 'Please enter a commit message to explain why this merge',
300 'Found a swap file by the name',
301 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800302 pexpect.TIMEOUT ],
303 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800304 # debug
kelvin-onlabd3b64892015-01-20 13:26:24 -0800305 # main.log.report( self.name +": DEBUG: \n"+
306 # "git pull response: " +
307 # str( self.handle.before ) + str( self.handle.after ) )
kelvin8ec71442015-01-15 16:57:00 -0800308 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700309 main.log.error( self.name + ": Git pull had some issue" )
310 output = self.handle.after
311 self.handle.expect( '\$' )
312 output += self.handle.before
313 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400314 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800315 elif i == 1:
316 main.log.error(
317 self.name +
318 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400319 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800320 elif i == 2:
321 main.log.info(
322 self.name +
323 ": Git Pull - pulling repository now" )
kelvin-onlaba1484582015-02-02 15:46:20 -0800324 self.handle.expect( self.home + "\$", 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800325 # So that only when git pull is done, we do mvn clean compile
326 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800327 elif i == 3:
328 main.log.info( self.name + ": Git Pull - Already up to date" )
Jon Hall47a93fb2015-01-06 16:46:06 -0800329 return i
kelvin8ec71442015-01-15 16:57:00 -0800330 elif i == 4:
331 main.log.info(
332 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800333 ": Git Pull - Aborting..." +
334 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400335 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800336 elif i == 5:
337 main.log.info(
338 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800339 ": Git Pull - You are not currently " +
340 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400341 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800342 elif i == 6:
343 main.log.info(
344 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800345 ": Git Pull - You have not configured an upstream " +
346 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400347 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800348 elif i == 7:
349 main.log.info(
350 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800351 ": Git Pull - Pull is not possible because " +
352 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400353 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800354 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700355 # NOTE: abandoning test since we can't reliably handle this
356 # there could be different default text editors and we
357 # also don't know if we actually want to make the commit
358 main.log.error( "Git pull resulted in a merge commit message" +
359 ". Exiting test!" )
360 main.cleanup()
361 main.exit()
362 elif i == 9: # Merge commit message but swap file exists
363 main.log.error( "Git pull resulted in a merge commit message" +
364 " but a swap file exists." )
365 try:
366 self.handle.send( 'A' ) # Abort
367 self.handle.expect( "\$" )
368 return main.ERROR
369 except Exception:
370 main.log.exception( "Couldn't exit editor prompt!")
371 main.cleanup()
372 main.exit()
373 elif i == 10: # In the middle of a merge commit
374 main.log.error( "Git branch is in the middle of a merge. " )
375 main.log.warn( self.handle.before + self.handle.after )
376 return main.ERROR
377 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800378 main.log.error( self.name + ": Git Pull - TIMEOUT" )
379 main.log.error(
380 self.name + " Response was: " + str(
381 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400382 return main.ERROR
383 else:
kelvin8ec71442015-01-15 16:57:00 -0800384 main.log.error(
385 self.name +
386 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400387 return main.ERROR
388 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800389 main.log.error( self.name + ": EOF exception found" )
390 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400391 main.cleanup()
392 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800393 except Exception:
394 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400395 main.cleanup()
396 main.exit()
397
kelvin-onlabd3b64892015-01-20 13:26:24 -0800398 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800399 """
Jon Hallacabffd2014-10-09 12:36:53 -0400400 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800401
Jon Hallacabffd2014-10-09 12:36:53 -0400402 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800403 If used as gitCheckout( "branch" ) it will do git checkout
404 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400405
406 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800407 branch of the ONOS repository. If it has any problems, it will return
408 main.ERROR.
409 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400410 successful then the function will return main.TRUE.
411
kelvin8ec71442015-01-15 16:57:00 -0800412 """
Jon Hallacabffd2014-10-09 12:36:53 -0400413 try:
kelvin8ec71442015-01-15 16:57:00 -0800414 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800415 self.handle.expect( self.home + "\$" )
Jon Hall274b6642015-02-17 11:57:17 -0800416 main.log.info( self.name +
417 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800418 cmd = "git checkout " + branch
419 self.handle.sendline( cmd )
420 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800421 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800422 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700423 'Username for (.*): ',
424 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700425 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800426 pexpect.TIMEOUT,
427 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800428 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800429 'error: you need to resolve your current index first',
430 "You are in 'detached HEAD' state.",
431 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800432 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800433 if i == 0:
434 main.log.error(
435 self.name +
436 ": Git checkout had some issue..." )
437 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400438 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800439 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800440 main.log.error(
441 self.name +
442 ": Git checkout asking for username." +
443 " Please configure your local git repository to be able " +
444 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800445 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400446 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800447 elif i == 2:
448 main.log.info(
449 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800450 ": Git Checkout %s : Already on this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800451 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800452 # main.log.info( "DEBUG: after checkout cmd = "+
453 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400454 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800455 elif i == 3:
456 main.log.info(
457 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800458 ": Git checkout %s - Switched to this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800459 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800460 # main.log.info( "DEBUG: after checkout cmd = "+
461 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400462 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800463 elif i == 4:
464 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
465 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800466 self.name + " Response was: " + str( self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400467 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800468 elif i == 5:
469 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800470 main.log.error(
471 self.name +
472 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800473 "Your local changes to the following files would" +
474 " be overwritten by checkout:" +
475 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800476 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500477 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800478 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800479 main.log.error(
480 self.name +
481 ": Git checkout error: \n" +
482 "You need to resolve your current index first:" +
483 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800484 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500485 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800486 elif i == 7:
487 main.log.info(
488 self.name +
489 ": Git checkout " + str( branch ) +
490 " - You are in 'detached HEAD' state. HEAD is now at " +
491 str( branch ) )
492 self.handle.expect( self.home + "\$" )
493 return main.TRUE
494 elif i == 8: # Already in detached HEAD on the specified commit
495 main.log.info(
496 self.name +
497 ": Git Checkout %s : Already on commit" % branch )
498 self.handle.expect( self.home + "\$" )
499 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400500 else:
kelvin8ec71442015-01-15 16:57:00 -0800501 main.log.error(
502 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800503 ": Git Checkout - Unexpected response, " +
504 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800505 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400506 return main.ERROR
507
508 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800509 main.log.error( self.name + ": EOF exception found" )
510 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400511 main.cleanup()
512 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800513 except Exception:
514 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400515 main.cleanup()
516 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400517
pingping-lin6d23d9e2015-02-02 16:54:24 -0800518 def getBranchName( self ):
pingping-linf30cf272015-05-29 15:54:07 -0700519 main.log.info( "self.home = " )
520 main.log.info( self.home )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800521 self.handle.sendline( "cd " + self.home )
pingping-lin9bf3d8f2015-05-29 16:05:28 -0700522 self.handle.expect( self.home + "\$" )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800523 self.handle.sendline( "git name-rev --name-only HEAD" )
524 self.handle.expect( "git name-rev --name-only HEAD" )
525 self.handle.expect( "\$" )
526
527 lines = self.handle.before.splitlines()
528 if lines[1] == "master":
529 return "master"
530 elif lines[1] == "onos-1.0":
531 return "onos-1.0"
532 else:
533 main.log.info( lines[1] )
534 return "unexpected ONOS branch for SDN-IP test"
535
kelvin-onlabd3b64892015-01-20 13:26:24 -0800536 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800537 """
Jon Hall274b6642015-02-17 11:57:17 -0800538 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800539 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800540 """
Jon Hall45ec0922014-10-10 19:33:49 -0400541 try:
kelvin8ec71442015-01-15 16:57:00 -0800542 self.handle.sendline( "" )
543 self.handle.expect( "\$" )
544 self.handle.sendline(
545 "cd " +
546 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800547 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
548 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800549 # NOTE: for some reason there are backspaces inserted in this
550 # phrase when run from Jenkins on some tests
551 self.handle.expect( "never" )
552 self.handle.expect( "\$" )
553 response = ( self.name + ": \n" + str(
554 self.handle.before + self.handle.after ) )
555 self.handle.sendline( "cd " + self.home )
556 self.handle.expect( "\$" )
557 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400558 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500559 print line
560 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700561 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800562 for line in lines[ 2:-1 ]:
563 # Bracket replacement is for Wiki-compliant
564 # formatting. '<' or '>' are interpreted
565 # as xml specific tags that cause errors
566 line = line.replace( "<", "[" )
567 line = line.replace( ">", "]" )
pingping-lin763ee042015-05-20 17:45:30 -0700568 #main.log.wiki( "\t" + line )
569 main.log.wiki( line + "<br /> " )
570 main.log.summary( line )
571 main.log.wiki( "</blockquote>" )
572 main.log.summary("\n")
kelvin8ec71442015-01-15 16:57:00 -0800573 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400574 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800575 main.log.error( self.name + ": EOF exception found" )
576 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400577 main.cleanup()
578 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800579 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800580 main.log.error( self.name + ": TIMEOUT exception found" )
581 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800582 main.cleanup()
583 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800584 except Exception:
585 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall45ec0922014-10-10 19:33:49 -0400586 main.cleanup()
587 main.exit()
588
kelvin-onlabd3b64892015-01-20 13:26:24 -0800589 def createCellFile( self, benchIp, fileName, mnIpAddrs,
cameron@onlab.us75900962015-03-30 13:22:49 -0700590 appString, *onosIpAddrs ):
kelvin8ec71442015-01-15 16:57:00 -0800591 """
andrewonlab94282092014-10-10 13:00:11 -0400592 Creates a cell file based on arguments
593 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800594 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400595 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800596 * File name of the cell file ( fileName )
597 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800598 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400599 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800600 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400601 - Must be passed in as last arguments
kelvin8ec71442015-01-15 16:57:00 -0800602
andrewonlab94282092014-10-10 13:00:11 -0400603 NOTE: Assumes cells are located at:
604 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800605 """
606 # Variable initialization
Jon Hallf57a5ef2015-07-07 17:56:16 -0700607 cellDirectory = os.environ["ONOS_ROOT"] + "/tools/test/cells/"
kelvin8ec71442015-01-15 16:57:00 -0800608 # We want to create the cell file in the dependencies directory
609 # of TestON first, then copy over to ONOS bench
kelvin-onlabd3b64892015-01-20 13:26:24 -0800610 tempDirectory = "/tmp/"
kelvin8ec71442015-01-15 16:57:00 -0800611 # Create the cell file in the directory for writing ( w+ )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800612 cellFile = open( tempDirectory + fileName, 'w+' )
kelvin8ec71442015-01-15 16:57:00 -0800613
cameron@onlab.us75900962015-03-30 13:22:49 -0700614 # App string is hardcoded environment variables
kelvin8ec71442015-01-15 16:57:00 -0800615 # That you may wish to use by default on startup.
cameron@onlab.us75900962015-03-30 13:22:49 -0700616 # Note that you may not want certain apps listed
kelvin8ec71442015-01-15 16:57:00 -0800617 # on here.
cameron@onlab.us75900962015-03-30 13:22:49 -0700618 appString = "export ONOS_APPS=" + appString
kelvin-onlabd3b64892015-01-20 13:26:24 -0800619 mnString = "export OCN="
kelvin-onlabf70fd542015-05-07 18:41:40 -0700620 if mnIpAddrs == "":
621 mnString = ""
kelvin-onlabd3b64892015-01-20 13:26:24 -0800622 onosString = "export OC"
623 tempCount = 1
kelvin8ec71442015-01-15 16:57:00 -0800624
kelvin-onlabd3b64892015-01-20 13:26:24 -0800625 # Create ONOSNIC ip address prefix
626 tempOnosIp = onosIpAddrs[ 0 ]
627 tempList = []
628 tempList = tempOnosIp.split( "." )
kelvin8ec71442015-01-15 16:57:00 -0800629 # Omit last element of list to format for NIC
kelvin-onlabd3b64892015-01-20 13:26:24 -0800630 tempList = tempList[ :-1 ]
kelvin8ec71442015-01-15 16:57:00 -0800631 # Structure the nic string ip
kelvin-onlabd3b64892015-01-20 13:26:24 -0800632 nicAddr = ".".join( tempList ) + ".*"
633 onosNicString = "export ONOS_NIC=" + nicAddr
andrewonlab94282092014-10-10 13:00:11 -0400634
635 try:
kelvin8ec71442015-01-15 16:57:00 -0800636 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800637 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400638
kelvin-onlabd3b64892015-01-20 13:26:24 -0800639 for arg in onosIpAddrs:
640 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800641 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400642 # export OC1="10.128.20.11"
643 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800644 cellFile.write( onosString + str( tempCount ) +
645 "=" + "\"" + arg + "\"" + "\n" )
646 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800647
kelvin-onlabd3b64892015-01-20 13:26:24 -0800648 cellFile.write( mnString + "\"" + mnIpAddrs + "\"" + "\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700649 cellFile.write( appString + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800650 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400651
kelvin8ec71442015-01-15 16:57:00 -0800652 # We use os.system to send the command to TestON cluster
653 # to account for the case in which TestON is not located
654 # on the same cluster as the ONOS bench
655 # Note that even if TestON is located on the same cluster
656 # as ONOS bench, you must setup passwordless ssh
657 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800658 os.system( "scp " + tempDirectory + fileName +
659 " admin@" + benchIp + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400660
andrewonlab2a6c9342014-10-16 13:40:15 -0400661 return main.TRUE
662
andrewonlab94282092014-10-10 13:00:11 -0400663 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800664 main.log.error( self.name + ": EOF exception found" )
665 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400666 main.cleanup()
667 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800668 except Exception:
669 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -0400670 main.cleanup()
671 main.exit()
672
kelvin-onlabd3b64892015-01-20 13:26:24 -0800673 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800674 """
andrewonlab95ca1462014-10-09 14:04:24 -0400675 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800676 """
Hari Krishna03f530e2015-07-10 17:28:27 -0700677 import re
andrewonlab95ca1462014-10-09 14:04:24 -0400678 try:
679 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800680 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400681 main.cleanup()
682 main.exit()
683 else:
kelvin8ec71442015-01-15 16:57:00 -0800684 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800685 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800686 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400687 # and that this driver will have to change accordingly
Cameron Franke9c94fb02015-01-21 10:20:20 -0800688 self.handle.expect(str(cellname))
kelvin-onlabd3b64892015-01-20 13:26:24 -0800689 handleBefore = self.handle.before
690 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800691 # Get the rest of the handle
Cameron Franke9c94fb02015-01-21 10:20:20 -0800692 self.handle.sendline("")
693 self.handle.expect("\$")
kelvin-onlabd3b64892015-01-20 13:26:24 -0800694 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400695
Hari Krishna03f530e2015-07-10 17:28:27 -0700696 cell_result = handleBefore + handleAfter + handleMore
697 print cell_result
698 if( re.search( "No such cell", cell_result ) ):
699 main.log.error( "Cell call returned: " + handleBefore +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800700 handleAfter + handleMore )
Hari Krishna03f530e2015-07-10 17:28:27 -0700701 main.cleanup()
702 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400703 return main.TRUE
704
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 )
andrewonlab95ca1462014-10-09 14:04:24 -0400708 main.cleanup()
709 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800710 except Exception:
711 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab95ca1462014-10-09 14:04:24 -0400712 main.cleanup()
713 main.exit()
714
kelvin-onlabd3b64892015-01-20 13:26:24 -0800715 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800716 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400717 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800718 """
719 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400720
andrewonlabc03bf6c2014-10-09 14:56:18 -0400721 try:
kelvin8ec71442015-01-15 16:57:00 -0800722 # Clean handle by sending empty and expecting $
723 self.handle.sendline( "" )
724 self.handle.expect( "\$" )
725 self.handle.sendline( "onos-verify-cell" )
726 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800727 handleBefore = self.handle.before
728 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800729 # Get the rest of the handle
730 self.handle.sendline( "" )
731 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800732 handleMore = self.handle.before
andrewonlabc03bf6c2014-10-09 14:56:18 -0400733
kelvin-onlabd3b64892015-01-20 13:26:24 -0800734 main.log.info( "Verify cell returned: " + handleBefore +
735 handleAfter + handleMore )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400736
737 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800738 except pexpect.ExceptionPexpect as e:
739 main.log.error( self.name + ": Pexpect exception found of type " +
740 str( type( e ) ) )
741 main.log.error ( e.get_trace() )
kelvin8ec71442015-01-15 16:57:00 -0800742 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400743 main.cleanup()
744 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800745 except Exception:
746 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400747 main.cleanup()
748 main.exit()
749
jenkins1e99e7b2015-04-02 18:15:39 -0700750 def onosCfgSet( self, ONOSIp, configName, configParam ):
751 """
752 Uses 'onos <node-ip> cfg set' to change a parameter value of an
753 application.
754
755 ex)
756 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700757 ONOSIp = '10.0.0.1'
758 configName = 'org.onosproject.myapp'
759 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700760 """
cameron@onlab.us78b89652015-07-08 15:21:03 -0700761 for i in range(5):
762 try:
763 cfgStr = ( "onos "+str(ONOSIp)+" cfg set "+
764 str(configName) + " " +
765 str(configParam)
766 )
jenkins1e99e7b2015-04-02 18:15:39 -0700767
cameron@onlab.us78b89652015-07-08 15:21:03 -0700768 self.handle.sendline( "" )
769 self.handle.expect( ":~" )
770 self.handle.sendline( cfgStr )
771 self.handle.expect("cfg set")
772 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700773
cameron@onlab.us78b89652015-07-08 15:21:03 -0700774 paramValue = configParam.split(" ")[1]
775 paramName = configParam.split(" ")[0]
776
777 checkStr = ( "onos " + str(ONOSIp) + """ cfg get " """ + str(configName) + " " + paramName + """ " """)
jenkins1e99e7b2015-04-02 18:15:39 -0700778
cameron@onlab.us78b89652015-07-08 15:21:03 -0700779 self.handle.sendline( checkStr )
780 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700781
cameron@onlab.us78b89652015-07-08 15:21:03 -0700782 if "value=" + paramValue + "," in self.handle.before:
783 main.log.info("cfg " + configName + " successfully set to " + configParam)
784 return main.TRUE
785
786 except pexpect.ExceptionPexpect as e:
787 main.log.error( self.name + ": Pexpect exception found of type " +
788 str( type( e ) ) )
789 main.log.error ( e.get_trace() )
790 main.log.error( self.name + ": " + self.handle.before )
791 main.cleanup()
792 main.exit()
793 except Exception:
794 main.log.exception( self.name + ": Uncaught exception!" )
795 main.cleanup()
796 main.exit()
797
798 time.sleep(5)
799
800 main.log.error("CFG SET FAILURE: " + configName + " " + configParam )
801 main.ONOSbench.handle.sendline("onos $OC1 cfg get")
802 main.ONOSbench.handle.expect("\$")
803 print main.ONOSbench.handle.before
804 main.ONOSbench.logReport( ONOSIp, ["ERROR","WARN","EXCEPT"], "d")
805 return main.FALSE
806
807
kelvin-onlabd3b64892015-01-20 13:26:24 -0800808 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800809 """
andrewonlab05e362f2014-10-10 00:40:57 -0400810 Uses 'onos' command to send various ONOS CLI arguments.
811 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800812 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400813 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800814
815 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400816 CLI commands for ONOS. Try to use this function first
817 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800818 function.
819 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400820 by starting onos, and typing in 'onos' to enter the
821 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800822 available commands.
823 """
andrewonlab05e362f2014-10-10 00:40:57 -0400824 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800825 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800826 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400827 return main.FALSE
828 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800829 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400830 return main.FALSE
831
kelvin8ec71442015-01-15 16:57:00 -0800832 cmdstr = str( cmdstr )
833 self.handle.sendline( "" )
834 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400835
kelvin-onlabd3b64892015-01-20 13:26:24 -0800836 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800837 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400838
kelvin-onlabd3b64892015-01-20 13:26:24 -0800839 handleBefore = self.handle.before
Shreya Shaha73aaad2014-10-27 18:03:09 -0400840 print "handle_before = ", self.handle.before
kelvin-onlabd3b64892015-01-20 13:26:24 -0800841 # handleAfter = str( self.handle.after )
Jon Hall47a93fb2015-01-06 16:46:06 -0800842
kelvin8ec71442015-01-15 16:57:00 -0800843 # self.handle.sendline( "" )
844 # self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800845 # handleMore = str( self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400846
kelvin8ec71442015-01-15 16:57:00 -0800847 main.log.info( "Command sent successfully" )
andrewonlab05e362f2014-10-10 00:40:57 -0400848
kelvin8ec71442015-01-15 16:57:00 -0800849 # Obtain return handle that consists of result from
850 # the onos command. The string may need to be
851 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800852 # returnString = handleBefore + handleAfter
853 returnString = handleBefore
854 print "return_string = ", returnString
855 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400856
857 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800858 main.log.error( self.name + ": EOF exception found" )
859 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400860 main.cleanup()
861 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800862 except Exception:
863 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab05e362f2014-10-10 00:40:57 -0400864 main.cleanup()
865 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400866
kelvin-onlabd3b64892015-01-20 13:26:24 -0800867 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -0800868 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400869 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -0800870 If -f option is provided, it also forces an uninstall.
871 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -0400872 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -0800873 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -0400874 files to certain onos nodes
875
876 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -0800877 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400878 try:
andrewonlab114768a2014-11-14 12:44:44 -0500879 if options:
kelvin8ec71442015-01-15 16:57:00 -0800880 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -0500881 else:
kelvin8ec71442015-01-15 16:57:00 -0800882 self.handle.sendline( "onos-install " + node )
883 self.handle.expect( "onos-install " )
884 # NOTE: this timeout may need to change depending on the network
885 # and size of ONOS
886 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -0800887 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -0800888 "ONOS\sis\salready\sinstalled",
889 pexpect.TIMEOUT ], timeout=60 )
Jon Hall7993bfc2014-10-09 16:30:14 -0400890
Jon Hall7993bfc2014-10-09 16:30:14 -0400891 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800892 main.log.warn( "Network is unreachable" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400893 return main.FALSE
894 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800895 main.log.info(
896 "ONOS was installed on " +
897 node +
898 " and started" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400899 return main.TRUE
andrewonlabd9a73a72014-11-14 17:28:21 -0500900 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800901 main.log.info( "ONOS is already installed on " + node )
andrewonlabd9a73a72014-11-14 17:28:21 -0500902 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800903 elif i == 3:
904 main.log.info(
905 "Installation of ONOS on " +
906 node +
907 " timed out" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400908 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -0400909
910 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800911 main.log.error( self.name + ": EOF exception found" )
912 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400913 main.cleanup()
914 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800915 except Exception:
916 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400917 main.cleanup()
918 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400919
kelvin-onlabd3b64892015-01-20 13:26:24 -0800920 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800921 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400922 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400923 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -0800924 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400925 try:
kelvin8ec71442015-01-15 16:57:00 -0800926 self.handle.sendline( "" )
927 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800928 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800929 " start" )
930 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -0400931 "Job\sis\salready\srunning",
932 "start/running",
933 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -0800934 pexpect.TIMEOUT ], timeout=120 )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400935
936 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800937 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400938 return main.TRUE
939 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800940 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400941 return main.TRUE
942 else:
kelvin8ec71442015-01-15 16:57:00 -0800943 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400944 main.cleanup()
945 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -0400946 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800947 main.log.error( self.name + ": EOF exception found" )
948 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400949 main.cleanup()
950 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800951 except Exception:
952 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400953 main.cleanup()
954 main.exit()
955
kelvin-onlabd3b64892015-01-20 13:26:24 -0800956 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800957 """
andrewonlab2b30bd32014-10-09 16:48:55 -0400958 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400959 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -0800960 """
andrewonlab2b30bd32014-10-09 16:48:55 -0400961 try:
kelvin8ec71442015-01-15 16:57:00 -0800962 self.handle.sendline( "" )
963 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800964 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800965 " stop" )
966 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -0400967 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -0700968 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -0400969 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -0800970 pexpect.TIMEOUT ], timeout=60 )
andrewonlab2b30bd32014-10-09 16:48:55 -0400971
972 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800973 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400974 return main.TRUE
975 elif i == 1:
Jon Hall65844a32015-03-09 19:09:37 -0700976 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800977 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -0400978 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -0700979 elif i == 2:
980 main.log.warn( "ONOS wasn't running" )
981 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -0400982 else:
kelvin8ec71442015-01-15 16:57:00 -0800983 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400984 return main.FALSE
985
986 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800987 main.log.error( self.name + ": EOF exception found" )
988 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -0400989 main.cleanup()
990 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800991 except Exception:
992 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab2b30bd32014-10-09 16:48:55 -0400993 main.cleanup()
994 main.exit()
kelvin8ec71442015-01-15 16:57:00 -0800995
kelvin-onlabd3b64892015-01-20 13:26:24 -0800996 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -0800997 """
andrewonlabc8d47972014-10-09 16:52:36 -0400998 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -0800999 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001000 if needed
kelvin8ec71442015-01-15 16:57:00 -08001001 """
andrewonlabc8d47972014-10-09 16:52:36 -04001002 try:
kelvin8ec71442015-01-15 16:57:00 -08001003 self.handle.sendline( "" )
pingping-lin763ee042015-05-20 17:45:30 -07001004 self.handle.expect( "\$", timeout=60 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001005 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001006 self.handle.expect( "\$" )
andrewonlabc8d47972014-10-09 16:52:36 -04001007
kelvin-onlabd3b64892015-01-20 13:26:24 -08001008 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
andrewonlab9dfd2082014-11-13 17:44:03 -05001009
kelvin8ec71442015-01-15 16:57:00 -08001010 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001011 return main.TRUE
1012
pingping-lin763ee042015-05-20 17:45:30 -07001013 except pexpect.TIMEOUT:
1014 main.log.exception( self.name + ": Timeout in onosUninstall" )
1015 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001016 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001017 main.log.error( self.name + ": EOF exception found" )
1018 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -04001019 main.cleanup()
1020 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001021 except Exception:
1022 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc8d47972014-10-09 16:52:36 -04001023 main.cleanup()
1024 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001025
kelvin-onlabd3b64892015-01-20 13:26:24 -08001026 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001027 """
andrewonlabaedc8332014-12-04 12:43:03 -05001028 Issues the command 'onos-die <node-ip>'
1029 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001030 """
andrewonlabaedc8332014-12-04 12:43:03 -05001031 try:
kelvin8ec71442015-01-15 16:57:00 -08001032 self.handle.sendline( "" )
1033 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001034 cmdStr = "onos-kill " + str( nodeIp )
1035 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001036 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001037 "Killing\sONOS",
1038 "ONOS\sprocess\sis\snot\srunning",
kelvin8ec71442015-01-15 16:57:00 -08001039 pexpect.TIMEOUT ], timeout=20 )
andrewonlabaedc8332014-12-04 12:43:03 -05001040 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001041 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001042 " was killed and stopped" )
andrewonlabaedc8332014-12-04 12:43:03 -05001043 return main.TRUE
1044 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001045 main.log.info( "ONOS process was not running" )
andrewonlabaedc8332014-12-04 12:43:03 -05001046 return main.FALSE
1047 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001048 main.log.error( self.name + ": EOF exception found" )
1049 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -05001050 main.cleanup()
1051 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001052 except Exception:
1053 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabaedc8332014-12-04 12:43:03 -05001054 main.cleanup()
1055 main.exit()
1056
kelvin-onlabd3b64892015-01-20 13:26:24 -08001057 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001058 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001059 Calls the command: 'onos-kill [<node-ip>]'
1060 "Remotely, and unceremoniously kills the ONOS instance running on
1061 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001062 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001063 try:
kelvin8ec71442015-01-15 16:57:00 -08001064 self.handle.sendline( "" )
1065 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001066 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001067 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -04001068 "\$",
1069 "No\sroute\sto\shost",
1070 "password:",
kelvin8ec71442015-01-15 16:57:00 -08001071 pexpect.TIMEOUT ], timeout=20 )
1072
andrewonlabe8e56fd2014-10-09 17:12:44 -04001073 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001074 main.log.info(
1075 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001076 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001077 return main.TRUE
1078 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001079 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001080 return main.FALSE
1081 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001082 main.log.info(
1083 "Passwordless login for host: " +
1084 str( nodeIp ) +
1085 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001086 return main.FALSE
1087 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001088 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001089 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001090
andrewonlabe8e56fd2014-10-09 17:12:44 -04001091 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001092 main.log.error( self.name + ": EOF exception found" )
1093 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001094 main.cleanup()
1095 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001096 except Exception:
1097 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001098 main.cleanup()
1099 main.exit()
1100
kelvin-onlabd3b64892015-01-20 13:26:24 -08001101 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001102 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001103 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001104 a cleaner environment.
1105
andrewonlab19fbdca2014-11-14 12:55:59 -05001106 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001107 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001108 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001109 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001110 try:
kelvin8ec71442015-01-15 16:57:00 -08001111 self.handle.sendline( "" )
1112 self.handle.expect( "\$" )
1113 self.handle.sendline( "onos-remove-raft-logs" )
1114 # Sometimes this command hangs
1115 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1116 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001117 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001118 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1119 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001120 if i == 1:
1121 return main.FALSE
shahshreya957feaa2015-03-23 16:08:29 -07001122 #self.handle.sendline( "" )
1123 #self.handle.expect( "\$" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001124 return main.TRUE
1125
1126 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001127 main.log.error( self.name + ": EOF exception found" )
1128 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -05001129 main.cleanup()
1130 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001131 except Exception:
1132 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001133 main.cleanup()
1134 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -05001135
kelvin-onlabd3b64892015-01-20 13:26:24 -08001136 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001137 """
1138 Calls the command 'onos-start-network [ <mininet-topo> ]
1139 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001140 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001141 cell."
andrewonlab94282092014-10-10 13:00:11 -04001142 * Specify mininet topology file name for mntopo
1143 * Topo files should be placed at:
1144 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001145
andrewonlab94282092014-10-10 13:00:11 -04001146 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001147 """
andrewonlab94282092014-10-10 13:00:11 -04001148 try:
1149 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001150 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001151 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001152
kelvin8ec71442015-01-15 16:57:00 -08001153 mntopo = str( mntopo )
1154 self.handle.sendline( "" )
1155 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001156
kelvin8ec71442015-01-15 16:57:00 -08001157 self.handle.sendline( "onos-start-network " + mntopo )
1158 self.handle.expect( "mininet>" )
1159 main.log.info( "Network started, entered mininet prompt" )
1160
1161 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001162
1163 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001164 main.log.error( self.name + ": EOF exception found" )
1165 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001166 main.cleanup()
1167 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001168 except Exception:
1169 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -04001170 main.cleanup()
1171 main.exit()
1172
Cameron Franke9c94fb02015-01-21 10:20:20 -08001173 def isup(self, node = "", timeout = 120):
kelvin8ec71442015-01-15 16:57:00 -08001174 """
1175 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001176 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001177
Jon Hall7993bfc2014-10-09 16:30:14 -04001178 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001179 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001180 try:
Cameron Franke9c94fb02015-01-21 10:20:20 -08001181 self.handle.sendline("onos-wait-for-start " + node )
1182 self.handle.expect("onos-wait-for-start")
kelvin8ec71442015-01-15 16:57:00 -08001183 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001184 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
Jon Hall7993bfc2014-10-09 16:30:14 -04001185 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001186 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001187 return main.TRUE
1188 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001189 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001190 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001191 main.log.error( "ONOS has not started yet" )
1192 self.handle.send( "\x03" ) # Control-C
1193 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001194 return main.FALSE
1195 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001196 main.log.error( self.name + ": EOF exception found" )
1197 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001198 main.cleanup()
1199 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001200 except Exception:
1201 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001202 main.cleanup()
1203 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001204
kelvin-onlabd3b64892015-01-20 13:26:24 -08001205 def pushTestIntentsShell(
1206 self,
1207 dpidSrc,
1208 dpidDst,
1209 numIntents,
1210 dirFile,
1211 onosIp,
1212 numMult="",
1213 appId="",
1214 report=True,
1215 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001216 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001217 Description:
kelvin8ec71442015-01-15 16:57:00 -08001218 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001219 better parallelize the results than the CLI
1220 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001221 * dpidSrc: specify source dpid
1222 * dpidDst: specify destination dpid
1223 * numIntents: specify number of intents to push
1224 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001225 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001226 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001227 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001228 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001229 """
1230 try:
1231 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001232 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001233 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001234 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001235 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001236 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001237
kelvin-onlabd3b64892015-01-20 13:26:24 -08001238 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1239 if not numMult:
1240 addIntents = addDpid + " " + str( numIntents )
1241 elif numMult:
1242 addIntents = addDpid + " " + str( numIntents ) + " " +\
1243 str( numMult )
1244 if appId:
1245 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001246 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001247 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001248
andrewonlabaedc8332014-12-04 12:43:03 -05001249 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001250 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001251 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001252 sendCmd = addApp + " &"
1253 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001254
kelvin-onlabd3b64892015-01-20 13:26:24 -08001255 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001256
1257 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001258 main.log.error( self.name + ": EOF exception found" )
1259 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001260 main.cleanup()
1261 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001262 except Exception:
1263 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001264 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001265 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001266
kelvin-onlabd3b64892015-01-20 13:26:24 -08001267 def getTopology( self, topologyOutput ):
kelvin8ec71442015-01-15 16:57:00 -08001268 """
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001269 Definition:
1270 Loads a json topology output
1271 Return:
1272 topology = current ONOS topology
kelvin8ec71442015-01-15 16:57:00 -08001273 """
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001274 import json
Jon Hall77f53ce2014-10-13 18:02:06 -04001275 try:
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001276 # either onos:topology or 'topology' will work in CLI
1277 topology = json.loads(topologyOutput)
1278 print topology
Jon Hall77f53ce2014-10-13 18:02:06 -04001279 return topology
1280 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001281 main.log.error( self.name + ": EOF exception found" )
1282 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001283 main.cleanup()
1284 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001285 except Exception:
1286 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001287 main.cleanup()
1288 main.exit()
1289
kelvin-onlabd3b64892015-01-20 13:26:24 -08001290 def checkStatus(
1291 self,
1292 topologyResult,
1293 numoswitch,
1294 numolink,
1295 logLevel="info" ):
kelvin8ec71442015-01-15 16:57:00 -08001296 """
Jon Hallefbd9792015-03-05 16:11:36 -08001297 Checks the number of switches & links that ONOS sees against the
kelvin8ec71442015-01-15 16:57:00 -08001298 supplied values. By default this will report to main.log, but the
Jon Hallefbd9792015-03-05 16:11:36 -08001299 log level can be specific.
kelvin8ec71442015-01-15 16:57:00 -08001300
Jon Hall77f53ce2014-10-13 18:02:06 -04001301 Params: ip = ip used for the onos cli
1302 numoswitch = expected number of switches
Jon Hallefbd9792015-03-05 16:11:36 -08001303 numolink = expected number of links
kelvin-onlabd3b64892015-01-20 13:26:24 -08001304 logLevel = level to log to.
1305 Currently accepts 'info', 'warn' and 'report'
Jon Hall77f53ce2014-10-13 18:02:06 -04001306
1307
kelvin-onlabd3b64892015-01-20 13:26:24 -08001308 logLevel can
Jon Hall77f53ce2014-10-13 18:02:06 -04001309
Jon Hallefbd9792015-03-05 16:11:36 -08001310 Returns: main.TRUE if the number of switches and links are correct,
1311 main.FALSE if the number of switches and links is incorrect,
Jon Hall77f53ce2014-10-13 18:02:06 -04001312 and main.ERROR otherwise
kelvin8ec71442015-01-15 16:57:00 -08001313 """
Jon Hall77f53ce2014-10-13 18:02:06 -04001314 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001315 topology = self.getTopology( topologyResult )
Jon Hall77f53ce2014-10-13 18:02:06 -04001316 if topology == {}:
1317 return main.ERROR
1318 output = ""
kelvin8ec71442015-01-15 16:57:00 -08001319 # Is the number of switches is what we expected
shahshreya234a1682015-05-27 15:41:56 -07001320 devices = topology.get( 'devices', False )
1321 links = topology.get( 'links', False )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001322 if not devices or not links:
Jon Hall77f53ce2014-10-13 18:02:06 -04001323 return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -08001324 switchCheck = ( int( devices ) == int( numoswitch ) )
kelvin8ec71442015-01-15 16:57:00 -08001325 # Is the number of links is what we expected
kelvin-onlabd3b64892015-01-20 13:26:24 -08001326 linkCheck = ( int( links ) == int( numolink ) )
Jon Hallefbd9792015-03-05 16:11:36 -08001327 if switchCheck and linkCheck:
kelvin8ec71442015-01-15 16:57:00 -08001328 # We expected the correct numbers
Jon Hall77f53ce2014-10-13 18:02:06 -04001329 output = output + "The number of links and switches match "\
kelvin8ec71442015-01-15 16:57:00 -08001330 + "what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001331 result = main.TRUE
1332 else:
1333 output = output + \
Jon Hall274b6642015-02-17 11:57:17 -08001334 "The number of links and switches does not match " + \
1335 "what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001336 result = main.FALSE
Jon Hallefbd9792015-03-05 16:11:36 -08001337 output = output + "\n ONOS sees %i devices" % int( devices )
1338 output = output + " (%i expected) " % int( numoswitch )
Jon Hall274b6642015-02-17 11:57:17 -08001339 output = output + "and %i links " % int( links )
1340 output = output + "(%i expected)" % int( numolink )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001341 if logLevel == "report":
kelvin8ec71442015-01-15 16:57:00 -08001342 main.log.report( output )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001343 elif logLevel == "warn":
kelvin8ec71442015-01-15 16:57:00 -08001344 main.log.warn( output )
Jon Hall77f53ce2014-10-13 18:02:06 -04001345 else:
kelvin8ec71442015-01-15 16:57:00 -08001346 main.log.info( output )
1347 return result
Jon Hall77f53ce2014-10-13 18:02:06 -04001348 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001349 main.log.error( self.name + ": EOF exception found" )
1350 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001351 main.cleanup()
1352 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001353 except Exception:
1354 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001355 main.cleanup()
1356 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001357
kelvin-onlabd3b64892015-01-20 13:26:24 -08001358 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001359 """
andrewonlab970399c2014-11-07 13:09:32 -05001360 Capture all packet activity and store in specified
1361 directory/file
1362
1363 Required:
1364 * interface: interface to capture
1365 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001366 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001367 try:
1368 self.handle.sendline( "" )
1369 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001370
Jon Hallfebb1c72015-03-05 13:30:09 -08001371 self.handle.sendline( "tshark -i " + str( interface ) +
1372 " -t e -w " + str( dirFile ) + " &" )
1373 self.handle.sendline( "\r" )
1374 self.handle.expect( "Capturing on" )
1375 self.handle.sendline( "\r" )
1376 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001377
Jon Hallfebb1c72015-03-05 13:30:09 -08001378 main.log.info( "Tshark started capturing files on " +
1379 str( interface ) + " and saving to directory: " +
1380 str( dirFile ) )
1381 except pexpect.EOF:
1382 main.log.error( self.name + ": EOF exception found" )
1383 main.log.error( self.name + ": " + self.handle.before )
1384 main.cleanup()
1385 main.exit()
1386 except Exception:
1387 main.log.exception( self.name + ": Uncaught exception!" )
1388 main.cleanup()
1389 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001390
kelvin-onlabd3b64892015-01-20 13:26:24 -08001391 def runOnosTopoCfg( self, instanceName, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001392 """
kelvin-onlabd3b64892015-01-20 13:26:24 -08001393 On ONOS bench, run this command:
Jon Halle94919c2015-03-23 11:42:57 -07001394 {ONOS_HOME}/tools/test/bin/onos-topo-cfg $OC1 filename
kelvin-onlabd3b64892015-01-20 13:26:24 -08001395 which starts the rest and copies
1396 the json file to the onos instance
kelvin8ec71442015-01-15 16:57:00 -08001397 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001398 try:
kelvin8ec71442015-01-15 16:57:00 -08001399 self.handle.sendline( "" )
1400 self.handle.expect( "\$" )
Jon Halle94919c2015-03-23 11:42:57 -07001401 self.handle.sendline( "cd " + self.home + "/tools/test/bin" )
kelvin8ec71442015-01-15 16:57:00 -08001402 self.handle.expect( "/bin$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001403 cmd = "./onos-topo-cfg " + instanceName + " " + jsonFile
shahshreyae6c7cf42014-11-26 16:39:01 -08001404 print "cmd = ", cmd
kelvin8ec71442015-01-15 16:57:00 -08001405 self.handle.sendline( cmd )
1406 self.handle.expect( "\$" )
1407 self.handle.sendline( "cd ~" )
1408 self.handle.expect( "\$" )
shahshreyae6c7cf42014-11-26 16:39:01 -08001409 return main.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -08001410 except pexpect.EOF:
1411 main.log.error( self.name + ": EOF exception found" )
1412 main.log.error( self.name + ": " + self.handle.before )
1413 main.cleanup()
1414 main.exit()
1415 except Exception:
1416 main.log.exception( self.name + ": Uncaught exception!" )
1417 main.cleanup()
1418 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001419
jenkins1e99e7b2015-04-02 18:15:39 -07001420 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001421 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001422 Required:
kelvin8ec71442015-01-15 16:57:00 -08001423 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001424 * directory to store results
1425 Optional:
1426 * interface - default: eth0
jenkins1e99e7b2015-04-02 18:15:39 -07001427 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001428 Description:
1429 Uses tshark command to grep specific group of packets
1430 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001431 The timestamp is hardcoded to be in epoch
1432 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001433 try:
1434 self.handle.sendline( "" )
1435 self.handle.expect( "\$" )
1436 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001437 if grepOptions:
1438 grepStr = "grep "+str(grepOptions)
1439 else:
1440 grepStr = "grep"
1441
Jon Hallfebb1c72015-03-05 13:30:09 -08001442 self.handle.sendline(
1443 "tshark -i " +
1444 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001445 " -t e | " +
1446 grepStr + " --line-buffered \"" +
Jon Hallfebb1c72015-03-05 13:30:09 -08001447 str(grep) +
1448 "\" >" +
1449 directory +
1450 " &" )
1451 self.handle.sendline( "\r" )
1452 self.handle.expect( "Capturing on" )
1453 self.handle.sendline( "\r" )
1454 self.handle.expect( "\$" )
1455 except pexpect.EOF:
1456 main.log.error( self.name + ": EOF exception found" )
1457 main.log.error( self.name + ": " + self.handle.before )
1458 main.cleanup()
1459 main.exit()
1460 except Exception:
1461 main.log.exception( self.name + ": Uncaught exception!" )
1462 main.cleanup()
1463 main.exit()
1464
kelvin-onlabd3b64892015-01-20 13:26:24 -08001465 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001466 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001467 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001468 """
1469 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001470 try:
1471 self.execute( cmd="sudo rm /tmp/wireshark*" )
1472 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001473 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1474 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001475 self.handle.sendline( "" )
1476 main.log.info( "Tshark stopped" )
1477 except pexpect.EOF:
1478 main.log.error( self.name + ": EOF exception found" )
1479 main.log.error( self.name + ": " + self.handle.before )
1480 main.cleanup()
1481 main.exit()
1482 except Exception:
1483 main.log.exception( self.name + ": Uncaught exception!" )
1484 main.cleanup()
1485 main.exit()
1486
kelvin8ec71442015-01-15 16:57:00 -08001487 def ptpd( self, args ):
1488 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001489 Initiate ptp with user-specified args.
1490 Required:
1491 * args: specify string of args after command
1492 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001493 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001494 try:
kelvin8ec71442015-01-15 16:57:00 -08001495 self.handle.sendline( "sudo ptpd " + str( args ) )
1496 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001497 "Multiple",
1498 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001499 "\$" ] )
1500 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001501
andrewonlab0c38a4a2014-10-28 18:35:35 -04001502 if i == 0:
1503 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001504 main.log.info( "ptpd returned an error: " +
1505 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001506 return handle
1507 elif i == 1:
1508 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001509 main.log.error( "ptpd returned an error: " +
1510 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001511 return handle
1512 else:
1513 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001514
andrewonlab0c38a4a2014-10-28 18:35:35 -04001515 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001516 main.log.error( self.name + ": EOF exception found" )
1517 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001518 main.cleanup()
1519 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001520 except Exception:
1521 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001522 main.cleanup()
1523 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001524
kelvin-onlabd3b64892015-01-20 13:26:24 -08001525 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001526 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001527 """
1528 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001529 Current implementation of ONOS deletes its karaf
1530 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001531 you may want to use this function to capture
1532 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001533 Localtime will be attached to the filename
1534
1535 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001536 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001537 copy.
kelvin8ec71442015-01-15 16:57:00 -08001538 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001539 For copying multiple files, leave copyFileName
1540 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001541 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001542 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001543 ex ) /tmp/
1544 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001545 * copyFileName: If you want to rename the log
1546 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001547 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001548 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001549 try:
kelvin8ec71442015-01-15 16:57:00 -08001550 localtime = time.strftime( '%x %X' )
1551 localtime = localtime.replace( "/", "" )
1552 localtime = localtime.replace( " ", "_" )
1553 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001554 if destDir[ -1: ] != "/":
1555 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001556
kelvin-onlabd3b64892015-01-20 13:26:24 -08001557 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001558 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1559 str( destDir ) + str( copyFileName ) +
1560 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001561 self.handle.expect( "cp" )
1562 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001563 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001564 self.handle.sendline( "cp " + str( logToCopy ) +
1565 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001566 self.handle.expect( "cp" )
1567 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001568
kelvin8ec71442015-01-15 16:57:00 -08001569 return self.handle.before
1570
1571 except pexpect.EOF:
1572 main.log.error( "Copying files failed" )
1573 main.log.error( self.name + ": EOF exception found" )
1574 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001575 except Exception:
1576 main.log.exception( "Copying files failed" )
1577
Jon Hall16b72c42015-05-20 10:23:36 -07001578 def checkLogs( self, onosIp, restart=False):
kelvin8ec71442015-01-15 16:57:00 -08001579 """
Jon Hall94fd0472014-12-08 11:52:42 -08001580 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001581 If restart is True, use the old version of onos-check-logs which
1582 does not print the full stacktrace, but shows the entire log file,
1583 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001584 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001585 """
Jon Hall94fd0472014-12-08 11:52:42 -08001586 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001587 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001588 if restart:
1589 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001590 self.handle.sendline( cmd )
1591 self.handle.expect( cmd )
1592 self.handle.expect( "\$" )
Jon Hall94fd0472014-12-08 11:52:42 -08001593 response = self.handle.before
1594 return response
1595 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001596 main.log.error( "Lost ssh connection" )
1597 main.log.error( self.name + ": EOF exception found" )
1598 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001599 except Exception:
1600 main.log.exception( self.name + ": Uncaught exception!" )
1601 main.cleanup()
1602 main.exit()
Jon Hall94fd0472014-12-08 11:52:42 -08001603
kelvin-onlabd3b64892015-01-20 13:26:24 -08001604 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001605 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001606 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001607 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001608 try:
kelvin8ec71442015-01-15 16:57:00 -08001609 self.handle.sendline( "" )
1610 self.handle.expect( "\$" )
1611 self.handle.sendline( "onos-service " + str( node ) +
1612 " status" )
1613 i = self.handle.expect( [
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001614 "start/running",
1615 "stop/waiting",
kelvin8ec71442015-01-15 16:57:00 -08001616 pexpect.TIMEOUT ], timeout=120 )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001617
1618 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001619 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001620 return main.TRUE
1621 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001622 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001623 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001624 main.cleanup()
1625 main.exit()
1626 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001627 main.log.error( self.name + ": EOF exception found" )
1628 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001629 main.cleanup()
1630 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001631 except Exception:
1632 main.log.exception( self.name + ": Uncaught exception!" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001633 main.cleanup()
1634 main.exit()
Jon Hall21270ac2015-02-16 17:59:55 -08001635
Jon Hall63604932015-02-26 17:09:50 -08001636 def setIpTables( self, ip, port='', action='add', packet_type='',
1637 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001638 """
Jon Hall21270ac2015-02-16 17:59:55 -08001639 Description:
1640 add or remove iptables rule to DROP (default) packets from
1641 specific IP and PORT
1642 Usage:
1643 * specify action ('add' or 'remove')
1644 when removing, pass in the same argument as you would add. It will
1645 delete that specific rule.
1646 * specify the ip to block
1647 * specify the destination port to block (defaults to all ports)
1648 * optional packet type to block (default tcp)
1649 * optional iptables rule (default DROP)
1650 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001651 * States boolean toggles adding all supported tcp states to the
1652 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001653 Returns:
1654 main.TRUE on success or
1655 main.FALSE if given invalid input or
1656 main.ERROR if there is an error in response from iptables
1657 WARNING:
1658 * This function uses root privilege iptables command which may result
1659 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001660 """
Jon Hall21270ac2015-02-16 17:59:55 -08001661 import time
1662
1663 # NOTE*********
1664 # The strict checking methods of this driver function is intentional
1665 # to discourage any misuse or error of iptables, which can cause
1666 # severe network errors
1667 # *************
1668
1669 # NOTE: Sleep needed to give some time for rule to be added and
1670 # registered to the instance. If you are calling this function
1671 # multiple times this sleep will prevent any errors.
1672 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001673 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001674 try:
1675 # input validation
1676 action_type = action.lower()
1677 rule = rule.upper()
1678 direction = direction.upper()
1679 if action_type != 'add' and action_type != 'remove':
1680 main.log.error( "Invalid action type. Use 'add' or "
1681 "'remove' table rule" )
1682 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1683 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1684 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1685 "'ACCEPT' or 'LOG' only." )
1686 if direction != 'INPUT' and direction != 'OUTPUT':
1687 # NOTE currently only supports rules INPUT and OUPTUT
1688 main.log.error( "Invalid rule. Valid directions are"
1689 " 'OUTPUT' or 'INPUT'" )
1690 return main.FALSE
1691 return main.FALSE
1692 return main.FALSE
1693 if action_type == 'add':
1694 # -A is the 'append' action of iptables
1695 actionFlag = '-A'
1696 elif action_type == 'remove':
1697 # -D is the 'delete' rule of iptables
1698 actionFlag = '-D'
1699 self.handle.sendline( "" )
1700 self.handle.expect( "\$" )
1701 cmd = "sudo iptables " + actionFlag + " " +\
1702 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001703 " -s " + str( ip )
Jon Hall63604932015-02-26 17:09:50 -08001704 # " -p " + str( packet_type ) +\
1705 if packet_type:
1706 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001707 if port:
1708 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001709 if states:
1710 cmd += " -m state --state="
1711 #FIXME- Allow user to configure which states to block
1712 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001713 cmd += " -j " + str( rule )
1714
1715 self.handle.sendline( cmd )
1716 self.handle.expect( "\$" )
1717 main.log.warn( self.handle.before )
1718
1719 info_string = "On " + str( self.name )
1720 info_string += " " + str( action_type )
1721 info_string += " iptable rule [ "
1722 info_string += " IP: " + str( ip )
1723 info_string += " Port: " + str( port )
1724 info_string += " Rule: " + str( rule )
1725 info_string += " Direction: " + str( direction ) + " ]"
1726 main.log.info( info_string )
1727 return main.TRUE
1728 except pexpect.TIMEOUT:
1729 main.log.exception( self.name + ": Timeout exception in "
1730 "setIpTables function" )
1731 return main.ERROR
1732 except pexpect.EOF:
1733 main.log.error( self.name + ": EOF exception found" )
1734 main.log.error( self.name + ": " + self.handle.before )
1735 main.cleanup()
1736 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001737 except Exception:
1738 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall21270ac2015-02-16 17:59:55 -08001739 main.cleanup()
1740 main.exit()
1741
Jon Hall0468b042015-02-19 19:08:21 -08001742 def detailed_status(self, log_filename):
Jon Hallefbd9792015-03-05 16:11:36 -08001743 """
Jon Hall0468b042015-02-19 19:08:21 -08001744 This method is used by STS to check the status of the controller
1745 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001746 """
Jon Hall0468b042015-02-19 19:08:21 -08001747 import re
1748 try:
1749 self.handle.sendline( "" )
1750 self.handle.expect( "\$" )
1751 self.handle.sendline( "cd " + self.home )
1752 self.handle.expect( "\$" )
1753 self.handle.sendline( "service onos status" )
1754 self.handle.expect( "\$" )
1755 response = self.handle.before
1756 if re.search( "onos start/running", response ):
1757 # onos start/running, process 10457
1758 return 'RUNNING'
1759 # FIXME: Implement this case
1760 # elif re.search( pattern, response ):
1761 # return 'STARTING'
1762 elif re.search( "onos stop/", response ):
1763 # onos stop/waiting
1764 # FIXME handle this differently?: onos stop/pre-stop
1765 return 'STOPPED'
1766 # FIXME: Implement this case
1767 # elif re.search( pattern, response ):
1768 # return 'FROZEN'
1769 else:
1770 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001771 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001772 main.log.warn( response )
1773 return 'ERROR', "Unknown response: %s" % response
1774 except pexpect.TIMEOUT:
1775 main.log.exception( self.name + ": Timeout exception in "
1776 "setIpTables function" )
1777 return 'ERROR', "Pexpect Timeout"
1778 except pexpect.EOF:
1779 main.log.error( self.name + ": EOF exception found" )
1780 main.log.error( self.name + ": " + self.handle.before )
1781 main.cleanup()
1782 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001783 except Exception:
1784 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall0468b042015-02-19 19:08:21 -08001785 main.cleanup()
1786 main.exit()
1787
andrew@onlab.us3b087132015-03-11 15:00:08 -07001788 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1789 '''
1790 Create/formats the LinkGraph.cfg file based on arguments
1791 -only creates a linear topology and connects islands
1792 -evenly distributes devices
1793 -must be called by ONOSbench
1794
1795 ONOSIpList - list of all of the node IPs to be used
1796
1797 deviceCount - number of switches to be assigned
1798 '''
1799 main.log.step("Creating link graph configuration file." )
1800 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
1801 tempFile = "/tmp/linkGraph.cfg"
1802
1803 linkGraph = open(tempFile, 'w+')
1804 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1805 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1806 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
1807
1808 clusterCount = len(ONOSIpList)
1809
1810 if type(deviceCount) is int or type(deviceCount) is str:
1811 deviceCount = int(deviceCount)
1812 switchList = [0]*(clusterCount+1)
1813 baselineSwitchCount = deviceCount/clusterCount
1814
1815 for node in range(1, clusterCount + 1):
1816 switchList[node] = baselineSwitchCount
1817
1818 for node in range(1, (deviceCount%clusterCount)+1):
1819 switchList[node] += 1
1820
1821 if type(deviceCount) is list:
1822 main.log.info("Using provided device distribution")
1823 switchList = [0]
1824 for i in deviceCount:
1825 switchList.append(int(i))
1826
1827 tempList = ['0']
1828 tempList.extend(ONOSIpList)
1829 ONOSIpList = tempList
1830
1831 myPort = 6
1832 lastSwitch = 0
1833 for node in range(1, clusterCount+1):
1834 if switchList[node] == 0:
1835 continue
1836
1837 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
1838
1839 if node > 1:
1840 #connect to last device on previous node
1841 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1842 linkGraph.write(line)
1843
1844 lastSwitch = 0
1845 for switch in range (0, switchList[node]-1):
1846 line = ""
1847 line = ("\t" + str(switch) + ":" + str(myPort))
1848 line += " -- "
1849 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1850 linkGraph.write(line)
1851 lastSwitch = switch+1
1852 lastIp = ONOSIpList[node]
1853
1854 #lastSwitch += 1
1855 if node < (clusterCount):
1856 #connect to first device on the next node
1857 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
1858 linkGraph.write(line)
1859
1860 linkGraph.write("}\n")
1861 linkGraph.close()
1862
1863 #SCP
1864 os.system( "scp " + tempFile + " admin@" + benchIp + ":" + linkGraphPath)
1865 main.log.info("linkGraph.cfg creation complete")
1866
cameron@onlab.us75900962015-03-30 13:22:49 -07001867 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001868
1869 '''
andrew@onlab.us3b087132015-03-11 15:00:08 -07001870 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
cameron@onlab.us75900962015-03-30 13:22:49 -07001871 deviceCount = number of switches to distribute, or list of values to use as custom distribution
1872 numPorts = number of ports per device. Defaults to 10 both in this function and in ONOS. Optional arg
andrew@onlab.us3b087132015-03-11 15:00:08 -07001873 '''
1874
cameron@onlab.us75900962015-03-30 13:22:49 -07001875 main.log.step("Configuring Null Device Provider" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001876 clusterCount = len(ONOSIpList)
1877
cameron@onlab.us75900962015-03-30 13:22:49 -07001878 try:
1879
1880 if type(deviceCount) is int or type(deviceCount) is str:
1881 main.log.step("Creating device distribution")
1882 deviceCount = int(deviceCount)
1883 switchList = [0]*(clusterCount+1)
1884 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001885
cameron@onlab.us75900962015-03-30 13:22:49 -07001886 for node in range(1, clusterCount + 1):
1887 switchList[node] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001888
cameron@onlab.us75900962015-03-30 13:22:49 -07001889 for node in range(1, (deviceCount%clusterCount)+1):
1890 switchList[node] += 1
1891
1892 if type(deviceCount) is list:
1893 main.log.info("Using provided device distribution")
1894
1895 if len(deviceCount) == clusterCount:
1896 switchList = ['0']
1897 switchList.extend(deviceCount)
1898
1899 if len(deviceCount) == (clusterCount + 1):
1900 if deviceCount[0] == '0' or deviceCount[0] == 0:
1901 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001902
cameron@onlab.us75900962015-03-30 13:22:49 -07001903 assert len(switchList) == (clusterCount + 1)
1904
1905 except AssertionError:
1906 main.log.error( "Bad device/Ip list match")
1907 except TypeError:
1908 main.log.exception( self.name + ": Object not as expected" )
1909 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07001910 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07001911 main.log.exception( self.name + ": Uncaught exception!" )
1912 main.cleanup()
1913 main.exit()
1914
andrew@onlab.us3b087132015-03-11 15:00:08 -07001915
1916 ONOSIp = [0]
1917 ONOSIp.extend(ONOSIpList)
1918
1919 devicesString = "devConfigs = "
1920 for node in range(1, len(ONOSIp)):
1921 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
1922 if node < clusterCount:
1923 devicesString += (",")
cameron@onlab.us75900962015-03-30 13:22:49 -07001924
1925 try:
1926 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
1927 self.handle.expect(":~")
1928 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
1929 self.handle.expect(":~")
andrew@onlab.us3b087132015-03-11 15:00:08 -07001930
cameron@onlab.us75900962015-03-30 13:22:49 -07001931 for i in range(10):
1932 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
1933 self.handle.expect(":~")
1934 verification = self.handle.before
1935 if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
1936 break
1937 else:
1938 time.sleep(1)
andrew@onlab.us3b087132015-03-11 15:00:08 -07001939
cameron@onlab.us2cc8bf12015-04-02 14:12:30 -07001940 assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
cameron@onlab.us75900962015-03-30 13:22:49 -07001941
1942 except AssertionError:
1943 main.log.error("Incorrect Config settings: " + verification)
Jon Hall77ba41c2015-04-06 10:25:40 -07001944 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07001945 main.log.exception( self.name + ": Uncaught exception!" )
1946 main.cleanup()
1947 main.exit()
1948
cameron@onlab.usc80a8c82015-04-15 14:57:37 -07001949 def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001950 '''
cameron@onlab.us75900962015-03-30 13:22:49 -07001951 fileName default is currently the same as the default on ONOS, specify alternate file if
1952 you want to use a different topology file than linkGraph.cfg
andrew@onlab.us3b087132015-03-11 15:00:08 -07001953 '''
1954
andrew@onlab.us3b087132015-03-11 15:00:08 -07001955
cameron@onlab.us75900962015-03-30 13:22:49 -07001956 try:
1957 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
1958 self.handle.expect(":~")
1959 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
1960 self.handle.expect(":~")
1961
1962 for i in range(10):
1963 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
1964 self.handle.expect(":~")
1965 verification = self.handle.before
1966 if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
1967 break
1968 else:
1969 time.sleep(1)
1970
1971 assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
1972
1973 except pexpect.EOF:
1974 main.log.error( self.name + ": EOF exception found" )
1975 main.log.error( self.name + ": " + self.handle.before )
1976 main.cleanup()
1977 main.exit()
cameron@onlab.us75900962015-03-30 13:22:49 -07001978 except AssertionError:
1979 main.log.info("Settings did not post to ONOS")
1980 main.log.error(varification)
Jon Hall77ba41c2015-04-06 10:25:40 -07001981 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07001982 main.log.exception( self.name + ": Uncaught exception!" )
1983 main.log.error(varification)
1984 main.cleanup()
1985 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07001986
cameron@onlab.us966d1be2015-05-15 14:54:09 -07001987 def getOnosIps(self):
cameron@onlab.us59d29d92015-05-11 14:31:54 -07001988
1989 import os
kelvin-onlab0a28a742015-05-18 16:03:13 -07001990
cameron@onlab.us966d1be2015-05-15 14:54:09 -07001991 # reads env for OC variables, also saves file with OC variables. If file and env conflict
1992 # priority goes to env. If file has OCs that are not in the env, the file OCs are used.
1993 # In other words, if the env is set, the test will use those values.
cameron@onlab.us59d29d92015-05-11 14:31:54 -07001994
cameron@onlab.us966d1be2015-05-15 14:54:09 -07001995 # returns a list of ip addresses for the onos nodes, will work with up to 7 nodes + OCN and OCI
1996 # returns in format [ OC1 ip, OC2 ...ect. , OCN, OCI ]
1997
1998 envONOSIps = {}
cameron@onlab.us59d29d92015-05-11 14:31:54 -07001999
2000 x = 1
2001 while True:
2002 try:
2003 temp = os.environ[ 'OC' + str(x) ]
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002004 except KeyError:
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002005 break
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002006 envONOSIps[ ("OC" + str(x)) ] = temp
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002007 x += 1
2008
2009 try:
2010 temp = os.environ[ 'OCN' ]
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002011 envONOSIps[ "OCN" ] = temp
2012 except KeyError:
2013 main.log.info("OCN not set in env")
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002014
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002015 try:
2016 temp = os.environ[ 'OCI' ]
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002017 envONOSIps[ "OCI" ] = temp
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002018 except:
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002019 main.log.error("OCI not set in env")
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002020
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002021 print(str(envONOSIps))
2022
2023 order = [ "OC1", "OC2", "OC3","OC4","OC5","OC6","OC7","OCN","OCI" ]
2024 ONOSIps = []
2025
2026 try:
cameron@onlab.us2e166212015-05-19 14:28:25 -07002027 if os.path.exists("myIps"):
2028 ipFile = open("myIps","r+")
2029 else:
2030 ipFile = open("myIps","w+")
2031
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002032 fileONOSIps = ipFile.readlines()
2033 ipFile.close()
2034
2035 print str(fileONOSIps)
2036
2037 if str(fileONOSIps) == "[]":
2038 ipFile = open("myIps","w+")
2039 for key in envONOSIps:
2040 ipFile.write(key+ "=" + envONOSIps[key] + "\n")
2041 ipFile.close()
2042 for i in order:
2043 if i in envONOSIps:
2044 ONOSIps.append(envONOSIps[i])
2045
2046 return ONOSIps
2047
2048 else:
2049 fileDict = {}
2050 for line in fileONOSIps:
2051 line = line.replace("\n","")
2052 line = line.split("=")
2053 key = line[0]
2054 value = line[1]
2055 fileDict[key] = value
2056
2057 for x in envONOSIps:
2058 if x in fileDict:
2059 if envONOSIps[x] == fileDict[x]:
2060 continue
2061 else:
2062 fileDict[x] = envONOSIps[x]
2063 else:
2064 fileDict[x] = envONOSIps[x]
2065
2066 ipFile = open("myIps","w+")
2067 for key in order:
2068 if key in fileDict:
2069 ipFile.write(key + "=" + fileDict[key] + "\n")
2070 ONOSIps.append(fileDict[key])
2071 ipFile.close()
2072
2073 return ONOSIps
2074
2075 except IOError as a:
2076 main.log.error(a)
2077
kelvin-onlab0a28a742015-05-18 16:03:13 -07002078 except Exception as a:
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002079 main.log.error(a)
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002080
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002081
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002082 def logReport(self, nodeIp, searchTerms, outputMode="s"):
2083 '''
2084 - accepts either a list or a string for "searchTerms" these
2085 terms will be searched for in the log and have their
2086 instances counted
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002087
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002088 - nodeIp is the ip of the node whos log is to be scanned
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002089
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002090 - output modes:
2091 "s" - Simple. Quiet output mode that just prints
cameron@onlab.us2e166212015-05-19 14:28:25 -07002092 the occurences of each search term
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002093
cameron@onlab.us2e166212015-05-19 14:28:25 -07002094 "d" - Detailed. Prints number of occurences as well as the entire
2095 line for each of the last 5 occurences
2096
2097 - returns total of the number of instances of all search terms
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002098 '''
2099 main.log.info("========================== Log Report ===========================\n")
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002100
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002101 if type(searchTerms) is str:
2102 searchTerms = [searchTerms]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002103
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002104 logLines = [ [" "] for i in range(len(searchTerms)) ]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002105
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002106 for term in range(len(searchTerms)):
2107 logLines[term][0] = searchTerms[term]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002108
cameron@onlab.us2e166212015-05-19 14:28:25 -07002109 totalHits = 0
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002110 for term in range(len(searchTerms)):
2111 cmd = "onos-ssh " + nodeIp + " cat /opt/onos/log/karaf.log | grep " + searchTerms[term]
2112 self.handle.sendline(cmd)
2113 self.handle.expect(":~")
2114 before = (self.handle.before).splitlines()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002115
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002116 count = [searchTerms[term],0]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002117
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002118 for line in before:
2119 if searchTerms[term] in line and "grep" not in line:
2120 count[1] += 1
2121 if before.index(line) > ( len(before) - 7 ):
2122 logLines[term].append(line)
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002123
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002124 main.log.info( str(count[0]) + ": " + str(count[1]) )
2125 if term == len(searchTerms)-1:
2126 print("\n")
cameron@onlab.us2e166212015-05-19 14:28:25 -07002127 totalHits += int(count[1])
2128
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002129 if outputMode != "s" and outputMode != "S":
2130 outputString = ""
2131 for i in logLines:
2132 outputString = i[0] + ": \n"
2133 for x in range(1,len(i)):
2134 outputString += ( i[x] + "\n" )
2135
2136 if outputString != (i[0] + ": \n"):
2137 main.log.info(outputString)
2138
2139 main.log.info("================================================================\n")
cameron@onlab.us2e166212015-05-19 14:28:25 -07002140 return totalHits
pingping-lin763ee042015-05-20 17:45:30 -07002141
Hari Krishnaade11a72015-07-01 17:06:46 -07002142 def getOnosIPfromCell(self):
2143 '''
2144 Returns the ONOS node names and their IP addresses as defined in the cell and applied to shell environment
Hari Krishnaa25104c2015-07-09 22:34:01 -07002145 Example output return: ['10.128.40.41','10.128.40.42','10.128.40.43']. This will work even if the Mininet is
2146 not part of the cell definition and also if there are multiple mininets, just by using static hostname
2147 in TOPO file.
2148 '''
Hari Krishnaade11a72015-07-01 17:06:46 -07002149 import re
2150 try:
2151 # Clean handle by sending empty and expecting $
2152 self.handle.sendline( "" )
2153 self.handle.expect( "\$" )
2154 self.handle.sendline( "cell" )
2155 self.handle.expect( "\$" )
2156 handleBefore = self.handle.before
2157 handleAfter = self.handle.after
2158 # Get the rest of the handle
2159 self.handle.sendline( "" )
2160 self.handle.expect( "\$" )
2161 handleMore = self.handle.before
2162 ipList = []
2163 cellOutput = handleBefore + handleAfter + handleMore
2164 cellOutput = cellOutput.replace("\r\r","")
2165 cellOutput = cellOutput.splitlines()
2166 for i in range( len(cellOutput) ):
2167 if( re.match( "OC", cellOutput[i] ) ):
2168 if( re.match( "OCI", cellOutput[i] ) or re.match( "OCN", cellOutput[i] ) ):
2169 continue
2170 else:
2171 onosIP = cellOutput[i].split("=")
Hari Krishnac195f3b2015-07-08 20:02:24 -07002172 ipList.append(onosIP[1])
Hari Krishnaade11a72015-07-01 17:06:46 -07002173 return ipList
2174 except pexpect.ExceptionPexpect as e:
2175 main.log.error( self.name + ": Pexpect exception found of type " +
2176 str( type( e ) ) )
2177 main.log.error ( e.get_trace() )
2178 main.log.error( self.name + ": " + self.handle.before )
2179 main.cleanup()
2180 main.exit()
2181 except Exception:
2182 main.log.exception( self.name + ": Uncaught exception!" )
2183 main.cleanup()
2184 main.exit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002185
2186 def copyMininetFile( self, fileName, localPath, userName, ip,
2187 mnPath='~/mininet/custom/', timeout = 60 ):
2188 """
2189 Description:
2190 Copy mininet topology file from dependency folder in the test folder
2191 and paste it to the mininet machine's mininet/custom folder
2192 Required:
2193 fileName - Name of the topology file to copy
2194 localPath - File path of the mininet topology file
2195 userName - User name of the mininet machine to send the file to
2196 ip - Ip address of the mininet machine
2197 Optional:
2198 mnPath - of the mininet directory to send the file to
2199 Return:
2200 Return main.TRUE if successfully copied the file otherwise
2201 return main.FALSE
2202 """
2203
2204 try:
2205 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2206 str( ip ) + ":" + mnPath + fileName
2207
2208 self.handle.sendline( "" )
2209 self.handle.expect( "\$" )
2210
2211 main.log.info( self.name + ": Execute: " + cmd )
2212
2213 self.handle.sendline( cmd )
2214
2215 i = self.handle.expect( [ 'No such file',
2216 "100%",
2217 pexpect.TIMEOUT ] )
2218
2219 if i == 0:
2220 main.log.error( self.name + ": File " + fileName +
2221 " does not exist!" )
2222 return main.FALSE
2223
2224 if i == 1:
2225 main.log.info( self.name + ": File " + fileName +
2226 " has been copied!" )
2227 self.handle.sendline( "" )
2228 self.handle.expect( "\$" )
2229 return main.TRUE
2230
2231 except pexpect.EOF:
2232 main.log.error( self.name + ": EOF exception found" )
2233 main.log.error( self.name + ": " + self.handle.before )
2234 main.cleanup()
2235 main.exit()
2236 except pexpect.TIMEOUT:
2237 main.log.error( self.name + ": TIMEOUT exception found" )
2238 main.log.error( self.name + ": " + self.handle.before )
2239 main.cleanup()
2240 main.exit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002241
2242 def jvmSet(self, memory=8):
2243
2244 import os
2245
2246 homeDir = os.path.expanduser('~')
2247 filename = "/onos/tools/package/bin/onos-service"
2248
2249 serviceConfig = open(homeDir + filename, 'w+')
2250 serviceConfig.write("#!/bin/bash\n ")
2251 serviceConfig.write("#------------------------------------- \n ")
2252 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
2253 serviceConfig.write("#------------------------------------- \n ")
2254 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
2255 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
2256 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
2257 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
2258 serviceConfig.close()
2259
2260 def createDBFile(self, testData):
2261
2262 filename = main.TEST + "DB"
2263 DBString = ""
2264
2265 for item in testData:
2266 if type(item) is string:
2267 item = "'" + item + "'"
2268 if testData.index(item) < len(testData-1):
2269 item += ","
2270 DBString += str(item)
2271
2272 DBFile = open(filename, "a")
2273 DBFile.write(DBString)
2274 DBFile.close()
2275
2276 def verifySummary(self, ONOSIp,*deviceCount):
2277
2278 self.handle.sendline("onos " + ONOSIp + " summary")
2279 self.handle.expect(":~")
2280
2281 summaryStr = self.handle.before
2282 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2283
2284 #passed = "SCC(s)=1" in summaryStr
2285 #if deviceCount:
2286 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
2287
2288
2289 if "SCC(s)=1," in summaryStr:
2290 passed = True
2291 print("Summary is verifed")
2292 else:
2293 print("Summary failed")
2294
2295 if deviceCount:
2296 print" ============================="
2297 checkStr = "devices=" + str(deviceCount[0]) + ","
2298 print "Checkstr: " + checkStr
2299 if checkStr not in summaryStr:
2300 passed = False
2301 print("Device count failed")
2302 else:
2303 print "device count verified"
2304
2305 return passed