blob: 37d55fec7a0999bd8bb0c2199b2732c8ed04f87b [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
kelvin-onlaba4074292015-07-09 15:19:49 -070022import os
andrewonlab7735d852014-10-09 13:02:47 -040023import os.path
pingping-lin6d23d9e2015-02-02 16:54:24 -080024from requests.models import Response
kelvin8ec71442015-01-15 16:57:00 -080025sys.path.append( "../" )
Jon Hall05b2b432014-10-08 19:53:25 -040026from drivers.common.clidriver import CLI
27
Jon Hall05b2b432014-10-08 19:53:25 -040028
kelvin8ec71442015-01-15 16:57:00 -080029class OnosDriver( CLI ):
Jon Hall05b2b432014-10-08 19:53:25 -040030
kelvin8ec71442015-01-15 16:57:00 -080031 def __init__( self ):
32 """
33 Initialize client
34 """
Jon Hallefbd9792015-03-05 16:11:36 -080035 self.name = None
36 self.home = None
37 self.handle = None
kelvin8ec71442015-01-15 16:57:00 -080038 super( CLI, self ).__init__()
39
40 def connect( self, **connectargs ):
41 """
Jon Hall05b2b432014-10-08 19:53:25 -040042 Creates ssh handle for ONOS "bench".
kelvin-onlaba4074292015-07-09 15:19:49 -070043 NOTE:
44 The ip_address would come from the topo file using the host tag, the
45 value can be an environment variable as well as a "localhost" to get
46 the ip address needed to ssh to the "bench"
kelvin8ec71442015-01-15 16:57:00 -080047 """
Jon Hall05b2b432014-10-08 19:53:25 -040048 try:
49 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080050 vars( self )[ key ] = connectargs[ key ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070051 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040052 for key in self.options:
53 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080054 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040055 break
Jon Hall274b6642015-02-17 11:57:17 -080056 if self.home is None or self.home == "":
Jon Halle94919c2015-03-23 11:42:57 -070057 self.home = "~/onos"
Jon Hall21270ac2015-02-16 17:59:55 -080058
kelvin8ec71442015-01-15 16:57:00 -080059 self.name = self.options[ 'name' ]
kelvin-onlaba4074292015-07-09 15:19:49 -070060
61 for key in self.options:
62 if key == "nodes":
63 # Maximum number of ONOS nodes to run
64 self.maxNodes = int( self.options[ 'nodes' ] )
65 break
66 self.maxNodes = None
67
68
69 # Grabs all OC environment variables
70 self.onosIps = {} # Dictionary of all possible ONOS ip
71
72 try:
73 if self.maxNodes:
74 main.log.info( self.name + ": Creating cluster data with " +
75 str( self.maxNodes ) + " maximum number" +
76 " of nodes" )
77
78 for i in range( self.maxNodes ):
79 envString = "OC" + str( i + 1 )
80 self.onosIps[ envString ] = os.getenv( envString )
81
82 if not self.onosIps:
83 main.log.info( "Could not read any environment variable"
84 + " please load a cell file with all" +
85 " onos IP" )
86 else:
87 main.log.info( self.name + ": Found " +
88 str( self.onosIps.values() ) +
89 " ONOS IPs" )
90
91 except KeyError:
92 main.log.info( "Invalid environment variable" )
93 except Exception as inst:
94 main.log.error( "Uncaught exception: " + str( inst ) )
95
96 try:
97 if os.getenv( str( self.ip_address ) ) != None:
98 self.ip_address = os.getenv( str( self.ip_address ) )
99 else:
100 main.log.info( self.name +
101 ": Trying to connect to " +
102 self.ip_address )
103
104 except KeyError:
105 main.log.info( "Invalid host name," +
106 " connecting to local host instead" )
107 self.ip_address = 'localhost'
108 except Exception as inst:
109 main.log.error( "Uncaught exception: " + str( inst ) )
110
kelvin8ec71442015-01-15 16:57:00 -0800111 self.handle = super( OnosDriver, self ).connect(
112 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -0800113 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -0800114 port=self.port,
115 pwd=self.pwd,
116 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -0400117
Jon Hall05b2b432014-10-08 19:53:25 -0400118 if self.handle:
Jon Hall0fc0d452015-07-14 09:49:58 -0700119 self.handle.sendline( "cd " + self.home )
120 self.handle.expect( "\$" )
Jon Hall05b2b432014-10-08 19:53:25 -0400121 return self.handle
kelvin8ec71442015-01-15 16:57:00 -0800122 else:
Jon Hall0fc0d452015-07-14 09:49:58 -0700123 main.log.info( "Failed to create ONOS handle" )
Jon Hall05b2b432014-10-08 19:53:25 -0400124 return main.FALSE
125 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800126 main.log.error( self.name + ": EOF exception found" )
127 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -0400128 main.cleanup()
129 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800130 except Exception:
131 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall05b2b432014-10-08 19:53:25 -0400132 main.cleanup()
133 main.exit()
134
kelvin8ec71442015-01-15 16:57:00 -0800135 def disconnect( self ):
136 """
Jon Hall05b2b432014-10-08 19:53:25 -0400137 Called when Test is complete to disconnect the ONOS handle.
kelvin8ec71442015-01-15 16:57:00 -0800138 """
Jon Halld61331b2015-02-17 16:35:47 -0800139 response = main.TRUE
Jon Hall05b2b432014-10-08 19:53:25 -0400140 try:
Jon Hall61282e32015-03-19 11:34:11 -0700141 if self.handle:
142 self.handle.sendline( "" )
143 self.handle.expect( "\$" )
144 self.handle.sendline( "exit" )
145 self.handle.expect( "closed" )
Jon Hall05b2b432014-10-08 19:53:25 -0400146 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800147 main.log.error( self.name + ": EOF exception found" )
148 main.log.error( self.name + ": " + self.handle.before )
Jon Hall61282e32015-03-19 11:34:11 -0700149 except ValueError:
Jon Hall1a77a1e2015-04-06 10:41:13 -0700150 main.log.exception( "Exception in disconnect of " + self.name )
Jon Hall61282e32015-03-19 11:34:11 -0700151 response = main.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -0800152 except Exception:
153 main.log.exception( self.name + ": Connection failed to the host" )
Jon Hall05b2b432014-10-08 19:53:25 -0400154 response = main.FALSE
155 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400156
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400157 def getEpochMs( self ):
158 """
159 Returns milliseconds since epoch
160
161 When checking multiple nodes in a for loop,
162 around a hundred milliseconds of difference (ascending) is
163 generally acceptable due to calltime of the function.
164 Few seconds, however, is not and it means clocks
165 are off sync.
166 """
167 try:
168 self.handle.sendline( 'date +%s.%N' )
169 self.handle.expect( 'date \+\%s\.\%N' )
170 self.handle.expect( '\$' )
171 epochMs = self.handle.before
172 return epochMs
173 except Exception:
174 main.log.exception( 'Uncaught exception getting epoch time' )
175 main.cleanup()
176 main.exit()
177
pingping-lin57a56ce2015-05-20 16:43:48 -0700178 def onosPackage( self, opTimeout=30 ):
kelvin8ec71442015-01-15 16:57:00 -0800179 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400180 Produce a self-contained tar.gz file that can be deployed
kelvin8ec71442015-01-15 16:57:00 -0800181 and executed on any platform with Java 7 JRE.
182 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400183 try:
kelvin8ec71442015-01-15 16:57:00 -0800184 self.handle.sendline( "onos-package" )
185 self.handle.expect( "onos-package" )
pingping-lin57a56ce2015-05-20 16:43:48 -0700186 self.handle.expect( "tar.gz", opTimeout )
kelvin8ec71442015-01-15 16:57:00 -0800187 handle = str( self.handle.before )
188 main.log.info( "onos-package command returned: " +
189 handle )
190 # As long as the sendline does not time out,
191 # return true. However, be careful to interpret
192 # the results of the onos-package command return
andrewonlab0748d2a2014-10-09 13:24:17 -0400193 return main.TRUE
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400194
andrewonlab7735d852014-10-09 13:02:47 -0400195 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800196 main.log.error( self.name + ": EOF exception found" )
197 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800198 except Exception:
199 main.log.exception( "Failed to package ONOS" )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400200 main.cleanup()
201 main.exit()
202
kelvin-onlabd3b64892015-01-20 13:26:24 -0800203 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800204 """
andrewonlab8790abb2014-11-06 13:51:54 -0500205 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800206 """
andrewonlab8790abb2014-11-06 13:51:54 -0500207 try:
kelvin8ec71442015-01-15 16:57:00 -0800208 self.handle.sendline( "onos-build" )
209 self.handle.expect( "onos-build" )
210 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800211 "BUILD SUCCESS",
212 "ERROR",
213 "BUILD FAILED" ],
214 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800215 handle = str( self.handle.before )
andrewonlab8790abb2014-11-06 13:51:54 -0500216
kelvin8ec71442015-01-15 16:57:00 -0800217 main.log.info( "onos-build command returned: " +
218 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500219
220 if i == 0:
221 return main.TRUE
222 else:
223 return handle
224
225 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800226 main.log.error( self.name + ": EOF exception found" )
227 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800228 except Exception:
229 main.log.exception( "Failed to build ONOS" )
andrewonlab8790abb2014-11-06 13:51:54 -0500230 main.cleanup()
231 main.exit()
232
shahshreya9f531fe2015-06-10 12:03:51 -0700233 def cleanInstall( self, skipTest=False, mciTimeout=600 ):
kelvin8ec71442015-01-15 16:57:00 -0800234 """
235 Runs mvn clean install in the root of the ONOS directory.
236 This will clean all ONOS artifacts then compile each module
shahshreya9f531fe2015-06-10 12:03:51 -0700237 Optional:
238 skipTest - Does "-DskipTests -Dcheckstyle.skip -U -T 1C" which
239 skip the test. This will make the building faster.
240 Disregarding the credibility of the build
kelvin8ec71442015-01-15 16:57:00 -0800241 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400242 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800243 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400244 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800245 main.log.info( "Running 'mvn clean install' on " +
246 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800247 ". This may take some time." )
248 self.handle.sendline( "cd " + self.home )
249 self.handle.expect( "\$" )
Jon Hallea7818b2014-10-09 14:30:59 -0400250
kelvin8ec71442015-01-15 16:57:00 -0800251 self.handle.sendline( "" )
252 self.handle.expect( "\$" )
shahshreya9f531fe2015-06-10 12:03:51 -0700253
254 if not skipTest:
255 self.handle.sendline( "mvn clean install" )
256 self.handle.expect( "mvn clean install" )
257 else:
258 self.handle.sendline( "mvn clean install -DskipTests" +
259 " -Dcheckstyle.skip -U -T 1C" )
260 self.handle.expect( "mvn clean install -DskipTests" +
261 " -Dcheckstyle.skip -U -T 1C" )
kelvin8ec71442015-01-15 16:57:00 -0800262 while True:
263 i = self.handle.expect( [
Jon Hall274b6642015-02-17 11:57:17 -0800264 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
Jon Hallefbd9792015-03-05 16:11:36 -0800265 'Runtime\sEnvironment\sto\scontinue',
Jon Hallde9d9aa2014-10-08 20:36:02 -0400266 'BUILD\sFAILURE',
267 'BUILD\sSUCCESS',
Jon Halle94919c2015-03-23 11:42:57 -0700268 'onos\$', #TODO: fix this to be more generic?
Jon Hallde9d9aa2014-10-08 20:36:02 -0400269 'ONOS\$',
pingping-lin57a56ce2015-05-20 16:43:48 -0700270 pexpect.TIMEOUT ], mciTimeout )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400271 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800272 main.log.error( self.name + ":There is insufficient memory \
273 for the Java Runtime Environment to continue." )
274 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400275 main.cleanup()
276 main.exit()
277 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800278 main.log.error( self.name + ": Build failure!" )
279 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400280 main.cleanup()
281 main.exit()
282 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800283 main.log.info( self.name + ": Build success!" )
Jon Halle94919c2015-03-23 11:42:57 -0700284 elif i == 3 or i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800285 main.log.info( self.name + ": Build complete" )
286 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400287 for line in self.handle.before.splitlines():
288 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800289 main.log.info( line )
290 self.handle.sendline( "" )
291 self.handle.expect( "\$", timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400292 return main.TRUE
Jon Halle94919c2015-03-23 11:42:57 -0700293 elif i == 5:
kelvin8ec71442015-01-15 16:57:00 -0800294 main.log.error(
295 self.name +
296 ": mvn clean install TIMEOUT!" )
297 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400298 main.cleanup()
299 main.exit()
300 else:
Jon Hall274b6642015-02-17 11:57:17 -0800301 main.log.error( self.name + ": unexpected response from " +
Jon Hallefbd9792015-03-05 16:11:36 -0800302 "mvn clean install" )
kelvin8ec71442015-01-15 16:57:00 -0800303 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400304 main.cleanup()
305 main.exit()
306 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800307 main.log.error( self.name + ": EOF exception found" )
308 main.log.error( self.name + ": " + self.handle.before )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400309 main.cleanup()
310 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800311 except Exception:
312 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400313 main.cleanup()
314 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400315
Jon Hall61282e32015-03-19 11:34:11 -0700316 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800317 """
Jon Hallacabffd2014-10-09 12:36:53 -0400318 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800319
Jon Hall61282e32015-03-19 11:34:11 -0700320 If the fastForward boolean is set to true, only git pulls that can
321 be fast forwarded will be performed. IE if you have not local commits
322 in your branch.
323
Jon Hallacabffd2014-10-09 12:36:53 -0400324 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800325 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400326 for the purpose of pulling from other nodes if necessary.
327
Jon Hall47a93fb2015-01-06 16:46:06 -0800328 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400329 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800330 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400331 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400332
kelvin8ec71442015-01-15 16:57:00 -0800333 """
Jon Hallacabffd2014-10-09 12:36:53 -0400334 try:
kelvin8ec71442015-01-15 16:57:00 -0800335 # main.log.info( self.name + ": Stopping ONOS" )
336 # self.stop()
337 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800338 self.handle.expect( self.home + "\$" )
Jon Hall61282e32015-03-19 11:34:11 -0700339 cmd = "git pull"
340 if comp1 != "":
341 cmd += ' ' + comp1
342 if fastForward:
343 cmd += ' ' + " --ff-only"
344 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800345 i = self.handle.expect(
346 [
347 'fatal',
348 'Username\sfor\s(.*):\s',
349 '\sfile(s*) changed,\s',
350 'Already up-to-date',
351 'Aborting',
352 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800353 'You asked me to pull without telling me which branch you',
354 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700355 'Please enter a commit message to explain why this merge',
356 'Found a swap file by the name',
357 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800358 pexpect.TIMEOUT ],
359 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800360 # debug
kelvin-onlabd3b64892015-01-20 13:26:24 -0800361 # main.log.report( self.name +": DEBUG: \n"+
362 # "git pull response: " +
363 # str( self.handle.before ) + str( self.handle.after ) )
kelvin8ec71442015-01-15 16:57:00 -0800364 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700365 main.log.error( self.name + ": Git pull had some issue" )
366 output = self.handle.after
367 self.handle.expect( '\$' )
368 output += self.handle.before
369 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400370 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800371 elif i == 1:
372 main.log.error(
373 self.name +
374 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400375 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800376 elif i == 2:
377 main.log.info(
378 self.name +
379 ": Git Pull - pulling repository now" )
kelvin-onlaba1484582015-02-02 15:46:20 -0800380 self.handle.expect( self.home + "\$", 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800381 # So that only when git pull is done, we do mvn clean compile
382 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800383 elif i == 3:
384 main.log.info( self.name + ": Git Pull - Already up to date" )
Jon Hall47a93fb2015-01-06 16:46:06 -0800385 return i
kelvin8ec71442015-01-15 16:57:00 -0800386 elif i == 4:
387 main.log.info(
388 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800389 ": Git Pull - Aborting..." +
390 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400391 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800392 elif i == 5:
393 main.log.info(
394 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800395 ": Git Pull - You are not currently " +
396 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400397 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800398 elif i == 6:
399 main.log.info(
400 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800401 ": Git Pull - You have not configured an upstream " +
402 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400403 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800404 elif i == 7:
405 main.log.info(
406 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800407 ": Git Pull - Pull is not possible because " +
408 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400409 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800410 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700411 # NOTE: abandoning test since we can't reliably handle this
412 # there could be different default text editors and we
413 # also don't know if we actually want to make the commit
414 main.log.error( "Git pull resulted in a merge commit message" +
415 ". Exiting test!" )
416 main.cleanup()
417 main.exit()
418 elif i == 9: # Merge commit message but swap file exists
419 main.log.error( "Git pull resulted in a merge commit message" +
420 " but a swap file exists." )
421 try:
422 self.handle.send( 'A' ) # Abort
423 self.handle.expect( "\$" )
424 return main.ERROR
425 except Exception:
426 main.log.exception( "Couldn't exit editor prompt!")
427 main.cleanup()
428 main.exit()
429 elif i == 10: # In the middle of a merge commit
430 main.log.error( "Git branch is in the middle of a merge. " )
431 main.log.warn( self.handle.before + self.handle.after )
432 return main.ERROR
433 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800434 main.log.error( self.name + ": Git Pull - TIMEOUT" )
435 main.log.error(
436 self.name + " Response was: " + str(
437 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400438 return main.ERROR
439 else:
kelvin8ec71442015-01-15 16:57:00 -0800440 main.log.error(
441 self.name +
442 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400443 return main.ERROR
444 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800445 main.log.error( self.name + ": EOF exception found" )
446 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400447 main.cleanup()
448 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800449 except Exception:
450 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400451 main.cleanup()
452 main.exit()
453
kelvin-onlabd3b64892015-01-20 13:26:24 -0800454 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800455 """
Jon Hallacabffd2014-10-09 12:36:53 -0400456 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800457
Jon Hallacabffd2014-10-09 12:36:53 -0400458 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800459 If used as gitCheckout( "branch" ) it will do git checkout
460 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400461
462 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800463 branch of the ONOS repository. If it has any problems, it will return
464 main.ERROR.
465 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400466 successful then the function will return main.TRUE.
467
kelvin8ec71442015-01-15 16:57:00 -0800468 """
Jon Hallacabffd2014-10-09 12:36:53 -0400469 try:
kelvin8ec71442015-01-15 16:57:00 -0800470 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800471 self.handle.expect( self.home + "\$" )
Jon Hall274b6642015-02-17 11:57:17 -0800472 main.log.info( self.name +
473 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800474 cmd = "git checkout " + branch
475 self.handle.sendline( cmd )
476 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800477 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800478 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700479 'Username for (.*): ',
480 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700481 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800482 pexpect.TIMEOUT,
483 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800484 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800485 'error: you need to resolve your current index first',
486 "You are in 'detached HEAD' state.",
487 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800488 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800489 if i == 0:
490 main.log.error(
491 self.name +
492 ": Git checkout had some issue..." )
493 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400494 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800495 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800496 main.log.error(
497 self.name +
498 ": Git checkout asking for username." +
499 " Please configure your local git repository to be able " +
500 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800501 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400502 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800503 elif i == 2:
504 main.log.info(
505 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800506 ": Git Checkout %s : Already on this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800507 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800508 # main.log.info( "DEBUG: after checkout cmd = "+
509 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400510 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800511 elif i == 3:
512 main.log.info(
513 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800514 ": Git checkout %s - Switched to this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800515 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800516 # main.log.info( "DEBUG: after checkout cmd = "+
517 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400518 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800519 elif i == 4:
520 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
521 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800522 self.name + " Response was: " + str( self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400523 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800524 elif i == 5:
525 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800526 main.log.error(
527 self.name +
528 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800529 "Your local changes to the following files would" +
530 " be overwritten by checkout:" +
531 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800532 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500533 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800534 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800535 main.log.error(
536 self.name +
537 ": Git checkout error: \n" +
538 "You need to resolve your current index first:" +
539 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800540 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500541 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800542 elif i == 7:
543 main.log.info(
544 self.name +
545 ": Git checkout " + str( branch ) +
546 " - You are in 'detached HEAD' state. HEAD is now at " +
547 str( branch ) )
548 self.handle.expect( self.home + "\$" )
549 return main.TRUE
550 elif i == 8: # Already in detached HEAD on the specified commit
551 main.log.info(
552 self.name +
553 ": Git Checkout %s : Already on commit" % branch )
554 self.handle.expect( self.home + "\$" )
555 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400556 else:
kelvin8ec71442015-01-15 16:57:00 -0800557 main.log.error(
558 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800559 ": Git Checkout - Unexpected response, " +
560 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800561 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400562 return main.ERROR
563
564 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800565 main.log.error( self.name + ": EOF exception found" )
566 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400567 main.cleanup()
568 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800569 except Exception:
570 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400571 main.cleanup()
572 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400573
pingping-lin6d23d9e2015-02-02 16:54:24 -0800574 def getBranchName( self ):
pingping-linf30cf272015-05-29 15:54:07 -0700575 main.log.info( "self.home = " )
576 main.log.info( self.home )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800577 self.handle.sendline( "cd " + self.home )
pingping-lin9bf3d8f2015-05-29 16:05:28 -0700578 self.handle.expect( self.home + "\$" )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800579 self.handle.sendline( "git name-rev --name-only HEAD" )
580 self.handle.expect( "git name-rev --name-only HEAD" )
581 self.handle.expect( "\$" )
582
583 lines = self.handle.before.splitlines()
584 if lines[1] == "master":
585 return "master"
586 elif lines[1] == "onos-1.0":
587 return "onos-1.0"
588 else:
589 main.log.info( lines[1] )
590 return "unexpected ONOS branch for SDN-IP test"
591
kelvin-onlabd3b64892015-01-20 13:26:24 -0800592 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800593 """
Jon Hall274b6642015-02-17 11:57:17 -0800594 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800595 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800596 """
Jon Hall45ec0922014-10-10 19:33:49 -0400597 try:
kelvin8ec71442015-01-15 16:57:00 -0800598 self.handle.sendline( "" )
599 self.handle.expect( "\$" )
600 self.handle.sendline(
601 "cd " +
602 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800603 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
604 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800605 # NOTE: for some reason there are backspaces inserted in this
606 # phrase when run from Jenkins on some tests
607 self.handle.expect( "never" )
608 self.handle.expect( "\$" )
609 response = ( self.name + ": \n" + str(
610 self.handle.before + self.handle.after ) )
611 self.handle.sendline( "cd " + self.home )
612 self.handle.expect( "\$" )
613 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400614 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500615 print line
616 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700617 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800618 for line in lines[ 2:-1 ]:
619 # Bracket replacement is for Wiki-compliant
620 # formatting. '<' or '>' are interpreted
621 # as xml specific tags that cause errors
622 line = line.replace( "<", "[" )
623 line = line.replace( ">", "]" )
pingping-lin763ee042015-05-20 17:45:30 -0700624 #main.log.wiki( "\t" + line )
625 main.log.wiki( line + "<br /> " )
626 main.log.summary( line )
627 main.log.wiki( "</blockquote>" )
628 main.log.summary("\n")
kelvin8ec71442015-01-15 16:57:00 -0800629 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400630 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800631 main.log.error( self.name + ": EOF exception found" )
632 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400633 main.cleanup()
634 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800635 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800636 main.log.error( self.name + ": TIMEOUT exception found" )
637 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800638 main.cleanup()
639 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800640 except Exception:
641 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall45ec0922014-10-10 19:33:49 -0400642 main.cleanup()
643 main.exit()
644
kelvin-onlabd3b64892015-01-20 13:26:24 -0800645 def createCellFile( self, benchIp, fileName, mnIpAddrs,
kelvin-onlaba4074292015-07-09 15:19:49 -0700646 appString, onosIpAddrs ):
kelvin8ec71442015-01-15 16:57:00 -0800647 """
andrewonlab94282092014-10-10 13:00:11 -0400648 Creates a cell file based on arguments
649 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800650 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400651 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800652 * File name of the cell file ( fileName )
653 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800654 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400655 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800656 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400657 - Must be passed in as last arguments
kelvin8ec71442015-01-15 16:57:00 -0800658
andrewonlab94282092014-10-10 13:00:11 -0400659 NOTE: Assumes cells are located at:
660 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800661 """
662 # Variable initialization
Jon Hallf57a5ef2015-07-07 17:56:16 -0700663 cellDirectory = os.environ["ONOS_ROOT"] + "/tools/test/cells/"
kelvin8ec71442015-01-15 16:57:00 -0800664 # We want to create the cell file in the dependencies directory
665 # of TestON first, then copy over to ONOS bench
kelvin-onlabd3b64892015-01-20 13:26:24 -0800666 tempDirectory = "/tmp/"
kelvin8ec71442015-01-15 16:57:00 -0800667 # Create the cell file in the directory for writing ( w+ )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800668 cellFile = open( tempDirectory + fileName, 'w+' )
kelvin8ec71442015-01-15 16:57:00 -0800669
cameron@onlab.us75900962015-03-30 13:22:49 -0700670 # App string is hardcoded environment variables
kelvin8ec71442015-01-15 16:57:00 -0800671 # That you may wish to use by default on startup.
cameron@onlab.us75900962015-03-30 13:22:49 -0700672 # Note that you may not want certain apps listed
kelvin8ec71442015-01-15 16:57:00 -0800673 # on here.
cameron@onlab.us75900962015-03-30 13:22:49 -0700674 appString = "export ONOS_APPS=" + appString
kelvin-onlabd3b64892015-01-20 13:26:24 -0800675 mnString = "export OCN="
kelvin-onlabf70fd542015-05-07 18:41:40 -0700676 if mnIpAddrs == "":
677 mnString = ""
kelvin-onlabd3b64892015-01-20 13:26:24 -0800678 onosString = "export OC"
679 tempCount = 1
kelvin8ec71442015-01-15 16:57:00 -0800680
kelvin-onlabd3b64892015-01-20 13:26:24 -0800681 # Create ONOSNIC ip address prefix
kelvin-onlaba4074292015-07-09 15:19:49 -0700682 tempOnosIp = str( onosIpAddrs[ 0 ] )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800683 tempList = []
684 tempList = tempOnosIp.split( "." )
kelvin8ec71442015-01-15 16:57:00 -0800685 # Omit last element of list to format for NIC
kelvin-onlabd3b64892015-01-20 13:26:24 -0800686 tempList = tempList[ :-1 ]
kelvin8ec71442015-01-15 16:57:00 -0800687 # Structure the nic string ip
kelvin-onlabd3b64892015-01-20 13:26:24 -0800688 nicAddr = ".".join( tempList ) + ".*"
689 onosNicString = "export ONOS_NIC=" + nicAddr
andrewonlab94282092014-10-10 13:00:11 -0400690
691 try:
kelvin8ec71442015-01-15 16:57:00 -0800692 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800693 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400694
kelvin-onlabd3b64892015-01-20 13:26:24 -0800695 for arg in onosIpAddrs:
696 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800697 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400698 # export OC1="10.128.20.11"
699 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800700 cellFile.write( onosString + str( tempCount ) +
701 "=" + "\"" + arg + "\"" + "\n" )
702 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800703
kelvin-onlabd3b64892015-01-20 13:26:24 -0800704 cellFile.write( mnString + "\"" + mnIpAddrs + "\"" + "\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700705 cellFile.write( appString + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800706 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400707
kelvin8ec71442015-01-15 16:57:00 -0800708 # We use os.system to send the command to TestON cluster
709 # to account for the case in which TestON is not located
710 # on the same cluster as the ONOS bench
711 # Note that even if TestON is located on the same cluster
712 # as ONOS bench, you must setup passwordless ssh
713 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800714 os.system( "scp " + tempDirectory + fileName +
715 " admin@" + benchIp + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400716
andrewonlab2a6c9342014-10-16 13:40:15 -0400717 return main.TRUE
718
andrewonlab94282092014-10-10 13:00:11 -0400719 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800720 main.log.error( self.name + ": EOF exception found" )
721 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400722 main.cleanup()
723 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800724 except Exception:
725 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -0400726 main.cleanup()
727 main.exit()
728
kelvin-onlabd3b64892015-01-20 13:26:24 -0800729 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800730 """
andrewonlab95ca1462014-10-09 14:04:24 -0400731 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800732 """
Hari Krishna03f530e2015-07-10 17:28:27 -0700733 import re
andrewonlab95ca1462014-10-09 14:04:24 -0400734 try:
735 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800736 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400737 main.cleanup()
738 main.exit()
739 else:
kelvin8ec71442015-01-15 16:57:00 -0800740 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800741 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800742 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400743 # and that this driver will have to change accordingly
Cameron Franke9c94fb02015-01-21 10:20:20 -0800744 self.handle.expect(str(cellname))
kelvin-onlabd3b64892015-01-20 13:26:24 -0800745 handleBefore = self.handle.before
746 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800747 # Get the rest of the handle
Cameron Franke9c94fb02015-01-21 10:20:20 -0800748 self.handle.sendline("")
749 self.handle.expect("\$")
kelvin-onlabd3b64892015-01-20 13:26:24 -0800750 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400751
Hari Krishna03f530e2015-07-10 17:28:27 -0700752 cell_result = handleBefore + handleAfter + handleMore
753 print cell_result
754 if( re.search( "No such cell", cell_result ) ):
755 main.log.error( "Cell call returned: " + handleBefore +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800756 handleAfter + handleMore )
Hari Krishna03f530e2015-07-10 17:28:27 -0700757 main.cleanup()
758 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400759 return main.TRUE
760
761 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800762 main.log.error( self.name + ": EOF exception found" )
763 main.log.error( self.name + ": " + self.handle.before )
andrewonlab95ca1462014-10-09 14:04:24 -0400764 main.cleanup()
765 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800766 except Exception:
767 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab95ca1462014-10-09 14:04:24 -0400768 main.cleanup()
769 main.exit()
770
kelvin-onlabd3b64892015-01-20 13:26:24 -0800771 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800772 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400773 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800774 """
775 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400776
andrewonlabc03bf6c2014-10-09 14:56:18 -0400777 try:
kelvin8ec71442015-01-15 16:57:00 -0800778 # Clean handle by sending empty and expecting $
779 self.handle.sendline( "" )
780 self.handle.expect( "\$" )
781 self.handle.sendline( "onos-verify-cell" )
782 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800783 handleBefore = self.handle.before
784 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800785 # Get the rest of the handle
786 self.handle.sendline( "" )
787 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800788 handleMore = self.handle.before
andrewonlabc03bf6c2014-10-09 14:56:18 -0400789
kelvin-onlabd3b64892015-01-20 13:26:24 -0800790 main.log.info( "Verify cell returned: " + handleBefore +
791 handleAfter + handleMore )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400792
793 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800794 except pexpect.ExceptionPexpect as e:
795 main.log.error( self.name + ": Pexpect exception found of type " +
796 str( type( e ) ) )
797 main.log.error ( e.get_trace() )
kelvin8ec71442015-01-15 16:57:00 -0800798 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400799 main.cleanup()
800 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800801 except Exception:
802 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400803 main.cleanup()
804 main.exit()
805
jenkins1e99e7b2015-04-02 18:15:39 -0700806 def onosCfgSet( self, ONOSIp, configName, configParam ):
807 """
808 Uses 'onos <node-ip> cfg set' to change a parameter value of an
809 application.
810
811 ex)
812 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700813 ONOSIp = '10.0.0.1'
814 configName = 'org.onosproject.myapp'
815 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700816 """
cameron@onlab.us78b89652015-07-08 15:21:03 -0700817 for i in range(5):
818 try:
819 cfgStr = ( "onos "+str(ONOSIp)+" cfg set "+
820 str(configName) + " " +
821 str(configParam)
822 )
jenkins1e99e7b2015-04-02 18:15:39 -0700823
cameron@onlab.us78b89652015-07-08 15:21:03 -0700824 self.handle.sendline( "" )
825 self.handle.expect( ":~" )
826 self.handle.sendline( cfgStr )
827 self.handle.expect("cfg set")
828 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700829
cameron@onlab.us78b89652015-07-08 15:21:03 -0700830 paramValue = configParam.split(" ")[1]
831 paramName = configParam.split(" ")[0]
832
833 checkStr = ( "onos " + str(ONOSIp) + """ cfg get " """ + str(configName) + " " + paramName + """ " """)
jenkins1e99e7b2015-04-02 18:15:39 -0700834
cameron@onlab.us78b89652015-07-08 15:21:03 -0700835 self.handle.sendline( checkStr )
836 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700837
cameron@onlab.us78b89652015-07-08 15:21:03 -0700838 if "value=" + paramValue + "," in self.handle.before:
839 main.log.info("cfg " + configName + " successfully set to " + configParam)
840 return main.TRUE
841
842 except pexpect.ExceptionPexpect as e:
843 main.log.error( self.name + ": Pexpect exception found of type " +
844 str( type( e ) ) )
845 main.log.error ( e.get_trace() )
846 main.log.error( self.name + ": " + self.handle.before )
847 main.cleanup()
848 main.exit()
849 except Exception:
850 main.log.exception( self.name + ": Uncaught exception!" )
851 main.cleanup()
852 main.exit()
853
854 time.sleep(5)
855
856 main.log.error("CFG SET FAILURE: " + configName + " " + configParam )
857 main.ONOSbench.handle.sendline("onos $OC1 cfg get")
858 main.ONOSbench.handle.expect("\$")
859 print main.ONOSbench.handle.before
860 main.ONOSbench.logReport( ONOSIp, ["ERROR","WARN","EXCEPT"], "d")
861 return main.FALSE
862
863
kelvin-onlabd3b64892015-01-20 13:26:24 -0800864 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800865 """
andrewonlab05e362f2014-10-10 00:40:57 -0400866 Uses 'onos' command to send various ONOS CLI arguments.
867 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800868 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400869 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800870
871 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400872 CLI commands for ONOS. Try to use this function first
873 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800874 function.
875 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400876 by starting onos, and typing in 'onos' to enter the
877 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800878 available commands.
879 """
andrewonlab05e362f2014-10-10 00:40:57 -0400880 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800881 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800882 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400883 return main.FALSE
884 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800885 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400886 return main.FALSE
887
kelvin8ec71442015-01-15 16:57:00 -0800888 cmdstr = str( cmdstr )
889 self.handle.sendline( "" )
890 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400891
kelvin-onlabd3b64892015-01-20 13:26:24 -0800892 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800893 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400894
kelvin-onlabd3b64892015-01-20 13:26:24 -0800895 handleBefore = self.handle.before
Shreya Shaha73aaad2014-10-27 18:03:09 -0400896 print "handle_before = ", self.handle.before
kelvin-onlabd3b64892015-01-20 13:26:24 -0800897 # handleAfter = str( self.handle.after )
Jon Hall47a93fb2015-01-06 16:46:06 -0800898
kelvin8ec71442015-01-15 16:57:00 -0800899 # self.handle.sendline( "" )
900 # self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800901 # handleMore = str( self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400902
kelvin8ec71442015-01-15 16:57:00 -0800903 main.log.info( "Command sent successfully" )
andrewonlab05e362f2014-10-10 00:40:57 -0400904
kelvin8ec71442015-01-15 16:57:00 -0800905 # Obtain return handle that consists of result from
906 # the onos command. The string may need to be
907 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800908 # returnString = handleBefore + handleAfter
909 returnString = handleBefore
910 print "return_string = ", returnString
911 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400912
913 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800914 main.log.error( self.name + ": EOF exception found" )
915 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400916 main.cleanup()
917 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800918 except Exception:
919 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab05e362f2014-10-10 00:40:57 -0400920 main.cleanup()
921 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400922
kelvin-onlabd3b64892015-01-20 13:26:24 -0800923 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -0800924 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400925 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -0800926 If -f option is provided, it also forces an uninstall.
927 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -0400928 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -0800929 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -0400930 files to certain onos nodes
931
932 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -0800933 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400934 try:
andrewonlab114768a2014-11-14 12:44:44 -0500935 if options:
kelvin8ec71442015-01-15 16:57:00 -0800936 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -0500937 else:
kelvin8ec71442015-01-15 16:57:00 -0800938 self.handle.sendline( "onos-install " + node )
939 self.handle.expect( "onos-install " )
940 # NOTE: this timeout may need to change depending on the network
941 # and size of ONOS
942 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -0800943 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -0800944 "ONOS\sis\salready\sinstalled",
945 pexpect.TIMEOUT ], timeout=60 )
Jon Hall7993bfc2014-10-09 16:30:14 -0400946
Jon Hall7993bfc2014-10-09 16:30:14 -0400947 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800948 main.log.warn( "Network is unreachable" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400949 return main.FALSE
950 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800951 main.log.info(
952 "ONOS was installed on " +
953 node +
954 " and started" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400955 return main.TRUE
andrewonlabd9a73a72014-11-14 17:28:21 -0500956 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800957 main.log.info( "ONOS is already installed on " + node )
andrewonlabd9a73a72014-11-14 17:28:21 -0500958 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800959 elif i == 3:
960 main.log.info(
961 "Installation of ONOS on " +
962 node +
963 " timed out" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400964 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -0400965
966 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800967 main.log.error( self.name + ": EOF exception found" )
968 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400969 main.cleanup()
970 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800971 except Exception:
972 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400973 main.cleanup()
974 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400975
kelvin-onlabd3b64892015-01-20 13:26:24 -0800976 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -0800977 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400978 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -0400979 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -0800980 """
andrewonlab8d0d7d72014-10-09 16:33:15 -0400981 try:
kelvin8ec71442015-01-15 16:57:00 -0800982 self.handle.sendline( "" )
983 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800984 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -0800985 " start" )
986 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -0400987 "Job\sis\salready\srunning",
988 "start/running",
989 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -0800990 pexpect.TIMEOUT ], timeout=120 )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400991
992 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800993 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400994 return main.TRUE
995 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800996 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -0400997 return main.TRUE
998 else:
kelvin8ec71442015-01-15 16:57:00 -0800999 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001000 main.cleanup()
1001 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001002 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001003 main.log.error( self.name + ": EOF exception found" )
1004 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001005 main.cleanup()
1006 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001007 except Exception:
1008 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001009 main.cleanup()
1010 main.exit()
1011
kelvin-onlabd3b64892015-01-20 13:26:24 -08001012 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001013 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001014 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001015 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001016 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001017 try:
kelvin8ec71442015-01-15 16:57:00 -08001018 self.handle.sendline( "" )
1019 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001020 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001021 " stop" )
1022 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001023 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001024 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001025 "Unknown\sinstance",
kelvin8ec71442015-01-15 16:57:00 -08001026 pexpect.TIMEOUT ], timeout=60 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001027
1028 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001029 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001030 return main.TRUE
1031 elif i == 1:
Jon Hall65844a32015-03-09 19:09:37 -07001032 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001033 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001034 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001035 elif i == 2:
1036 main.log.warn( "ONOS wasn't running" )
1037 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001038 else:
kelvin8ec71442015-01-15 16:57:00 -08001039 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001040 return main.FALSE
1041
1042 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001043 main.log.error( self.name + ": EOF exception found" )
1044 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -04001045 main.cleanup()
1046 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001047 except Exception:
1048 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001049 main.cleanup()
1050 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001051
kelvin-onlabd3b64892015-01-20 13:26:24 -08001052 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001053 """
andrewonlabc8d47972014-10-09 16:52:36 -04001054 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001055 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001056 if needed
kelvin8ec71442015-01-15 16:57:00 -08001057 """
andrewonlabc8d47972014-10-09 16:52:36 -04001058 try:
kelvin8ec71442015-01-15 16:57:00 -08001059 self.handle.sendline( "" )
pingping-lin763ee042015-05-20 17:45:30 -07001060 self.handle.expect( "\$", timeout=60 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001061 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001062 self.handle.expect( "\$" )
andrewonlabc8d47972014-10-09 16:52:36 -04001063
kelvin-onlabd3b64892015-01-20 13:26:24 -08001064 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
andrewonlab9dfd2082014-11-13 17:44:03 -05001065
kelvin8ec71442015-01-15 16:57:00 -08001066 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001067 return main.TRUE
1068
pingping-lin763ee042015-05-20 17:45:30 -07001069 except pexpect.TIMEOUT:
1070 main.log.exception( self.name + ": Timeout in onosUninstall" )
1071 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001072 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001073 main.log.error( self.name + ": EOF exception found" )
1074 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -04001075 main.cleanup()
1076 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001077 except Exception:
1078 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc8d47972014-10-09 16:52:36 -04001079 main.cleanup()
1080 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001081
kelvin-onlabd3b64892015-01-20 13:26:24 -08001082 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001083 """
andrewonlabaedc8332014-12-04 12:43:03 -05001084 Issues the command 'onos-die <node-ip>'
1085 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001086 """
andrewonlabaedc8332014-12-04 12:43:03 -05001087 try:
kelvin8ec71442015-01-15 16:57:00 -08001088 self.handle.sendline( "" )
1089 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001090 cmdStr = "onos-kill " + str( nodeIp )
1091 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001092 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001093 "Killing\sONOS",
1094 "ONOS\sprocess\sis\snot\srunning",
kelvin8ec71442015-01-15 16:57:00 -08001095 pexpect.TIMEOUT ], timeout=20 )
andrewonlabaedc8332014-12-04 12:43:03 -05001096 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001097 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001098 " was killed and stopped" )
andrewonlabaedc8332014-12-04 12:43:03 -05001099 return main.TRUE
1100 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001101 main.log.info( "ONOS process was not running" )
andrewonlabaedc8332014-12-04 12:43:03 -05001102 return main.FALSE
1103 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001104 main.log.error( self.name + ": EOF exception found" )
1105 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -05001106 main.cleanup()
1107 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001108 except Exception:
1109 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabaedc8332014-12-04 12:43:03 -05001110 main.cleanup()
1111 main.exit()
1112
kelvin-onlabd3b64892015-01-20 13:26:24 -08001113 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001114 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001115 Calls the command: 'onos-kill [<node-ip>]'
1116 "Remotely, and unceremoniously kills the ONOS instance running on
1117 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001118 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001119 try:
kelvin8ec71442015-01-15 16:57:00 -08001120 self.handle.sendline( "" )
1121 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001122 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001123 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -04001124 "\$",
1125 "No\sroute\sto\shost",
1126 "password:",
kelvin8ec71442015-01-15 16:57:00 -08001127 pexpect.TIMEOUT ], timeout=20 )
1128
andrewonlabe8e56fd2014-10-09 17:12:44 -04001129 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001130 main.log.info(
1131 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001132 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001133 return main.TRUE
1134 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001135 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001136 return main.FALSE
1137 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001138 main.log.info(
1139 "Passwordless login for host: " +
1140 str( nodeIp ) +
1141 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001142 return main.FALSE
1143 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001144 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001145 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001146
andrewonlabe8e56fd2014-10-09 17:12:44 -04001147 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001148 main.log.error( self.name + ": EOF exception found" )
1149 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001150 main.cleanup()
1151 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001152 except Exception:
1153 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001154 main.cleanup()
1155 main.exit()
1156
kelvin-onlabd3b64892015-01-20 13:26:24 -08001157 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001158 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001159 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001160 a cleaner environment.
1161
andrewonlab19fbdca2014-11-14 12:55:59 -05001162 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001163 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001164 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001165 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001166 try:
kelvin8ec71442015-01-15 16:57:00 -08001167 self.handle.sendline( "" )
1168 self.handle.expect( "\$" )
1169 self.handle.sendline( "onos-remove-raft-logs" )
1170 # Sometimes this command hangs
1171 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1172 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001173 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001174 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1175 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001176 if i == 1:
1177 return main.FALSE
shahshreya957feaa2015-03-23 16:08:29 -07001178 #self.handle.sendline( "" )
1179 #self.handle.expect( "\$" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001180 return main.TRUE
1181
1182 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001183 main.log.error( self.name + ": EOF exception found" )
1184 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -05001185 main.cleanup()
1186 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001187 except Exception:
1188 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001189 main.cleanup()
1190 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -05001191
kelvin-onlabd3b64892015-01-20 13:26:24 -08001192 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001193 """
1194 Calls the command 'onos-start-network [ <mininet-topo> ]
1195 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001196 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001197 cell."
andrewonlab94282092014-10-10 13:00:11 -04001198 * Specify mininet topology file name for mntopo
1199 * Topo files should be placed at:
1200 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001201
andrewonlab94282092014-10-10 13:00:11 -04001202 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001203 """
andrewonlab94282092014-10-10 13:00:11 -04001204 try:
1205 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001206 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001207 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001208
kelvin8ec71442015-01-15 16:57:00 -08001209 mntopo = str( mntopo )
1210 self.handle.sendline( "" )
1211 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001212
kelvin8ec71442015-01-15 16:57:00 -08001213 self.handle.sendline( "onos-start-network " + mntopo )
1214 self.handle.expect( "mininet>" )
1215 main.log.info( "Network started, entered mininet prompt" )
1216
1217 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001218
1219 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001220 main.log.error( self.name + ": EOF exception found" )
1221 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001222 main.cleanup()
1223 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001224 except Exception:
1225 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -04001226 main.cleanup()
1227 main.exit()
1228
Cameron Franke9c94fb02015-01-21 10:20:20 -08001229 def isup(self, node = "", timeout = 120):
kelvin8ec71442015-01-15 16:57:00 -08001230 """
1231 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001232 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001233
Jon Hall7993bfc2014-10-09 16:30:14 -04001234 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001235 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001236 try:
Cameron Franke9c94fb02015-01-21 10:20:20 -08001237 self.handle.sendline("onos-wait-for-start " + node )
1238 self.handle.expect("onos-wait-for-start")
kelvin8ec71442015-01-15 16:57:00 -08001239 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001240 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
Jon Hall7993bfc2014-10-09 16:30:14 -04001241 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001242 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001243 return main.TRUE
1244 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001245 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001246 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001247 main.log.error( "ONOS has not started yet" )
1248 self.handle.send( "\x03" ) # Control-C
1249 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001250 return main.FALSE
1251 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001252 main.log.error( self.name + ": EOF exception found" )
1253 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001254 main.cleanup()
1255 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001256 except Exception:
1257 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001258 main.cleanup()
1259 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001260
kelvin-onlabd3b64892015-01-20 13:26:24 -08001261 def pushTestIntentsShell(
1262 self,
1263 dpidSrc,
1264 dpidDst,
1265 numIntents,
1266 dirFile,
1267 onosIp,
1268 numMult="",
1269 appId="",
1270 report=True,
1271 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001272 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001273 Description:
kelvin8ec71442015-01-15 16:57:00 -08001274 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001275 better parallelize the results than the CLI
1276 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001277 * dpidSrc: specify source dpid
1278 * dpidDst: specify destination dpid
1279 * numIntents: specify number of intents to push
1280 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001281 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001282 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001283 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001284 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001285 """
1286 try:
1287 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001288 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001289 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001290 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001291 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001292 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001293
kelvin-onlabd3b64892015-01-20 13:26:24 -08001294 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1295 if not numMult:
1296 addIntents = addDpid + " " + str( numIntents )
1297 elif numMult:
1298 addIntents = addDpid + " " + str( numIntents ) + " " +\
1299 str( numMult )
1300 if appId:
1301 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001302 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001303 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001304
andrewonlabaedc8332014-12-04 12:43:03 -05001305 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001306 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001307 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001308 sendCmd = addApp + " &"
1309 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001310
kelvin-onlabd3b64892015-01-20 13:26:24 -08001311 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001312
1313 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001314 main.log.error( self.name + ": EOF exception found" )
1315 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001316 main.cleanup()
1317 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001318 except Exception:
1319 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001320 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001321 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001322
kelvin-onlabd3b64892015-01-20 13:26:24 -08001323 def getTopology( self, topologyOutput ):
kelvin8ec71442015-01-15 16:57:00 -08001324 """
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001325 Definition:
1326 Loads a json topology output
1327 Return:
1328 topology = current ONOS topology
kelvin8ec71442015-01-15 16:57:00 -08001329 """
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001330 import json
Jon Hall77f53ce2014-10-13 18:02:06 -04001331 try:
Hari Krishnaef1bd4e2015-03-12 16:55:30 -07001332 # either onos:topology or 'topology' will work in CLI
1333 topology = json.loads(topologyOutput)
1334 print topology
Jon Hall77f53ce2014-10-13 18:02:06 -04001335 return topology
1336 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001337 main.log.error( self.name + ": EOF exception found" )
1338 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001339 main.cleanup()
1340 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001341 except Exception:
1342 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001343 main.cleanup()
1344 main.exit()
1345
kelvin-onlabd3b64892015-01-20 13:26:24 -08001346 def checkStatus(
1347 self,
1348 topologyResult,
1349 numoswitch,
1350 numolink,
1351 logLevel="info" ):
kelvin8ec71442015-01-15 16:57:00 -08001352 """
Jon Hallefbd9792015-03-05 16:11:36 -08001353 Checks the number of switches & links that ONOS sees against the
kelvin8ec71442015-01-15 16:57:00 -08001354 supplied values. By default this will report to main.log, but the
Jon Hallefbd9792015-03-05 16:11:36 -08001355 log level can be specific.
kelvin8ec71442015-01-15 16:57:00 -08001356
Jon Hall77f53ce2014-10-13 18:02:06 -04001357 Params: ip = ip used for the onos cli
1358 numoswitch = expected number of switches
Jon Hallefbd9792015-03-05 16:11:36 -08001359 numolink = expected number of links
kelvin-onlabd3b64892015-01-20 13:26:24 -08001360 logLevel = level to log to.
1361 Currently accepts 'info', 'warn' and 'report'
Jon Hall77f53ce2014-10-13 18:02:06 -04001362
1363
kelvin-onlabd3b64892015-01-20 13:26:24 -08001364 logLevel can
Jon Hall77f53ce2014-10-13 18:02:06 -04001365
Jon Hallefbd9792015-03-05 16:11:36 -08001366 Returns: main.TRUE if the number of switches and links are correct,
1367 main.FALSE if the number of switches and links is incorrect,
Jon Hall77f53ce2014-10-13 18:02:06 -04001368 and main.ERROR otherwise
kelvin8ec71442015-01-15 16:57:00 -08001369 """
Jon Hall77f53ce2014-10-13 18:02:06 -04001370 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001371 topology = self.getTopology( topologyResult )
Jon Hall77f53ce2014-10-13 18:02:06 -04001372 if topology == {}:
1373 return main.ERROR
1374 output = ""
kelvin8ec71442015-01-15 16:57:00 -08001375 # Is the number of switches is what we expected
shahshreya234a1682015-05-27 15:41:56 -07001376 devices = topology.get( 'devices', False )
1377 links = topology.get( 'links', False )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001378 if not devices or not links:
Jon Hall77f53ce2014-10-13 18:02:06 -04001379 return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -08001380 switchCheck = ( int( devices ) == int( numoswitch ) )
kelvin8ec71442015-01-15 16:57:00 -08001381 # Is the number of links is what we expected
kelvin-onlabd3b64892015-01-20 13:26:24 -08001382 linkCheck = ( int( links ) == int( numolink ) )
Jon Hallefbd9792015-03-05 16:11:36 -08001383 if switchCheck and linkCheck:
kelvin8ec71442015-01-15 16:57:00 -08001384 # We expected the correct numbers
Jon Hall77f53ce2014-10-13 18:02:06 -04001385 output = output + "The number of links and switches match "\
kelvin8ec71442015-01-15 16:57:00 -08001386 + "what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001387 result = main.TRUE
1388 else:
1389 output = output + \
Jon Hall274b6642015-02-17 11:57:17 -08001390 "The number of links and switches does not match " + \
1391 "what was expected"
Jon Hall77f53ce2014-10-13 18:02:06 -04001392 result = main.FALSE
Jon Hallefbd9792015-03-05 16:11:36 -08001393 output = output + "\n ONOS sees %i devices" % int( devices )
1394 output = output + " (%i expected) " % int( numoswitch )
Jon Hall274b6642015-02-17 11:57:17 -08001395 output = output + "and %i links " % int( links )
1396 output = output + "(%i expected)" % int( numolink )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001397 if logLevel == "report":
kelvin8ec71442015-01-15 16:57:00 -08001398 main.log.report( output )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001399 elif logLevel == "warn":
kelvin8ec71442015-01-15 16:57:00 -08001400 main.log.warn( output )
Jon Hall77f53ce2014-10-13 18:02:06 -04001401 else:
kelvin8ec71442015-01-15 16:57:00 -08001402 main.log.info( output )
1403 return result
Jon Hall77f53ce2014-10-13 18:02:06 -04001404 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001405 main.log.error( self.name + ": EOF exception found" )
1406 main.log.error( self.name + ": " + self.handle.before )
Jon Hall77f53ce2014-10-13 18:02:06 -04001407 main.cleanup()
1408 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001409 except Exception:
1410 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall77f53ce2014-10-13 18:02:06 -04001411 main.cleanup()
1412 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001413
kelvin-onlabd3b64892015-01-20 13:26:24 -08001414 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001415 """
andrewonlab970399c2014-11-07 13:09:32 -05001416 Capture all packet activity and store in specified
1417 directory/file
1418
1419 Required:
1420 * interface: interface to capture
1421 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001422 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001423 try:
1424 self.handle.sendline( "" )
1425 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001426
Jon Hallfebb1c72015-03-05 13:30:09 -08001427 self.handle.sendline( "tshark -i " + str( interface ) +
1428 " -t e -w " + str( dirFile ) + " &" )
1429 self.handle.sendline( "\r" )
1430 self.handle.expect( "Capturing on" )
1431 self.handle.sendline( "\r" )
1432 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001433
Jon Hallfebb1c72015-03-05 13:30:09 -08001434 main.log.info( "Tshark started capturing files on " +
1435 str( interface ) + " and saving to directory: " +
1436 str( dirFile ) )
1437 except pexpect.EOF:
1438 main.log.error( self.name + ": EOF exception found" )
1439 main.log.error( self.name + ": " + self.handle.before )
1440 main.cleanup()
1441 main.exit()
1442 except Exception:
1443 main.log.exception( self.name + ": Uncaught exception!" )
1444 main.cleanup()
1445 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001446
kelvin-onlabd3b64892015-01-20 13:26:24 -08001447 def runOnosTopoCfg( self, instanceName, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001448 """
kelvin-onlabd3b64892015-01-20 13:26:24 -08001449 On ONOS bench, run this command:
Jon Halle94919c2015-03-23 11:42:57 -07001450 {ONOS_HOME}/tools/test/bin/onos-topo-cfg $OC1 filename
kelvin-onlabd3b64892015-01-20 13:26:24 -08001451 which starts the rest and copies
1452 the json file to the onos instance
kelvin8ec71442015-01-15 16:57:00 -08001453 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001454 try:
kelvin8ec71442015-01-15 16:57:00 -08001455 self.handle.sendline( "" )
1456 self.handle.expect( "\$" )
Jon Halle94919c2015-03-23 11:42:57 -07001457 self.handle.sendline( "cd " + self.home + "/tools/test/bin" )
kelvin8ec71442015-01-15 16:57:00 -08001458 self.handle.expect( "/bin$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001459 cmd = "./onos-topo-cfg " + instanceName + " " + jsonFile
shahshreyae6c7cf42014-11-26 16:39:01 -08001460 print "cmd = ", cmd
kelvin8ec71442015-01-15 16:57:00 -08001461 self.handle.sendline( cmd )
1462 self.handle.expect( "\$" )
1463 self.handle.sendline( "cd ~" )
1464 self.handle.expect( "\$" )
shahshreyae6c7cf42014-11-26 16:39:01 -08001465 return main.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -08001466 except pexpect.EOF:
1467 main.log.error( self.name + ": EOF exception found" )
1468 main.log.error( self.name + ": " + self.handle.before )
1469 main.cleanup()
1470 main.exit()
1471 except Exception:
1472 main.log.exception( self.name + ": Uncaught exception!" )
1473 main.cleanup()
1474 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001475
jenkins1e99e7b2015-04-02 18:15:39 -07001476 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001477 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001478 Required:
kelvin8ec71442015-01-15 16:57:00 -08001479 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001480 * directory to store results
1481 Optional:
1482 * interface - default: eth0
jenkins1e99e7b2015-04-02 18:15:39 -07001483 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001484 Description:
1485 Uses tshark command to grep specific group of packets
1486 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001487 The timestamp is hardcoded to be in epoch
1488 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001489 try:
1490 self.handle.sendline( "" )
1491 self.handle.expect( "\$" )
1492 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001493 if grepOptions:
1494 grepStr = "grep "+str(grepOptions)
1495 else:
1496 grepStr = "grep"
1497
Jon Hallfebb1c72015-03-05 13:30:09 -08001498 self.handle.sendline(
1499 "tshark -i " +
1500 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001501 " -t e | " +
1502 grepStr + " --line-buffered \"" +
Jon Hallfebb1c72015-03-05 13:30:09 -08001503 str(grep) +
1504 "\" >" +
1505 directory +
1506 " &" )
1507 self.handle.sendline( "\r" )
1508 self.handle.expect( "Capturing on" )
1509 self.handle.sendline( "\r" )
1510 self.handle.expect( "\$" )
1511 except pexpect.EOF:
1512 main.log.error( self.name + ": EOF exception found" )
1513 main.log.error( self.name + ": " + self.handle.before )
1514 main.cleanup()
1515 main.exit()
1516 except Exception:
1517 main.log.exception( self.name + ": Uncaught exception!" )
1518 main.cleanup()
1519 main.exit()
1520
kelvin-onlabd3b64892015-01-20 13:26:24 -08001521 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001522 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001523 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001524 """
1525 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001526 try:
1527 self.execute( cmd="sudo rm /tmp/wireshark*" )
1528 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001529 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1530 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001531 self.handle.sendline( "" )
1532 main.log.info( "Tshark stopped" )
1533 except pexpect.EOF:
1534 main.log.error( self.name + ": EOF exception found" )
1535 main.log.error( self.name + ": " + self.handle.before )
1536 main.cleanup()
1537 main.exit()
1538 except Exception:
1539 main.log.exception( self.name + ": Uncaught exception!" )
1540 main.cleanup()
1541 main.exit()
1542
kelvin8ec71442015-01-15 16:57:00 -08001543 def ptpd( self, args ):
1544 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001545 Initiate ptp with user-specified args.
1546 Required:
1547 * args: specify string of args after command
1548 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001549 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001550 try:
kelvin8ec71442015-01-15 16:57:00 -08001551 self.handle.sendline( "sudo ptpd " + str( args ) )
1552 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001553 "Multiple",
1554 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001555 "\$" ] )
1556 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001557
andrewonlab0c38a4a2014-10-28 18:35:35 -04001558 if i == 0:
1559 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001560 main.log.info( "ptpd returned an error: " +
1561 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001562 return handle
1563 elif i == 1:
1564 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001565 main.log.error( "ptpd returned an error: " +
1566 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001567 return handle
1568 else:
1569 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001570
andrewonlab0c38a4a2014-10-28 18:35:35 -04001571 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001572 main.log.error( self.name + ": EOF exception found" )
1573 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001574 main.cleanup()
1575 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001576 except Exception:
1577 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001578 main.cleanup()
1579 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001580
kelvin-onlabd3b64892015-01-20 13:26:24 -08001581 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001582 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001583 """
1584 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001585 Current implementation of ONOS deletes its karaf
1586 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001587 you may want to use this function to capture
1588 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001589 Localtime will be attached to the filename
1590
1591 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001592 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001593 copy.
kelvin8ec71442015-01-15 16:57:00 -08001594 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001595 For copying multiple files, leave copyFileName
1596 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001597 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001598 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001599 ex ) /tmp/
1600 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001601 * copyFileName: If you want to rename the log
1602 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001603 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001604 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001605 try:
kelvin8ec71442015-01-15 16:57:00 -08001606 localtime = time.strftime( '%x %X' )
1607 localtime = localtime.replace( "/", "" )
1608 localtime = localtime.replace( " ", "_" )
1609 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001610 if destDir[ -1: ] != "/":
1611 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001612
kelvin-onlabd3b64892015-01-20 13:26:24 -08001613 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001614 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1615 str( destDir ) + str( copyFileName ) +
1616 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001617 self.handle.expect( "cp" )
1618 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001619 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001620 self.handle.sendline( "cp " + str( logToCopy ) +
1621 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001622 self.handle.expect( "cp" )
1623 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001624
kelvin8ec71442015-01-15 16:57:00 -08001625 return self.handle.before
1626
1627 except pexpect.EOF:
1628 main.log.error( "Copying files failed" )
1629 main.log.error( self.name + ": EOF exception found" )
1630 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001631 except Exception:
1632 main.log.exception( "Copying files failed" )
1633
Jon Hall16b72c42015-05-20 10:23:36 -07001634 def checkLogs( self, onosIp, restart=False):
kelvin8ec71442015-01-15 16:57:00 -08001635 """
Jon Hall94fd0472014-12-08 11:52:42 -08001636 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001637 If restart is True, use the old version of onos-check-logs which
1638 does not print the full stacktrace, but shows the entire log file,
1639 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001640 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001641 """
Jon Hall94fd0472014-12-08 11:52:42 -08001642 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001643 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001644 if restart:
1645 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001646 self.handle.sendline( cmd )
1647 self.handle.expect( cmd )
1648 self.handle.expect( "\$" )
Jon Hall94fd0472014-12-08 11:52:42 -08001649 response = self.handle.before
1650 return response
1651 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001652 main.log.error( "Lost ssh connection" )
1653 main.log.error( self.name + ": EOF exception found" )
1654 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001655 except Exception:
1656 main.log.exception( self.name + ": Uncaught exception!" )
1657 main.cleanup()
1658 main.exit()
Jon Hall94fd0472014-12-08 11:52:42 -08001659
kelvin-onlabd3b64892015-01-20 13:26:24 -08001660 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001661 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001662 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001663 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001664 try:
kelvin8ec71442015-01-15 16:57:00 -08001665 self.handle.sendline( "" )
1666 self.handle.expect( "\$" )
1667 self.handle.sendline( "onos-service " + str( node ) +
1668 " status" )
1669 i = self.handle.expect( [
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001670 "start/running",
1671 "stop/waiting",
kelvin8ec71442015-01-15 16:57:00 -08001672 pexpect.TIMEOUT ], timeout=120 )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001673
1674 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001675 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001676 return main.TRUE
1677 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001678 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001679 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001680 main.cleanup()
1681 main.exit()
1682 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001683 main.log.error( self.name + ": EOF exception found" )
1684 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001685 main.cleanup()
1686 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001687 except Exception:
1688 main.log.exception( self.name + ": Uncaught exception!" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001689 main.cleanup()
1690 main.exit()
Jon Hall21270ac2015-02-16 17:59:55 -08001691
Jon Hall63604932015-02-26 17:09:50 -08001692 def setIpTables( self, ip, port='', action='add', packet_type='',
1693 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001694 """
Jon Hall21270ac2015-02-16 17:59:55 -08001695 Description:
1696 add or remove iptables rule to DROP (default) packets from
1697 specific IP and PORT
1698 Usage:
1699 * specify action ('add' or 'remove')
1700 when removing, pass in the same argument as you would add. It will
1701 delete that specific rule.
1702 * specify the ip to block
1703 * specify the destination port to block (defaults to all ports)
1704 * optional packet type to block (default tcp)
1705 * optional iptables rule (default DROP)
1706 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001707 * States boolean toggles adding all supported tcp states to the
1708 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001709 Returns:
1710 main.TRUE on success or
1711 main.FALSE if given invalid input or
1712 main.ERROR if there is an error in response from iptables
1713 WARNING:
1714 * This function uses root privilege iptables command which may result
1715 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001716 """
Jon Hall21270ac2015-02-16 17:59:55 -08001717 import time
1718
1719 # NOTE*********
1720 # The strict checking methods of this driver function is intentional
1721 # to discourage any misuse or error of iptables, which can cause
1722 # severe network errors
1723 # *************
1724
1725 # NOTE: Sleep needed to give some time for rule to be added and
1726 # registered to the instance. If you are calling this function
1727 # multiple times this sleep will prevent any errors.
1728 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001729 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001730 try:
1731 # input validation
1732 action_type = action.lower()
1733 rule = rule.upper()
1734 direction = direction.upper()
1735 if action_type != 'add' and action_type != 'remove':
1736 main.log.error( "Invalid action type. Use 'add' or "
1737 "'remove' table rule" )
1738 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1739 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1740 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1741 "'ACCEPT' or 'LOG' only." )
1742 if direction != 'INPUT' and direction != 'OUTPUT':
1743 # NOTE currently only supports rules INPUT and OUPTUT
1744 main.log.error( "Invalid rule. Valid directions are"
1745 " 'OUTPUT' or 'INPUT'" )
1746 return main.FALSE
1747 return main.FALSE
1748 return main.FALSE
1749 if action_type == 'add':
1750 # -A is the 'append' action of iptables
1751 actionFlag = '-A'
1752 elif action_type == 'remove':
1753 # -D is the 'delete' rule of iptables
1754 actionFlag = '-D'
1755 self.handle.sendline( "" )
1756 self.handle.expect( "\$" )
1757 cmd = "sudo iptables " + actionFlag + " " +\
1758 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001759 " -s " + str( ip )
Jon Hall63604932015-02-26 17:09:50 -08001760 # " -p " + str( packet_type ) +\
1761 if packet_type:
1762 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001763 if port:
1764 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001765 if states:
1766 cmd += " -m state --state="
1767 #FIXME- Allow user to configure which states to block
1768 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001769 cmd += " -j " + str( rule )
1770
1771 self.handle.sendline( cmd )
1772 self.handle.expect( "\$" )
1773 main.log.warn( self.handle.before )
1774
1775 info_string = "On " + str( self.name )
1776 info_string += " " + str( action_type )
1777 info_string += " iptable rule [ "
1778 info_string += " IP: " + str( ip )
1779 info_string += " Port: " + str( port )
1780 info_string += " Rule: " + str( rule )
1781 info_string += " Direction: " + str( direction ) + " ]"
1782 main.log.info( info_string )
1783 return main.TRUE
1784 except pexpect.TIMEOUT:
1785 main.log.exception( self.name + ": Timeout exception in "
1786 "setIpTables function" )
1787 return main.ERROR
1788 except pexpect.EOF:
1789 main.log.error( self.name + ": EOF exception found" )
1790 main.log.error( self.name + ": " + self.handle.before )
1791 main.cleanup()
1792 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001793 except Exception:
1794 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall21270ac2015-02-16 17:59:55 -08001795 main.cleanup()
1796 main.exit()
1797
Jon Hall0468b042015-02-19 19:08:21 -08001798 def detailed_status(self, log_filename):
Jon Hallefbd9792015-03-05 16:11:36 -08001799 """
Jon Hall0468b042015-02-19 19:08:21 -08001800 This method is used by STS to check the status of the controller
1801 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001802 """
Jon Hall0468b042015-02-19 19:08:21 -08001803 import re
1804 try:
1805 self.handle.sendline( "" )
1806 self.handle.expect( "\$" )
1807 self.handle.sendline( "cd " + self.home )
1808 self.handle.expect( "\$" )
1809 self.handle.sendline( "service onos status" )
1810 self.handle.expect( "\$" )
1811 response = self.handle.before
1812 if re.search( "onos start/running", response ):
1813 # onos start/running, process 10457
1814 return 'RUNNING'
1815 # FIXME: Implement this case
1816 # elif re.search( pattern, response ):
1817 # return 'STARTING'
1818 elif re.search( "onos stop/", response ):
1819 # onos stop/waiting
1820 # FIXME handle this differently?: onos stop/pre-stop
1821 return 'STOPPED'
1822 # FIXME: Implement this case
1823 # elif re.search( pattern, response ):
1824 # return 'FROZEN'
1825 else:
1826 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001827 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001828 main.log.warn( response )
1829 return 'ERROR', "Unknown response: %s" % response
1830 except pexpect.TIMEOUT:
1831 main.log.exception( self.name + ": Timeout exception in "
1832 "setIpTables function" )
1833 return 'ERROR', "Pexpect Timeout"
1834 except pexpect.EOF:
1835 main.log.error( self.name + ": EOF exception found" )
1836 main.log.error( self.name + ": " + self.handle.before )
1837 main.cleanup()
1838 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001839 except Exception:
1840 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall0468b042015-02-19 19:08:21 -08001841 main.cleanup()
1842 main.exit()
1843
andrew@onlab.us3b087132015-03-11 15:00:08 -07001844 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1845 '''
1846 Create/formats the LinkGraph.cfg file based on arguments
1847 -only creates a linear topology and connects islands
1848 -evenly distributes devices
1849 -must be called by ONOSbench
1850
1851 ONOSIpList - list of all of the node IPs to be used
1852
1853 deviceCount - number of switches to be assigned
1854 '''
1855 main.log.step("Creating link graph configuration file." )
1856 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
1857 tempFile = "/tmp/linkGraph.cfg"
1858
1859 linkGraph = open(tempFile, 'w+')
1860 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1861 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1862 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
1863
1864 clusterCount = len(ONOSIpList)
1865
1866 if type(deviceCount) is int or type(deviceCount) is str:
1867 deviceCount = int(deviceCount)
1868 switchList = [0]*(clusterCount+1)
1869 baselineSwitchCount = deviceCount/clusterCount
1870
1871 for node in range(1, clusterCount + 1):
1872 switchList[node] = baselineSwitchCount
1873
1874 for node in range(1, (deviceCount%clusterCount)+1):
1875 switchList[node] += 1
1876
1877 if type(deviceCount) is list:
1878 main.log.info("Using provided device distribution")
1879 switchList = [0]
1880 for i in deviceCount:
1881 switchList.append(int(i))
1882
1883 tempList = ['0']
1884 tempList.extend(ONOSIpList)
1885 ONOSIpList = tempList
1886
1887 myPort = 6
1888 lastSwitch = 0
1889 for node in range(1, clusterCount+1):
1890 if switchList[node] == 0:
1891 continue
1892
1893 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
1894
1895 if node > 1:
1896 #connect to last device on previous node
1897 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1898 linkGraph.write(line)
1899
1900 lastSwitch = 0
1901 for switch in range (0, switchList[node]-1):
1902 line = ""
1903 line = ("\t" + str(switch) + ":" + str(myPort))
1904 line += " -- "
1905 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1906 linkGraph.write(line)
1907 lastSwitch = switch+1
1908 lastIp = ONOSIpList[node]
1909
1910 #lastSwitch += 1
1911 if node < (clusterCount):
1912 #connect to first device on the next node
1913 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
1914 linkGraph.write(line)
1915
1916 linkGraph.write("}\n")
1917 linkGraph.close()
1918
1919 #SCP
1920 os.system( "scp " + tempFile + " admin@" + benchIp + ":" + linkGraphPath)
1921 main.log.info("linkGraph.cfg creation complete")
1922
cameron@onlab.us75900962015-03-30 13:22:49 -07001923 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001924
1925 '''
andrew@onlab.us3b087132015-03-11 15:00:08 -07001926 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
cameron@onlab.us75900962015-03-30 13:22:49 -07001927 deviceCount = number of switches to distribute, or list of values to use as custom distribution
1928 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 -07001929 '''
1930
cameron@onlab.us75900962015-03-30 13:22:49 -07001931 main.log.step("Configuring Null Device Provider" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001932 clusterCount = len(ONOSIpList)
1933
cameron@onlab.us75900962015-03-30 13:22:49 -07001934 try:
1935
1936 if type(deviceCount) is int or type(deviceCount) is str:
1937 main.log.step("Creating device distribution")
1938 deviceCount = int(deviceCount)
1939 switchList = [0]*(clusterCount+1)
1940 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001941
cameron@onlab.us75900962015-03-30 13:22:49 -07001942 for node in range(1, clusterCount + 1):
1943 switchList[node] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001944
cameron@onlab.us75900962015-03-30 13:22:49 -07001945 for node in range(1, (deviceCount%clusterCount)+1):
1946 switchList[node] += 1
1947
1948 if type(deviceCount) is list:
1949 main.log.info("Using provided device distribution")
1950
1951 if len(deviceCount) == clusterCount:
1952 switchList = ['0']
1953 switchList.extend(deviceCount)
1954
1955 if len(deviceCount) == (clusterCount + 1):
1956 if deviceCount[0] == '0' or deviceCount[0] == 0:
1957 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001958
cameron@onlab.us75900962015-03-30 13:22:49 -07001959 assert len(switchList) == (clusterCount + 1)
1960
1961 except AssertionError:
1962 main.log.error( "Bad device/Ip list match")
1963 except TypeError:
1964 main.log.exception( self.name + ": Object not as expected" )
1965 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07001966 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07001967 main.log.exception( self.name + ": Uncaught exception!" )
1968 main.cleanup()
1969 main.exit()
1970
andrew@onlab.us3b087132015-03-11 15:00:08 -07001971
1972 ONOSIp = [0]
1973 ONOSIp.extend(ONOSIpList)
1974
1975 devicesString = "devConfigs = "
1976 for node in range(1, len(ONOSIp)):
1977 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
1978 if node < clusterCount:
1979 devicesString += (",")
cameron@onlab.us75900962015-03-30 13:22:49 -07001980
1981 try:
1982 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
1983 self.handle.expect(":~")
1984 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
1985 self.handle.expect(":~")
andrew@onlab.us3b087132015-03-11 15:00:08 -07001986
cameron@onlab.us75900962015-03-30 13:22:49 -07001987 for i in range(10):
1988 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
1989 self.handle.expect(":~")
1990 verification = self.handle.before
1991 if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
1992 break
1993 else:
1994 time.sleep(1)
andrew@onlab.us3b087132015-03-11 15:00:08 -07001995
cameron@onlab.us2cc8bf12015-04-02 14:12:30 -07001996 assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
cameron@onlab.us75900962015-03-30 13:22:49 -07001997
1998 except AssertionError:
1999 main.log.error("Incorrect Config settings: " + verification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002000 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002001 main.log.exception( self.name + ": Uncaught exception!" )
2002 main.cleanup()
2003 main.exit()
2004
cameron@onlab.usc80a8c82015-04-15 14:57:37 -07002005 def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002006 '''
cameron@onlab.us75900962015-03-30 13:22:49 -07002007 fileName default is currently the same as the default on ONOS, specify alternate file if
2008 you want to use a different topology file than linkGraph.cfg
andrew@onlab.us3b087132015-03-11 15:00:08 -07002009 '''
2010
andrew@onlab.us3b087132015-03-11 15:00:08 -07002011
cameron@onlab.us75900962015-03-30 13:22:49 -07002012 try:
2013 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
2014 self.handle.expect(":~")
2015 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2016 self.handle.expect(":~")
2017
2018 for i in range(10):
2019 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
2020 self.handle.expect(":~")
2021 verification = self.handle.before
2022 if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
2023 break
2024 else:
2025 time.sleep(1)
2026
2027 assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
2028
2029 except pexpect.EOF:
2030 main.log.error( self.name + ": EOF exception found" )
2031 main.log.error( self.name + ": " + self.handle.before )
2032 main.cleanup()
2033 main.exit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002034 except AssertionError:
2035 main.log.info("Settings did not post to ONOS")
2036 main.log.error(varification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002037 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002038 main.log.exception( self.name + ": Uncaught exception!" )
2039 main.log.error(varification)
2040 main.cleanup()
2041 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002042
kelvin-onlaba4074292015-07-09 15:19:49 -07002043 def getOnosIps( self ):
2044 """
2045 Get all onos IPs stored in
2046 """
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002047
kelvin-onlaba4074292015-07-09 15:19:49 -07002048 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002049
kelvin-onlaba4074292015-07-09 15:19:49 -07002050 def logReport( self, nodeIp, searchTerms, outputMode="s" ):
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002051 '''
2052 - accepts either a list or a string for "searchTerms" these
2053 terms will be searched for in the log and have their
2054 instances counted
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002055
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002056 - nodeIp is the ip of the node whos log is to be scanned
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002057
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002058 - output modes:
2059 "s" - Simple. Quiet output mode that just prints
cameron@onlab.us2e166212015-05-19 14:28:25 -07002060 the occurences of each search term
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002061
cameron@onlab.us2e166212015-05-19 14:28:25 -07002062 "d" - Detailed. Prints number of occurences as well as the entire
2063 line for each of the last 5 occurences
2064
2065 - returns total of the number of instances of all search terms
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002066 '''
2067 main.log.info("========================== Log Report ===========================\n")
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002068
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002069 if type(searchTerms) is str:
2070 searchTerms = [searchTerms]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002071
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002072 logLines = [ [" "] for i in range(len(searchTerms)) ]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002073
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002074 for term in range(len(searchTerms)):
2075 logLines[term][0] = searchTerms[term]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002076
cameron@onlab.us2e166212015-05-19 14:28:25 -07002077 totalHits = 0
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002078 for term in range(len(searchTerms)):
2079 cmd = "onos-ssh " + nodeIp + " cat /opt/onos/log/karaf.log | grep " + searchTerms[term]
2080 self.handle.sendline(cmd)
2081 self.handle.expect(":~")
2082 before = (self.handle.before).splitlines()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002083
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002084 count = [searchTerms[term],0]
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002085
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002086 for line in before:
2087 if searchTerms[term] in line and "grep" not in line:
2088 count[1] += 1
2089 if before.index(line) > ( len(before) - 7 ):
2090 logLines[term].append(line)
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002091
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002092 main.log.info( str(count[0]) + ": " + str(count[1]) )
2093 if term == len(searchTerms)-1:
2094 print("\n")
cameron@onlab.us2e166212015-05-19 14:28:25 -07002095 totalHits += int(count[1])
2096
cameron@onlab.us966d1be2015-05-15 14:54:09 -07002097 if outputMode != "s" and outputMode != "S":
2098 outputString = ""
2099 for i in logLines:
2100 outputString = i[0] + ": \n"
2101 for x in range(1,len(i)):
2102 outputString += ( i[x] + "\n" )
2103
2104 if outputString != (i[0] + ": \n"):
2105 main.log.info(outputString)
2106
2107 main.log.info("================================================================\n")
cameron@onlab.us2e166212015-05-19 14:28:25 -07002108 return totalHits
pingping-lin763ee042015-05-20 17:45:30 -07002109
Hari Krishnaade11a72015-07-01 17:06:46 -07002110 def getOnosIPfromCell(self):
2111 '''
2112 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 -07002113 Example output return: ['10.128.40.41','10.128.40.42','10.128.40.43']. This will work even if the Mininet is
2114 not part of the cell definition and also if there are multiple mininets, just by using static hostname
2115 in TOPO file.
2116 '''
Hari Krishnaade11a72015-07-01 17:06:46 -07002117 import re
2118 try:
2119 # Clean handle by sending empty and expecting $
2120 self.handle.sendline( "" )
2121 self.handle.expect( "\$" )
2122 self.handle.sendline( "cell" )
2123 self.handle.expect( "\$" )
2124 handleBefore = self.handle.before
2125 handleAfter = self.handle.after
2126 # Get the rest of the handle
2127 self.handle.sendline( "" )
2128 self.handle.expect( "\$" )
2129 handleMore = self.handle.before
2130 ipList = []
2131 cellOutput = handleBefore + handleAfter + handleMore
2132 cellOutput = cellOutput.replace("\r\r","")
2133 cellOutput = cellOutput.splitlines()
2134 for i in range( len(cellOutput) ):
2135 if( re.match( "OC", cellOutput[i] ) ):
2136 if( re.match( "OCI", cellOutput[i] ) or re.match( "OCN", cellOutput[i] ) ):
2137 continue
2138 else:
2139 onosIP = cellOutput[i].split("=")
Hari Krishnac195f3b2015-07-08 20:02:24 -07002140 ipList.append(onosIP[1])
Hari Krishnaade11a72015-07-01 17:06:46 -07002141 return ipList
2142 except pexpect.ExceptionPexpect as e:
2143 main.log.error( self.name + ": Pexpect exception found of type " +
2144 str( type( e ) ) )
2145 main.log.error ( e.get_trace() )
2146 main.log.error( self.name + ": " + self.handle.before )
2147 main.cleanup()
2148 main.exit()
2149 except Exception:
2150 main.log.exception( self.name + ": Uncaught exception!" )
2151 main.cleanup()
2152 main.exit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002153
2154 def copyMininetFile( self, fileName, localPath, userName, ip,
2155 mnPath='~/mininet/custom/', timeout = 60 ):
2156 """
2157 Description:
2158 Copy mininet topology file from dependency folder in the test folder
2159 and paste it to the mininet machine's mininet/custom folder
2160 Required:
2161 fileName - Name of the topology file to copy
2162 localPath - File path of the mininet topology file
2163 userName - User name of the mininet machine to send the file to
2164 ip - Ip address of the mininet machine
2165 Optional:
2166 mnPath - of the mininet directory to send the file to
2167 Return:
2168 Return main.TRUE if successfully copied the file otherwise
2169 return main.FALSE
2170 """
2171
2172 try:
2173 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2174 str( ip ) + ":" + mnPath + fileName
2175
2176 self.handle.sendline( "" )
2177 self.handle.expect( "\$" )
2178
2179 main.log.info( self.name + ": Execute: " + cmd )
2180
2181 self.handle.sendline( cmd )
2182
2183 i = self.handle.expect( [ 'No such file',
2184 "100%",
2185 pexpect.TIMEOUT ] )
2186
2187 if i == 0:
2188 main.log.error( self.name + ": File " + fileName +
2189 " does not exist!" )
2190 return main.FALSE
2191
2192 if i == 1:
2193 main.log.info( self.name + ": File " + fileName +
2194 " has been copied!" )
2195 self.handle.sendline( "" )
2196 self.handle.expect( "\$" )
2197 return main.TRUE
2198
2199 except pexpect.EOF:
2200 main.log.error( self.name + ": EOF exception found" )
2201 main.log.error( self.name + ": " + self.handle.before )
2202 main.cleanup()
2203 main.exit()
2204 except pexpect.TIMEOUT:
2205 main.log.error( self.name + ": TIMEOUT exception found" )
2206 main.log.error( self.name + ": " + self.handle.before )
2207 main.cleanup()
2208 main.exit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002209
2210 def jvmSet(self, memory=8):
2211
2212 import os
2213
2214 homeDir = os.path.expanduser('~')
2215 filename = "/onos/tools/package/bin/onos-service"
2216
2217 serviceConfig = open(homeDir + filename, 'w+')
2218 serviceConfig.write("#!/bin/bash\n ")
2219 serviceConfig.write("#------------------------------------- \n ")
2220 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
2221 serviceConfig.write("#------------------------------------- \n ")
2222 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
2223 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
2224 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
2225 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
2226 serviceConfig.close()
2227
2228 def createDBFile(self, testData):
2229
2230 filename = main.TEST + "DB"
2231 DBString = ""
2232
2233 for item in testData:
2234 if type(item) is string:
2235 item = "'" + item + "'"
2236 if testData.index(item) < len(testData-1):
2237 item += ","
2238 DBString += str(item)
2239
2240 DBFile = open(filename, "a")
2241 DBFile.write(DBString)
2242 DBFile.close()
2243
2244 def verifySummary(self, ONOSIp,*deviceCount):
2245
2246 self.handle.sendline("onos " + ONOSIp + " summary")
2247 self.handle.expect(":~")
2248
2249 summaryStr = self.handle.before
2250 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2251
2252 #passed = "SCC(s)=1" in summaryStr
2253 #if deviceCount:
2254 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
2255
2256
2257 if "SCC(s)=1," in summaryStr:
2258 passed = True
2259 print("Summary is verifed")
2260 else:
2261 print("Summary failed")
2262
2263 if deviceCount:
2264 print" ============================="
2265 checkStr = "devices=" + str(deviceCount[0]) + ","
2266 print "Checkstr: " + checkStr
2267 if checkStr not in summaryStr:
2268 passed = False
2269 print("Device count failed")
2270 else:
2271 print "device count verified"
2272
2273 return passed