blob: 633b501f7a51dcbee376e2d1f288eef5320a1f69 [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 ):
You Wang9cdf9a22017-05-01 13:44:18 -0700659 import re
660 try:
661 main.log.info( "self.home = " )
662 main.log.info( self.home )
663 self.handle.sendline( "cd " + self.home )
664 self.handle.expect( self.home + "\$" )
665 self.handle.sendline( "git name-rev --name-only HEAD" )
666 self.handle.expect( "git name-rev --name-only HEAD" )
667 self.handle.expect( "\$" )
668 lines = self.handle.before.splitlines()
669 if lines[1] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[1] ):
670 return lines[1]
671 else:
672 main.log.info( lines[1] )
673 return "unexpected ONOS branch"
674 except pexpect.EOF:
675 main.log.error( self.name + ": EOF exception found" )
676 main.log.error( self.name + ": " + self.handle.before )
677 main.cleanup()
678 main.exit()
679 except pexpect.TIMEOUT:
680 main.log.error( self.name + ": TIMEOUT exception found" )
681 main.log.error( self.name + ": " + self.handle.before )
682 main.cleanup()
683 main.exit()
684 except Exception:
685 main.log.exception( self.name + ": Uncaught exception!" )
686 main.cleanup()
687 main.exit()
pingping-lin6d23d9e2015-02-02 16:54:24 -0800688
kelvin-onlabd3b64892015-01-20 13:26:24 -0800689 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800690 """
Jon Hall274b6642015-02-17 11:57:17 -0800691 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800692 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800693 """
Jon Hall45ec0922014-10-10 19:33:49 -0400694 try:
kelvin8ec71442015-01-15 16:57:00 -0800695 self.handle.sendline( "" )
696 self.handle.expect( "\$" )
697 self.handle.sendline(
698 "cd " +
699 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800700 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
701 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800702 # NOTE: for some reason there are backspaces inserted in this
703 # phrase when run from Jenkins on some tests
704 self.handle.expect( "never" )
705 self.handle.expect( "\$" )
706 response = ( self.name + ": \n" + str(
707 self.handle.before + self.handle.after ) )
708 self.handle.sendline( "cd " + self.home )
709 self.handle.expect( "\$" )
710 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400711 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500712 print line
713 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700714 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800715 for line in lines[ 2:-1 ]:
716 # Bracket replacement is for Wiki-compliant
717 # formatting. '<' or '>' are interpreted
718 # as xml specific tags that cause errors
719 line = line.replace( "<", "[" )
720 line = line.replace( ">", "]" )
pingping-lin763ee042015-05-20 17:45:30 -0700721 #main.log.wiki( "\t" + line )
722 main.log.wiki( line + "<br /> " )
723 main.log.summary( line )
724 main.log.wiki( "</blockquote>" )
725 main.log.summary("\n")
kelvin8ec71442015-01-15 16:57:00 -0800726 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400727 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800728 main.log.error( self.name + ": EOF exception found" )
729 main.log.error( self.name + ": " + self.handle.before )
Jon Hall45ec0922014-10-10 19:33:49 -0400730 main.cleanup()
731 main.exit()
Jon Hall368769f2014-11-19 15:43:35 -0800732 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800733 main.log.error( self.name + ": TIMEOUT exception found" )
734 main.log.error( self.name + ": " + self.handle.before )
Jon Hall368769f2014-11-19 15:43:35 -0800735 main.cleanup()
736 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800737 except Exception:
738 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall45ec0922014-10-10 19:33:49 -0400739 main.cleanup()
740 main.exit()
741
kelvin-onlabd3b64892015-01-20 13:26:24 -0800742 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Jon Hall810b67d2016-12-05 10:19:01 -0800743 appString, onosIpAddrs, onosUser="sdn", useSSH=True ):
kelvin8ec71442015-01-15 16:57:00 -0800744 """
andrewonlab94282092014-10-10 13:00:11 -0400745 Creates a cell file based on arguments
746 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800747 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400748 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800749 * File name of the cell file ( fileName )
750 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800751 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400752 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800753 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400754 - Must be passed in as last arguments
Flavio Castrocc38a542016-03-03 13:15:46 -0800755 * ONOS USER (onosUser)
756 - optional argument to set ONOS_USER environment variable
kelvin8ec71442015-01-15 16:57:00 -0800757
andrewonlab94282092014-10-10 13:00:11 -0400758 NOTE: Assumes cells are located at:
759 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800760 """
andrewonlab94282092014-10-10 13:00:11 -0400761 try:
Jon Hall2c8959e2016-12-16 12:17:34 -0800762 # Variable initialization
763 cellDirectory = self.home + "/tools/test/cells/"
764 # We want to create the cell file in the dependencies directory
765 # of TestON first, then copy over to ONOS bench
766 tempDirectory = "/tmp/"
767 # Create the cell file in the directory for writing ( w+ )
768 cellFile = open( tempDirectory + fileName, 'w+' )
769 if isinstance( onosIpAddrs, types.StringType ):
770 onosIpAddrs = [ onosIpAddrs ]
771
772 # App string is hardcoded environment variables
773 # That you may wish to use by default on startup.
774 # Note that you may not want certain apps listed
775 # on here.
776 appString = "export ONOS_APPS=" + appString
777 onosGroup = "export ONOS_GROUP=" + onosUser
778 onosUser = "export ONOS_USER=" + onosUser
779 if useSSH:
780 onosUseSSH = "export ONOS_USE_SSH=true"
781 mnString = "export OCN="
782 if mnIpAddrs == "":
783 mnString = ""
784 onosString = "export OC"
785 tempCount = 1
786
787 # Create ONOSNIC ip address prefix
788 tempOnosIp = str( onosIpAddrs[ 0 ] )
789 tempList = []
790 tempList = tempOnosIp.split( "." )
791 # Omit last element of list to format for NIC
792 tempList = tempList[ :-1 ]
793 # Structure the nic string ip
794 nicAddr = ".".join( tempList ) + ".*"
795 self.nicAddr = nicAddr
796 onosNicString = "export ONOS_NIC=" + nicAddr
797
kelvin8ec71442015-01-15 16:57:00 -0800798 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800799 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400800
kelvin-onlabd3b64892015-01-20 13:26:24 -0800801 for arg in onosIpAddrs:
802 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800803 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400804 # export OC1="10.128.20.11"
805 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800806 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700807 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800808 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800809
Jon Hall6f665652015-09-18 10:08:07 -0700810 cellFile.write( "export OCI=$OC1\n" )
811 cellFile.write( mnString + "\"" + mnIpAddrs + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700812 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800813 cellFile.write( onosGroup + "\n" )
814 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700815 if useSSH:
816 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800817 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400818
kelvin8ec71442015-01-15 16:57:00 -0800819 # We use os.system to send the command to TestON cluster
820 # to account for the case in which TestON is not located
821 # on the same cluster as the ONOS bench
822 # Note that even if TestON is located on the same cluster
823 # as ONOS bench, you must setup passwordless ssh
824 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700825 os.system( "scp " + tempDirectory + fileName + " " +
826 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400827
andrewonlab2a6c9342014-10-16 13:40:15 -0400828 return main.TRUE
829
andrewonlab94282092014-10-10 13:00:11 -0400830 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800831 main.log.error( self.name + ": EOF exception found" )
832 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400833 main.cleanup()
834 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800835 except Exception:
836 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -0400837 main.cleanup()
838 main.exit()
839
kelvin-onlabd3b64892015-01-20 13:26:24 -0800840 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800841 """
andrewonlab95ca1462014-10-09 14:04:24 -0400842 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800843 """
Hari Krishna03f530e2015-07-10 17:28:27 -0700844 import re
andrewonlab95ca1462014-10-09 14:04:24 -0400845 try:
846 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800847 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400848 main.cleanup()
849 main.exit()
850 else:
kelvin8ec71442015-01-15 16:57:00 -0800851 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800852 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800853 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400854 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700855 self.handle.expect( str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800856 handleBefore = self.handle.before
857 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800858 # Get the rest of the handle
Jon Hall3b489db2015-10-05 14:38:37 -0700859 self.handle.expect( "\$" )
Jon Hall439c8912016-04-15 02:22:03 -0700860 time.sleep(10)
kelvin-onlabd3b64892015-01-20 13:26:24 -0800861 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400862
Hari Krishna03f530e2015-07-10 17:28:27 -0700863 cell_result = handleBefore + handleAfter + handleMore
suibin zhang116647a2016-05-06 16:30:09 -0700864 #print cell_result
Hari Krishna03f530e2015-07-10 17:28:27 -0700865 if( re.search( "No such cell", cell_result ) ):
866 main.log.error( "Cell call returned: " + handleBefore +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800867 handleAfter + handleMore )
Hari Krishna03f530e2015-07-10 17:28:27 -0700868 main.cleanup()
869 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400870 return main.TRUE
andrewonlab95ca1462014-10-09 14:04:24 -0400871 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800872 main.log.error( self.name + ": EOF exception found" )
873 main.log.error( self.name + ": " + self.handle.before )
andrewonlab95ca1462014-10-09 14:04:24 -0400874 main.cleanup()
875 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800876 except Exception:
877 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab95ca1462014-10-09 14:04:24 -0400878 main.cleanup()
879 main.exit()
880
kelvin-onlabd3b64892015-01-20 13:26:24 -0800881 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800882 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400883 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800884 """
885 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400886
andrewonlabc03bf6c2014-10-09 14:56:18 -0400887 try:
kelvin8ec71442015-01-15 16:57:00 -0800888 # Clean handle by sending empty and expecting $
889 self.handle.sendline( "" )
890 self.handle.expect( "\$" )
891 self.handle.sendline( "onos-verify-cell" )
892 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800893 handleBefore = self.handle.before
894 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800895 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700896 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400897 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800898 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700899 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800900 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400901 main.cleanup()
902 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800903 except Exception:
904 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400905 main.cleanup()
906 main.exit()
907
jenkins1e99e7b2015-04-02 18:15:39 -0700908 def onosCfgSet( self, ONOSIp, configName, configParam ):
909 """
910 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700911 application.
912
jenkins1e99e7b2015-04-02 18:15:39 -0700913 ex)
914 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700915 ONOSIp = '10.0.0.1'
916 configName = 'org.onosproject.myapp'
917 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700918 """
Jon Hall72280bc2016-01-25 14:29:05 -0800919 try:
920 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
921 configName,
922 configParam )
923 self.handle.sendline( "" )
924 self.handle.expect( ":~" )
925 self.handle.sendline( cfgStr )
926 self.handle.expect("cfg set")
927 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700928
Jon Hall72280bc2016-01-25 14:29:05 -0800929 paramValue = configParam.split(" ")[1]
930 paramName = configParam.split(" ")[0]
Jon Hall4ba53f02015-07-29 13:07:41 -0700931
Jon Hall72280bc2016-01-25 14:29:05 -0800932 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700933
Jon Hall72280bc2016-01-25 14:29:05 -0800934 self.handle.sendline( checkStr )
935 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700936
Jon Hall72280bc2016-01-25 14:29:05 -0800937 if "value=" + paramValue + "," in self.handle.before:
938 main.log.info("cfg " + configName + " successfully set to " + configParam)
939 return main.TRUE
940 except pexpect.ExceptionPexpect as e:
941 main.log.exception( self.name + ": Pexpect exception found: " )
942 main.log.error( self.name + ": " + self.handle.before )
943 main.cleanup()
944 main.exit()
945 except Exception:
946 main.log.exception( self.name + ": Uncaught exception!" )
947 main.cleanup()
948 main.exit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700949
kelvin-onlabd3b64892015-01-20 13:26:24 -0800950 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800951 """
andrewonlab05e362f2014-10-10 00:40:57 -0400952 Uses 'onos' command to send various ONOS CLI arguments.
953 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800954 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400955 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800956
957 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400958 CLI commands for ONOS. Try to use this function first
959 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800960 function.
961 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400962 by starting onos, and typing in 'onos' to enter the
963 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800964 available commands.
965 """
andrewonlab05e362f2014-10-10 00:40:57 -0400966 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800967 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800968 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400969 return main.FALSE
970 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800971 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400972 return main.FALSE
973
kelvin8ec71442015-01-15 16:57:00 -0800974 cmdstr = str( cmdstr )
975 self.handle.sendline( "" )
976 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400977
kelvin-onlabd3b64892015-01-20 13:26:24 -0800978 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800979 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400980
kelvin-onlabd3b64892015-01-20 13:26:24 -0800981 handleBefore = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -0800982 main.log.info( "Command sent successfully" )
kelvin8ec71442015-01-15 16:57:00 -0800983 # Obtain return handle that consists of result from
984 # the onos command. The string may need to be
985 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800986 returnString = handleBefore
kelvin-onlabd3b64892015-01-20 13:26:24 -0800987 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400988 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800989 main.log.error( self.name + ": EOF exception found" )
990 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400991 main.cleanup()
992 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800993 except Exception:
994 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab05e362f2014-10-10 00:40:57 -0400995 main.cleanup()
996 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400997
Pier88189b62016-09-07 17:01:53 -0700998 def onosSecureSSH( self, userName="onos", userPWD="rocks", node=""):
999 """
1000 Enables secure access to ONOS console
1001 by removing default users & keys.
1002
1003 onos-secure-ssh -u onos -p rocks node
1004
1005 Returns: main.TRUE on success and main.FALSE on failure
1006 """
1007
1008 try:
Chiyu Chengef109502016-11-21 15:51:38 -08001009 self.handle.sendline( "" )
1010 self.handle.expect( "\$" )
Pier88189b62016-09-07 17:01:53 -07001011 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
1012
1013 # NOTE: this timeout may need to change depending on the network
1014 # and size of ONOS
1015 # TODO: Handle the other possible error
1016 i = self.handle.expect([ "Network\sis\sunreachable",
1017 "\$",
1018 pexpect.TIMEOUT ], timeout=180 )
1019 if i == 0:
1020 # can't reach ONOS node
1021 main.log.warn( "Network is unreachable" )
1022 self.handle.expect( "\$" )
1023 return main.FALSE
1024 elif i == 1:
1025 # Process started
1026 main.log.info(
1027 "Secure SSH performed on " +
1028 node)
1029 return main.TRUE
1030 except pexpect.EOF:
1031 main.log.error( self.name + ": EOF exception found" )
1032 main.log.error( self.name + ": " + self.handle.before )
1033 main.cleanup()
1034 main.exit()
1035 except Exception:
1036 main.log.exception( self.name + ": Uncaught exception!" )
1037 main.cleanup()
1038 main.exit()
1039
1040
kelvin-onlabd3b64892015-01-20 13:26:24 -08001041 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001042 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001043 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001044 If -f option is provided, it also forces an uninstall.
1045 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001046 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001047 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001048 files to certain onos nodes
1049
1050 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001051 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001052 try:
andrewonlab114768a2014-11-14 12:44:44 -05001053 if options:
kelvin8ec71442015-01-15 16:57:00 -08001054 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001055 else:
kelvin8ec71442015-01-15 16:57:00 -08001056 self.handle.sendline( "onos-install " + node )
1057 self.handle.expect( "onos-install " )
1058 # NOTE: this timeout may need to change depending on the network
1059 # and size of ONOS
1060 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001061 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001062 "ONOS\sis\salready\sinstalled",
Jeremyc72b2582016-02-26 18:27:38 -08001063 "already\sup-to-date",
Jon Hall3576f572016-08-23 10:01:07 -07001064 "does not exist",
Jeremyc72b2582016-02-26 18:27:38 -08001065 "\$",
Jon Hall6c44c0b2016-04-20 15:21:00 -07001066 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001067 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001068 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001069 main.log.warn( "Network is unreachable" )
Jon Hall3b489db2015-10-05 14:38:37 -07001070 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001071 return main.FALSE
1072 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001073 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001074 main.log.info(
1075 "ONOS was installed on " +
1076 node +
1077 " and started" )
Jon Hall3b489db2015-10-05 14:38:37 -07001078 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001079 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001080 elif i == 2 or i == 3:
1081 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001082 main.log.info( "ONOS is already installed on " + node )
1083 self.handle.expect( "\$" )
1084 return main.TRUE
1085 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001086 # onos not packaged
1087 main.log.error( "ONOS package not found." )
1088 self.handle.expect( "\$" )
1089 return main.FALSE
1090 elif i == 5:
1091 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001092 main.log.info( "ONOS was installed on " + node )
1093 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001094 elif i == 6:
1095 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001096 main.log.info(
1097 "Installation of ONOS on " +
1098 node +
1099 " timed out" )
Jon Hall3b489db2015-10-05 14:38:37 -07001100 self.handle.expect( "\$" )
Jon Hall53c5e662016-04-13 16:06:56 -07001101 main.log.warn( self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001102 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001103 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001104 main.log.error( self.name + ": EOF exception found" )
1105 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001106 main.cleanup()
1107 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001108 except Exception:
1109 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001110 main.cleanup()
1111 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -04001112
kelvin-onlabd3b64892015-01-20 13:26:24 -08001113 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001114 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001115 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001116 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001117 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001118 try:
kelvin8ec71442015-01-15 16:57:00 -08001119 self.handle.sendline( "" )
1120 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001121 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001122 " start" )
1123 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001124 "Job\sis\salready\srunning",
1125 "start/running",
Jeremyd0e9a6d2016-03-02 11:28:52 -08001126 "\$",
andrewonlab8d0d7d72014-10-09 16:33:15 -04001127 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001128 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001129 if i == 0:
Jon Halleab7a242016-03-04 10:20:43 -08001130 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001131 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001132 return main.TRUE
1133 elif i == 1:
Jon Halleab7a242016-03-04 10:20:43 -08001134 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001135 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001136 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001137 elif i == 2:
1138 main.log.info( "ONOS service started" )
1139 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001140 else:
Jon Halleab7a242016-03-04 10:20:43 -08001141 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001142 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001143 main.cleanup()
1144 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001145 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001146 main.log.error( self.name + ": EOF exception found" )
1147 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001148 main.cleanup()
1149 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001150 except Exception:
1151 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001152 main.cleanup()
1153 main.exit()
1154
kelvin-onlabd3b64892015-01-20 13:26:24 -08001155 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001156 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001157 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001158 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001159 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001160 try:
kelvin8ec71442015-01-15 16:57:00 -08001161 self.handle.sendline( "" )
1162 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001163 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001164 " stop" )
1165 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001166 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001167 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001168 "Unknown\sinstance",
YPZhang77badfc2016-03-09 10:28:59 -08001169 "\$",
Jeremy Songster14c13572016-04-21 17:34:03 -07001170 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001171 if i == 0:
YPZhang77badfc2016-03-09 10:28:59 -08001172 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001173 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001174 return main.TRUE
1175 elif i == 1:
YPZhang77badfc2016-03-09 10:28:59 -08001176 self.handle.expect( "\$" )
Jon Hall65844a32015-03-09 19:09:37 -07001177 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001178 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001179 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001180 elif i == 2:
YPZhang77badfc2016-03-09 10:28:59 -08001181 self.handle.expect( "\$" )
Jon Hall61282e32015-03-19 11:34:11 -07001182 main.log.warn( "ONOS wasn't running" )
1183 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001184 elif i == 3:
1185 main.log.info( "ONOS service stopped" )
1186 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001187 else:
kelvin8ec71442015-01-15 16:57:00 -08001188 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001189 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001190 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001191 main.log.error( self.name + ": EOF exception found" )
1192 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -04001193 main.cleanup()
1194 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001195 except Exception:
1196 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001197 main.cleanup()
1198 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001199
kelvin-onlabd3b64892015-01-20 13:26:24 -08001200 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001201 """
andrewonlabc8d47972014-10-09 16:52:36 -04001202 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001203 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001204 if needed
kelvin8ec71442015-01-15 16:57:00 -08001205 """
andrewonlabc8d47972014-10-09 16:52:36 -04001206 try:
kelvin8ec71442015-01-15 16:57:00 -08001207 self.handle.sendline( "" )
Jeremy Songster14c13572016-04-21 17:34:03 -07001208 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001209 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Jeremy Songster14c13572016-04-21 17:34:03 -07001210 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001211 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001212 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001213 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001214 except pexpect.TIMEOUT:
1215 main.log.exception( self.name + ": Timeout in onosUninstall" )
1216 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001217 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001218 main.log.error( self.name + ": EOF exception found" )
1219 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -04001220 main.cleanup()
1221 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001222 except Exception:
1223 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc8d47972014-10-09 16:52:36 -04001224 main.cleanup()
1225 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001226
kelvin-onlabd3b64892015-01-20 13:26:24 -08001227 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001228 """
andrewonlabaedc8332014-12-04 12:43:03 -05001229 Issues the command 'onos-die <node-ip>'
1230 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001231 """
andrewonlabaedc8332014-12-04 12:43:03 -05001232 try:
kelvin8ec71442015-01-15 16:57:00 -08001233 self.handle.sendline( "" )
1234 self.handle.expect( "\$" )
Jeremyf0aecdb2016-03-30 13:19:57 -07001235 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001236 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001237 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001238 "Killing\sONOS",
1239 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001240 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001241 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001242 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001243 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001244 self.handle.sendline( "" )
1245 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001246 return main.TRUE
1247 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001248 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001249 self.handle.sendline( "" )
1250 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001251 return main.FALSE
1252 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001253 main.log.error( self.name + ": EOF exception found" )
1254 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -05001255 main.cleanup()
1256 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001257 except Exception:
1258 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabaedc8332014-12-04 12:43:03 -05001259 main.cleanup()
1260 main.exit()
1261
kelvin-onlabd3b64892015-01-20 13:26:24 -08001262 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001263 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001264 Calls the command: 'onos-kill [<node-ip>]'
1265 "Remotely, and unceremoniously kills the ONOS instance running on
1266 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001267 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001268 try:
kelvin8ec71442015-01-15 16:57:00 -08001269 self.handle.sendline( "" )
1270 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001271 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001272 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -04001273 "\$",
1274 "No\sroute\sto\shost",
1275 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001276 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001277
andrewonlabe8e56fd2014-10-09 17:12:44 -04001278 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001279 main.log.info(
1280 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001281 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001282 return main.TRUE
1283 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001284 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001285 return main.FALSE
1286 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001287 main.log.info(
1288 "Passwordless login for host: " +
1289 str( nodeIp ) +
1290 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001291 return main.FALSE
1292 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001293 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001294 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001295
andrewonlabe8e56fd2014-10-09 17:12:44 -04001296 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001297 main.log.error( self.name + ": EOF exception found" )
1298 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001299 main.cleanup()
1300 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001301 except Exception:
1302 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001303 main.cleanup()
1304 main.exit()
1305
kelvin-onlabd3b64892015-01-20 13:26:24 -08001306 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001307 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001308 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001309 a cleaner environment.
1310
andrewonlab19fbdca2014-11-14 12:55:59 -05001311 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001312 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001313 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001314 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001315 try:
kelvin8ec71442015-01-15 16:57:00 -08001316 self.handle.sendline( "" )
1317 self.handle.expect( "\$" )
1318 self.handle.sendline( "onos-remove-raft-logs" )
1319 # Sometimes this command hangs
1320 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1321 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001322 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001323 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1324 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001325 if i == 1:
1326 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001327 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001328 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001329 main.log.error( self.name + ": EOF exception found" )
1330 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -05001331 main.cleanup()
1332 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001333 except Exception:
1334 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001335 main.cleanup()
1336 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -05001337
kelvin-onlabd3b64892015-01-20 13:26:24 -08001338 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001339 """
1340 Calls the command 'onos-start-network [ <mininet-topo> ]
1341 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001342 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001343 cell."
andrewonlab94282092014-10-10 13:00:11 -04001344 * Specify mininet topology file name for mntopo
1345 * Topo files should be placed at:
1346 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001347
andrewonlab94282092014-10-10 13:00:11 -04001348 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001349 """
andrewonlab94282092014-10-10 13:00:11 -04001350 try:
1351 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001352 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001353 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001354
kelvin8ec71442015-01-15 16:57:00 -08001355 mntopo = str( mntopo )
1356 self.handle.sendline( "" )
1357 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001358
kelvin8ec71442015-01-15 16:57:00 -08001359 self.handle.sendline( "onos-start-network " + mntopo )
1360 self.handle.expect( "mininet>" )
1361 main.log.info( "Network started, entered mininet prompt" )
1362
1363 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001364
1365 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001366 main.log.error( self.name + ": EOF exception found" )
1367 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001368 main.cleanup()
1369 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001370 except Exception:
1371 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -04001372 main.cleanup()
1373 main.exit()
1374
Jeremy Songster14c13572016-04-21 17:34:03 -07001375 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001376 """
1377 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001378 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001379
Jon Hall7993bfc2014-10-09 16:30:14 -04001380 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001381 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001382 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001383 self.handle.sendline( "onos-wait-for-start " + node )
1384 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001385 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001386 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
Jon Hall7993bfc2014-10-09 16:30:14 -04001387 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001388 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001389 return main.TRUE
1390 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001391 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001392 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001393 main.log.error( "ONOS has not started yet" )
1394 self.handle.send( "\x03" ) # Control-C
1395 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001396 return main.FALSE
1397 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001398 main.log.error( self.name + ": EOF exception found" )
1399 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001400 main.cleanup()
1401 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001402 except Exception:
1403 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001404 main.cleanup()
1405 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001406
kelvin-onlabd3b64892015-01-20 13:26:24 -08001407 def pushTestIntentsShell(
1408 self,
1409 dpidSrc,
1410 dpidDst,
1411 numIntents,
1412 dirFile,
1413 onosIp,
1414 numMult="",
1415 appId="",
1416 report=True,
1417 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001418 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001419 Description:
kelvin8ec71442015-01-15 16:57:00 -08001420 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001421 better parallelize the results than the CLI
1422 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001423 * dpidSrc: specify source dpid
1424 * dpidDst: specify destination dpid
1425 * numIntents: specify number of intents to push
1426 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001427 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001428 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001429 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001430 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001431 """
1432 try:
1433 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001434 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001435 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001436 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001437 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001438 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001439
kelvin-onlabd3b64892015-01-20 13:26:24 -08001440 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1441 if not numMult:
1442 addIntents = addDpid + " " + str( numIntents )
1443 elif numMult:
1444 addIntents = addDpid + " " + str( numIntents ) + " " +\
1445 str( numMult )
1446 if appId:
1447 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001448 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001449 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001450
andrewonlabaedc8332014-12-04 12:43:03 -05001451 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001452 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001453 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001454 sendCmd = addApp + " &"
1455 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001456
kelvin-onlabd3b64892015-01-20 13:26:24 -08001457 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001458
1459 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001460 main.log.error( self.name + ": EOF exception found" )
1461 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001462 main.cleanup()
1463 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001464 except Exception:
1465 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001466 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001467 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001468
kelvin-onlabd3b64892015-01-20 13:26:24 -08001469 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001470 """
andrewonlab970399c2014-11-07 13:09:32 -05001471 Capture all packet activity and store in specified
1472 directory/file
1473
1474 Required:
1475 * interface: interface to capture
1476 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001477 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001478 try:
1479 self.handle.sendline( "" )
1480 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001481
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001482 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001483 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001484 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001485 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001486 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001487
Jon Hallfebb1c72015-03-05 13:30:09 -08001488 main.log.info( "Tshark started capturing files on " +
1489 str( interface ) + " and saving to directory: " +
1490 str( dirFile ) )
1491 except pexpect.EOF:
1492 main.log.error( self.name + ": EOF exception found" )
1493 main.log.error( self.name + ": " + self.handle.before )
1494 main.cleanup()
1495 main.exit()
1496 except Exception:
1497 main.log.exception( self.name + ": Uncaught exception!" )
1498 main.cleanup()
1499 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001500
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001501 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001502 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001503 Description:
1504 Execute onos-topo-cfg command
1505 Required:
1506 onosIp - IP of the onos node you want to send the json to
1507 jsonFile - File path of the json file
1508 Return:
1509 Returns main.TRUE if the command is successfull; Returns
1510 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001511 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001512 try:
kelvin8ec71442015-01-15 16:57:00 -08001513 self.handle.sendline( "" )
1514 self.handle.expect( "\$" )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001515 cmd = "onos-topo-cfg "
1516 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1517 handle = self.handle.before
1518 print handle
1519 if "Error" in handle:
1520 main.log.error( self.name + ": " + self.handle.before )
1521 return main.FALSE
1522 else:
1523 self.handle.expect( "\$" )
1524 return main.TRUE
1525
Jon Hallfebb1c72015-03-05 13:30:09 -08001526 except pexpect.EOF:
1527 main.log.error( self.name + ": EOF exception found" )
1528 main.log.error( self.name + ": " + self.handle.before )
1529 main.cleanup()
1530 main.exit()
1531 except Exception:
1532 main.log.exception( self.name + ": Uncaught exception!" )
1533 main.cleanup()
1534 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001535
jenkins1e99e7b2015-04-02 18:15:39 -07001536 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001537 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001538 Required:
kelvin8ec71442015-01-15 16:57:00 -08001539 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001540 * directory to store results
1541 Optional:
1542 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001543 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001544 Description:
1545 Uses tshark command to grep specific group of packets
1546 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001547 The timestamp is hardcoded to be in epoch
1548 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001549 try:
1550 self.handle.sendline( "" )
1551 self.handle.expect( "\$" )
1552 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001553 if grepOptions:
1554 grepStr = "grep "+str(grepOptions)
1555 else:
1556 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001557
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001558 cmd = (
1559 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001560 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001561 " -t e | " +
1562 grepStr + " --line-buffered \"" +
Jon Hallfebb1c72015-03-05 13:30:09 -08001563 str(grep) +
1564 "\" >" +
1565 directory +
1566 " &" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001567 self.handle.sendline(cmd)
1568 main.log.info(cmd)
Jon Hallfebb1c72015-03-05 13:30:09 -08001569 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001570 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001571 self.handle.expect( "\$" )
1572 except pexpect.EOF:
1573 main.log.error( self.name + ": EOF exception found" )
1574 main.log.error( self.name + ": " + self.handle.before )
1575 main.cleanup()
1576 main.exit()
1577 except Exception:
1578 main.log.exception( self.name + ": Uncaught exception!" )
1579 main.cleanup()
1580 main.exit()
1581
kelvin-onlabd3b64892015-01-20 13:26:24 -08001582 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001583 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001584 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001585 """
1586 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001587 try:
1588 self.execute( cmd="sudo rm /tmp/wireshark*" )
1589 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001590 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1591 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001592 self.handle.sendline( "" )
1593 main.log.info( "Tshark stopped" )
1594 except pexpect.EOF:
1595 main.log.error( self.name + ": EOF exception found" )
1596 main.log.error( self.name + ": " + self.handle.before )
1597 main.cleanup()
1598 main.exit()
1599 except Exception:
1600 main.log.exception( self.name + ": Uncaught exception!" )
1601 main.cleanup()
1602 main.exit()
1603
kelvin8ec71442015-01-15 16:57:00 -08001604 def ptpd( self, args ):
1605 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001606 Initiate ptp with user-specified args.
1607 Required:
1608 * args: specify string of args after command
1609 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001610 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001611 try:
kelvin8ec71442015-01-15 16:57:00 -08001612 self.handle.sendline( "sudo ptpd " + str( args ) )
1613 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001614 "Multiple",
1615 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001616 "\$" ] )
1617 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001618
andrewonlab0c38a4a2014-10-28 18:35:35 -04001619 if i == 0:
1620 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001621 main.log.info( "ptpd returned an error: " +
1622 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001623 return handle
1624 elif i == 1:
1625 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001626 main.log.error( "ptpd returned an error: " +
1627 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001628 return handle
1629 else:
1630 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001631
andrewonlab0c38a4a2014-10-28 18:35:35 -04001632 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001633 main.log.error( self.name + ": EOF exception found" )
1634 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001635 main.cleanup()
1636 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001637 except Exception:
1638 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001639 main.cleanup()
1640 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001641
Pier50f0bc62016-09-07 17:53:40 -07001642 def dumpONOSCmd(self, ONOSIp, CMD, destDir, filename, options=""):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001643 """
Pier50f0bc62016-09-07 17:53:40 -07001644 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001645 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001646 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001647 Localtime will be attached to the filename
1648
1649 Required:
1650 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001651 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001652 * destDir: specify directory to copy to.
1653 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001654 * fileName: Name of the file
Pier50f0bc62016-09-07 17:53:40 -07001655 * options: Options for ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001656 """
1657
1658 localtime = time.strftime( '%x %X' )
1659 localtime = localtime.replace( "/", "" )
1660 localtime = localtime.replace( " ", "_" )
1661 localtime = localtime.replace( ":", "" )
1662 if destDir[ -1: ] != "/":
1663 destDir += "/"
Pier50f0bc62016-09-07 17:53:40 -07001664 cmd=CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
1665 return self.onosCli(ONOSIp, cmd)
Flavio Castrob7718952016-05-18 08:53:41 -07001666
kelvin-onlabd3b64892015-01-20 13:26:24 -08001667 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001668 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001669 """
1670 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001671 Current implementation of ONOS deletes its karaf
1672 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001673 you may want to use this function to capture
1674 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001675 Localtime will be attached to the filename
1676
1677 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001678 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001679 copy.
kelvin8ec71442015-01-15 16:57:00 -08001680 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001681 For copying multiple files, leave copyFileName
1682 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001683 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001684 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001685 ex ) /tmp/
1686 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001687 * copyFileName: If you want to rename the log
1688 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001689 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001690 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001691 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001692 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001693 localtime = localtime.replace( "/", "" )
1694 localtime = localtime.replace( " ", "_" )
1695 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001696 if destDir[ -1: ] != "/":
1697 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001698
kelvin-onlabd3b64892015-01-20 13:26:24 -08001699 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001700 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1701 str( destDir ) + str( copyFileName ) +
1702 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001703 self.handle.expect( "cp" )
1704 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001705 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001706 self.handle.sendline( "cp " + str( logToCopy ) +
1707 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001708 self.handle.expect( "cp" )
1709 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001710
kelvin8ec71442015-01-15 16:57:00 -08001711 return self.handle.before
1712
1713 except pexpect.EOF:
1714 main.log.error( "Copying files failed" )
1715 main.log.error( self.name + ": EOF exception found" )
1716 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001717 except Exception:
1718 main.log.exception( "Copying files failed" )
1719
Jon Hall16b72c42015-05-20 10:23:36 -07001720 def checkLogs( self, onosIp, restart=False):
kelvin8ec71442015-01-15 16:57:00 -08001721 """
Jon Hall94fd0472014-12-08 11:52:42 -08001722 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001723 If restart is True, use the old version of onos-check-logs which
1724 does not print the full stacktrace, but shows the entire log file,
1725 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001726 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001727 """
Jon Hall94fd0472014-12-08 11:52:42 -08001728 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001729 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001730 if restart:
1731 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001732 self.handle.sendline( cmd )
1733 self.handle.expect( cmd )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001734 self.handle.expect( "\$ " )
Jon Hall94fd0472014-12-08 11:52:42 -08001735 response = self.handle.before
1736 return response
1737 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001738 main.log.error( "Lost ssh connection" )
1739 main.log.error( self.name + ": EOF exception found" )
1740 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001741 except Exception:
1742 main.log.exception( self.name + ": Uncaught exception!" )
1743 main.cleanup()
1744 main.exit()
Jon Hall94fd0472014-12-08 11:52:42 -08001745
kelvin-onlabd3b64892015-01-20 13:26:24 -08001746 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001747 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001748 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001749 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001750 try:
kelvin8ec71442015-01-15 16:57:00 -08001751 self.handle.sendline( "" )
1752 self.handle.expect( "\$" )
1753 self.handle.sendline( "onos-service " + str( node ) +
1754 " status" )
1755 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001756 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001757 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001758 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001759 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001760 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001761 self.handle.sendline( "" )
1762 self.handle.expect( "\$" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001763
You Wangef1e6572016-03-08 12:53:18 -08001764 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001765 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001766 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001767 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001768 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001769 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001770 main.cleanup()
1771 main.exit()
1772 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001773 main.log.error( self.name + ": EOF exception found" )
1774 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001775 main.cleanup()
1776 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001777 except Exception:
1778 main.log.exception( self.name + ": Uncaught exception!" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001779 main.cleanup()
1780 main.exit()
Jon Hall21270ac2015-02-16 17:59:55 -08001781
Jon Hall63604932015-02-26 17:09:50 -08001782 def setIpTables( self, ip, port='', action='add', packet_type='',
1783 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001784 """
Jon Hall21270ac2015-02-16 17:59:55 -08001785 Description:
1786 add or remove iptables rule to DROP (default) packets from
1787 specific IP and PORT
1788 Usage:
1789 * specify action ('add' or 'remove')
1790 when removing, pass in the same argument as you would add. It will
1791 delete that specific rule.
1792 * specify the ip to block
1793 * specify the destination port to block (defaults to all ports)
1794 * optional packet type to block (default tcp)
1795 * optional iptables rule (default DROP)
1796 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001797 * States boolean toggles adding all supported tcp states to the
1798 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001799 Returns:
1800 main.TRUE on success or
1801 main.FALSE if given invalid input or
1802 main.ERROR if there is an error in response from iptables
1803 WARNING:
1804 * This function uses root privilege iptables command which may result
1805 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001806 """
Jon Hall21270ac2015-02-16 17:59:55 -08001807
1808 # NOTE*********
1809 # The strict checking methods of this driver function is intentional
1810 # to discourage any misuse or error of iptables, which can cause
1811 # severe network errors
1812 # *************
1813
1814 # NOTE: Sleep needed to give some time for rule to be added and
1815 # registered to the instance. If you are calling this function
1816 # multiple times this sleep will prevent any errors.
1817 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001818 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001819 try:
1820 # input validation
1821 action_type = action.lower()
1822 rule = rule.upper()
1823 direction = direction.upper()
1824 if action_type != 'add' and action_type != 'remove':
1825 main.log.error( "Invalid action type. Use 'add' or "
1826 "'remove' table rule" )
1827 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1828 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1829 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1830 "'ACCEPT' or 'LOG' only." )
1831 if direction != 'INPUT' and direction != 'OUTPUT':
1832 # NOTE currently only supports rules INPUT and OUPTUT
1833 main.log.error( "Invalid rule. Valid directions are"
1834 " 'OUTPUT' or 'INPUT'" )
1835 return main.FALSE
1836 return main.FALSE
1837 return main.FALSE
1838 if action_type == 'add':
1839 # -A is the 'append' action of iptables
1840 actionFlag = '-A'
1841 elif action_type == 'remove':
1842 # -D is the 'delete' rule of iptables
1843 actionFlag = '-D'
1844 self.handle.sendline( "" )
1845 self.handle.expect( "\$" )
1846 cmd = "sudo iptables " + actionFlag + " " +\
1847 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001848 " -s " + str( ip )
Jon Hall63604932015-02-26 17:09:50 -08001849 # " -p " + str( packet_type ) +\
1850 if packet_type:
1851 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001852 if port:
1853 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001854 if states:
1855 cmd += " -m state --state="
1856 #FIXME- Allow user to configure which states to block
1857 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001858 cmd += " -j " + str( rule )
1859
1860 self.handle.sendline( cmd )
1861 self.handle.expect( "\$" )
1862 main.log.warn( self.handle.before )
1863
1864 info_string = "On " + str( self.name )
1865 info_string += " " + str( action_type )
1866 info_string += " iptable rule [ "
1867 info_string += " IP: " + str( ip )
1868 info_string += " Port: " + str( port )
1869 info_string += " Rule: " + str( rule )
1870 info_string += " Direction: " + str( direction ) + " ]"
1871 main.log.info( info_string )
1872 return main.TRUE
1873 except pexpect.TIMEOUT:
1874 main.log.exception( self.name + ": Timeout exception in "
1875 "setIpTables function" )
1876 return main.ERROR
1877 except pexpect.EOF:
1878 main.log.error( self.name + ": EOF exception found" )
1879 main.log.error( self.name + ": " + self.handle.before )
1880 main.cleanup()
1881 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001882 except Exception:
1883 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall21270ac2015-02-16 17:59:55 -08001884 main.cleanup()
1885 main.exit()
1886
Jon Hall0468b042015-02-19 19:08:21 -08001887 def detailed_status(self, log_filename):
Jon Hallefbd9792015-03-05 16:11:36 -08001888 """
Jon Hall0468b042015-02-19 19:08:21 -08001889 This method is used by STS to check the status of the controller
1890 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001891 """
Jon Hall0468b042015-02-19 19:08:21 -08001892 import re
1893 try:
1894 self.handle.sendline( "" )
1895 self.handle.expect( "\$" )
1896 self.handle.sendline( "cd " + self.home )
1897 self.handle.expect( "\$" )
1898 self.handle.sendline( "service onos status" )
1899 self.handle.expect( "\$" )
1900 response = self.handle.before
1901 if re.search( "onos start/running", response ):
1902 # onos start/running, process 10457
1903 return 'RUNNING'
1904 # FIXME: Implement this case
1905 # elif re.search( pattern, response ):
1906 # return 'STARTING'
1907 elif re.search( "onos stop/", response ):
1908 # onos stop/waiting
1909 # FIXME handle this differently?: onos stop/pre-stop
1910 return 'STOPPED'
1911 # FIXME: Implement this case
1912 # elif re.search( pattern, response ):
1913 # return 'FROZEN'
1914 else:
1915 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001916 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001917 main.log.warn( response )
1918 return 'ERROR', "Unknown response: %s" % response
1919 except pexpect.TIMEOUT:
1920 main.log.exception( self.name + ": Timeout exception in "
1921 "setIpTables function" )
1922 return 'ERROR', "Pexpect Timeout"
1923 except pexpect.EOF:
1924 main.log.error( self.name + ": EOF exception found" )
1925 main.log.error( self.name + ": " + self.handle.before )
1926 main.cleanup()
1927 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001928 except Exception:
1929 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall0468b042015-02-19 19:08:21 -08001930 main.cleanup()
1931 main.exit()
1932
andrew@onlab.us3b087132015-03-11 15:00:08 -07001933 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1934 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001935 Create/formats the LinkGraph.cfg file based on arguments
1936 -only creates a linear topology and connects islands
1937 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001938 -must be called by ONOSbench
1939
Jon Hall4ba53f02015-07-29 13:07:41 -07001940 ONOSIpList - list of all of the node IPs to be used
1941
1942 deviceCount - number of switches to be assigned
andrew@onlab.us3b087132015-03-11 15:00:08 -07001943 '''
Jon Hall6509dbf2016-06-21 17:01:17 -07001944 main.log.info("Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001945 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001946 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001947
1948 linkGraph = open(tempFile, 'w+')
1949 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1950 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1951 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001952
andrew@onlab.us3b087132015-03-11 15:00:08 -07001953 clusterCount = len(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07001954
1955 if type(deviceCount) is int or type(deviceCount) is str:
andrew@onlab.us3b087132015-03-11 15:00:08 -07001956 deviceCount = int(deviceCount)
1957 switchList = [0]*(clusterCount+1)
1958 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07001959
andrew@onlab.us3b087132015-03-11 15:00:08 -07001960 for node in range(1, clusterCount + 1):
1961 switchList[node] = baselineSwitchCount
1962
1963 for node in range(1, (deviceCount%clusterCount)+1):
1964 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001965
andrew@onlab.us3b087132015-03-11 15:00:08 -07001966 if type(deviceCount) is list:
1967 main.log.info("Using provided device distribution")
1968 switchList = [0]
1969 for i in deviceCount:
1970 switchList.append(int(i))
1971
1972 tempList = ['0']
1973 tempList.extend(ONOSIpList)
1974 ONOSIpList = tempList
1975
1976 myPort = 6
1977 lastSwitch = 0
1978 for node in range(1, clusterCount+1):
1979 if switchList[node] == 0:
1980 continue
1981
1982 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001983
andrew@onlab.us3b087132015-03-11 15:00:08 -07001984 if node > 1:
1985 #connect to last device on previous node
Jon Hall4ba53f02015-07-29 13:07:41 -07001986 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1987 linkGraph.write(line)
1988
1989 lastSwitch = 0
1990 for switch in range (0, switchList[node]-1):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001991 line = ""
1992 line = ("\t" + str(switch) + ":" + str(myPort))
1993 line += " -- "
1994 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1995 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07001996 lastSwitch = switch+1
andrew@onlab.us3b087132015-03-11 15:00:08 -07001997 lastIp = ONOSIpList[node]
Jon Hall4ba53f02015-07-29 13:07:41 -07001998
andrew@onlab.us3b087132015-03-11 15:00:08 -07001999 #lastSwitch += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002000 if node < (clusterCount):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002001 #connect to first device on the next node
Jon Hall4ba53f02015-07-29 13:07:41 -07002002 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
andrew@onlab.us3b087132015-03-11 15:00:08 -07002003 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07002004
andrew@onlab.us3b087132015-03-11 15:00:08 -07002005 linkGraph.write("}\n")
2006 linkGraph.close()
2007
2008 #SCP
Jon Hall4ba53f02015-07-29 13:07:41 -07002009 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)
andrew@onlab.us3b087132015-03-11 15:00:08 -07002010 main.log.info("linkGraph.cfg creation complete")
2011
cameron@onlab.us75900962015-03-30 13:22:49 -07002012 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
Jon Hall4ba53f02015-07-29 13:07:41 -07002013
andrew@onlab.us3b087132015-03-11 15:00:08 -07002014 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002015 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
2016 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07002017 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 -07002018 '''
2019
Jon Hall6509dbf2016-06-21 17:01:17 -07002020 main.log.info("Configuring Null Device Provider" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002021 clusterCount = len(ONOSIpList)
2022
Jon Hall4ba53f02015-07-29 13:07:41 -07002023 try:
2024
cameron@onlab.us75900962015-03-30 13:22:49 -07002025 if type(deviceCount) is int or type(deviceCount) is str:
Jon Hall6509dbf2016-06-21 17:01:17 -07002026 main.log.info("Creating device distribution")
cameron@onlab.us75900962015-03-30 13:22:49 -07002027 deviceCount = int(deviceCount)
2028 switchList = [0]*(clusterCount+1)
2029 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002030
cameron@onlab.us75900962015-03-30 13:22:49 -07002031 for node in range(1, clusterCount + 1):
2032 switchList[node] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002033
cameron@onlab.us75900962015-03-30 13:22:49 -07002034 for node in range(1, (deviceCount%clusterCount)+1):
2035 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002036
2037 if type(deviceCount) is list:
2038 main.log.info("Using provided device distribution")
2039
2040 if len(deviceCount) == clusterCount:
cameron@onlab.us75900962015-03-30 13:22:49 -07002041 switchList = ['0']
2042 switchList.extend(deviceCount)
Jon Hall4ba53f02015-07-29 13:07:41 -07002043
2044 if len(deviceCount) == (clusterCount + 1):
2045 if deviceCount[0] == '0' or deviceCount[0] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002046 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002047
cameron@onlab.us75900962015-03-30 13:22:49 -07002048 assert len(switchList) == (clusterCount + 1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002049
cameron@onlab.us75900962015-03-30 13:22:49 -07002050 except AssertionError:
Jon Hall4ba53f02015-07-29 13:07:41 -07002051 main.log.error( "Bad device/Ip list match")
cameron@onlab.us75900962015-03-30 13:22:49 -07002052 except TypeError:
2053 main.log.exception( self.name + ": Object not as expected" )
2054 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002055 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002056 main.log.exception( self.name + ": Uncaught exception!" )
2057 main.cleanup()
2058 main.exit()
2059
andrew@onlab.us3b087132015-03-11 15:00:08 -07002060
2061 ONOSIp = [0]
2062 ONOSIp.extend(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07002063
andrew@onlab.us3b087132015-03-11 15:00:08 -07002064 devicesString = "devConfigs = "
2065 for node in range(1, len(ONOSIp)):
2066 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
2067 if node < clusterCount:
2068 devicesString += (",")
Jon Hall4ba53f02015-07-29 13:07:41 -07002069
2070 try:
cameron@onlab.us75900962015-03-30 13:22:49 -07002071 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2072 self.handle.expect(":~")
2073 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
2074 self.handle.expect(":~")
andrew@onlab.us3b087132015-03-11 15:00:08 -07002075
cameron@onlab.us75900962015-03-30 13:22:49 -07002076 for i in range(10):
2077 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
2078 self.handle.expect(":~")
2079 verification = self.handle.before
2080 if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
2081 break
2082 else:
2083 time.sleep(1)
andrew@onlab.us3b087132015-03-11 15:00:08 -07002084
cameron@onlab.us2cc8bf12015-04-02 14:12:30 -07002085 assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002086
cameron@onlab.us75900962015-03-30 13:22:49 -07002087 except AssertionError:
2088 main.log.error("Incorrect Config settings: " + verification)
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.cleanup()
2092 main.exit()
2093
Jon Hall4ba53f02015-07-29 13:07:41 -07002094 def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002095 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002096 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002097 you want to use a different topology file than linkGraph.cfg
andrew@onlab.us3b087132015-03-11 15:00:08 -07002098 '''
2099
Jon Hall4ba53f02015-07-29 13:07:41 -07002100
2101 try:
2102 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
2103 self.handle.expect(":~")
cameron@onlab.us75900962015-03-30 13:22:49 -07002104 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2105 self.handle.expect(":~")
Jon Hall4ba53f02015-07-29 13:07:41 -07002106
2107 for i in range(10):
2108 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
cameron@onlab.us75900962015-03-30 13:22:49 -07002109 self.handle.expect(":~")
2110 verification = self.handle.before
Jon Hall4ba53f02015-07-29 13:07:41 -07002111 if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002112 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002113 else:
cameron@onlab.us75900962015-03-30 13:22:49 -07002114 time.sleep(1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002115
cameron@onlab.us75900962015-03-30 13:22:49 -07002116 assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002117
cameron@onlab.us75900962015-03-30 13:22:49 -07002118 except pexpect.EOF:
2119 main.log.error( self.name + ": EOF exception found" )
2120 main.log.error( self.name + ": " + self.handle.before )
2121 main.cleanup()
2122 main.exit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002123 except AssertionError:
2124 main.log.info("Settings did not post to ONOS")
Jon Hall4ba53f02015-07-29 13:07:41 -07002125 main.log.error(varification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002126 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002127 main.log.exception( self.name + ": Uncaught exception!" )
2128 main.log.error(varification)
2129 main.cleanup()
2130 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002131
kelvin-onlaba4074292015-07-09 15:19:49 -07002132 def getOnosIps( self ):
2133 """
2134 Get all onos IPs stored in
2135 """
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002136
kelvin-onlaba4074292015-07-09 15:19:49 -07002137 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002138
Chiyu Chengec63bde2016-11-17 18:11:36 -08002139 def listLog( self, nodeIp ):
2140 """
2141 Get a list of all the karaf log names
2142 """
2143 try:
2144 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2145 self.handle.sendline( cmd )
2146 self.handle.expect( ":~" )
2147 before = self.handle.before.splitlines()
2148 logNames = []
2149 for word in before:
2150 if 'karaf.log' in word:
2151 logNames.append( word )
2152 return logNames
2153 except pexpect.EOF:
2154 main.log.error( self.name + ": EOF exception found" )
2155 main.log.error( self.name + ": " + self.handle.before )
2156 main.cleanup()
2157 main.exit()
2158 except pexpect.TIMEOUT:
2159 main.log.error( self.name + ": TIMEOUT exception found" )
2160 main.log.error( self.name + ": " + self.handle.before )
2161 main.cleanup()
2162 main.exit()
2163 except Exception:
2164 main.log.exception( self.name + ": Uncaught exception!" )
2165 main.cleanup()
2166 main.exit()
2167
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002168 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002169 """
2170 Searches the latest ONOS log file for the given search terms and
2171 prints the total occurances of each term. Returns to combined total of
2172 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002173
Jon Hallb4242222016-01-25 17:07:04 -08002174 Arguments:
2175 * nodeIp - The ip of the ONOS node where the log is located
2176 * searchTerms - A string to grep for or a list of strings to grep
2177 for in the ONOS log. Will print out the number of
2178 occurances for each term.
2179 Optional Arguments:
2180 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2181 containing each search term as well as the total
2182 number of occurances of each term. Defaults to 's',
2183 which prints the simple output of just the number
2184 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002185 * startStr - the start string to be given to stream editor command
2186 as the start point for extraction of data
2187 * endStr - the end string to be given to stream editor command as
2188 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002189 """
2190 try:
2191 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
2192 if type( searchTerms ) is str:
2193 searchTerms = [searchTerms]
2194 numTerms = len( searchTerms )
2195 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002196
Jon Hallb4242222016-01-25 17:07:04 -08002197 totalHits = 0
2198 logLines = []
2199 for termIndex in range( numTerms ):
2200 term = searchTerms[termIndex]
2201 logLines.append( [term] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002202 if startStr and endStr:
2203 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2204 startStr,
2205 endStr,
2206 term )
2207 else:
2208 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2209 term )
Jon Hallb4242222016-01-25 17:07:04 -08002210 self.handle.sendline( cmd )
2211 self.handle.expect( ":~" )
2212 before = self.handle.before.splitlines()
2213 count = 0
2214 for line in before:
2215 if term in line and "grep" not in line:
2216 count += 1
2217 if before.index( line ) > ( len( before ) - 7 ):
2218 logLines[termIndex].append( line )
2219 main.log.info( "{}: {}".format( term, count ) )
2220 totalHits += count
2221 if termIndex == numTerms - 1:
2222 print "\n"
2223 if outputMode != "s":
2224 outputString = ""
2225 for term in logLines:
2226 outputString = term[0] + ": \n"
2227 for line in range( 1, len( term ) ):
2228 outputString += ( "\t" + term[line] + "\n" )
2229 if outputString != ( term[0] + ": \n" ):
2230 main.log.info( outputString )
2231 main.log.info( "=" * 70 )
2232 return totalHits
2233 except pexpect.EOF:
2234 main.log.error( self.name + ": EOF exception found" )
2235 main.log.error( self.name + ": " + self.handle.before )
2236 main.cleanup()
2237 main.exit()
2238 except pexpect.TIMEOUT:
2239 main.log.error( self.name + ": TIMEOUT exception found" )
2240 main.log.error( self.name + ": " + self.handle.before )
2241 main.cleanup()
2242 main.exit()
2243 except Exception:
2244 main.log.exception( self.name + ": Uncaught exception!" )
2245 main.cleanup()
2246 main.exit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002247
2248 def copyMininetFile( self, fileName, localPath, userName, ip,
2249 mnPath='~/mininet/custom/', timeout = 60 ):
2250 """
2251 Description:
2252 Copy mininet topology file from dependency folder in the test folder
2253 and paste it to the mininet machine's mininet/custom folder
2254 Required:
2255 fileName - Name of the topology file to copy
2256 localPath - File path of the mininet topology file
2257 userName - User name of the mininet machine to send the file to
2258 ip - Ip address of the mininet machine
2259 Optional:
2260 mnPath - of the mininet directory to send the file to
2261 Return:
2262 Return main.TRUE if successfully copied the file otherwise
2263 return main.FALSE
2264 """
2265
2266 try:
2267 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2268 str( ip ) + ":" + mnPath + fileName
2269
2270 self.handle.sendline( "" )
2271 self.handle.expect( "\$" )
2272
2273 main.log.info( self.name + ": Execute: " + cmd )
2274
2275 self.handle.sendline( cmd )
2276
2277 i = self.handle.expect( [ 'No such file',
2278 "100%",
2279 pexpect.TIMEOUT ] )
2280
2281 if i == 0:
2282 main.log.error( self.name + ": File " + fileName +
2283 " does not exist!" )
2284 return main.FALSE
2285
2286 if i == 1:
2287 main.log.info( self.name + ": File " + fileName +
2288 " has been copied!" )
2289 self.handle.sendline( "" )
2290 self.handle.expect( "\$" )
2291 return main.TRUE
2292
2293 except pexpect.EOF:
2294 main.log.error( self.name + ": EOF exception found" )
2295 main.log.error( self.name + ": " + self.handle.before )
2296 main.cleanup()
2297 main.exit()
2298 except pexpect.TIMEOUT:
2299 main.log.error( self.name + ": TIMEOUT exception found" )
2300 main.log.error( self.name + ": " + self.handle.before )
2301 main.cleanup()
2302 main.exit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002303
2304 def jvmSet(self, memory=8):
Jon Hall4ba53f02015-07-29 13:07:41 -07002305
cameron@onlab.us78b89652015-07-08 15:21:03 -07002306 import os
2307
2308 homeDir = os.path.expanduser('~')
2309 filename = "/onos/tools/package/bin/onos-service"
2310
2311 serviceConfig = open(homeDir + filename, 'w+')
2312 serviceConfig.write("#!/bin/bash\n ")
2313 serviceConfig.write("#------------------------------------- \n ")
2314 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
2315 serviceConfig.write("#------------------------------------- \n ")
2316 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
2317 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
2318 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
2319 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
2320 serviceConfig.close()
2321
Jon Hall6c44c0b2016-04-20 15:21:00 -07002322 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002323
cameron@onlab.us78b89652015-07-08 15:21:03 -07002324 filename = main.TEST + "DB"
2325 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002326
cameron@onlab.us78b89652015-07-08 15:21:03 -07002327 for item in testData:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002328 if type( item ) is string:
cameron@onlab.us78b89652015-07-08 15:21:03 -07002329 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002330 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002331 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002332 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002333
Jon Hall6c44c0b2016-04-20 15:21:00 -07002334 DBFile = open( filename, "a" )
2335 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002336 DBFile.close()
2337
Jon Hall6c44c0b2016-04-20 15:21:00 -07002338 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002339
Jon Hall6c44c0b2016-04-20 15:21:00 -07002340 self.handle.sendline( "onos " + ONOSIp + " summary" )
2341 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002342
2343 summaryStr = self.handle.before
2344 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2345
2346 #passed = "SCC(s)=1" in summaryStr
2347 #if deviceCount:
2348 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
2349
GlennRC772363b2015-08-25 13:05:57 -07002350 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002351 if "SCC(s)=1," in summaryStr:
2352 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002353 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002354 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002355 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002356
2357 if deviceCount:
2358 print" ============================="
Jon Hall6c44c0b2016-04-20 15:21:00 -07002359 checkStr = "devices=" + str( deviceCount[0] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002360 print "Checkstr: " + checkStr
2361 if checkStr not in summaryStr:
2362 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002363 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002364 else:
2365 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002366
2367 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002368
Jon Hall8f6d4622016-05-23 15:27:18 -07002369 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002370 """
2371 Update self.ip_address with numerical ip address. If multiple IP's are
2372 located on the device, will attempt to use self.nicAddr to choose the
2373 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2374 determine the correct address.
2375
2376 ONLY WORKS WITH IPV4 ADDRESSES
2377 """
2378 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002379 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002380 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2381 pattern = re.compile( ipPat )
2382 match = re.search( pattern, self.ip_address )
2383 if self.nicAddr:
2384 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2385 nicPat = re.compile( nicPat )
2386 else:
2387 nicPat = None
2388 # IF self.ip_address is an ip address and matches
2389 # self.nicAddr: return self.ip_address
2390 if match:
2391 curIp = match.group(0)
2392 if nicPat:
2393 nicMatch = re.search( nicPat, curIp )
2394 if nicMatch:
2395 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002396 # ELSE: IF iface, return ip of interface
2397 cmd = "ifconfig"
2398 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2399 if iface:
2400 cmd += " " + str( iface )
2401 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002402 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2403 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002404 if iface:
2405 if ips:
2406 ip = ips[0]
2407 self.ip_address = ip
2408 return ip
2409 else:
2410 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2411 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002412 if nicPat:
2413 for ip in ips:
2414 curMatch = re.search( nicPat, ip )
2415 if curMatch:
2416 self.ip_address = ip
2417 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002418 else: # If only one non-localhost ip, return that
2419 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002420 if len(tmpList) == 1:
2421 curIp = tmpList[0]
2422 self.ip_address = curIp
2423 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002424 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002425 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002426 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002427 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002428 main.log.exception( "Error executing ifconfig" )
2429 except IndexError:
2430 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002431 except Exception:
2432 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002433
You Wangc669d212017-01-25 11:09:48 -08002434 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30 ):
suibin zhang116647a2016-05-06 16:30:09 -07002435 '''
2436 Start onos cluster with defined nodes, but only with drivers app
suibin zhang116647a2016-05-06 16:30:09 -07002437 '''
2438 import time
2439
2440 self.createCellFile( self.ip_address,
2441 "temp",
2442 self.ip_address,
2443 "drivers",
2444 nodeList )
2445
2446 main.log.info( self.name + ": Apply cell to environment" )
2447 cellResult = self.setCell( "temp" )
2448 verifyResult = self.verifyCell()
2449
2450 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002451 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002452
You Wangc669d212017-01-25 11:09:48 -08002453 main.log.info( self.name + ": Uninstalling ONOS" )
2454 for nd in nodeList:
2455 self.onosUninstall( nodeIp=nd )
2456
suibin zhang116647a2016-05-06 16:30:09 -07002457 main.log.info( self.name + ": Installing ONOS package" )
2458 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002459 self.onosInstall( node=nd )
2460
2461 main.log.info( self.name + ": Set up ONOS secure SSH" )
2462 for nd in nodeList:
2463 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002464
2465 main.log.info( self.name + ": Starting ONOS service" )
2466 time.sleep( onosStartupSleep )
2467
2468 onosStatus = True
2469 for nd in nodeList:
2470 onosStatus = onosStatus & self.isup( node = nd )
2471 #print "onosStatus is: " + str( onosStatus )
2472
2473 return main.TRUE if onosStatus else main.FALSE
2474
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002475 def onosNetCfg( self, controllerIps, path, fileName ):
2476 """
2477 Push a specified json file to ONOS through the onos-netcfg service
2478
2479 Required:
2480 controllerIps - the Ips of the ONOS nodes in the cluster
2481 path - the location of the file to be sent
2482 fileName - name of the json file to be sent
2483
2484 Returns main.TRUE on successfully sending json file, and main.FALSE if
2485 there is an error.
2486 """
2487 try:
2488 cmd = "onos-netcfg {0} {1}{2}.json".format( controllerIps, path, fileName )
2489 main.log.info( "Sending: " + cmd )
2490 main.ONOSbench.handle.sendline( cmd )
2491 handle = self.handle.before
2492 print handle
2493 if "Error" in handle:
2494 main.log.error( self.name + ": " + self.handle.before )
2495 return main.FALSE
2496 else:
2497 self.handle.expect( "\$" )
2498 return main.TRUE
2499 except pexpect.EOF:
2500 main.log.error( self.name + ": EOF exception found" )
2501 main.log.error( self.name + ": " + self.handle.before )
2502 main.cleanup()
2503 main.exit()
2504 except Exception:
2505 main.log.exception( self.name + ": Uncaught exception!" )
2506 main.cleanup()
Jeremy Songsterae01bba2016-07-11 15:39:17 -07002507 main.exit()