blob: d120951d274a62d4f872071a8e965253bcb6d2b0 [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
Jeremy Songsterae01bba2016-07-11 15:39:17 -070017Modified 2016 by ON.Lab
18
19Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
20the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
21or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
andrewonlabe8e56fd2014-10-09 17:12:44 -040022
kelvin8ec71442015-01-15 16:57:00 -080023"""
Jon Hall05b2b432014-10-08 19:53:25 -040024import time
Jon Hall6801cda2015-07-15 14:13:45 -070025import types
Jon Hall05b2b432014-10-08 19:53:25 -040026import pexpect
kelvin-onlaba4074292015-07-09 15:19:49 -070027import os
Jon Hall6c44c0b2016-04-20 15:21:00 -070028import re
29import subprocess
pingping-lin6d23d9e2015-02-02 16:54:24 -080030from requests.models import Response
Jon Hall05b2b432014-10-08 19:53:25 -040031from drivers.common.clidriver import CLI
32
kelvin8ec71442015-01-15 16:57:00 -080033class OnosDriver( CLI ):
Jon Hall05b2b432014-10-08 19:53:25 -040034
kelvin8ec71442015-01-15 16:57:00 -080035 def __init__( self ):
36 """
37 Initialize client
38 """
Jon Hallefbd9792015-03-05 16:11:36 -080039 self.name = None
40 self.home = None
41 self.handle = None
Jon Hall6c44c0b2016-04-20 15:21:00 -070042 self.nicAddr = None
kelvin8ec71442015-01-15 16:57:00 -080043 super( CLI, self ).__init__()
44
45 def connect( self, **connectargs ):
46 """
Jon Hall05b2b432014-10-08 19:53:25 -040047 Creates ssh handle for ONOS "bench".
kelvin-onlaba4074292015-07-09 15:19:49 -070048 NOTE:
49 The ip_address would come from the topo file using the host tag, the
50 value can be an environment variable as well as a "localhost" to get
51 the ip address needed to ssh to the "bench"
kelvin8ec71442015-01-15 16:57:00 -080052 """
Jon Hall05b2b432014-10-08 19:53:25 -040053 try:
54 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080055 vars( self )[ key ] = connectargs[ key ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070056 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040057 for key in self.options:
58 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080059 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040060 break
Jon Hall274b6642015-02-17 11:57:17 -080061 if self.home is None or self.home == "":
Jon Halle94919c2015-03-23 11:42:57 -070062 self.home = "~/onos"
Jon Hall21270ac2015-02-16 17:59:55 -080063
kelvin8ec71442015-01-15 16:57:00 -080064 self.name = self.options[ 'name' ]
kelvin-onlaba4074292015-07-09 15:19:49 -070065
kelvin-onlabc2b79102015-07-14 11:41:20 -070066 # The 'nodes' tag is optional and it is not required in .topo file
kelvin-onlaba4074292015-07-09 15:19:49 -070067 for key in self.options:
68 if key == "nodes":
kelvin-onlabc2b79102015-07-14 11:41:20 -070069 # Maximum number of ONOS nodes to run, if there is any
kelvin-onlaba4074292015-07-09 15:19:49 -070070 self.maxNodes = int( self.options[ 'nodes' ] )
71 break
72 self.maxNodes = None
73
kelvin-onlabc2b79102015-07-14 11:41:20 -070074 if self.maxNodes == None or self.maxNodes == "":
75 self.maxNodes = 100
kelvin-onlaba4074292015-07-09 15:19:49 -070076
kelvin-onlabc2b79102015-07-14 11:41:20 -070077
78 # Grabs all OC environment variables based on max number of nodes
kelvin-onlaba4074292015-07-09 15:19:49 -070079 self.onosIps = {} # Dictionary of all possible ONOS ip
80
81 try:
82 if self.maxNodes:
kelvin-onlaba4074292015-07-09 15:19:49 -070083 for i in range( self.maxNodes ):
84 envString = "OC" + str( i + 1 )
kelvin-onlabc2b79102015-07-14 11:41:20 -070085 # If there is no more OC# then break the loop
86 if os.getenv( envString ):
87 self.onosIps[ envString ] = os.getenv( envString )
88 else:
89 self.maxNodes = len( self.onosIps )
90 main.log.info( self.name +
91 ": Created cluster data with " +
92 str( self.maxNodes ) +
93 " maximum number" +
94 " of nodes" )
95 break
kelvin-onlaba4074292015-07-09 15:19:49 -070096
97 if not self.onosIps:
98 main.log.info( "Could not read any environment variable"
99 + " please load a cell file with all" +
100 " onos IP" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700101 self.maxNodes = None
kelvin-onlaba4074292015-07-09 15:19:49 -0700102 else:
103 main.log.info( self.name + ": Found " +
104 str( self.onosIps.values() ) +
105 " ONOS IPs" )
kelvin-onlaba4074292015-07-09 15:19:49 -0700106 except KeyError:
107 main.log.info( "Invalid environment variable" )
108 except Exception as inst:
109 main.log.error( "Uncaught exception: " + str( inst ) )
110
111 try:
112 if os.getenv( str( self.ip_address ) ) != None:
113 self.ip_address = os.getenv( str( self.ip_address ) )
114 else:
115 main.log.info( self.name +
116 ": Trying to connect to " +
117 self.ip_address )
kelvin-onlaba4074292015-07-09 15:19:49 -0700118 except KeyError:
119 main.log.info( "Invalid host name," +
120 " connecting to local host instead" )
121 self.ip_address = 'localhost'
122 except Exception as inst:
123 main.log.error( "Uncaught exception: " + str( inst ) )
124
kelvin8ec71442015-01-15 16:57:00 -0800125 self.handle = super( OnosDriver, self ).connect(
126 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -0800127 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -0800128 port=self.port,
129 pwd=self.pwd,
130 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -0400131
Jon Hall05b2b432014-10-08 19:53:25 -0400132 if self.handle:
Jon Hall0fc0d452015-07-14 09:49:58 -0700133 self.handle.sendline( "cd " + self.home )
134 self.handle.expect( "\$" )
Jon Hall05b2b432014-10-08 19:53:25 -0400135 return self.handle
kelvin8ec71442015-01-15 16:57:00 -0800136 else:
Jon Hall0fc0d452015-07-14 09:49:58 -0700137 main.log.info( "Failed to create ONOS handle" )
Jon Hall05b2b432014-10-08 19:53:25 -0400138 return main.FALSE
139 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800140 main.log.error( self.name + ": EOF exception found" )
141 main.log.error( self.name + ": " + self.handle.before )
Jon Hall05b2b432014-10-08 19:53:25 -0400142 main.cleanup()
143 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800144 except Exception:
145 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall05b2b432014-10-08 19:53:25 -0400146 main.cleanup()
147 main.exit()
148
kelvin8ec71442015-01-15 16:57:00 -0800149 def disconnect( self ):
150 """
Jon Hall05b2b432014-10-08 19:53:25 -0400151 Called when Test is complete to disconnect the ONOS handle.
kelvin8ec71442015-01-15 16:57:00 -0800152 """
Jon Halld61331b2015-02-17 16:35:47 -0800153 response = main.TRUE
Jon Hall05b2b432014-10-08 19:53:25 -0400154 try:
Jon Hall61282e32015-03-19 11:34:11 -0700155 if self.handle:
156 self.handle.sendline( "" )
157 self.handle.expect( "\$" )
158 self.handle.sendline( "exit" )
159 self.handle.expect( "closed" )
Jon Hall05b2b432014-10-08 19:53:25 -0400160 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800161 main.log.error( self.name + ": EOF exception found" )
162 main.log.error( self.name + ": " + self.handle.before )
Jon Hall61282e32015-03-19 11:34:11 -0700163 except ValueError:
Jon Hall1a77a1e2015-04-06 10:41:13 -0700164 main.log.exception( "Exception in disconnect of " + self.name )
Jon Hall61282e32015-03-19 11:34:11 -0700165 response = main.TRUE
Jon Hallfebb1c72015-03-05 13:30:09 -0800166 except Exception:
167 main.log.exception( self.name + ": Connection failed to the host" )
Jon Hall05b2b432014-10-08 19:53:25 -0400168 response = main.FALSE
169 return response
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400170
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400171 def getEpochMs( self ):
172 """
173 Returns milliseconds since epoch
Jon Hall4ba53f02015-07-29 13:07:41 -0700174
175 When checking multiple nodes in a for loop,
176 around a hundred milliseconds of difference (ascending) is
177 generally acceptable due to calltime of the function.
178 Few seconds, however, is not and it means clocks
179 are off sync.
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400180 """
181 try:
182 self.handle.sendline( 'date +%s.%N' )
183 self.handle.expect( 'date \+\%s\.\%N' )
184 self.handle.expect( '\$' )
185 epochMs = self.handle.before
186 return epochMs
187 except Exception:
188 main.log.exception( 'Uncaught exception getting epoch time' )
189 main.cleanup()
190 main.exit()
191
Jon Hall6c44c0b2016-04-20 15:21:00 -0700192 def onosPackage( self, opTimeout=180 ):
kelvin8ec71442015-01-15 16:57:00 -0800193 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400194 Produce a self-contained tar.gz file that can be deployed
Jon Hall64af8502015-12-15 10:09:33 -0800195 and executed on any platform with Java 8 JRE.
kelvin8ec71442015-01-15 16:57:00 -0800196 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400197 try:
Jon Hall64af8502015-12-15 10:09:33 -0800198 ret = main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800199 self.handle.sendline( "onos-package" )
200 self.handle.expect( "onos-package" )
Jon Hall96451092016-05-04 09:42:30 -0700201 while True:
202 i = self.handle.expect( [ "Downloading",
203 "Unknown options",
204 "No such file or directory",
205 "tar.gz",
206 "\$" ],
207 opTimeout )
208 handle = str( self.handle.before + self.handle.after )
209 if i == 0:
210 # Give more time to download the file
211 continue # expect again
212 elif i == 1:
213 # Incorrect usage
214 main.log.error( "onos-package does not recognize the given options" )
215 ret = main.FALSE
216 continue # expect again
217 elif i == 2:
218 # File(s) not found
219 main.log.error( "onos-package could not find a file or directory" )
220 ret = main.FALSE
221 continue # expect again
222 elif i == 3:
223 # tar.gz
224 continue # expect again
225 elif i == 4:
226 # Prompt returned
227 break
Jon Hallc6793552016-01-19 14:18:37 -0800228 main.log.info( "onos-package command returned: " + handle )
kelvin8ec71442015-01-15 16:57:00 -0800229 # As long as the sendline does not time out,
230 # return true. However, be careful to interpret
231 # the results of the onos-package command return
Jon Hall64af8502015-12-15 10:09:33 -0800232 return ret
233 except pexpect.TIMEOUT:
234 main.log.exception( self.name + ": TIMEOUT exception found in onosPackage" )
235 main.log.error( self.name + ": " + self.handle.before )
236 return main.FALSE
andrewonlab7735d852014-10-09 13:02:47 -0400237 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800238 main.log.error( self.name + ": EOF exception found" )
239 main.log.error( self.name + ": " + self.handle.before )
Jon Hall64af8502015-12-15 10:09:33 -0800240 main.cleanup()
241 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800242 except Exception:
243 main.log.exception( "Failed to package ONOS" )
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400244 main.cleanup()
245 main.exit()
246
kelvin-onlabd3b64892015-01-20 13:26:24 -0800247 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800248 """
andrewonlab8790abb2014-11-06 13:51:54 -0500249 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800250 """
andrewonlab8790abb2014-11-06 13:51:54 -0500251 try:
kelvin8ec71442015-01-15 16:57:00 -0800252 self.handle.sendline( "onos-build" )
253 self.handle.expect( "onos-build" )
254 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800255 "BUILD SUCCESS",
256 "ERROR",
257 "BUILD FAILED" ],
258 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800259 handle = str( self.handle.before )
Jon Hall3b489db2015-10-05 14:38:37 -0700260 self.handle.expect( "\$" )
andrewonlab8790abb2014-11-06 13:51:54 -0500261
kelvin8ec71442015-01-15 16:57:00 -0800262 main.log.info( "onos-build command returned: " +
263 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500264
265 if i == 0:
266 return main.TRUE
267 else:
268 return handle
269
270 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800271 main.log.error( self.name + ": EOF exception found" )
272 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800273 except Exception:
274 main.log.exception( "Failed to build ONOS" )
andrewonlab8790abb2014-11-06 13:51:54 -0500275 main.cleanup()
276 main.exit()
277
shahshreya9f531fe2015-06-10 12:03:51 -0700278 def cleanInstall( self, skipTest=False, mciTimeout=600 ):
kelvin8ec71442015-01-15 16:57:00 -0800279 """
280 Runs mvn clean install in the root of the ONOS directory.
281 This will clean all ONOS artifacts then compile each module
shahshreya9f531fe2015-06-10 12:03:51 -0700282 Optional:
283 skipTest - Does "-DskipTests -Dcheckstyle.skip -U -T 1C" which
284 skip the test. This will make the building faster.
285 Disregarding the credibility of the build
kelvin8ec71442015-01-15 16:57:00 -0800286 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400287 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800288 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400289 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800290 main.log.info( "Running 'mvn clean install' on " +
291 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800292 ". This may take some time." )
293 self.handle.sendline( "cd " + self.home )
294 self.handle.expect( "\$" )
Jon Hallea7818b2014-10-09 14:30:59 -0400295
kelvin8ec71442015-01-15 16:57:00 -0800296 self.handle.sendline( "" )
297 self.handle.expect( "\$" )
shahshreya9f531fe2015-06-10 12:03:51 -0700298
299 if not skipTest:
300 self.handle.sendline( "mvn clean install" )
301 self.handle.expect( "mvn clean install" )
302 else:
303 self.handle.sendline( "mvn clean install -DskipTests" +
304 " -Dcheckstyle.skip -U -T 1C" )
305 self.handle.expect( "mvn clean install -DskipTests" +
306 " -Dcheckstyle.skip -U -T 1C" )
kelvin8ec71442015-01-15 16:57:00 -0800307 while True:
308 i = self.handle.expect( [
Jon Hall274b6642015-02-17 11:57:17 -0800309 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
Jon Hallefbd9792015-03-05 16:11:36 -0800310 'Runtime\sEnvironment\sto\scontinue',
Jon Hallde9d9aa2014-10-08 20:36:02 -0400311 'BUILD\sFAILURE',
312 'BUILD\sSUCCESS',
Jon Halle94919c2015-03-23 11:42:57 -0700313 'onos\$', #TODO: fix this to be more generic?
Jon Hallde9d9aa2014-10-08 20:36:02 -0400314 'ONOS\$',
pingping-lin57a56ce2015-05-20 16:43:48 -0700315 pexpect.TIMEOUT ], mciTimeout )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400316 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800317 main.log.error( self.name + ":There is insufficient memory \
318 for the Java Runtime Environment to continue." )
319 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400320 main.cleanup()
321 main.exit()
322 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800323 main.log.error( self.name + ": Build failure!" )
324 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400325 main.cleanup()
326 main.exit()
327 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800328 main.log.info( self.name + ": Build success!" )
Jon Halle94919c2015-03-23 11:42:57 -0700329 elif i == 3 or i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800330 main.log.info( self.name + ": Build complete" )
331 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400332 for line in self.handle.before.splitlines():
333 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800334 main.log.info( line )
335 self.handle.sendline( "" )
336 self.handle.expect( "\$", timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400337 return main.TRUE
Jon Halle94919c2015-03-23 11:42:57 -0700338 elif i == 5:
kelvin8ec71442015-01-15 16:57:00 -0800339 main.log.error(
340 self.name +
341 ": mvn clean install TIMEOUT!" )
342 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400343 main.cleanup()
344 main.exit()
345 else:
Jon Hall274b6642015-02-17 11:57:17 -0800346 main.log.error( self.name + ": unexpected response from " +
Jon Hallefbd9792015-03-05 16:11:36 -0800347 "mvn clean install" )
kelvin8ec71442015-01-15 16:57:00 -0800348 # return main.FALSE
Jon Hallde9d9aa2014-10-08 20:36:02 -0400349 main.cleanup()
350 main.exit()
351 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800352 main.log.error( self.name + ": EOF exception found" )
353 main.log.error( self.name + ": " + self.handle.before )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400354 main.cleanup()
355 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800356 except Exception:
357 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400358 main.cleanup()
359 main.exit()
Jon Hallacabffd2014-10-09 12:36:53 -0400360
Jon Hall3576f572016-08-23 10:01:07 -0700361 def buckBuild( self, timeout=180 ):
362 """
363 Build onos using buck.
364 """
365 try:
366 ret = main.TRUE
367 self.handle.sendline( "buck build onos" )
368 self.handle.expect( "buck build onos" )
369 output = ""
370 while True:
371 i = self.handle.expect( [ "This does not appear to be the root of a Buck project.",
372 "\n",
373 "BUILD FAILED",
374 "\$" ],
375 timeout=timeout )
376 output += str( self.handle.before + self.handle.after )
377 if i == 0:
378 main.log.error( "Wrong location" )
379 ret = main.FALSE
380 elif i == 1:
381 # end of a line, buck is still printing output
382 pass
383 elif i == 2:
384 # Build failed
385 main.log.error( "Build failed" )
386 ret = main.FALSE
387 elif i == 3:
388 # Prompt returned
389 break
390 main.log.debug( output )
391 return ret
392 except pexpect.TIMEOUT:
393 main.log.exception( self.name + ": TIMEOUT exception found" )
394 main.log.error( self.name + ": " + self.handle.before )
395 return main.FALSE
396 except pexpect.EOF:
397 main.log.error( self.name + ": EOF exception found" )
398 main.log.error( self.name + ": " + self.handle.before )
399 main.cleanup()
400 main.exit()
401 except Exception:
402 main.log.exception( "Failed to build and package ONOS" )
403 main.cleanup()
404 main.exit()
405
Jon Hall61282e32015-03-19 11:34:11 -0700406 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800407 """
Jon Hallacabffd2014-10-09 12:36:53 -0400408 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800409
Jon Hall61282e32015-03-19 11:34:11 -0700410 If the fastForward boolean is set to true, only git pulls that can
411 be fast forwarded will be performed. IE if you have not local commits
412 in your branch.
413
Jon Hallacabffd2014-10-09 12:36:53 -0400414 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800415 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400416 for the purpose of pulling from other nodes if necessary.
417
Jon Hall47a93fb2015-01-06 16:46:06 -0800418 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400419 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800420 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400421 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400422
kelvin8ec71442015-01-15 16:57:00 -0800423 """
Jon Hallacabffd2014-10-09 12:36:53 -0400424 try:
kelvin8ec71442015-01-15 16:57:00 -0800425 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800426 self.handle.expect( self.home + "\$" )
Jon Hall61282e32015-03-19 11:34:11 -0700427 cmd = "git pull"
428 if comp1 != "":
429 cmd += ' ' + comp1
430 if fastForward:
431 cmd += ' ' + " --ff-only"
432 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800433 i = self.handle.expect(
434 [
435 'fatal',
436 'Username\sfor\s(.*):\s',
437 '\sfile(s*) changed,\s',
438 'Already up-to-date',
439 'Aborting',
440 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800441 'You asked me to pull without telling me which branch you',
442 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700443 'Please enter a commit message to explain why this merge',
444 'Found a swap file by the name',
445 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800446 pexpect.TIMEOUT ],
447 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800448 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700449 main.log.error( self.name + ": Git pull had some issue" )
450 output = self.handle.after
451 self.handle.expect( '\$' )
452 output += self.handle.before
453 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400454 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800455 elif i == 1:
456 main.log.error(
457 self.name +
458 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400459 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800460 elif i == 2:
461 main.log.info(
462 self.name +
463 ": Git Pull - pulling repository now" )
kelvin-onlaba1484582015-02-02 15:46:20 -0800464 self.handle.expect( self.home + "\$", 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800465 # So that only when git pull is done, we do mvn clean compile
466 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800467 elif i == 3:
468 main.log.info( self.name + ": Git Pull - Already up to date" )
Jon Hall47a93fb2015-01-06 16:46:06 -0800469 return i
kelvin8ec71442015-01-15 16:57:00 -0800470 elif i == 4:
471 main.log.info(
472 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800473 ": Git Pull - Aborting..." +
474 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400475 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800476 elif i == 5:
477 main.log.info(
478 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800479 ": Git Pull - You are not currently " +
480 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400481 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800482 elif i == 6:
483 main.log.info(
484 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800485 ": Git Pull - You have not configured an upstream " +
486 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400487 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800488 elif i == 7:
489 main.log.info(
490 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800491 ": Git Pull - Pull is not possible because " +
492 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400493 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800494 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700495 # NOTE: abandoning test since we can't reliably handle this
496 # there could be different default text editors and we
497 # also don't know if we actually want to make the commit
498 main.log.error( "Git pull resulted in a merge commit message" +
499 ". Exiting test!" )
500 main.cleanup()
501 main.exit()
502 elif i == 9: # Merge commit message but swap file exists
503 main.log.error( "Git pull resulted in a merge commit message" +
504 " but a swap file exists." )
505 try:
506 self.handle.send( 'A' ) # Abort
507 self.handle.expect( "\$" )
508 return main.ERROR
509 except Exception:
510 main.log.exception( "Couldn't exit editor prompt!")
511 main.cleanup()
512 main.exit()
513 elif i == 10: # In the middle of a merge commit
514 main.log.error( "Git branch is in the middle of a merge. " )
515 main.log.warn( self.handle.before + self.handle.after )
516 return main.ERROR
517 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800518 main.log.error( self.name + ": Git Pull - TIMEOUT" )
519 main.log.error(
520 self.name + " Response was: " + str(
521 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400522 return main.ERROR
523 else:
kelvin8ec71442015-01-15 16:57:00 -0800524 main.log.error(
525 self.name +
526 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400527 return main.ERROR
528 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800529 main.log.error( self.name + ": EOF exception found" )
530 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400531 main.cleanup()
532 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800533 except Exception:
534 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400535 main.cleanup()
536 main.exit()
537
kelvin-onlabd3b64892015-01-20 13:26:24 -0800538 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800539 """
Jon Hallacabffd2014-10-09 12:36:53 -0400540 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800541
Jon Hallacabffd2014-10-09 12:36:53 -0400542 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800543 If used as gitCheckout( "branch" ) it will do git checkout
544 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400545
546 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800547 branch of the ONOS repository. If it has any problems, it will return
548 main.ERROR.
549 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400550 successful then the function will return main.TRUE.
551
kelvin8ec71442015-01-15 16:57:00 -0800552 """
Jon Hallacabffd2014-10-09 12:36:53 -0400553 try:
kelvin8ec71442015-01-15 16:57:00 -0800554 self.handle.sendline( "cd " + self.home )
kelvin-onlaba1484582015-02-02 15:46:20 -0800555 self.handle.expect( self.home + "\$" )
Jon Hall274b6642015-02-17 11:57:17 -0800556 main.log.info( self.name +
557 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800558 cmd = "git checkout " + branch
559 self.handle.sendline( cmd )
560 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800561 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800562 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700563 'Username for (.*): ',
564 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700565 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800566 pexpect.TIMEOUT,
567 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800568 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800569 'error: you need to resolve your current index first',
570 "You are in 'detached HEAD' state.",
571 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800572 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800573 if i == 0:
574 main.log.error(
575 self.name +
576 ": Git checkout had some issue..." )
577 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400578 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800579 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800580 main.log.error(
581 self.name +
582 ": Git checkout asking for username." +
583 " Please configure your local git repository to be able " +
584 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800585 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400586 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800587 elif i == 2:
588 main.log.info(
589 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800590 ": Git Checkout %s : Already on this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800591 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800592 # main.log.info( "DEBUG: after checkout cmd = "+
593 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400594 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800595 elif i == 3:
596 main.log.info(
597 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800598 ": Git checkout %s - Switched to this branch" % branch )
kelvin-onlaba1484582015-02-02 15:46:20 -0800599 self.handle.expect( self.home + "\$" )
kelvin8ec71442015-01-15 16:57:00 -0800600 # main.log.info( "DEBUG: after checkout cmd = "+
601 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400602 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800603 elif i == 4:
604 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
605 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800606 self.name + " Response was: " + str( self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400607 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800608 elif i == 5:
609 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800610 main.log.error(
611 self.name +
612 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800613 "Your local changes to the following files would" +
614 " be overwritten by checkout:" +
615 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800616 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500617 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800618 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800619 main.log.error(
620 self.name +
621 ": Git checkout error: \n" +
622 "You need to resolve your current index first:" +
623 str( self.handle.before ) )
kelvin-onlaba1484582015-02-02 15:46:20 -0800624 self.handle.expect( self.home + "\$" )
Jon Hall81e29af2014-11-04 20:41:23 -0500625 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800626 elif i == 7:
627 main.log.info(
628 self.name +
629 ": Git checkout " + str( branch ) +
630 " - You are in 'detached HEAD' state. HEAD is now at " +
631 str( branch ) )
632 self.handle.expect( self.home + "\$" )
633 return main.TRUE
634 elif i == 8: # Already in detached HEAD on the specified commit
635 main.log.info(
636 self.name +
637 ": Git Checkout %s : Already on commit" % branch )
638 self.handle.expect( self.home + "\$" )
639 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400640 else:
kelvin8ec71442015-01-15 16:57:00 -0800641 main.log.error(
642 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800643 ": Git Checkout - Unexpected response, " +
644 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800645 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400646 return main.ERROR
647
648 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800649 main.log.error( self.name + ": EOF exception found" )
650 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400651 main.cleanup()
652 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800653 except Exception:
654 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400655 main.cleanup()
656 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400657
pingping-lin6d23d9e2015-02-02 16:54:24 -0800658 def getBranchName( self ):
pingping-linf30cf272015-05-29 15:54:07 -0700659 main.log.info( "self.home = " )
660 main.log.info( self.home )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800661 self.handle.sendline( "cd " + self.home )
pingping-lin9bf3d8f2015-05-29 16:05:28 -0700662 self.handle.expect( self.home + "\$" )
pingping-lin6d23d9e2015-02-02 16:54:24 -0800663 self.handle.sendline( "git name-rev --name-only HEAD" )
664 self.handle.expect( "git name-rev --name-only HEAD" )
665 self.handle.expect( "\$" )
666
667 lines = self.handle.before.splitlines()
668 if lines[1] == "master":
669 return "master"
670 elif lines[1] == "onos-1.0":
671 return "onos-1.0"
672 else:
673 main.log.info( lines[1] )
674 return "unexpected ONOS branch for SDN-IP test"
675
kelvin-onlabd3b64892015-01-20 13:26:24 -0800676 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800677 """
Jon Hall274b6642015-02-17 11:57:17 -0800678 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800679 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800680 """
Jon Hall45ec0922014-10-10 19:33:49 -0400681 try:
kelvin8ec71442015-01-15 16:57:00 -0800682 self.handle.sendline( "" )
683 self.handle.expect( "\$" )
684 self.handle.sendline(
685 "cd " +
686 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800687 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
688 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800689 # NOTE: for some reason there are backspaces inserted in this
690 # phrase when run from Jenkins on some tests
691 self.handle.expect( "never" )
692 self.handle.expect( "\$" )
693 response = ( self.name + ": \n" + str(
694 self.handle.before + self.handle.after ) )
695 self.handle.sendline( "cd " + self.home )
696 self.handle.expect( "\$" )
697 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400698 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500699 print line
700 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700701 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800702 for line in lines[ 2:-1 ]:
703 # Bracket replacement is for Wiki-compliant
704 # formatting. '<' or '>' are interpreted
705 # as xml specific tags that cause errors
706 line = line.replace( "<", "[" )
707 line = line.replace( ">", "]" )
pingping-lin763ee042015-05-20 17:45:30 -0700708 #main.log.wiki( "\t" + line )
709 main.log.wiki( line + "<br /> " )
710 main.log.summary( line )
711 main.log.wiki( "</blockquote>" )
712 main.log.summary("\n")
kelvin8ec71442015-01-15 16:57:00 -0800713 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400714 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800715 main.log.error( self.name + ": EOF exception found" )
716 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400717 main.cleanup()
718 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800719 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800720 main.log.error( self.name + ": TIMEOUT exception found" )
721 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800722 main.cleanup()
723 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800724 except Exception:
725 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall45ec0922014-10-10 19:33:49 -0400726 main.cleanup()
727 main.exit()
728
kelvin-onlabd3b64892015-01-20 13:26:24 -0800729 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Flavio Castrocc38a542016-03-03 13:15:46 -0800730 appString, onosIpAddrs, onosUser="sdn" ):
kelvin8ec71442015-01-15 16:57:00 -0800731 """
andrewonlab94282092014-10-10 13:00:11 -0400732 Creates a cell file based on arguments
733 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800734 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400735 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800736 * File name of the cell file ( fileName )
737 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800738 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400739 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800740 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400741 - Must be passed in as last arguments
Flavio Castrocc38a542016-03-03 13:15:46 -0800742 * ONOS USER (onosUser)
743 - optional argument to set ONOS_USER environment variable
kelvin8ec71442015-01-15 16:57:00 -0800744
andrewonlab94282092014-10-10 13:00:11 -0400745 NOTE: Assumes cells are located at:
746 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800747 """
748 # Variable initialization
Jon Hall6801cda2015-07-15 14:13:45 -0700749 cellDirectory = self.home + "/tools/test/cells/"
kelvin8ec71442015-01-15 16:57:00 -0800750 # We want to create the cell file in the dependencies directory
751 # of TestON first, then copy over to ONOS bench
kelvin-onlabd3b64892015-01-20 13:26:24 -0800752 tempDirectory = "/tmp/"
kelvin8ec71442015-01-15 16:57:00 -0800753 # Create the cell file in the directory for writing ( w+ )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800754 cellFile = open( tempDirectory + fileName, 'w+' )
Jon Hall6801cda2015-07-15 14:13:45 -0700755 if isinstance( onosIpAddrs, types.StringType ):
756 onosIpAddrs = [ onosIpAddrs ]
kelvin8ec71442015-01-15 16:57:00 -0800757
cameron@onlab.us75900962015-03-30 13:22:49 -0700758 # App string is hardcoded environment variables
kelvin8ec71442015-01-15 16:57:00 -0800759 # That you may wish to use by default on startup.
cameron@onlab.us75900962015-03-30 13:22:49 -0700760 # Note that you may not want certain apps listed
kelvin8ec71442015-01-15 16:57:00 -0800761 # on here.
cameron@onlab.us75900962015-03-30 13:22:49 -0700762 appString = "export ONOS_APPS=" + appString
Flavio Castrocc38a542016-03-03 13:15:46 -0800763 onosGroup = "export ONOS_GROUP=" + onosUser
764 onosUser = "export ONOS_USER=" + onosUser
kelvin-onlabd3b64892015-01-20 13:26:24 -0800765 mnString = "export OCN="
kelvin-onlabf70fd542015-05-07 18:41:40 -0700766 if mnIpAddrs == "":
767 mnString = ""
kelvin-onlabd3b64892015-01-20 13:26:24 -0800768 onosString = "export OC"
769 tempCount = 1
kelvin8ec71442015-01-15 16:57:00 -0800770
kelvin-onlabd3b64892015-01-20 13:26:24 -0800771 # Create ONOSNIC ip address prefix
kelvin-onlaba4074292015-07-09 15:19:49 -0700772 tempOnosIp = str( onosIpAddrs[ 0 ] )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800773 tempList = []
774 tempList = tempOnosIp.split( "." )
kelvin8ec71442015-01-15 16:57:00 -0800775 # Omit last element of list to format for NIC
kelvin-onlabd3b64892015-01-20 13:26:24 -0800776 tempList = tempList[ :-1 ]
kelvin8ec71442015-01-15 16:57:00 -0800777 # Structure the nic string ip
kelvin-onlabd3b64892015-01-20 13:26:24 -0800778 nicAddr = ".".join( tempList ) + ".*"
Jon Hall6c44c0b2016-04-20 15:21:00 -0700779 self.nicAddr = nicAddr
kelvin-onlabd3b64892015-01-20 13:26:24 -0800780 onosNicString = "export ONOS_NIC=" + nicAddr
andrewonlab94282092014-10-10 13:00:11 -0400781
782 try:
kelvin8ec71442015-01-15 16:57:00 -0800783 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800784 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400785
kelvin-onlabd3b64892015-01-20 13:26:24 -0800786 for arg in onosIpAddrs:
787 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800788 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400789 # export OC1="10.128.20.11"
790 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800791 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700792 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800793 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800794
Jon Hall6f665652015-09-18 10:08:07 -0700795 cellFile.write( "export OCI=$OC1\n" )
796 cellFile.write( mnString + "\"" + mnIpAddrs + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700797 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800798 cellFile.write( onosGroup + "\n" )
799 cellFile.write( onosUser + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800800 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400801
kelvin8ec71442015-01-15 16:57:00 -0800802 # We use os.system to send the command to TestON cluster
803 # to account for the case in which TestON is not located
804 # on the same cluster as the ONOS bench
805 # Note that even if TestON is located on the same cluster
806 # as ONOS bench, you must setup passwordless ssh
807 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700808 os.system( "scp " + tempDirectory + fileName + " " +
809 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400810
andrewonlab2a6c9342014-10-16 13:40:15 -0400811 return main.TRUE
812
andrewonlab94282092014-10-10 13:00:11 -0400813 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800814 main.log.error( self.name + ": EOF exception found" )
815 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400816 main.cleanup()
817 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800818 except Exception:
819 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -0400820 main.cleanup()
821 main.exit()
822
kelvin-onlabd3b64892015-01-20 13:26:24 -0800823 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800824 """
andrewonlab95ca1462014-10-09 14:04:24 -0400825 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800826 """
Hari Krishna03f530e2015-07-10 17:28:27 -0700827 import re
andrewonlab95ca1462014-10-09 14:04:24 -0400828 try:
829 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800830 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400831 main.cleanup()
832 main.exit()
833 else:
kelvin8ec71442015-01-15 16:57:00 -0800834 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800835 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800836 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400837 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700838 self.handle.expect( str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800839 handleBefore = self.handle.before
840 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800841 # Get the rest of the handle
Jon Hall3b489db2015-10-05 14:38:37 -0700842 self.handle.expect( "\$" )
Jon Hall439c8912016-04-15 02:22:03 -0700843 time.sleep(10)
kelvin-onlabd3b64892015-01-20 13:26:24 -0800844 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400845
Hari Krishna03f530e2015-07-10 17:28:27 -0700846 cell_result = handleBefore + handleAfter + handleMore
suibin zhang116647a2016-05-06 16:30:09 -0700847 #print cell_result
Hari Krishna03f530e2015-07-10 17:28:27 -0700848 if( re.search( "No such cell", cell_result ) ):
849 main.log.error( "Cell call returned: " + handleBefore +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800850 handleAfter + handleMore )
Hari Krishna03f530e2015-07-10 17:28:27 -0700851 main.cleanup()
852 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400853 return main.TRUE
andrewonlab95ca1462014-10-09 14:04:24 -0400854 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800855 main.log.error( self.name + ": EOF exception found" )
856 main.log.error( self.name + ": " + self.handle.before )
andrewonlab95ca1462014-10-09 14:04:24 -0400857 main.cleanup()
858 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800859 except Exception:
860 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab95ca1462014-10-09 14:04:24 -0400861 main.cleanup()
862 main.exit()
863
kelvin-onlabd3b64892015-01-20 13:26:24 -0800864 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800865 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400866 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800867 """
868 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400869
andrewonlabc03bf6c2014-10-09 14:56:18 -0400870 try:
kelvin8ec71442015-01-15 16:57:00 -0800871 # Clean handle by sending empty and expecting $
872 self.handle.sendline( "" )
873 self.handle.expect( "\$" )
874 self.handle.sendline( "onos-verify-cell" )
875 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800876 handleBefore = self.handle.before
877 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800878 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700879 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400880 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800881 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700882 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800883 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400884 main.cleanup()
885 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800886 except Exception:
887 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400888 main.cleanup()
889 main.exit()
890
jenkins1e99e7b2015-04-02 18:15:39 -0700891 def onosCfgSet( self, ONOSIp, configName, configParam ):
892 """
893 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700894 application.
895
jenkins1e99e7b2015-04-02 18:15:39 -0700896 ex)
897 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700898 ONOSIp = '10.0.0.1'
899 configName = 'org.onosproject.myapp'
900 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700901 """
Jon Hall72280bc2016-01-25 14:29:05 -0800902 try:
903 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
904 configName,
905 configParam )
906 self.handle.sendline( "" )
907 self.handle.expect( ":~" )
908 self.handle.sendline( cfgStr )
909 self.handle.expect("cfg set")
910 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700911
Jon Hall72280bc2016-01-25 14:29:05 -0800912 paramValue = configParam.split(" ")[1]
913 paramName = configParam.split(" ")[0]
Jon Hall4ba53f02015-07-29 13:07:41 -0700914
Jon Hall72280bc2016-01-25 14:29:05 -0800915 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700916
Jon Hall72280bc2016-01-25 14:29:05 -0800917 self.handle.sendline( checkStr )
918 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700919
Jon Hall72280bc2016-01-25 14:29:05 -0800920 if "value=" + paramValue + "," in self.handle.before:
921 main.log.info("cfg " + configName + " successfully set to " + configParam)
922 return main.TRUE
923 except pexpect.ExceptionPexpect as e:
924 main.log.exception( self.name + ": Pexpect exception found: " )
925 main.log.error( self.name + ": " + self.handle.before )
926 main.cleanup()
927 main.exit()
928 except Exception:
929 main.log.exception( self.name + ": Uncaught exception!" )
930 main.cleanup()
931 main.exit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700932
kelvin-onlabd3b64892015-01-20 13:26:24 -0800933 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800934 """
andrewonlab05e362f2014-10-10 00:40:57 -0400935 Uses 'onos' command to send various ONOS CLI arguments.
936 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800937 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400938 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800939
940 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400941 CLI commands for ONOS. Try to use this function first
942 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800943 function.
944 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400945 by starting onos, and typing in 'onos' to enter the
946 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800947 available commands.
948 """
andrewonlab05e362f2014-10-10 00:40:57 -0400949 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800950 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800951 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400952 return main.FALSE
953 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800954 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400955 return main.FALSE
956
kelvin8ec71442015-01-15 16:57:00 -0800957 cmdstr = str( cmdstr )
958 self.handle.sendline( "" )
959 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400960
kelvin-onlabd3b64892015-01-20 13:26:24 -0800961 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800962 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400963
kelvin-onlabd3b64892015-01-20 13:26:24 -0800964 handleBefore = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -0800965 main.log.info( "Command sent successfully" )
kelvin8ec71442015-01-15 16:57:00 -0800966 # Obtain return handle that consists of result from
967 # the onos command. The string may need to be
968 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800969 returnString = handleBefore
kelvin-onlabd3b64892015-01-20 13:26:24 -0800970 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400971 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800972 main.log.error( self.name + ": EOF exception found" )
973 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400974 main.cleanup()
975 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800976 except Exception:
977 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab05e362f2014-10-10 00:40:57 -0400978 main.cleanup()
979 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400980
kelvin-onlabd3b64892015-01-20 13:26:24 -0800981 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -0800982 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400983 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -0800984 If -f option is provided, it also forces an uninstall.
985 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -0400986 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -0800987 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -0400988 files to certain onos nodes
989
990 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -0800991 """
Jon Hall7993bfc2014-10-09 16:30:14 -0400992 try:
andrewonlab114768a2014-11-14 12:44:44 -0500993 if options:
kelvin8ec71442015-01-15 16:57:00 -0800994 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -0500995 else:
kelvin8ec71442015-01-15 16:57:00 -0800996 self.handle.sendline( "onos-install " + node )
997 self.handle.expect( "onos-install " )
998 # NOTE: this timeout may need to change depending on the network
999 # and size of ONOS
1000 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001001 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001002 "ONOS\sis\salready\sinstalled",
Jeremyc72b2582016-02-26 18:27:38 -08001003 "already\sup-to-date",
Jon Hall3576f572016-08-23 10:01:07 -07001004 "does not exist",
Jeremyc72b2582016-02-26 18:27:38 -08001005 "\$",
Jon Hall6c44c0b2016-04-20 15:21:00 -07001006 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001007 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001008 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001009 main.log.warn( "Network is unreachable" )
Jon Hall3b489db2015-10-05 14:38:37 -07001010 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001011 return main.FALSE
1012 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001013 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001014 main.log.info(
1015 "ONOS was installed on " +
1016 node +
1017 " and started" )
Jon Hall3b489db2015-10-05 14:38:37 -07001018 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001019 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001020 elif i == 2 or i == 3:
1021 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001022 main.log.info( "ONOS is already installed on " + node )
1023 self.handle.expect( "\$" )
1024 return main.TRUE
1025 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001026 # onos not packaged
1027 main.log.error( "ONOS package not found." )
1028 self.handle.expect( "\$" )
1029 return main.FALSE
1030 elif i == 5:
1031 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001032 main.log.info( "ONOS was installed on " + node )
1033 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001034 elif i == 6:
1035 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001036 main.log.info(
1037 "Installation of ONOS on " +
1038 node +
1039 " timed out" )
Jon Hall3b489db2015-10-05 14:38:37 -07001040 self.handle.expect( "\$" )
Jon Hall53c5e662016-04-13 16:06:56 -07001041 main.log.warn( self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001042 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001043 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001044 main.log.error( self.name + ": EOF exception found" )
1045 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001046 main.cleanup()
1047 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001048 except Exception:
1049 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001050 main.cleanup()
1051 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -04001052
kelvin-onlabd3b64892015-01-20 13:26:24 -08001053 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001054 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001055 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001056 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001057 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001058 try:
kelvin8ec71442015-01-15 16:57:00 -08001059 self.handle.sendline( "" )
1060 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001061 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001062 " start" )
1063 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001064 "Job\sis\salready\srunning",
1065 "start/running",
Jeremyd0e9a6d2016-03-02 11:28:52 -08001066 "\$",
andrewonlab8d0d7d72014-10-09 16:33:15 -04001067 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001068 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001069 if i == 0:
Jon Halleab7a242016-03-04 10:20:43 -08001070 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001071 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001072 return main.TRUE
1073 elif i == 1:
Jon Halleab7a242016-03-04 10:20:43 -08001074 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001075 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001076 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001077 elif i == 2:
1078 main.log.info( "ONOS service started" )
1079 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001080 else:
Jon Halleab7a242016-03-04 10:20:43 -08001081 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001082 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001083 main.cleanup()
1084 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001085 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001086 main.log.error( self.name + ": EOF exception found" )
1087 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001088 main.cleanup()
1089 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001090 except Exception:
1091 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001092 main.cleanup()
1093 main.exit()
1094
kelvin-onlabd3b64892015-01-20 13:26:24 -08001095 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001096 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001097 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001098 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001099 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001100 try:
kelvin8ec71442015-01-15 16:57:00 -08001101 self.handle.sendline( "" )
1102 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001103 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001104 " stop" )
1105 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001106 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001107 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001108 "Unknown\sinstance",
YPZhang77badfc2016-03-09 10:28:59 -08001109 "\$",
Jeremy Songster14c13572016-04-21 17:34:03 -07001110 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001111 if i == 0:
YPZhang77badfc2016-03-09 10:28:59 -08001112 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001113 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001114 return main.TRUE
1115 elif i == 1:
YPZhang77badfc2016-03-09 10:28:59 -08001116 self.handle.expect( "\$" )
Jon Hall65844a32015-03-09 19:09:37 -07001117 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001118 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001119 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001120 elif i == 2:
YPZhang77badfc2016-03-09 10:28:59 -08001121 self.handle.expect( "\$" )
Jon Hall61282e32015-03-19 11:34:11 -07001122 main.log.warn( "ONOS wasn't running" )
1123 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001124 elif i == 3:
1125 main.log.info( "ONOS service stopped" )
1126 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001127 else:
kelvin8ec71442015-01-15 16:57:00 -08001128 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001129 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001130 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001131 main.log.error( self.name + ": EOF exception found" )
1132 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -04001133 main.cleanup()
1134 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001135 except Exception:
1136 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001137 main.cleanup()
1138 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001139
kelvin-onlabd3b64892015-01-20 13:26:24 -08001140 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001141 """
andrewonlabc8d47972014-10-09 16:52:36 -04001142 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001143 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001144 if needed
kelvin8ec71442015-01-15 16:57:00 -08001145 """
andrewonlabc8d47972014-10-09 16:52:36 -04001146 try:
kelvin8ec71442015-01-15 16:57:00 -08001147 self.handle.sendline( "" )
Jeremy Songster14c13572016-04-21 17:34:03 -07001148 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001149 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Jeremy Songster14c13572016-04-21 17:34:03 -07001150 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001151 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001152 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001153 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001154 except pexpect.TIMEOUT:
1155 main.log.exception( self.name + ": Timeout in onosUninstall" )
1156 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001157 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001158 main.log.error( self.name + ": EOF exception found" )
1159 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -04001160 main.cleanup()
1161 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001162 except Exception:
1163 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc8d47972014-10-09 16:52:36 -04001164 main.cleanup()
1165 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001166
kelvin-onlabd3b64892015-01-20 13:26:24 -08001167 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001168 """
andrewonlabaedc8332014-12-04 12:43:03 -05001169 Issues the command 'onos-die <node-ip>'
1170 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001171 """
andrewonlabaedc8332014-12-04 12:43:03 -05001172 try:
kelvin8ec71442015-01-15 16:57:00 -08001173 self.handle.sendline( "" )
1174 self.handle.expect( "\$" )
Jeremyf0aecdb2016-03-30 13:19:57 -07001175 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001176 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001177 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001178 "Killing\sONOS",
1179 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001180 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001181 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001182 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001183 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001184 self.handle.sendline( "" )
1185 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001186 return main.TRUE
1187 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001188 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001189 self.handle.sendline( "" )
1190 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001191 return main.FALSE
1192 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001193 main.log.error( self.name + ": EOF exception found" )
1194 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -05001195 main.cleanup()
1196 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001197 except Exception:
1198 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabaedc8332014-12-04 12:43:03 -05001199 main.cleanup()
1200 main.exit()
1201
kelvin-onlabd3b64892015-01-20 13:26:24 -08001202 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001203 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001204 Calls the command: 'onos-kill [<node-ip>]'
1205 "Remotely, and unceremoniously kills the ONOS instance running on
1206 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001207 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001208 try:
kelvin8ec71442015-01-15 16:57:00 -08001209 self.handle.sendline( "" )
1210 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001211 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001212 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -04001213 "\$",
1214 "No\sroute\sto\shost",
1215 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001216 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001217
andrewonlabe8e56fd2014-10-09 17:12:44 -04001218 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001219 main.log.info(
1220 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001221 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001222 return main.TRUE
1223 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001224 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001225 return main.FALSE
1226 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001227 main.log.info(
1228 "Passwordless login for host: " +
1229 str( nodeIp ) +
1230 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001231 return main.FALSE
1232 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001233 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001234 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001235
andrewonlabe8e56fd2014-10-09 17:12:44 -04001236 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001237 main.log.error( self.name + ": EOF exception found" )
1238 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001239 main.cleanup()
1240 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001241 except Exception:
1242 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001243 main.cleanup()
1244 main.exit()
1245
kelvin-onlabd3b64892015-01-20 13:26:24 -08001246 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001247 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001248 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001249 a cleaner environment.
1250
andrewonlab19fbdca2014-11-14 12:55:59 -05001251 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001252 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001253 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001254 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001255 try:
kelvin8ec71442015-01-15 16:57:00 -08001256 self.handle.sendline( "" )
1257 self.handle.expect( "\$" )
1258 self.handle.sendline( "onos-remove-raft-logs" )
1259 # Sometimes this command hangs
1260 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1261 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001262 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001263 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1264 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001265 if i == 1:
1266 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001267 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001268 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001269 main.log.error( self.name + ": EOF exception found" )
1270 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -05001271 main.cleanup()
1272 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001273 except Exception:
1274 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001275 main.cleanup()
1276 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -05001277
kelvin-onlabd3b64892015-01-20 13:26:24 -08001278 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001279 """
1280 Calls the command 'onos-start-network [ <mininet-topo> ]
1281 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001282 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001283 cell."
andrewonlab94282092014-10-10 13:00:11 -04001284 * Specify mininet topology file name for mntopo
1285 * Topo files should be placed at:
1286 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001287
andrewonlab94282092014-10-10 13:00:11 -04001288 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001289 """
andrewonlab94282092014-10-10 13:00:11 -04001290 try:
1291 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001292 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001293 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001294
kelvin8ec71442015-01-15 16:57:00 -08001295 mntopo = str( mntopo )
1296 self.handle.sendline( "" )
1297 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001298
kelvin8ec71442015-01-15 16:57:00 -08001299 self.handle.sendline( "onos-start-network " + mntopo )
1300 self.handle.expect( "mininet>" )
1301 main.log.info( "Network started, entered mininet prompt" )
1302
1303 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001304
1305 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001306 main.log.error( self.name + ": EOF exception found" )
1307 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001308 main.cleanup()
1309 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001310 except Exception:
1311 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -04001312 main.cleanup()
1313 main.exit()
1314
Jeremy Songster14c13572016-04-21 17:34:03 -07001315 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001316 """
1317 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001318 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001319
Jon Hall7993bfc2014-10-09 16:30:14 -04001320 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001321 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001322 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001323 self.handle.sendline( "onos-wait-for-start " + node )
1324 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001325 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001326 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
Jon Hall7993bfc2014-10-09 16:30:14 -04001327 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001328 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001329 return main.TRUE
1330 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001331 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001332 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001333 main.log.error( "ONOS has not started yet" )
1334 self.handle.send( "\x03" ) # Control-C
1335 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001336 return main.FALSE
1337 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001338 main.log.error( self.name + ": EOF exception found" )
1339 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001340 main.cleanup()
1341 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001342 except Exception:
1343 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001344 main.cleanup()
1345 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001346
kelvin-onlabd3b64892015-01-20 13:26:24 -08001347 def pushTestIntentsShell(
1348 self,
1349 dpidSrc,
1350 dpidDst,
1351 numIntents,
1352 dirFile,
1353 onosIp,
1354 numMult="",
1355 appId="",
1356 report=True,
1357 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001358 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001359 Description:
kelvin8ec71442015-01-15 16:57:00 -08001360 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001361 better parallelize the results than the CLI
1362 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001363 * dpidSrc: specify source dpid
1364 * dpidDst: specify destination dpid
1365 * numIntents: specify number of intents to push
1366 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001367 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001368 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001369 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001370 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001371 """
1372 try:
1373 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001374 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001375 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001376 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001377 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001378 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001379
kelvin-onlabd3b64892015-01-20 13:26:24 -08001380 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1381 if not numMult:
1382 addIntents = addDpid + " " + str( numIntents )
1383 elif numMult:
1384 addIntents = addDpid + " " + str( numIntents ) + " " +\
1385 str( numMult )
1386 if appId:
1387 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001388 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001389 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001390
andrewonlabaedc8332014-12-04 12:43:03 -05001391 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001392 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001393 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001394 sendCmd = addApp + " &"
1395 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001396
kelvin-onlabd3b64892015-01-20 13:26:24 -08001397 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001398
1399 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001400 main.log.error( self.name + ": EOF exception found" )
1401 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001402 main.cleanup()
1403 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001404 except Exception:
1405 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001406 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001407 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001408
kelvin-onlabd3b64892015-01-20 13:26:24 -08001409 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001410 """
andrewonlab970399c2014-11-07 13:09:32 -05001411 Capture all packet activity and store in specified
1412 directory/file
1413
1414 Required:
1415 * interface: interface to capture
1416 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001417 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001418 try:
1419 self.handle.sendline( "" )
1420 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001421
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001422 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001423 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001424 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001425 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001426 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001427
Jon Hallfebb1c72015-03-05 13:30:09 -08001428 main.log.info( "Tshark started capturing files on " +
1429 str( interface ) + " and saving to directory: " +
1430 str( dirFile ) )
1431 except pexpect.EOF:
1432 main.log.error( self.name + ": EOF exception found" )
1433 main.log.error( self.name + ": " + self.handle.before )
1434 main.cleanup()
1435 main.exit()
1436 except Exception:
1437 main.log.exception( self.name + ": Uncaught exception!" )
1438 main.cleanup()
1439 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001440
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001441 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001442 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001443 Description:
1444 Execute onos-topo-cfg command
1445 Required:
1446 onosIp - IP of the onos node you want to send the json to
1447 jsonFile - File path of the json file
1448 Return:
1449 Returns main.TRUE if the command is successfull; Returns
1450 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001451 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001452 try:
kelvin8ec71442015-01-15 16:57:00 -08001453 self.handle.sendline( "" )
1454 self.handle.expect( "\$" )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001455 cmd = "onos-topo-cfg "
1456 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1457 handle = self.handle.before
1458 print handle
1459 if "Error" in handle:
1460 main.log.error( self.name + ": " + self.handle.before )
1461 return main.FALSE
1462 else:
1463 self.handle.expect( "\$" )
1464 return main.TRUE
1465
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
Jon Hall4ba53f02015-07-29 13:07:41 -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"
Jon Hall4ba53f02015-07-29 13:07:41 -07001497
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001498 cmd = (
1499 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001500 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 " &" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001507 self.handle.sendline(cmd)
1508 main.log.info(cmd)
Jon Hallfebb1c72015-03-05 13:30:09 -08001509 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001510 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001511 self.handle.expect( "\$" )
1512 except pexpect.EOF:
1513 main.log.error( self.name + ": EOF exception found" )
1514 main.log.error( self.name + ": " + self.handle.before )
1515 main.cleanup()
1516 main.exit()
1517 except Exception:
1518 main.log.exception( self.name + ": Uncaught exception!" )
1519 main.cleanup()
1520 main.exit()
1521
kelvin-onlabd3b64892015-01-20 13:26:24 -08001522 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001523 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001524 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001525 """
1526 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001527 try:
1528 self.execute( cmd="sudo rm /tmp/wireshark*" )
1529 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001530 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1531 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001532 self.handle.sendline( "" )
1533 main.log.info( "Tshark stopped" )
1534 except pexpect.EOF:
1535 main.log.error( self.name + ": EOF exception found" )
1536 main.log.error( self.name + ": " + self.handle.before )
1537 main.cleanup()
1538 main.exit()
1539 except Exception:
1540 main.log.exception( self.name + ": Uncaught exception!" )
1541 main.cleanup()
1542 main.exit()
1543
kelvin8ec71442015-01-15 16:57:00 -08001544 def ptpd( self, args ):
1545 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001546 Initiate ptp with user-specified args.
1547 Required:
1548 * args: specify string of args after command
1549 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001550 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001551 try:
kelvin8ec71442015-01-15 16:57:00 -08001552 self.handle.sendline( "sudo ptpd " + str( args ) )
1553 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001554 "Multiple",
1555 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001556 "\$" ] )
1557 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001558
andrewonlab0c38a4a2014-10-28 18:35:35 -04001559 if i == 0:
1560 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001561 main.log.info( "ptpd returned an error: " +
1562 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001563 return handle
1564 elif i == 1:
1565 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001566 main.log.error( "ptpd returned an error: " +
1567 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001568 return handle
1569 else:
1570 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001571
andrewonlab0c38a4a2014-10-28 18:35:35 -04001572 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001573 main.log.error( self.name + ": EOF exception found" )
1574 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001575 main.cleanup()
1576 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001577 except Exception:
1578 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001579 main.cleanup()
1580 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001581
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001582 def dumpFlows(self,ONOSIp, destDir, filename="flows" ):
1583 """
1584 Dump Flow Tables to a desired directory.
1585 For debugging purposes, you may want to use
1586 this function to capture flows at a given point in time.
1587 Localtime will be attached to the filename
1588
1589 Required:
1590 * ONOSIp: the IP of the target ONOS instance
1591 * destDir: specify directory to copy to.
1592 ex ) /tmp/
1593 Optional:
1594 * fileName: Name of the file
1595 """
1596
1597 localtime = time.strftime( '%x %X' )
1598 localtime = localtime.replace( "/", "" )
1599 localtime = localtime.replace( " ", "_" )
1600 localtime = localtime.replace( ":", "" )
1601 if destDir[ -1: ] != "/":
1602 destDir += "/"
1603 cmd="flows > "+ str( destDir ) + str( filename ) + localtime
1604 return self.onosCli(ONOSIp,cmd)
1605
Flavio Castrob7718952016-05-18 08:53:41 -07001606 def dumpGroups(self,ONOSIp, destDir, filename="groups" ):
1607 """
1608 Dump Group Tables to a desired directory.
1609 For debugging purposes, you may want to use
1610 this function to capture groups at a given point in time.
1611 Localtime will be attached to the filename
1612
1613 Required:
1614 * ONOSIp: the IP of the target ONOS instance
1615 * destDir: specify directory to copy to.
1616 ex ) /tmp/
1617 Optional:
1618 * fileName: Name of the file
1619 """
1620
Flavio Castro09ab59d2016-05-25 17:01:35 -07001621 localtime = time.strftime( '%H %M' )
Flavio Castrob7718952016-05-18 08:53:41 -07001622 localtime = localtime.replace( "/", "" )
1623 localtime = localtime.replace( " ", "_" )
1624 localtime = localtime.replace( ":", "" )
1625 if destDir[ -1: ] != "/":
1626 destDir += "/"
1627 cmd="groups > "+ str( destDir ) + str( filename ) + localtime
1628 return self.onosCli(ONOSIp,cmd)
1629
kelvin-onlabd3b64892015-01-20 13:26:24 -08001630 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001631 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001632 """
1633 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001634 Current implementation of ONOS deletes its karaf
1635 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001636 you may want to use this function to capture
1637 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001638 Localtime will be attached to the filename
1639
1640 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001641 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001642 copy.
kelvin8ec71442015-01-15 16:57:00 -08001643 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001644 For copying multiple files, leave copyFileName
1645 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001646 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001647 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001648 ex ) /tmp/
1649 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001650 * copyFileName: If you want to rename the log
1651 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001652 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001653 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001654 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001655 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001656 localtime = localtime.replace( "/", "" )
1657 localtime = localtime.replace( " ", "_" )
1658 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001659 if destDir[ -1: ] != "/":
1660 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001661
kelvin-onlabd3b64892015-01-20 13:26:24 -08001662 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001663 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1664 str( destDir ) + str( copyFileName ) +
1665 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001666 self.handle.expect( "cp" )
1667 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001668 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001669 self.handle.sendline( "cp " + str( logToCopy ) +
1670 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001671 self.handle.expect( "cp" )
1672 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001673
kelvin8ec71442015-01-15 16:57:00 -08001674 return self.handle.before
1675
1676 except pexpect.EOF:
1677 main.log.error( "Copying files failed" )
1678 main.log.error( self.name + ": EOF exception found" )
1679 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001680 except Exception:
1681 main.log.exception( "Copying files failed" )
1682
Jon Hall16b72c42015-05-20 10:23:36 -07001683 def checkLogs( self, onosIp, restart=False):
kelvin8ec71442015-01-15 16:57:00 -08001684 """
Jon Hall94fd0472014-12-08 11:52:42 -08001685 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001686 If restart is True, use the old version of onos-check-logs which
1687 does not print the full stacktrace, but shows the entire log file,
1688 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001689 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001690 """
Jon Hall94fd0472014-12-08 11:52:42 -08001691 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001692 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001693 if restart:
1694 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001695 self.handle.sendline( cmd )
1696 self.handle.expect( cmd )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001697 self.handle.expect( "\$ " )
Jon Hall94fd0472014-12-08 11:52:42 -08001698 response = self.handle.before
1699 return response
1700 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001701 main.log.error( "Lost ssh connection" )
1702 main.log.error( self.name + ": EOF exception found" )
1703 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001704 except Exception:
1705 main.log.exception( self.name + ": Uncaught exception!" )
1706 main.cleanup()
1707 main.exit()
Jon Hall94fd0472014-12-08 11:52:42 -08001708
kelvin-onlabd3b64892015-01-20 13:26:24 -08001709 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001710 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001711 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001712 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001713 try:
kelvin8ec71442015-01-15 16:57:00 -08001714 self.handle.sendline( "" )
1715 self.handle.expect( "\$" )
1716 self.handle.sendline( "onos-service " + str( node ) +
1717 " status" )
1718 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001719 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001720 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001721 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001722 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001723 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001724 self.handle.sendline( "" )
1725 self.handle.expect( "\$" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001726
You Wangef1e6572016-03-08 12:53:18 -08001727 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001728 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001729 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001730 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001731 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001732 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001733 main.cleanup()
1734 main.exit()
1735 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001736 main.log.error( self.name + ": EOF exception found" )
1737 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001738 main.cleanup()
1739 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001740 except Exception:
1741 main.log.exception( self.name + ": Uncaught exception!" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001742 main.cleanup()
1743 main.exit()
Jon Hall21270ac2015-02-16 17:59:55 -08001744
Jon Hall63604932015-02-26 17:09:50 -08001745 def setIpTables( self, ip, port='', action='add', packet_type='',
1746 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001747 """
Jon Hall21270ac2015-02-16 17:59:55 -08001748 Description:
1749 add or remove iptables rule to DROP (default) packets from
1750 specific IP and PORT
1751 Usage:
1752 * specify action ('add' or 'remove')
1753 when removing, pass in the same argument as you would add. It will
1754 delete that specific rule.
1755 * specify the ip to block
1756 * specify the destination port to block (defaults to all ports)
1757 * optional packet type to block (default tcp)
1758 * optional iptables rule (default DROP)
1759 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001760 * States boolean toggles adding all supported tcp states to the
1761 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001762 Returns:
1763 main.TRUE on success or
1764 main.FALSE if given invalid input or
1765 main.ERROR if there is an error in response from iptables
1766 WARNING:
1767 * This function uses root privilege iptables command which may result
1768 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001769 """
Jon Hall21270ac2015-02-16 17:59:55 -08001770
1771 # NOTE*********
1772 # The strict checking methods of this driver function is intentional
1773 # to discourage any misuse or error of iptables, which can cause
1774 # severe network errors
1775 # *************
1776
1777 # NOTE: Sleep needed to give some time for rule to be added and
1778 # registered to the instance. If you are calling this function
1779 # multiple times this sleep will prevent any errors.
1780 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001781 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001782 try:
1783 # input validation
1784 action_type = action.lower()
1785 rule = rule.upper()
1786 direction = direction.upper()
1787 if action_type != 'add' and action_type != 'remove':
1788 main.log.error( "Invalid action type. Use 'add' or "
1789 "'remove' table rule" )
1790 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1791 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1792 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1793 "'ACCEPT' or 'LOG' only." )
1794 if direction != 'INPUT' and direction != 'OUTPUT':
1795 # NOTE currently only supports rules INPUT and OUPTUT
1796 main.log.error( "Invalid rule. Valid directions are"
1797 " 'OUTPUT' or 'INPUT'" )
1798 return main.FALSE
1799 return main.FALSE
1800 return main.FALSE
1801 if action_type == 'add':
1802 # -A is the 'append' action of iptables
1803 actionFlag = '-A'
1804 elif action_type == 'remove':
1805 # -D is the 'delete' rule of iptables
1806 actionFlag = '-D'
1807 self.handle.sendline( "" )
1808 self.handle.expect( "\$" )
1809 cmd = "sudo iptables " + actionFlag + " " +\
1810 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001811 " -s " + str( ip )
Jon Hall63604932015-02-26 17:09:50 -08001812 # " -p " + str( packet_type ) +\
1813 if packet_type:
1814 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001815 if port:
1816 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001817 if states:
1818 cmd += " -m state --state="
1819 #FIXME- Allow user to configure which states to block
1820 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001821 cmd += " -j " + str( rule )
1822
1823 self.handle.sendline( cmd )
1824 self.handle.expect( "\$" )
1825 main.log.warn( self.handle.before )
1826
1827 info_string = "On " + str( self.name )
1828 info_string += " " + str( action_type )
1829 info_string += " iptable rule [ "
1830 info_string += " IP: " + str( ip )
1831 info_string += " Port: " + str( port )
1832 info_string += " Rule: " + str( rule )
1833 info_string += " Direction: " + str( direction ) + " ]"
1834 main.log.info( info_string )
1835 return main.TRUE
1836 except pexpect.TIMEOUT:
1837 main.log.exception( self.name + ": Timeout exception in "
1838 "setIpTables function" )
1839 return main.ERROR
1840 except pexpect.EOF:
1841 main.log.error( self.name + ": EOF exception found" )
1842 main.log.error( self.name + ": " + self.handle.before )
1843 main.cleanup()
1844 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001845 except Exception:
1846 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall21270ac2015-02-16 17:59:55 -08001847 main.cleanup()
1848 main.exit()
1849
Jon Hall0468b042015-02-19 19:08:21 -08001850 def detailed_status(self, log_filename):
Jon Hallefbd9792015-03-05 16:11:36 -08001851 """
Jon Hall0468b042015-02-19 19:08:21 -08001852 This method is used by STS to check the status of the controller
1853 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001854 """
Jon Hall0468b042015-02-19 19:08:21 -08001855 import re
1856 try:
1857 self.handle.sendline( "" )
1858 self.handle.expect( "\$" )
1859 self.handle.sendline( "cd " + self.home )
1860 self.handle.expect( "\$" )
1861 self.handle.sendline( "service onos status" )
1862 self.handle.expect( "\$" )
1863 response = self.handle.before
1864 if re.search( "onos start/running", response ):
1865 # onos start/running, process 10457
1866 return 'RUNNING'
1867 # FIXME: Implement this case
1868 # elif re.search( pattern, response ):
1869 # return 'STARTING'
1870 elif re.search( "onos stop/", response ):
1871 # onos stop/waiting
1872 # FIXME handle this differently?: onos stop/pre-stop
1873 return 'STOPPED'
1874 # FIXME: Implement this case
1875 # elif re.search( pattern, response ):
1876 # return 'FROZEN'
1877 else:
1878 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001879 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001880 main.log.warn( response )
1881 return 'ERROR', "Unknown response: %s" % response
1882 except pexpect.TIMEOUT:
1883 main.log.exception( self.name + ": Timeout exception in "
1884 "setIpTables function" )
1885 return 'ERROR', "Pexpect Timeout"
1886 except pexpect.EOF:
1887 main.log.error( self.name + ": EOF exception found" )
1888 main.log.error( self.name + ": " + self.handle.before )
1889 main.cleanup()
1890 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001891 except Exception:
1892 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall0468b042015-02-19 19:08:21 -08001893 main.cleanup()
1894 main.exit()
1895
andrew@onlab.us3b087132015-03-11 15:00:08 -07001896 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1897 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001898 Create/formats the LinkGraph.cfg file based on arguments
1899 -only creates a linear topology and connects islands
1900 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001901 -must be called by ONOSbench
1902
Jon Hall4ba53f02015-07-29 13:07:41 -07001903 ONOSIpList - list of all of the node IPs to be used
1904
1905 deviceCount - number of switches to be assigned
andrew@onlab.us3b087132015-03-11 15:00:08 -07001906 '''
Jon Hall6509dbf2016-06-21 17:01:17 -07001907 main.log.info("Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001908 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001909 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001910
1911 linkGraph = open(tempFile, 'w+')
1912 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1913 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1914 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001915
andrew@onlab.us3b087132015-03-11 15:00:08 -07001916 clusterCount = len(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07001917
1918 if type(deviceCount) is int or type(deviceCount) is str:
andrew@onlab.us3b087132015-03-11 15:00:08 -07001919 deviceCount = int(deviceCount)
1920 switchList = [0]*(clusterCount+1)
1921 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07001922
andrew@onlab.us3b087132015-03-11 15:00:08 -07001923 for node in range(1, clusterCount + 1):
1924 switchList[node] = baselineSwitchCount
1925
1926 for node in range(1, (deviceCount%clusterCount)+1):
1927 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001928
andrew@onlab.us3b087132015-03-11 15:00:08 -07001929 if type(deviceCount) is list:
1930 main.log.info("Using provided device distribution")
1931 switchList = [0]
1932 for i in deviceCount:
1933 switchList.append(int(i))
1934
1935 tempList = ['0']
1936 tempList.extend(ONOSIpList)
1937 ONOSIpList = tempList
1938
1939 myPort = 6
1940 lastSwitch = 0
1941 for node in range(1, clusterCount+1):
1942 if switchList[node] == 0:
1943 continue
1944
1945 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001946
andrew@onlab.us3b087132015-03-11 15:00:08 -07001947 if node > 1:
1948 #connect to last device on previous node
Jon Hall4ba53f02015-07-29 13:07:41 -07001949 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1950 linkGraph.write(line)
1951
1952 lastSwitch = 0
1953 for switch in range (0, switchList[node]-1):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001954 line = ""
1955 line = ("\t" + str(switch) + ":" + str(myPort))
1956 line += " -- "
1957 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1958 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07001959 lastSwitch = switch+1
andrew@onlab.us3b087132015-03-11 15:00:08 -07001960 lastIp = ONOSIpList[node]
Jon Hall4ba53f02015-07-29 13:07:41 -07001961
andrew@onlab.us3b087132015-03-11 15:00:08 -07001962 #lastSwitch += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001963 if node < (clusterCount):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001964 #connect to first device on the next node
Jon Hall4ba53f02015-07-29 13:07:41 -07001965 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
andrew@onlab.us3b087132015-03-11 15:00:08 -07001966 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07001967
andrew@onlab.us3b087132015-03-11 15:00:08 -07001968 linkGraph.write("}\n")
1969 linkGraph.close()
1970
1971 #SCP
Jon Hall4ba53f02015-07-29 13:07:41 -07001972 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)
andrew@onlab.us3b087132015-03-11 15:00:08 -07001973 main.log.info("linkGraph.cfg creation complete")
1974
cameron@onlab.us75900962015-03-30 13:22:49 -07001975 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
Jon Hall4ba53f02015-07-29 13:07:41 -07001976
andrew@onlab.us3b087132015-03-11 15:00:08 -07001977 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001978 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
1979 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07001980 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 -07001981 '''
1982
Jon Hall6509dbf2016-06-21 17:01:17 -07001983 main.log.info("Configuring Null Device Provider" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001984 clusterCount = len(ONOSIpList)
1985
Jon Hall4ba53f02015-07-29 13:07:41 -07001986 try:
1987
cameron@onlab.us75900962015-03-30 13:22:49 -07001988 if type(deviceCount) is int or type(deviceCount) is str:
Jon Hall6509dbf2016-06-21 17:01:17 -07001989 main.log.info("Creating device distribution")
cameron@onlab.us75900962015-03-30 13:22:49 -07001990 deviceCount = int(deviceCount)
1991 switchList = [0]*(clusterCount+1)
1992 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001993
cameron@onlab.us75900962015-03-30 13:22:49 -07001994 for node in range(1, clusterCount + 1):
1995 switchList[node] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001996
cameron@onlab.us75900962015-03-30 13:22:49 -07001997 for node in range(1, (deviceCount%clusterCount)+1):
1998 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001999
2000 if type(deviceCount) is list:
2001 main.log.info("Using provided device distribution")
2002
2003 if len(deviceCount) == clusterCount:
cameron@onlab.us75900962015-03-30 13:22:49 -07002004 switchList = ['0']
2005 switchList.extend(deviceCount)
Jon Hall4ba53f02015-07-29 13:07:41 -07002006
2007 if len(deviceCount) == (clusterCount + 1):
2008 if deviceCount[0] == '0' or deviceCount[0] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002009 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002010
cameron@onlab.us75900962015-03-30 13:22:49 -07002011 assert len(switchList) == (clusterCount + 1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002012
cameron@onlab.us75900962015-03-30 13:22:49 -07002013 except AssertionError:
Jon Hall4ba53f02015-07-29 13:07:41 -07002014 main.log.error( "Bad device/Ip list match")
cameron@onlab.us75900962015-03-30 13:22:49 -07002015 except TypeError:
2016 main.log.exception( self.name + ": Object not as expected" )
2017 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002018 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002019 main.log.exception( self.name + ": Uncaught exception!" )
2020 main.cleanup()
2021 main.exit()
2022
andrew@onlab.us3b087132015-03-11 15:00:08 -07002023
2024 ONOSIp = [0]
2025 ONOSIp.extend(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07002026
andrew@onlab.us3b087132015-03-11 15:00:08 -07002027 devicesString = "devConfigs = "
2028 for node in range(1, len(ONOSIp)):
2029 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
2030 if node < clusterCount:
2031 devicesString += (",")
Jon Hall4ba53f02015-07-29 13:07:41 -07002032
2033 try:
cameron@onlab.us75900962015-03-30 13:22:49 -07002034 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2035 self.handle.expect(":~")
2036 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
2037 self.handle.expect(":~")
andrew@onlab.us3b087132015-03-11 15:00:08 -07002038
cameron@onlab.us75900962015-03-30 13:22:49 -07002039 for i in range(10):
2040 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
2041 self.handle.expect(":~")
2042 verification = self.handle.before
2043 if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
2044 break
2045 else:
2046 time.sleep(1)
andrew@onlab.us3b087132015-03-11 15:00:08 -07002047
cameron@onlab.us2cc8bf12015-04-02 14:12:30 -07002048 assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002049
cameron@onlab.us75900962015-03-30 13:22:49 -07002050 except AssertionError:
2051 main.log.error("Incorrect Config settings: " + verification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002052 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002053 main.log.exception( self.name + ": Uncaught exception!" )
2054 main.cleanup()
2055 main.exit()
2056
Jon Hall4ba53f02015-07-29 13:07:41 -07002057 def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002058 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002059 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002060 you want to use a different topology file than linkGraph.cfg
andrew@onlab.us3b087132015-03-11 15:00:08 -07002061 '''
2062
Jon Hall4ba53f02015-07-29 13:07:41 -07002063
2064 try:
2065 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
2066 self.handle.expect(":~")
cameron@onlab.us75900962015-03-30 13:22:49 -07002067 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2068 self.handle.expect(":~")
Jon Hall4ba53f02015-07-29 13:07:41 -07002069
2070 for i in range(10):
2071 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
cameron@onlab.us75900962015-03-30 13:22:49 -07002072 self.handle.expect(":~")
2073 verification = self.handle.before
Jon Hall4ba53f02015-07-29 13:07:41 -07002074 if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002075 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002076 else:
cameron@onlab.us75900962015-03-30 13:22:49 -07002077 time.sleep(1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002078
cameron@onlab.us75900962015-03-30 13:22:49 -07002079 assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002080
cameron@onlab.us75900962015-03-30 13:22:49 -07002081 except pexpect.EOF:
2082 main.log.error( self.name + ": EOF exception found" )
2083 main.log.error( self.name + ": " + self.handle.before )
2084 main.cleanup()
2085 main.exit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002086 except AssertionError:
2087 main.log.info("Settings did not post to ONOS")
Jon Hall4ba53f02015-07-29 13:07:41 -07002088 main.log.error(varification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002089 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002090 main.log.exception( self.name + ": Uncaught exception!" )
2091 main.log.error(varification)
2092 main.cleanup()
2093 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002094
kelvin-onlaba4074292015-07-09 15:19:49 -07002095 def getOnosIps( self ):
2096 """
2097 Get all onos IPs stored in
2098 """
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002099
kelvin-onlaba4074292015-07-09 15:19:49 -07002100 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002101
kelvin-onlaba4074292015-07-09 15:19:49 -07002102 def logReport( self, nodeIp, searchTerms, outputMode="s" ):
Jon Hallb4242222016-01-25 17:07:04 -08002103 """
2104 Searches the latest ONOS log file for the given search terms and
2105 prints the total occurances of each term. Returns to combined total of
2106 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002107
Jon Hallb4242222016-01-25 17:07:04 -08002108 Arguments:
2109 * nodeIp - The ip of the ONOS node where the log is located
2110 * searchTerms - A string to grep for or a list of strings to grep
2111 for in the ONOS log. Will print out the number of
2112 occurances for each term.
2113 Optional Arguments:
2114 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2115 containing each search term as well as the total
2116 number of occurances of each term. Defaults to 's',
2117 which prints the simple output of just the number
2118 of occurances for each term.
2119 """
2120 try:
2121 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
2122 if type( searchTerms ) is str:
2123 searchTerms = [searchTerms]
2124 numTerms = len( searchTerms )
2125 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002126
Jon Hallb4242222016-01-25 17:07:04 -08002127 totalHits = 0
2128 logLines = []
2129 for termIndex in range( numTerms ):
2130 term = searchTerms[termIndex]
2131 logLines.append( [term] )
2132 cmd = "onos-ssh " + nodeIp + " cat /opt/onos/log/karaf.log | grep " + term
2133 self.handle.sendline( cmd )
2134 self.handle.expect( ":~" )
2135 before = self.handle.before.splitlines()
2136 count = 0
2137 for line in before:
2138 if term in line and "grep" not in line:
2139 count += 1
2140 if before.index( line ) > ( len( before ) - 7 ):
2141 logLines[termIndex].append( line )
2142 main.log.info( "{}: {}".format( term, count ) )
2143 totalHits += count
2144 if termIndex == numTerms - 1:
2145 print "\n"
2146 if outputMode != "s":
2147 outputString = ""
2148 for term in logLines:
2149 outputString = term[0] + ": \n"
2150 for line in range( 1, len( term ) ):
2151 outputString += ( "\t" + term[line] + "\n" )
2152 if outputString != ( term[0] + ": \n" ):
2153 main.log.info( outputString )
2154 main.log.info( "=" * 70 )
2155 return totalHits
2156 except pexpect.EOF:
2157 main.log.error( self.name + ": EOF exception found" )
2158 main.log.error( self.name + ": " + self.handle.before )
2159 main.cleanup()
2160 main.exit()
2161 except pexpect.TIMEOUT:
2162 main.log.error( self.name + ": TIMEOUT exception found" )
2163 main.log.error( self.name + ": " + self.handle.before )
2164 main.cleanup()
2165 main.exit()
2166 except Exception:
2167 main.log.exception( self.name + ": Uncaught exception!" )
2168 main.cleanup()
2169 main.exit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002170
2171 def copyMininetFile( self, fileName, localPath, userName, ip,
2172 mnPath='~/mininet/custom/', timeout = 60 ):
2173 """
2174 Description:
2175 Copy mininet topology file from dependency folder in the test folder
2176 and paste it to the mininet machine's mininet/custom folder
2177 Required:
2178 fileName - Name of the topology file to copy
2179 localPath - File path of the mininet topology file
2180 userName - User name of the mininet machine to send the file to
2181 ip - Ip address of the mininet machine
2182 Optional:
2183 mnPath - of the mininet directory to send the file to
2184 Return:
2185 Return main.TRUE if successfully copied the file otherwise
2186 return main.FALSE
2187 """
2188
2189 try:
2190 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2191 str( ip ) + ":" + mnPath + fileName
2192
2193 self.handle.sendline( "" )
2194 self.handle.expect( "\$" )
2195
2196 main.log.info( self.name + ": Execute: " + cmd )
2197
2198 self.handle.sendline( cmd )
2199
2200 i = self.handle.expect( [ 'No such file',
2201 "100%",
2202 pexpect.TIMEOUT ] )
2203
2204 if i == 0:
2205 main.log.error( self.name + ": File " + fileName +
2206 " does not exist!" )
2207 return main.FALSE
2208
2209 if i == 1:
2210 main.log.info( self.name + ": File " + fileName +
2211 " has been copied!" )
2212 self.handle.sendline( "" )
2213 self.handle.expect( "\$" )
2214 return main.TRUE
2215
2216 except pexpect.EOF:
2217 main.log.error( self.name + ": EOF exception found" )
2218 main.log.error( self.name + ": " + self.handle.before )
2219 main.cleanup()
2220 main.exit()
2221 except pexpect.TIMEOUT:
2222 main.log.error( self.name + ": TIMEOUT exception found" )
2223 main.log.error( self.name + ": " + self.handle.before )
2224 main.cleanup()
2225 main.exit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002226
2227 def jvmSet(self, memory=8):
Jon Hall4ba53f02015-07-29 13:07:41 -07002228
cameron@onlab.us78b89652015-07-08 15:21:03 -07002229 import os
2230
2231 homeDir = os.path.expanduser('~')
2232 filename = "/onos/tools/package/bin/onos-service"
2233
2234 serviceConfig = open(homeDir + filename, 'w+')
2235 serviceConfig.write("#!/bin/bash\n ")
2236 serviceConfig.write("#------------------------------------- \n ")
2237 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
2238 serviceConfig.write("#------------------------------------- \n ")
2239 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
2240 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
2241 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
2242 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
2243 serviceConfig.close()
2244
Jon Hall6c44c0b2016-04-20 15:21:00 -07002245 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002246
cameron@onlab.us78b89652015-07-08 15:21:03 -07002247 filename = main.TEST + "DB"
2248 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002249
cameron@onlab.us78b89652015-07-08 15:21:03 -07002250 for item in testData:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002251 if type( item ) is string:
cameron@onlab.us78b89652015-07-08 15:21:03 -07002252 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002253 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002254 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002255 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002256
Jon Hall6c44c0b2016-04-20 15:21:00 -07002257 DBFile = open( filename, "a" )
2258 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002259 DBFile.close()
2260
Jon Hall6c44c0b2016-04-20 15:21:00 -07002261 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002262
Jon Hall6c44c0b2016-04-20 15:21:00 -07002263 self.handle.sendline( "onos " + ONOSIp + " summary" )
2264 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002265
2266 summaryStr = self.handle.before
2267 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2268
2269 #passed = "SCC(s)=1" in summaryStr
2270 #if deviceCount:
2271 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
2272
GlennRC772363b2015-08-25 13:05:57 -07002273 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002274 if "SCC(s)=1," in summaryStr:
2275 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002276 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002277 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002278 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002279
2280 if deviceCount:
2281 print" ============================="
Jon Hall6c44c0b2016-04-20 15:21:00 -07002282 checkStr = "devices=" + str( deviceCount[0] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002283 print "Checkstr: " + checkStr
2284 if checkStr not in summaryStr:
2285 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002286 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002287 else:
2288 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002289
2290 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002291
Jon Hall8f6d4622016-05-23 15:27:18 -07002292 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002293 """
2294 Update self.ip_address with numerical ip address. If multiple IP's are
2295 located on the device, will attempt to use self.nicAddr to choose the
2296 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2297 determine the correct address.
2298
2299 ONLY WORKS WITH IPV4 ADDRESSES
2300 """
2301 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002302 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002303 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2304 pattern = re.compile( ipPat )
2305 match = re.search( pattern, self.ip_address )
2306 if self.nicAddr:
2307 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2308 nicPat = re.compile( nicPat )
2309 else:
2310 nicPat = None
2311 # IF self.ip_address is an ip address and matches
2312 # self.nicAddr: return self.ip_address
2313 if match:
2314 curIp = match.group(0)
2315 if nicPat:
2316 nicMatch = re.search( nicPat, curIp )
2317 if nicMatch:
2318 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002319 # ELSE: IF iface, return ip of interface
2320 cmd = "ifconfig"
2321 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2322 if iface:
2323 cmd += " " + str( iface )
2324 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002325 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2326 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002327 if iface:
2328 if ips:
2329 ip = ips[0]
2330 self.ip_address = ip
2331 return ip
2332 else:
2333 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2334 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002335 if nicPat:
2336 for ip in ips:
2337 curMatch = re.search( nicPat, ip )
2338 if curMatch:
2339 self.ip_address = ip
2340 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002341 else: # If only one non-localhost ip, return that
2342 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002343 if len(tmpList) == 1:
2344 curIp = tmpList[0]
2345 self.ip_address = curIp
2346 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002347 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002348 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002349 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002350 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002351 main.log.exception( "Error executing ifconfig" )
2352 except IndexError:
2353 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002354 except Exception:
2355 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002356
2357 def startBasicONOS(self, nodeList, opSleep = 60, onosStartupSleep = 60):
2358
2359 '''
2360 Start onos cluster with defined nodes, but only with drivers app
2361
2362 '''
2363 import time
2364
2365 self.createCellFile( self.ip_address,
2366 "temp",
2367 self.ip_address,
2368 "drivers",
2369 nodeList )
2370
2371 main.log.info( self.name + ": Apply cell to environment" )
2372 cellResult = self.setCell( "temp" )
2373 verifyResult = self.verifyCell()
2374
2375 main.log.info( self.name + ": Creating ONOS package" )
2376 packageResult = self.onosPackage( opTimeout=opSleep )
2377
2378 main.log.info( self.name + ": Installing ONOS package" )
2379 for nd in nodeList:
2380 self.onosInstall( node=nd )
2381
2382 main.log.info( self.name + ": Starting ONOS service" )
2383 time.sleep( onosStartupSleep )
2384
2385 onosStatus = True
2386 for nd in nodeList:
2387 onosStatus = onosStatus & self.isup( node = nd )
2388 #print "onosStatus is: " + str( onosStatus )
2389
2390 return main.TRUE if onosStatus else main.FALSE
2391
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002392 def onosNetCfg( self, controllerIps, path, fileName ):
2393 """
2394 Push a specified json file to ONOS through the onos-netcfg service
2395
2396 Required:
2397 controllerIps - the Ips of the ONOS nodes in the cluster
2398 path - the location of the file to be sent
2399 fileName - name of the json file to be sent
2400
2401 Returns main.TRUE on successfully sending json file, and main.FALSE if
2402 there is an error.
2403 """
2404 try:
2405 cmd = "onos-netcfg {0} {1}{2}.json".format( controllerIps, path, fileName )
2406 main.log.info( "Sending: " + cmd )
2407 main.ONOSbench.handle.sendline( cmd )
2408 handle = self.handle.before
2409 print handle
2410 if "Error" in handle:
2411 main.log.error( self.name + ": " + self.handle.before )
2412 return main.FALSE
2413 else:
2414 self.handle.expect( "\$" )
2415 return main.TRUE
2416 except pexpect.EOF:
2417 main.log.error( self.name + ": EOF exception found" )
2418 main.log.error( self.name + ": " + self.handle.before )
2419 main.cleanup()
2420 main.exit()
2421 except Exception:
2422 main.log.exception( self.name + ": Uncaught exception!" )
2423 main.cleanup()
Jeremy Songsterae01bba2016-07-11 15:39:17 -07002424 main.exit()