blob: 611d6042e0d3ee36e18e47d909a9953635e2a816 [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:
Devin Lim461f0872017-06-05 16:49:33 -0700762
Jon Hall2c8959e2016-12-16 12:17:34 -0800763 # Variable initialization
764 cellDirectory = self.home + "/tools/test/cells/"
765 # We want to create the cell file in the dependencies directory
766 # of TestON first, then copy over to ONOS bench
767 tempDirectory = "/tmp/"
768 # Create the cell file in the directory for writing ( w+ )
769 cellFile = open( tempDirectory + fileName, 'w+' )
770 if isinstance( onosIpAddrs, types.StringType ):
771 onosIpAddrs = [ onosIpAddrs ]
772
773 # App string is hardcoded environment variables
774 # That you may wish to use by default on startup.
775 # Note that you may not want certain apps listed
776 # on here.
777 appString = "export ONOS_APPS=" + appString
778 onosGroup = "export ONOS_GROUP=" + onosUser
779 onosUser = "export ONOS_USER=" + onosUser
780 if useSSH:
781 onosUseSSH = "export ONOS_USE_SSH=true"
782 mnString = "export OCN="
783 if mnIpAddrs == "":
784 mnString = ""
785 onosString = "export OC"
786 tempCount = 1
787
788 # Create ONOSNIC ip address prefix
789 tempOnosIp = str( onosIpAddrs[ 0 ] )
790 tempList = []
791 tempList = tempOnosIp.split( "." )
792 # Omit last element of list to format for NIC
793 tempList = tempList[ :-1 ]
794 # Structure the nic string ip
795 nicAddr = ".".join( tempList ) + ".*"
796 self.nicAddr = nicAddr
797 onosNicString = "export ONOS_NIC=" + nicAddr
798
kelvin8ec71442015-01-15 16:57:00 -0800799 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800800 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400801
kelvin-onlabd3b64892015-01-20 13:26:24 -0800802 for arg in onosIpAddrs:
803 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800804 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400805 # export OC1="10.128.20.11"
806 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800807 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700808 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800809 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800810
Jon Hall6f665652015-09-18 10:08:07 -0700811 cellFile.write( "export OCI=$OC1\n" )
812 cellFile.write( mnString + "\"" + mnIpAddrs + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700813 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800814 cellFile.write( onosGroup + "\n" )
815 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700816 if useSSH:
817 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800818 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400819
kelvin8ec71442015-01-15 16:57:00 -0800820 # We use os.system to send the command to TestON cluster
821 # to account for the case in which TestON is not located
822 # on the same cluster as the ONOS bench
823 # Note that even if TestON is located on the same cluster
824 # as ONOS bench, you must setup passwordless ssh
825 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700826 os.system( "scp " + tempDirectory + fileName + " " +
827 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400828
andrewonlab2a6c9342014-10-16 13:40:15 -0400829 return main.TRUE
830
andrewonlab94282092014-10-10 13:00:11 -0400831 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800832 main.log.error( self.name + ": EOF exception found" )
833 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -0400834 main.cleanup()
835 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800836 except Exception:
837 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -0400838 main.cleanup()
839 main.exit()
840
kelvin-onlabd3b64892015-01-20 13:26:24 -0800841 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800842 """
andrewonlab95ca1462014-10-09 14:04:24 -0400843 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800844 """
Hari Krishna03f530e2015-07-10 17:28:27 -0700845 import re
andrewonlab95ca1462014-10-09 14:04:24 -0400846 try:
847 if not cellname:
kelvin8ec71442015-01-15 16:57:00 -0800848 main.log.error( "Must define cellname" )
andrewonlab95ca1462014-10-09 14:04:24 -0400849 main.cleanup()
850 main.exit()
851 else:
kelvin8ec71442015-01-15 16:57:00 -0800852 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800853 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800854 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400855 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700856 self.handle.expect( str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800857 handleBefore = self.handle.before
858 handleAfter = self.handle.after
kelvin8ec71442015-01-15 16:57:00 -0800859 # Get the rest of the handle
Jon Hall3b489db2015-10-05 14:38:37 -0700860 self.handle.expect( "\$" )
Jon Hall439c8912016-04-15 02:22:03 -0700861 time.sleep(10)
kelvin-onlabd3b64892015-01-20 13:26:24 -0800862 handleMore = self.handle.before
andrewonlab95ca1462014-10-09 14:04:24 -0400863
Hari Krishna03f530e2015-07-10 17:28:27 -0700864 cell_result = handleBefore + handleAfter + handleMore
suibin zhang116647a2016-05-06 16:30:09 -0700865 #print cell_result
Hari Krishna03f530e2015-07-10 17:28:27 -0700866 if( re.search( "No such cell", cell_result ) ):
867 main.log.error( "Cell call returned: " + handleBefore +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800868 handleAfter + handleMore )
Hari Krishna03f530e2015-07-10 17:28:27 -0700869 main.cleanup()
870 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -0400871 return main.TRUE
andrewonlab95ca1462014-10-09 14:04:24 -0400872 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800873 main.log.error( self.name + ": EOF exception found" )
874 main.log.error( self.name + ": " + self.handle.before )
andrewonlab95ca1462014-10-09 14:04:24 -0400875 main.cleanup()
876 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800877 except Exception:
878 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab95ca1462014-10-09 14:04:24 -0400879 main.cleanup()
880 main.exit()
881
kelvin-onlabd3b64892015-01-20 13:26:24 -0800882 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800883 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400884 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800885 """
886 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400887
andrewonlabc03bf6c2014-10-09 14:56:18 -0400888 try:
kelvin8ec71442015-01-15 16:57:00 -0800889 # Clean handle by sending empty and expecting $
890 self.handle.sendline( "" )
891 self.handle.expect( "\$" )
892 self.handle.sendline( "onos-verify-cell" )
893 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800894 handleBefore = self.handle.before
895 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800896 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700897 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400898 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800899 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700900 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800901 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -0400902 main.cleanup()
903 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800904 except Exception:
905 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -0400906 main.cleanup()
907 main.exit()
908
jenkins1e99e7b2015-04-02 18:15:39 -0700909 def onosCfgSet( self, ONOSIp, configName, configParam ):
910 """
911 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700912 application.
913
jenkins1e99e7b2015-04-02 18:15:39 -0700914 ex)
915 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700916 ONOSIp = '10.0.0.1'
917 configName = 'org.onosproject.myapp'
918 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700919 """
Jon Hall72280bc2016-01-25 14:29:05 -0800920 try:
921 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
922 configName,
923 configParam )
924 self.handle.sendline( "" )
925 self.handle.expect( ":~" )
926 self.handle.sendline( cfgStr )
927 self.handle.expect("cfg set")
928 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700929
Jon Hall72280bc2016-01-25 14:29:05 -0800930 paramValue = configParam.split(" ")[1]
931 paramName = configParam.split(" ")[0]
Jon Hall4ba53f02015-07-29 13:07:41 -0700932
Jon Hall72280bc2016-01-25 14:29:05 -0800933 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700934
Jon Hall72280bc2016-01-25 14:29:05 -0800935 self.handle.sendline( checkStr )
936 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700937
Jon Hall72280bc2016-01-25 14:29:05 -0800938 if "value=" + paramValue + "," in self.handle.before:
939 main.log.info("cfg " + configName + " successfully set to " + configParam)
940 return main.TRUE
941 except pexpect.ExceptionPexpect as e:
942 main.log.exception( self.name + ": Pexpect exception found: " )
943 main.log.error( self.name + ": " + self.handle.before )
944 main.cleanup()
945 main.exit()
946 except Exception:
947 main.log.exception( self.name + ": Uncaught exception!" )
948 main.cleanup()
949 main.exit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700950
kelvin-onlabd3b64892015-01-20 13:26:24 -0800951 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800952 """
andrewonlab05e362f2014-10-10 00:40:57 -0400953 Uses 'onos' command to send various ONOS CLI arguments.
954 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800955 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400956 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800957
958 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400959 CLI commands for ONOS. Try to use this function first
960 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800961 function.
962 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400963 by starting onos, and typing in 'onos' to enter the
964 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800965 available commands.
966 """
andrewonlab05e362f2014-10-10 00:40:57 -0400967 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800968 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800969 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400970 return main.FALSE
971 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800972 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400973 return main.FALSE
974
kelvin8ec71442015-01-15 16:57:00 -0800975 cmdstr = str( cmdstr )
976 self.handle.sendline( "" )
977 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400978
kelvin-onlabd3b64892015-01-20 13:26:24 -0800979 self.handle.sendline( "onos -w " + ONOSIp + " " + cmdstr )
kelvin8ec71442015-01-15 16:57:00 -0800980 self.handle.expect( "\$" )
andrewonlab05e362f2014-10-10 00:40:57 -0400981
kelvin-onlabd3b64892015-01-20 13:26:24 -0800982 handleBefore = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -0800983 main.log.info( "Command sent successfully" )
kelvin8ec71442015-01-15 16:57:00 -0800984 # Obtain return handle that consists of result from
985 # the onos command. The string may need to be
986 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800987 returnString = handleBefore
kelvin-onlabd3b64892015-01-20 13:26:24 -0800988 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400989 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800990 main.log.error( self.name + ": EOF exception found" )
991 main.log.error( self.name + ": " + self.handle.before )
andrewonlab05e362f2014-10-10 00:40:57 -0400992 main.cleanup()
993 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800994 except Exception:
995 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab05e362f2014-10-10 00:40:57 -0400996 main.cleanup()
997 main.exit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400998
Pier88189b62016-09-07 17:01:53 -0700999 def onosSecureSSH( self, userName="onos", userPWD="rocks", node=""):
1000 """
1001 Enables secure access to ONOS console
1002 by removing default users & keys.
1003
1004 onos-secure-ssh -u onos -p rocks node
1005
1006 Returns: main.TRUE on success and main.FALSE on failure
1007 """
1008
1009 try:
Chiyu Chengef109502016-11-21 15:51:38 -08001010 self.handle.sendline( "" )
1011 self.handle.expect( "\$" )
Pier88189b62016-09-07 17:01:53 -07001012 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
1013
1014 # NOTE: this timeout may need to change depending on the network
1015 # and size of ONOS
1016 # TODO: Handle the other possible error
1017 i = self.handle.expect([ "Network\sis\sunreachable",
1018 "\$",
1019 pexpect.TIMEOUT ], timeout=180 )
1020 if i == 0:
1021 # can't reach ONOS node
1022 main.log.warn( "Network is unreachable" )
1023 self.handle.expect( "\$" )
1024 return main.FALSE
1025 elif i == 1:
1026 # Process started
1027 main.log.info(
1028 "Secure SSH performed on " +
1029 node)
1030 return main.TRUE
1031 except pexpect.EOF:
1032 main.log.error( self.name + ": EOF exception found" )
1033 main.log.error( self.name + ": " + self.handle.before )
1034 main.cleanup()
1035 main.exit()
1036 except Exception:
1037 main.log.exception( self.name + ": Uncaught exception!" )
1038 main.cleanup()
1039 main.exit()
1040
1041
kelvin-onlabd3b64892015-01-20 13:26:24 -08001042 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001043 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001044 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001045 If -f option is provided, it also forces an uninstall.
1046 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001047 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001048 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001049 files to certain onos nodes
1050
1051 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001052 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001053 try:
andrewonlab114768a2014-11-14 12:44:44 -05001054 if options:
kelvin8ec71442015-01-15 16:57:00 -08001055 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001056 else:
kelvin8ec71442015-01-15 16:57:00 -08001057 self.handle.sendline( "onos-install " + node )
1058 self.handle.expect( "onos-install " )
1059 # NOTE: this timeout may need to change depending on the network
1060 # and size of ONOS
1061 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001062 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001063 "ONOS\sis\salready\sinstalled",
Jeremyc72b2582016-02-26 18:27:38 -08001064 "already\sup-to-date",
Jon Hall3576f572016-08-23 10:01:07 -07001065 "does not exist",
Jeremyc72b2582016-02-26 18:27:38 -08001066 "\$",
Jon Hall6c44c0b2016-04-20 15:21:00 -07001067 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001068 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001069 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001070 main.log.warn( "Network is unreachable" )
Jon Hall3b489db2015-10-05 14:38:37 -07001071 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001072 return main.FALSE
1073 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001074 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001075 main.log.info(
1076 "ONOS was installed on " +
1077 node +
1078 " and started" )
Jon Hall3b489db2015-10-05 14:38:37 -07001079 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001080 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001081 elif i == 2 or i == 3:
1082 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001083 main.log.info( "ONOS is already installed on " + node )
1084 self.handle.expect( "\$" )
1085 return main.TRUE
1086 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001087 # onos not packaged
1088 main.log.error( "ONOS package not found." )
1089 self.handle.expect( "\$" )
1090 return main.FALSE
1091 elif i == 5:
1092 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001093 main.log.info( "ONOS was installed on " + node )
1094 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001095 elif i == 6:
1096 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001097 main.log.info(
1098 "Installation of ONOS on " +
1099 node +
1100 " timed out" )
Jon Hall3b489db2015-10-05 14:38:37 -07001101 self.handle.expect( "\$" )
Jon Hall53c5e662016-04-13 16:06:56 -07001102 main.log.warn( self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001103 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001104 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001105 main.log.error( self.name + ": EOF exception found" )
1106 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001107 main.cleanup()
1108 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001109 except Exception:
1110 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc03bf6c2014-10-09 14:56:18 -04001111 main.cleanup()
1112 main.exit()
andrewonlab95ca1462014-10-09 14:04:24 -04001113
kelvin-onlabd3b64892015-01-20 13:26:24 -08001114 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001115 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001116 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001117 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001118 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001119 try:
kelvin8ec71442015-01-15 16:57:00 -08001120 self.handle.sendline( "" )
1121 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001122 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001123 " start" )
1124 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001125 "Job\sis\salready\srunning",
1126 "start/running",
Jeremyd0e9a6d2016-03-02 11:28:52 -08001127 "\$",
andrewonlab8d0d7d72014-10-09 16:33:15 -04001128 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001129 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001130 if i == 0:
Jon Halleab7a242016-03-04 10:20:43 -08001131 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001132 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001133 return main.TRUE
1134 elif i == 1:
Jon Halleab7a242016-03-04 10:20:43 -08001135 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001136 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001137 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001138 elif i == 2:
1139 main.log.info( "ONOS service started" )
1140 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001141 else:
Jon Halleab7a242016-03-04 10:20:43 -08001142 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001143 main.log.error( "ONOS service failed to start" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001144 main.cleanup()
1145 main.exit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001146 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001147 main.log.error( self.name + ": EOF exception found" )
1148 main.log.error( self.name + ": " + self.handle.before )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001149 main.cleanup()
1150 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001151 except Exception:
1152 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001153 main.cleanup()
1154 main.exit()
1155
kelvin-onlabd3b64892015-01-20 13:26:24 -08001156 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001157 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001158 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001159 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001160 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001161 try:
kelvin8ec71442015-01-15 16:57:00 -08001162 self.handle.sendline( "" )
1163 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001164 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001165 " stop" )
1166 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001167 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001168 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001169 "Unknown\sinstance",
YPZhang77badfc2016-03-09 10:28:59 -08001170 "\$",
Jeremy Songster14c13572016-04-21 17:34:03 -07001171 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001172 if i == 0:
YPZhang77badfc2016-03-09 10:28:59 -08001173 self.handle.expect( "\$" )
kelvin8ec71442015-01-15 16:57:00 -08001174 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001175 return main.TRUE
1176 elif i == 1:
YPZhang77badfc2016-03-09 10:28:59 -08001177 self.handle.expect( "\$" )
Jon Hall65844a32015-03-09 19:09:37 -07001178 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001179 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001180 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001181 elif i == 2:
YPZhang77badfc2016-03-09 10:28:59 -08001182 self.handle.expect( "\$" )
Jon Hall61282e32015-03-19 11:34:11 -07001183 main.log.warn( "ONOS wasn't running" )
1184 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001185 elif i == 3:
1186 main.log.info( "ONOS service stopped" )
1187 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001188 else:
kelvin8ec71442015-01-15 16:57:00 -08001189 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001190 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001191 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001192 main.log.error( self.name + ": EOF exception found" )
1193 main.log.error( self.name + ": " + self.handle.before )
andrewonlab2b30bd32014-10-09 16:48:55 -04001194 main.cleanup()
1195 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001196 except Exception:
1197 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001198 main.cleanup()
1199 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001200
kelvin-onlabd3b64892015-01-20 13:26:24 -08001201 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001202 """
andrewonlabc8d47972014-10-09 16:52:36 -04001203 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001204 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001205 if needed
kelvin8ec71442015-01-15 16:57:00 -08001206 """
andrewonlabc8d47972014-10-09 16:52:36 -04001207 try:
kelvin8ec71442015-01-15 16:57:00 -08001208 self.handle.sendline( "" )
Jeremy Songster14c13572016-04-21 17:34:03 -07001209 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001210 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Jeremy Songster14c13572016-04-21 17:34:03 -07001211 self.handle.expect( "\$", timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001212 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001213 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001214 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001215 except pexpect.TIMEOUT:
1216 main.log.exception( self.name + ": Timeout in onosUninstall" )
1217 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001218 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001219 main.log.error( self.name + ": EOF exception found" )
1220 main.log.error( self.name + ": " + self.handle.before )
andrewonlabc8d47972014-10-09 16:52:36 -04001221 main.cleanup()
1222 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001223 except Exception:
1224 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabc8d47972014-10-09 16:52:36 -04001225 main.cleanup()
1226 main.exit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001227
kelvin-onlabd3b64892015-01-20 13:26:24 -08001228 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001229 """
andrewonlabaedc8332014-12-04 12:43:03 -05001230 Issues the command 'onos-die <node-ip>'
1231 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001232 """
andrewonlabaedc8332014-12-04 12:43:03 -05001233 try:
kelvin8ec71442015-01-15 16:57:00 -08001234 self.handle.sendline( "" )
1235 self.handle.expect( "\$" )
Jeremyf0aecdb2016-03-30 13:19:57 -07001236 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001237 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001238 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001239 "Killing\sONOS",
1240 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001241 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001242 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001243 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001244 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001245 self.handle.sendline( "" )
1246 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001247 return main.TRUE
1248 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001249 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001250 self.handle.sendline( "" )
1251 self.handle.expect( "\$" )
andrewonlabaedc8332014-12-04 12:43:03 -05001252 return main.FALSE
1253 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001254 main.log.error( self.name + ": EOF exception found" )
1255 main.log.error( self.name + ": " + self.handle.before )
andrewonlabaedc8332014-12-04 12:43:03 -05001256 main.cleanup()
1257 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001258 except Exception:
1259 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabaedc8332014-12-04 12:43:03 -05001260 main.cleanup()
1261 main.exit()
1262
kelvin-onlabd3b64892015-01-20 13:26:24 -08001263 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001264 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001265 Calls the command: 'onos-kill [<node-ip>]'
1266 "Remotely, and unceremoniously kills the ONOS instance running on
1267 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001268 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001269 try:
kelvin8ec71442015-01-15 16:57:00 -08001270 self.handle.sendline( "" )
1271 self.handle.expect( "\$" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001272 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001273 i = self.handle.expect( [
andrewonlabe8e56fd2014-10-09 17:12:44 -04001274 "\$",
1275 "No\sroute\sto\shost",
1276 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001277 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001278
andrewonlabe8e56fd2014-10-09 17:12:44 -04001279 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001280 main.log.info(
1281 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001282 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001283 return main.TRUE
1284 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001285 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001286 return main.FALSE
1287 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001288 main.log.info(
1289 "Passwordless login for host: " +
1290 str( nodeIp ) +
1291 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001292 return main.FALSE
1293 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001294 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001295 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001296
andrewonlabe8e56fd2014-10-09 17:12:44 -04001297 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001298 main.log.error( self.name + ": EOF exception found" )
1299 main.log.error( self.name + ": " + self.handle.before )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001300 main.cleanup()
1301 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001302 except Exception:
1303 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001304 main.cleanup()
1305 main.exit()
1306
kelvin-onlabd3b64892015-01-20 13:26:24 -08001307 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001308 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001309 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001310 a cleaner environment.
1311
andrewonlab19fbdca2014-11-14 12:55:59 -05001312 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001313 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001314 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001315 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001316 try:
kelvin8ec71442015-01-15 16:57:00 -08001317 self.handle.sendline( "" )
1318 self.handle.expect( "\$" )
1319 self.handle.sendline( "onos-remove-raft-logs" )
1320 # Sometimes this command hangs
1321 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1322 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001323 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001324 i = self.handle.expect( [ "\$", pexpect.TIMEOUT ],
1325 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001326 if i == 1:
1327 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001328 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001329 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001330 main.log.error( self.name + ": EOF exception found" )
1331 main.log.error( self.name + ": " + self.handle.before )
andrewonlab19fbdca2014-11-14 12:55:59 -05001332 main.cleanup()
1333 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001334 except Exception:
1335 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab19fbdca2014-11-14 12:55:59 -05001336 main.cleanup()
1337 main.exit()
Jon Hallfcc88622014-11-25 13:09:54 -05001338
kelvin-onlabd3b64892015-01-20 13:26:24 -08001339 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001340 """
1341 Calls the command 'onos-start-network [ <mininet-topo> ]
1342 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001343 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001344 cell."
andrewonlab94282092014-10-10 13:00:11 -04001345 * Specify mininet topology file name for mntopo
1346 * Topo files should be placed at:
1347 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001348
andrewonlab94282092014-10-10 13:00:11 -04001349 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001350 """
andrewonlab94282092014-10-10 13:00:11 -04001351 try:
1352 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001353 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001354 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001355
kelvin8ec71442015-01-15 16:57:00 -08001356 mntopo = str( mntopo )
1357 self.handle.sendline( "" )
1358 self.handle.expect( "\$" )
andrewonlab94282092014-10-10 13:00:11 -04001359
kelvin8ec71442015-01-15 16:57:00 -08001360 self.handle.sendline( "onos-start-network " + mntopo )
1361 self.handle.expect( "mininet>" )
1362 main.log.info( "Network started, entered mininet prompt" )
1363
1364 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001365
1366 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001367 main.log.error( self.name + ": EOF exception found" )
1368 main.log.error( self.name + ": " + self.handle.before )
andrewonlab94282092014-10-10 13:00:11 -04001369 main.cleanup()
1370 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001371 except Exception:
1372 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab94282092014-10-10 13:00:11 -04001373 main.cleanup()
1374 main.exit()
1375
Jeremy Songster14c13572016-04-21 17:34:03 -07001376 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001377 """
1378 Run's onos-wait-for-start which only returns once ONOS is at run
Cameron Franke9c94fb02015-01-21 10:20:20 -08001379 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001380
Jon Hall7993bfc2014-10-09 16:30:14 -04001381 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001382 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001383 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001384 self.handle.sendline( "onos-wait-for-start " + node )
1385 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001386 # NOTE: this timeout is arbitrary"
Cameron Franke9c94fb02015-01-21 10:20:20 -08001387 i = self.handle.expect(["\$", pexpect.TIMEOUT], timeout)
Jon Hall7993bfc2014-10-09 16:30:14 -04001388 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001389 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001390 return main.TRUE
1391 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001392 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001393 # we will kill it on timeout
kelvin8ec71442015-01-15 16:57:00 -08001394 main.log.error( "ONOS has not started yet" )
1395 self.handle.send( "\x03" ) # Control-C
1396 self.handle.expect( "\$" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001397 return main.FALSE
1398 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001399 main.log.error( self.name + ": EOF exception found" )
1400 main.log.error( self.name + ": " + self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001401 main.cleanup()
1402 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001403 except Exception:
1404 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001405 main.cleanup()
1406 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001407
kelvin-onlabd3b64892015-01-20 13:26:24 -08001408 def pushTestIntentsShell(
1409 self,
1410 dpidSrc,
1411 dpidDst,
1412 numIntents,
1413 dirFile,
1414 onosIp,
1415 numMult="",
1416 appId="",
1417 report=True,
1418 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001419 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001420 Description:
kelvin8ec71442015-01-15 16:57:00 -08001421 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001422 better parallelize the results than the CLI
1423 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001424 * dpidSrc: specify source dpid
1425 * dpidDst: specify destination dpid
1426 * numIntents: specify number of intents to push
1427 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001428 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001429 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001430 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001431 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001432 """
1433 try:
1434 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001435 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001436 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001437 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001438 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001439 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001440
kelvin-onlabd3b64892015-01-20 13:26:24 -08001441 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1442 if not numMult:
1443 addIntents = addDpid + " " + str( numIntents )
1444 elif numMult:
1445 addIntents = addDpid + " " + str( numIntents ) + " " +\
1446 str( numMult )
1447 if appId:
1448 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001449 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001450 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001451
andrewonlabaedc8332014-12-04 12:43:03 -05001452 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001453 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001454 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001455 sendCmd = addApp + " &"
1456 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001457
kelvin-onlabd3b64892015-01-20 13:26:24 -08001458 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001459
1460 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001461 main.log.error( self.name + ": EOF exception found" )
1462 main.log.error( self.name + ": " + self.handle.before )
andrewonlabb66dfa12014-12-02 15:51:10 -05001463 main.cleanup()
1464 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001465 except Exception:
1466 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlabb66dfa12014-12-02 15:51:10 -05001467 main.cleanup()
kelvin8ec71442015-01-15 16:57:00 -08001468 main.exit()
andrewonlab05e362f2014-10-10 00:40:57 -04001469
kelvin-onlabd3b64892015-01-20 13:26:24 -08001470 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001471 """
andrewonlab970399c2014-11-07 13:09:32 -05001472 Capture all packet activity and store in specified
1473 directory/file
1474
1475 Required:
1476 * interface: interface to capture
1477 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001478 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001479 try:
1480 self.handle.sendline( "" )
1481 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001482
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001483 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001484 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001485 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001486 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001487 self.handle.expect( "\$" )
andrewonlab970399c2014-11-07 13:09:32 -05001488
Jon Hallfebb1c72015-03-05 13:30:09 -08001489 main.log.info( "Tshark started capturing files on " +
1490 str( interface ) + " and saving to directory: " +
1491 str( dirFile ) )
1492 except pexpect.EOF:
1493 main.log.error( self.name + ": EOF exception found" )
1494 main.log.error( self.name + ": " + self.handle.before )
1495 main.cleanup()
1496 main.exit()
1497 except Exception:
1498 main.log.exception( self.name + ": Uncaught exception!" )
1499 main.cleanup()
1500 main.exit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001501
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001502 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001503 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001504 Description:
1505 Execute onos-topo-cfg command
1506 Required:
1507 onosIp - IP of the onos node you want to send the json to
1508 jsonFile - File path of the json file
1509 Return:
1510 Returns main.TRUE if the command is successfull; Returns
1511 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001512 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001513 try:
kelvin8ec71442015-01-15 16:57:00 -08001514 self.handle.sendline( "" )
1515 self.handle.expect( "\$" )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001516 cmd = "onos-topo-cfg "
1517 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1518 handle = self.handle.before
1519 print handle
1520 if "Error" in handle:
1521 main.log.error( self.name + ": " + self.handle.before )
1522 return main.FALSE
1523 else:
1524 self.handle.expect( "\$" )
1525 return main.TRUE
1526
Jon Hallfebb1c72015-03-05 13:30:09 -08001527 except pexpect.EOF:
1528 main.log.error( self.name + ": EOF exception found" )
1529 main.log.error( self.name + ": " + self.handle.before )
1530 main.cleanup()
1531 main.exit()
1532 except Exception:
1533 main.log.exception( self.name + ": Uncaught exception!" )
1534 main.cleanup()
1535 main.exit()
kelvin8ec71442015-01-15 16:57:00 -08001536
jenkins1e99e7b2015-04-02 18:15:39 -07001537 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001538 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001539 Required:
kelvin8ec71442015-01-15 16:57:00 -08001540 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001541 * directory to store results
1542 Optional:
1543 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001544 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001545 Description:
1546 Uses tshark command to grep specific group of packets
1547 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001548 The timestamp is hardcoded to be in epoch
1549 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001550 try:
1551 self.handle.sendline( "" )
1552 self.handle.expect( "\$" )
1553 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001554 if grepOptions:
1555 grepStr = "grep "+str(grepOptions)
1556 else:
1557 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001558
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001559 cmd = (
1560 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001561 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001562 " -t e | " +
1563 grepStr + " --line-buffered \"" +
Jon Hallfebb1c72015-03-05 13:30:09 -08001564 str(grep) +
1565 "\" >" +
1566 directory +
1567 " &" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001568 self.handle.sendline(cmd)
1569 main.log.info(cmd)
Jon Hallfebb1c72015-03-05 13:30:09 -08001570 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001571 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001572 self.handle.expect( "\$" )
1573 except pexpect.EOF:
1574 main.log.error( self.name + ": EOF exception found" )
1575 main.log.error( self.name + ": " + self.handle.before )
1576 main.cleanup()
1577 main.exit()
1578 except Exception:
1579 main.log.exception( self.name + ": Uncaught exception!" )
1580 main.cleanup()
1581 main.exit()
1582
kelvin-onlabd3b64892015-01-20 13:26:24 -08001583 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001584 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001585 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001586 """
1587 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001588 try:
1589 self.execute( cmd="sudo rm /tmp/wireshark*" )
1590 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001591 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1592 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001593 self.handle.sendline( "" )
1594 main.log.info( "Tshark stopped" )
1595 except pexpect.EOF:
1596 main.log.error( self.name + ": EOF exception found" )
1597 main.log.error( self.name + ": " + self.handle.before )
1598 main.cleanup()
1599 main.exit()
1600 except Exception:
1601 main.log.exception( self.name + ": Uncaught exception!" )
1602 main.cleanup()
1603 main.exit()
1604
kelvin8ec71442015-01-15 16:57:00 -08001605 def ptpd( self, args ):
1606 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001607 Initiate ptp with user-specified args.
1608 Required:
1609 * args: specify string of args after command
1610 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001611 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001612 try:
kelvin8ec71442015-01-15 16:57:00 -08001613 self.handle.sendline( "sudo ptpd " + str( args ) )
1614 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001615 "Multiple",
1616 "Error",
kelvin8ec71442015-01-15 16:57:00 -08001617 "\$" ] )
1618 self.handle.expect( "\$" )
andrewonlabba44bcf2014-10-16 16:54:41 -04001619
andrewonlab0c38a4a2014-10-28 18:35:35 -04001620 if i == 0:
1621 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001622 main.log.info( "ptpd returned an error: " +
1623 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001624 return handle
1625 elif i == 1:
1626 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001627 main.log.error( "ptpd returned an error: " +
1628 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001629 return handle
1630 else:
1631 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001632
andrewonlab0c38a4a2014-10-28 18:35:35 -04001633 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001634 main.log.error( self.name + ": EOF exception found" )
1635 main.log.error( self.name + ": " + self.handle.before )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001636 main.cleanup()
1637 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001638 except Exception:
1639 main.log.exception( self.name + ": Uncaught exception!" )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001640 main.cleanup()
1641 main.exit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001642
Pier50f0bc62016-09-07 17:53:40 -07001643 def dumpONOSCmd(self, ONOSIp, CMD, destDir, filename, options=""):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001644 """
Pier50f0bc62016-09-07 17:53:40 -07001645 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001646 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001647 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001648 Localtime will be attached to the filename
1649
1650 Required:
1651 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001652 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001653 * destDir: specify directory to copy to.
1654 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001655 * fileName: Name of the file
Pier50f0bc62016-09-07 17:53:40 -07001656 * options: Options for ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001657 """
1658
1659 localtime = time.strftime( '%x %X' )
1660 localtime = localtime.replace( "/", "" )
1661 localtime = localtime.replace( " ", "_" )
1662 localtime = localtime.replace( ":", "" )
1663 if destDir[ -1: ] != "/":
1664 destDir += "/"
Pier50f0bc62016-09-07 17:53:40 -07001665 cmd=CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
1666 return self.onosCli(ONOSIp, cmd)
Flavio Castrob7718952016-05-18 08:53:41 -07001667
kelvin-onlabd3b64892015-01-20 13:26:24 -08001668 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001669 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001670 """
1671 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001672 Current implementation of ONOS deletes its karaf
1673 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001674 you may want to use this function to capture
1675 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001676 Localtime will be attached to the filename
1677
1678 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001679 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001680 copy.
kelvin8ec71442015-01-15 16:57:00 -08001681 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001682 For copying multiple files, leave copyFileName
1683 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001684 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001685 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001686 ex ) /tmp/
1687 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001688 * copyFileName: If you want to rename the log
1689 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001690 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001691 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001692 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001693 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001694 localtime = localtime.replace( "/", "" )
1695 localtime = localtime.replace( " ", "_" )
1696 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001697 if destDir[ -1: ] != "/":
1698 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001699
kelvin-onlabd3b64892015-01-20 13:26:24 -08001700 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001701 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1702 str( destDir ) + str( copyFileName ) +
1703 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001704 self.handle.expect( "cp" )
1705 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001706 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001707 self.handle.sendline( "cp " + str( logToCopy ) +
1708 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001709 self.handle.expect( "cp" )
1710 self.handle.expect( "\$" )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001711
kelvin8ec71442015-01-15 16:57:00 -08001712 return self.handle.before
1713
1714 except pexpect.EOF:
1715 main.log.error( "Copying files failed" )
1716 main.log.error( self.name + ": EOF exception found" )
1717 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001718 except Exception:
1719 main.log.exception( "Copying files failed" )
1720
Jon Hall16b72c42015-05-20 10:23:36 -07001721 def checkLogs( self, onosIp, restart=False):
kelvin8ec71442015-01-15 16:57:00 -08001722 """
Jon Hall94fd0472014-12-08 11:52:42 -08001723 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001724 If restart is True, use the old version of onos-check-logs which
1725 does not print the full stacktrace, but shows the entire log file,
1726 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001727 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001728 """
Jon Hall94fd0472014-12-08 11:52:42 -08001729 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001730 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001731 if restart:
1732 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001733 self.handle.sendline( cmd )
1734 self.handle.expect( cmd )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001735 self.handle.expect( "\$ " )
Jon Hall94fd0472014-12-08 11:52:42 -08001736 response = self.handle.before
1737 return response
1738 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001739 main.log.error( "Lost ssh connection" )
1740 main.log.error( self.name + ": EOF exception found" )
1741 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001742 except Exception:
1743 main.log.exception( self.name + ": Uncaught exception!" )
1744 main.cleanup()
1745 main.exit()
Jon Hall94fd0472014-12-08 11:52:42 -08001746
kelvin-onlabd3b64892015-01-20 13:26:24 -08001747 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001748 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001749 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001750 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001751 try:
kelvin8ec71442015-01-15 16:57:00 -08001752 self.handle.sendline( "" )
1753 self.handle.expect( "\$" )
1754 self.handle.sendline( "onos-service " + str( node ) +
1755 " status" )
1756 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001757 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001758 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001759 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001760 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001761 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001762 self.handle.sendline( "" )
1763 self.handle.expect( "\$" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001764
You Wangef1e6572016-03-08 12:53:18 -08001765 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001766 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001767 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001768 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001769 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001770 main.log.error( "ONOS service failed to check the status" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001771 main.cleanup()
1772 main.exit()
1773 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001774 main.log.error( self.name + ": EOF exception found" )
1775 main.log.error( self.name + ": " + self.handle.before )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001776 main.cleanup()
1777 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001778 except Exception:
1779 main.log.exception( self.name + ": Uncaught exception!" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001780 main.cleanup()
1781 main.exit()
Jon Hall21270ac2015-02-16 17:59:55 -08001782
Jon Hall63604932015-02-26 17:09:50 -08001783 def setIpTables( self, ip, port='', action='add', packet_type='',
1784 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001785 """
Jon Hall21270ac2015-02-16 17:59:55 -08001786 Description:
1787 add or remove iptables rule to DROP (default) packets from
1788 specific IP and PORT
1789 Usage:
1790 * specify action ('add' or 'remove')
1791 when removing, pass in the same argument as you would add. It will
1792 delete that specific rule.
1793 * specify the ip to block
1794 * specify the destination port to block (defaults to all ports)
1795 * optional packet type to block (default tcp)
1796 * optional iptables rule (default DROP)
1797 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001798 * States boolean toggles adding all supported tcp states to the
1799 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001800 Returns:
1801 main.TRUE on success or
1802 main.FALSE if given invalid input or
1803 main.ERROR if there is an error in response from iptables
1804 WARNING:
1805 * This function uses root privilege iptables command which may result
1806 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001807 """
Jon Hall21270ac2015-02-16 17:59:55 -08001808
1809 # NOTE*********
1810 # The strict checking methods of this driver function is intentional
1811 # to discourage any misuse or error of iptables, which can cause
1812 # severe network errors
1813 # *************
1814
1815 # NOTE: Sleep needed to give some time for rule to be added and
1816 # registered to the instance. If you are calling this function
1817 # multiple times this sleep will prevent any errors.
1818 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001819 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001820 try:
1821 # input validation
1822 action_type = action.lower()
1823 rule = rule.upper()
1824 direction = direction.upper()
1825 if action_type != 'add' and action_type != 'remove':
1826 main.log.error( "Invalid action type. Use 'add' or "
1827 "'remove' table rule" )
1828 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1829 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1830 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1831 "'ACCEPT' or 'LOG' only." )
1832 if direction != 'INPUT' and direction != 'OUTPUT':
1833 # NOTE currently only supports rules INPUT and OUPTUT
1834 main.log.error( "Invalid rule. Valid directions are"
1835 " 'OUTPUT' or 'INPUT'" )
1836 return main.FALSE
1837 return main.FALSE
1838 return main.FALSE
1839 if action_type == 'add':
1840 # -A is the 'append' action of iptables
1841 actionFlag = '-A'
1842 elif action_type == 'remove':
1843 # -D is the 'delete' rule of iptables
1844 actionFlag = '-D'
1845 self.handle.sendline( "" )
1846 self.handle.expect( "\$" )
1847 cmd = "sudo iptables " + actionFlag + " " +\
1848 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001849 " -s " + str( ip )
Jon Hall63604932015-02-26 17:09:50 -08001850 # " -p " + str( packet_type ) +\
1851 if packet_type:
1852 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001853 if port:
1854 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001855 if states:
1856 cmd += " -m state --state="
1857 #FIXME- Allow user to configure which states to block
1858 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001859 cmd += " -j " + str( rule )
1860
1861 self.handle.sendline( cmd )
1862 self.handle.expect( "\$" )
1863 main.log.warn( self.handle.before )
1864
1865 info_string = "On " + str( self.name )
1866 info_string += " " + str( action_type )
1867 info_string += " iptable rule [ "
1868 info_string += " IP: " + str( ip )
1869 info_string += " Port: " + str( port )
1870 info_string += " Rule: " + str( rule )
1871 info_string += " Direction: " + str( direction ) + " ]"
1872 main.log.info( info_string )
1873 return main.TRUE
1874 except pexpect.TIMEOUT:
1875 main.log.exception( self.name + ": Timeout exception in "
1876 "setIpTables function" )
1877 return main.ERROR
1878 except pexpect.EOF:
1879 main.log.error( self.name + ": EOF exception found" )
1880 main.log.error( self.name + ": " + self.handle.before )
1881 main.cleanup()
1882 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001883 except Exception:
1884 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall21270ac2015-02-16 17:59:55 -08001885 main.cleanup()
1886 main.exit()
1887
Jon Hall0468b042015-02-19 19:08:21 -08001888 def detailed_status(self, log_filename):
Jon Hallefbd9792015-03-05 16:11:36 -08001889 """
Jon Hall0468b042015-02-19 19:08:21 -08001890 This method is used by STS to check the status of the controller
1891 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001892 """
Jon Hall0468b042015-02-19 19:08:21 -08001893 import re
1894 try:
1895 self.handle.sendline( "" )
1896 self.handle.expect( "\$" )
1897 self.handle.sendline( "cd " + self.home )
1898 self.handle.expect( "\$" )
1899 self.handle.sendline( "service onos status" )
1900 self.handle.expect( "\$" )
1901 response = self.handle.before
1902 if re.search( "onos start/running", response ):
1903 # onos start/running, process 10457
1904 return 'RUNNING'
1905 # FIXME: Implement this case
1906 # elif re.search( pattern, response ):
1907 # return 'STARTING'
1908 elif re.search( "onos stop/", response ):
1909 # onos stop/waiting
1910 # FIXME handle this differently?: onos stop/pre-stop
1911 return 'STOPPED'
1912 # FIXME: Implement this case
1913 # elif re.search( pattern, response ):
1914 # return 'FROZEN'
1915 else:
1916 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001917 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001918 main.log.warn( response )
1919 return 'ERROR', "Unknown response: %s" % response
1920 except pexpect.TIMEOUT:
1921 main.log.exception( self.name + ": Timeout exception in "
1922 "setIpTables function" )
1923 return 'ERROR', "Pexpect Timeout"
1924 except pexpect.EOF:
1925 main.log.error( self.name + ": EOF exception found" )
1926 main.log.error( self.name + ": " + self.handle.before )
1927 main.cleanup()
1928 main.exit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001929 except Exception:
1930 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall0468b042015-02-19 19:08:21 -08001931 main.cleanup()
1932 main.exit()
1933
andrew@onlab.us3b087132015-03-11 15:00:08 -07001934 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount):
1935 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001936 Create/formats the LinkGraph.cfg file based on arguments
1937 -only creates a linear topology and connects islands
1938 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001939 -must be called by ONOSbench
1940
Jon Hall4ba53f02015-07-29 13:07:41 -07001941 ONOSIpList - list of all of the node IPs to be used
1942
1943 deviceCount - number of switches to be assigned
andrew@onlab.us3b087132015-03-11 15:00:08 -07001944 '''
Jon Hall6509dbf2016-06-21 17:01:17 -07001945 main.log.info("Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001946 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001947 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001948
1949 linkGraph = open(tempFile, 'w+')
1950 linkGraph.write("# NullLinkProvider topology description (config file).\n")
1951 linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
1952 linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001953
andrew@onlab.us3b087132015-03-11 15:00:08 -07001954 clusterCount = len(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07001955
1956 if type(deviceCount) is int or type(deviceCount) is str:
andrew@onlab.us3b087132015-03-11 15:00:08 -07001957 deviceCount = int(deviceCount)
1958 switchList = [0]*(clusterCount+1)
1959 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07001960
andrew@onlab.us3b087132015-03-11 15:00:08 -07001961 for node in range(1, clusterCount + 1):
1962 switchList[node] = baselineSwitchCount
1963
1964 for node in range(1, (deviceCount%clusterCount)+1):
1965 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001966
andrew@onlab.us3b087132015-03-11 15:00:08 -07001967 if type(deviceCount) is list:
1968 main.log.info("Using provided device distribution")
1969 switchList = [0]
1970 for i in deviceCount:
1971 switchList.append(int(i))
1972
1973 tempList = ['0']
1974 tempList.extend(ONOSIpList)
1975 ONOSIpList = tempList
1976
1977 myPort = 6
1978 lastSwitch = 0
1979 for node in range(1, clusterCount+1):
1980 if switchList[node] == 0:
1981 continue
1982
1983 linkGraph.write("graph " + ONOSIpList[node] + " {\n")
Jon Hall4ba53f02015-07-29 13:07:41 -07001984
andrew@onlab.us3b087132015-03-11 15:00:08 -07001985 if node > 1:
1986 #connect to last device on previous node
Jon Hall4ba53f02015-07-29 13:07:41 -07001987 line = ("\t0:5 -> " + str(lastSwitch) + ":6:" + lastIp + "\n") #ONOSIpList[node-1]
1988 linkGraph.write(line)
1989
1990 lastSwitch = 0
1991 for switch in range (0, switchList[node]-1):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001992 line = ""
1993 line = ("\t" + str(switch) + ":" + str(myPort))
1994 line += " -- "
1995 line += (str(switch+1) + ":" + str(myPort-1) + "\n")
1996 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07001997 lastSwitch = switch+1
andrew@onlab.us3b087132015-03-11 15:00:08 -07001998 lastIp = ONOSIpList[node]
Jon Hall4ba53f02015-07-29 13:07:41 -07001999
andrew@onlab.us3b087132015-03-11 15:00:08 -07002000 #lastSwitch += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002001 if node < (clusterCount):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002002 #connect to first device on the next node
Jon Hall4ba53f02015-07-29 13:07:41 -07002003 line = ("\t" + str(lastSwitch) + ":6 -> 0:5:" + ONOSIpList[node+1] + "\n")
andrew@onlab.us3b087132015-03-11 15:00:08 -07002004 linkGraph.write(line)
Jon Hall4ba53f02015-07-29 13:07:41 -07002005
andrew@onlab.us3b087132015-03-11 15:00:08 -07002006 linkGraph.write("}\n")
2007 linkGraph.close()
2008
2009 #SCP
Jon Hall4ba53f02015-07-29 13:07:41 -07002010 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath)
andrew@onlab.us3b087132015-03-11 15:00:08 -07002011 main.log.info("linkGraph.cfg creation complete")
2012
cameron@onlab.us75900962015-03-30 13:22:49 -07002013 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
Jon Hall4ba53f02015-07-29 13:07:41 -07002014
andrew@onlab.us3b087132015-03-11 15:00:08 -07002015 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002016 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
2017 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07002018 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 -07002019 '''
2020
Jon Hall6509dbf2016-06-21 17:01:17 -07002021 main.log.info("Configuring Null Device Provider" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002022 clusterCount = len(ONOSIpList)
2023
Jon Hall4ba53f02015-07-29 13:07:41 -07002024 try:
2025
cameron@onlab.us75900962015-03-30 13:22:49 -07002026 if type(deviceCount) is int or type(deviceCount) is str:
Jon Hall6509dbf2016-06-21 17:01:17 -07002027 main.log.info("Creating device distribution")
cameron@onlab.us75900962015-03-30 13:22:49 -07002028 deviceCount = int(deviceCount)
2029 switchList = [0]*(clusterCount+1)
2030 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002031
cameron@onlab.us75900962015-03-30 13:22:49 -07002032 for node in range(1, clusterCount + 1):
2033 switchList[node] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002034
cameron@onlab.us75900962015-03-30 13:22:49 -07002035 for node in range(1, (deviceCount%clusterCount)+1):
2036 switchList[node] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002037
2038 if type(deviceCount) is list:
2039 main.log.info("Using provided device distribution")
2040
2041 if len(deviceCount) == clusterCount:
cameron@onlab.us75900962015-03-30 13:22:49 -07002042 switchList = ['0']
2043 switchList.extend(deviceCount)
Jon Hall4ba53f02015-07-29 13:07:41 -07002044
2045 if len(deviceCount) == (clusterCount + 1):
2046 if deviceCount[0] == '0' or deviceCount[0] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002047 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002048
cameron@onlab.us75900962015-03-30 13:22:49 -07002049 assert len(switchList) == (clusterCount + 1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002050
cameron@onlab.us75900962015-03-30 13:22:49 -07002051 except AssertionError:
Jon Hall4ba53f02015-07-29 13:07:41 -07002052 main.log.error( "Bad device/Ip list match")
cameron@onlab.us75900962015-03-30 13:22:49 -07002053 except TypeError:
2054 main.log.exception( self.name + ": Object not as expected" )
2055 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002056 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002057 main.log.exception( self.name + ": Uncaught exception!" )
2058 main.cleanup()
2059 main.exit()
2060
andrew@onlab.us3b087132015-03-11 15:00:08 -07002061
2062 ONOSIp = [0]
2063 ONOSIp.extend(ONOSIpList)
Jon Hall4ba53f02015-07-29 13:07:41 -07002064
andrew@onlab.us3b087132015-03-11 15:00:08 -07002065 devicesString = "devConfigs = "
2066 for node in range(1, len(ONOSIp)):
2067 devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
2068 if node < clusterCount:
2069 devicesString += (",")
Jon Hall4ba53f02015-07-29 13:07:41 -07002070
2071 try:
cameron@onlab.us75900962015-03-30 13:22:49 -07002072 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2073 self.handle.expect(":~")
2074 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
2075 self.handle.expect(":~")
andrew@onlab.us3b087132015-03-11 15:00:08 -07002076
cameron@onlab.us75900962015-03-30 13:22:49 -07002077 for i in range(10):
2078 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
2079 self.handle.expect(":~")
2080 verification = self.handle.before
2081 if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
2082 break
2083 else:
2084 time.sleep(1)
andrew@onlab.us3b087132015-03-11 15:00:08 -07002085
cameron@onlab.us2cc8bf12015-04-02 14:12:30 -07002086 assert ("value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002087
cameron@onlab.us75900962015-03-30 13:22:49 -07002088 except AssertionError:
2089 main.log.error("Incorrect Config settings: " + verification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002090 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002091 main.log.exception( self.name + ": Uncaught exception!" )
2092 main.cleanup()
2093 main.exit()
2094
Jon Hall4ba53f02015-07-29 13:07:41 -07002095 def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002096 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002097 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002098 you want to use a different topology file than linkGraph.cfg
andrew@onlab.us3b087132015-03-11 15:00:08 -07002099 '''
2100
Jon Hall4ba53f02015-07-29 13:07:41 -07002101
2102 try:
2103 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
2104 self.handle.expect(":~")
cameron@onlab.us75900962015-03-30 13:22:49 -07002105 self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2106 self.handle.expect(":~")
Jon Hall4ba53f02015-07-29 13:07:41 -07002107
2108 for i in range(10):
2109 self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
cameron@onlab.us75900962015-03-30 13:22:49 -07002110 self.handle.expect(":~")
2111 verification = self.handle.before
Jon Hall4ba53f02015-07-29 13:07:41 -07002112 if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002113 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002114 else:
cameron@onlab.us75900962015-03-30 13:22:49 -07002115 time.sleep(1)
Jon Hall4ba53f02015-07-29 13:07:41 -07002116
cameron@onlab.us75900962015-03-30 13:22:49 -07002117 assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002118
cameron@onlab.us75900962015-03-30 13:22:49 -07002119 except pexpect.EOF:
2120 main.log.error( self.name + ": EOF exception found" )
2121 main.log.error( self.name + ": " + self.handle.before )
2122 main.cleanup()
2123 main.exit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002124 except AssertionError:
2125 main.log.info("Settings did not post to ONOS")
Jon Hall4ba53f02015-07-29 13:07:41 -07002126 main.log.error(varification)
Jon Hall77ba41c2015-04-06 10:25:40 -07002127 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002128 main.log.exception( self.name + ": Uncaught exception!" )
2129 main.log.error(varification)
2130 main.cleanup()
2131 main.exit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002132
kelvin-onlaba4074292015-07-09 15:19:49 -07002133 def getOnosIps( self ):
2134 """
2135 Get all onos IPs stored in
2136 """
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002137
kelvin-onlaba4074292015-07-09 15:19:49 -07002138 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002139
Chiyu Chengec63bde2016-11-17 18:11:36 -08002140 def listLog( self, nodeIp ):
2141 """
2142 Get a list of all the karaf log names
2143 """
2144 try:
2145 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2146 self.handle.sendline( cmd )
2147 self.handle.expect( ":~" )
2148 before = self.handle.before.splitlines()
2149 logNames = []
2150 for word in before:
2151 if 'karaf.log' in word:
2152 logNames.append( word )
2153 return logNames
2154 except pexpect.EOF:
2155 main.log.error( self.name + ": EOF exception found" )
2156 main.log.error( self.name + ": " + self.handle.before )
2157 main.cleanup()
2158 main.exit()
2159 except pexpect.TIMEOUT:
2160 main.log.error( self.name + ": TIMEOUT exception found" )
2161 main.log.error( self.name + ": " + self.handle.before )
2162 main.cleanup()
2163 main.exit()
2164 except Exception:
2165 main.log.exception( self.name + ": Uncaught exception!" )
2166 main.cleanup()
2167 main.exit()
2168
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002169 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002170 """
2171 Searches the latest ONOS log file for the given search terms and
2172 prints the total occurances of each term. Returns to combined total of
2173 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002174
Jon Hallb4242222016-01-25 17:07:04 -08002175 Arguments:
2176 * nodeIp - The ip of the ONOS node where the log is located
2177 * searchTerms - A string to grep for or a list of strings to grep
2178 for in the ONOS log. Will print out the number of
2179 occurances for each term.
2180 Optional Arguments:
2181 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2182 containing each search term as well as the total
2183 number of occurances of each term. Defaults to 's',
2184 which prints the simple output of just the number
2185 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002186 * startStr - the start string to be given to stream editor command
2187 as the start point for extraction of data
2188 * endStr - the end string to be given to stream editor command as
2189 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002190 """
2191 try:
2192 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
2193 if type( searchTerms ) is str:
2194 searchTerms = [searchTerms]
2195 numTerms = len( searchTerms )
2196 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002197
Jon Hallb4242222016-01-25 17:07:04 -08002198 totalHits = 0
2199 logLines = []
2200 for termIndex in range( numTerms ):
2201 term = searchTerms[termIndex]
2202 logLines.append( [term] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002203 if startStr and endStr:
2204 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2205 startStr,
2206 endStr,
2207 term )
2208 else:
2209 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2210 term )
Jon Hallb4242222016-01-25 17:07:04 -08002211 self.handle.sendline( cmd )
2212 self.handle.expect( ":~" )
2213 before = self.handle.before.splitlines()
2214 count = 0
2215 for line in before:
2216 if term in line and "grep" not in line:
2217 count += 1
2218 if before.index( line ) > ( len( before ) - 7 ):
2219 logLines[termIndex].append( line )
2220 main.log.info( "{}: {}".format( term, count ) )
2221 totalHits += count
2222 if termIndex == numTerms - 1:
2223 print "\n"
2224 if outputMode != "s":
2225 outputString = ""
2226 for term in logLines:
2227 outputString = term[0] + ": \n"
2228 for line in range( 1, len( term ) ):
2229 outputString += ( "\t" + term[line] + "\n" )
2230 if outputString != ( term[0] + ": \n" ):
2231 main.log.info( outputString )
2232 main.log.info( "=" * 70 )
2233 return totalHits
2234 except pexpect.EOF:
2235 main.log.error( self.name + ": EOF exception found" )
2236 main.log.error( self.name + ": " + self.handle.before )
2237 main.cleanup()
2238 main.exit()
2239 except pexpect.TIMEOUT:
2240 main.log.error( self.name + ": TIMEOUT exception found" )
2241 main.log.error( self.name + ": " + self.handle.before )
2242 main.cleanup()
2243 main.exit()
2244 except Exception:
2245 main.log.exception( self.name + ": Uncaught exception!" )
2246 main.cleanup()
2247 main.exit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002248
2249 def copyMininetFile( self, fileName, localPath, userName, ip,
2250 mnPath='~/mininet/custom/', timeout = 60 ):
2251 """
2252 Description:
2253 Copy mininet topology file from dependency folder in the test folder
2254 and paste it to the mininet machine's mininet/custom folder
2255 Required:
2256 fileName - Name of the topology file to copy
2257 localPath - File path of the mininet topology file
2258 userName - User name of the mininet machine to send the file to
2259 ip - Ip address of the mininet machine
2260 Optional:
2261 mnPath - of the mininet directory to send the file to
2262 Return:
2263 Return main.TRUE if successfully copied the file otherwise
2264 return main.FALSE
2265 """
2266
2267 try:
2268 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2269 str( ip ) + ":" + mnPath + fileName
2270
2271 self.handle.sendline( "" )
2272 self.handle.expect( "\$" )
2273
2274 main.log.info( self.name + ": Execute: " + cmd )
2275
2276 self.handle.sendline( cmd )
2277
2278 i = self.handle.expect( [ 'No such file',
2279 "100%",
2280 pexpect.TIMEOUT ] )
2281
2282 if i == 0:
2283 main.log.error( self.name + ": File " + fileName +
2284 " does not exist!" )
2285 return main.FALSE
2286
2287 if i == 1:
2288 main.log.info( self.name + ": File " + fileName +
2289 " has been copied!" )
2290 self.handle.sendline( "" )
2291 self.handle.expect( "\$" )
2292 return main.TRUE
2293
2294 except pexpect.EOF:
2295 main.log.error( self.name + ": EOF exception found" )
2296 main.log.error( self.name + ": " + self.handle.before )
2297 main.cleanup()
2298 main.exit()
2299 except pexpect.TIMEOUT:
2300 main.log.error( self.name + ": TIMEOUT exception found" )
2301 main.log.error( self.name + ": " + self.handle.before )
2302 main.cleanup()
2303 main.exit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002304
2305 def jvmSet(self, memory=8):
Jon Hall4ba53f02015-07-29 13:07:41 -07002306
cameron@onlab.us78b89652015-07-08 15:21:03 -07002307 import os
2308
2309 homeDir = os.path.expanduser('~')
2310 filename = "/onos/tools/package/bin/onos-service"
2311
2312 serviceConfig = open(homeDir + filename, 'w+')
2313 serviceConfig.write("#!/bin/bash\n ")
2314 serviceConfig.write("#------------------------------------- \n ")
2315 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
2316 serviceConfig.write("#------------------------------------- \n ")
2317 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
2318 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str(memory) + "G -Xmx" + str(memory) + """G}" \n """)
2319 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
2320 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
2321 serviceConfig.close()
2322
Jon Hall6c44c0b2016-04-20 15:21:00 -07002323 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002324
cameron@onlab.us78b89652015-07-08 15:21:03 -07002325 filename = main.TEST + "DB"
2326 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002327
cameron@onlab.us78b89652015-07-08 15:21:03 -07002328 for item in testData:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002329 if type( item ) is string:
cameron@onlab.us78b89652015-07-08 15:21:03 -07002330 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002331 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002332 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002333 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002334
Jon Hall6c44c0b2016-04-20 15:21:00 -07002335 DBFile = open( filename, "a" )
2336 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002337 DBFile.close()
2338
Jon Hall6c44c0b2016-04-20 15:21:00 -07002339 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002340
Jon Hall6c44c0b2016-04-20 15:21:00 -07002341 self.handle.sendline( "onos " + ONOSIp + " summary" )
2342 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002343
2344 summaryStr = self.handle.before
2345 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2346
2347 #passed = "SCC(s)=1" in summaryStr
2348 #if deviceCount:
2349 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
2350
GlennRC772363b2015-08-25 13:05:57 -07002351 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002352 if "SCC(s)=1," in summaryStr:
2353 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002354 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002355 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002356 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002357
2358 if deviceCount:
2359 print" ============================="
Jon Hall6c44c0b2016-04-20 15:21:00 -07002360 checkStr = "devices=" + str( deviceCount[0] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002361 print "Checkstr: " + checkStr
2362 if checkStr not in summaryStr:
2363 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002364 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002365 else:
2366 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002367
2368 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002369
Jon Hall8f6d4622016-05-23 15:27:18 -07002370 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002371 """
2372 Update self.ip_address with numerical ip address. If multiple IP's are
2373 located on the device, will attempt to use self.nicAddr to choose the
2374 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2375 determine the correct address.
2376
2377 ONLY WORKS WITH IPV4 ADDRESSES
2378 """
2379 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002380 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002381 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2382 pattern = re.compile( ipPat )
2383 match = re.search( pattern, self.ip_address )
2384 if self.nicAddr:
2385 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2386 nicPat = re.compile( nicPat )
2387 else:
2388 nicPat = None
2389 # IF self.ip_address is an ip address and matches
2390 # self.nicAddr: return self.ip_address
2391 if match:
2392 curIp = match.group(0)
2393 if nicPat:
2394 nicMatch = re.search( nicPat, curIp )
2395 if nicMatch:
2396 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002397 # ELSE: IF iface, return ip of interface
2398 cmd = "ifconfig"
2399 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2400 if iface:
2401 cmd += " " + str( iface )
2402 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002403 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2404 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002405 if iface:
2406 if ips:
2407 ip = ips[0]
2408 self.ip_address = ip
2409 return ip
2410 else:
2411 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2412 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002413 if nicPat:
2414 for ip in ips:
2415 curMatch = re.search( nicPat, ip )
2416 if curMatch:
2417 self.ip_address = ip
2418 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002419 else: # If only one non-localhost ip, return that
2420 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002421 if len(tmpList) == 1:
2422 curIp = tmpList[0]
2423 self.ip_address = curIp
2424 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002425 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002426 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002427 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002428 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002429 main.log.exception( "Error executing ifconfig" )
2430 except IndexError:
2431 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002432 except Exception:
2433 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002434
Devin Lim461f0872017-06-05 16:49:33 -07002435 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
suibin zhang116647a2016-05-06 16:30:09 -07002436 '''
2437 Start onos cluster with defined nodes, but only with drivers app
suibin zhang116647a2016-05-06 16:30:09 -07002438 '''
2439 import time
2440
2441 self.createCellFile( self.ip_address,
2442 "temp",
2443 self.ip_address,
2444 "drivers",
Devin Lim461f0872017-06-05 16:49:33 -07002445 nodeList, onosUser )
suibin zhang116647a2016-05-06 16:30:09 -07002446
2447 main.log.info( self.name + ": Apply cell to environment" )
2448 cellResult = self.setCell( "temp" )
2449 verifyResult = self.verifyCell()
2450
2451 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002452 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002453
You Wangc669d212017-01-25 11:09:48 -08002454 main.log.info( self.name + ": Uninstalling ONOS" )
2455 for nd in nodeList:
2456 self.onosUninstall( nodeIp=nd )
2457
suibin zhang116647a2016-05-06 16:30:09 -07002458 main.log.info( self.name + ": Installing ONOS package" )
2459 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002460 self.onosInstall( node=nd )
2461
2462 main.log.info( self.name + ": Set up ONOS secure SSH" )
2463 for nd in nodeList:
2464 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002465
2466 main.log.info( self.name + ": Starting ONOS service" )
2467 time.sleep( onosStartupSleep )
2468
2469 onosStatus = True
2470 for nd in nodeList:
2471 onosStatus = onosStatus & self.isup( node = nd )
2472 #print "onosStatus is: " + str( onosStatus )
2473
2474 return main.TRUE if onosStatus else main.FALSE
2475
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002476 def onosNetCfg( self, controllerIps, path, fileName ):
2477 """
2478 Push a specified json file to ONOS through the onos-netcfg service
2479
2480 Required:
2481 controllerIps - the Ips of the ONOS nodes in the cluster
2482 path - the location of the file to be sent
2483 fileName - name of the json file to be sent
2484
2485 Returns main.TRUE on successfully sending json file, and main.FALSE if
2486 there is an error.
2487 """
2488 try:
2489 cmd = "onos-netcfg {0} {1}{2}.json".format( controllerIps, path, fileName )
2490 main.log.info( "Sending: " + cmd )
2491 main.ONOSbench.handle.sendline( cmd )
2492 handle = self.handle.before
2493 print handle
2494 if "Error" in handle:
2495 main.log.error( self.name + ": " + self.handle.before )
2496 return main.FALSE
2497 else:
2498 self.handle.expect( "\$" )
2499 return main.TRUE
2500 except pexpect.EOF:
2501 main.log.error( self.name + ": EOF exception found" )
2502 main.log.error( self.name + ": " + self.handle.before )
2503 main.cleanup()
2504 main.exit()
2505 except Exception:
2506 main.log.exception( self.name + ": Uncaught exception!" )
2507 main.cleanup()
Jeremy Songsterae01bba2016-07-11 15:39:17 -07002508 main.exit()