blob: 6b13e3a668fcb08de01ee120e2e9b44b0e3a70fa [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"""
Jeremy Ronquilloec916a42018-02-02 13:05:57 -08004Copyright 2014 Open Networking Foundation (ONF)
5
kelvin8ec71442015-01-15 16:57:00 -08006This driver interacts with ONOS bench, the OSGi platform
7that configures the ONOS nodes. ( aka ONOS-next )
andrewonlabe8e56fd2014-10-09 17:12:44 -04008
kelvin8ec71442015-01-15 16:57:00 -08009Please follow the coding style demonstrated by existing
andrewonlabe8e56fd2014-10-09 17:12:44 -040010functions and document properly.
11
12If you are a contributor to the driver, please
13list your email here for future contact:
14
15jhall@onlab.us
16andrew@onlab.us
17
18OCT 9 2014
Jeremy Songsterae01bba2016-07-11 15:39:17 -070019Modified 2016 by ON.Lab
20
21Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
22the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
23or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
andrewonlabe8e56fd2014-10-09 17:12:44 -040024
kelvin8ec71442015-01-15 16:57:00 -080025"""
Jon Hall05b2b432014-10-08 19:53:25 -040026import time
Jon Hall6801cda2015-07-15 14:13:45 -070027import types
Jon Hall05b2b432014-10-08 19:53:25 -040028import pexpect
kelvin-onlaba4074292015-07-09 15:19:49 -070029import os
Jon Hall6c44c0b2016-04-20 15:21:00 -070030import re
31import subprocess
Jon Hall05b2b432014-10-08 19:53:25 -040032from drivers.common.clidriver import CLI
33
kelvin8ec71442015-01-15 16:57:00 -080034class OnosDriver( CLI ):
Jon Hall05b2b432014-10-08 19:53:25 -040035
kelvin8ec71442015-01-15 16:57:00 -080036 def __init__( self ):
37 """
38 Initialize client
39 """
Jon Hallefbd9792015-03-05 16:11:36 -080040 self.name = None
41 self.home = None
42 self.handle = None
Jon Hall6c44c0b2016-04-20 15:21:00 -070043 self.nicAddr = None
Devin Limdc78e202017-06-09 18:30:07 -070044 super( OnosDriver, self ).__init__()
kelvin8ec71442015-01-15 16:57:00 -080045
46 def connect( self, **connectargs ):
47 """
Jon Hall05b2b432014-10-08 19:53:25 -040048 Creates ssh handle for ONOS "bench".
kelvin-onlaba4074292015-07-09 15:19:49 -070049 NOTE:
50 The ip_address would come from the topo file using the host tag, the
51 value can be an environment variable as well as a "localhost" to get
52 the ip address needed to ssh to the "bench"
kelvin8ec71442015-01-15 16:57:00 -080053 """
Jon Hall05b2b432014-10-08 19:53:25 -040054 try:
Devin Limdc78e202017-06-09 18:30:07 -070055
Jon Hall05b2b432014-10-08 19:53:25 -040056 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080057 vars( self )[ key ] = connectargs[ key ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070058 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040059 for key in self.options:
60 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080061 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040062 break
Jon Hall274b6642015-02-17 11:57:17 -080063 if self.home is None or self.home == "":
Jon Halle94919c2015-03-23 11:42:57 -070064 self.home = "~/onos"
Jon Hall21270ac2015-02-16 17:59:55 -080065
kelvin8ec71442015-01-15 16:57:00 -080066 self.name = self.options[ 'name' ]
kelvin-onlaba4074292015-07-09 15:19:49 -070067
kelvin-onlabc2b79102015-07-14 11:41:20 -070068 # The 'nodes' tag is optional and it is not required in .topo file
kelvin-onlaba4074292015-07-09 15:19:49 -070069 for key in self.options:
70 if key == "nodes":
kelvin-onlabc2b79102015-07-14 11:41:20 -070071 # Maximum number of ONOS nodes to run, if there is any
kelvin-onlaba4074292015-07-09 15:19:49 -070072 self.maxNodes = int( self.options[ 'nodes' ] )
73 break
74 self.maxNodes = None
75
Jeremy Ronquillo82705492017-10-18 14:19:55 -070076 if self.maxNodes is None or self.maxNodes == "":
kelvin-onlabc2b79102015-07-14 11:41:20 -070077 self.maxNodes = 100
kelvin-onlaba4074292015-07-09 15:19:49 -070078
kelvin-onlabc2b79102015-07-14 11:41:20 -070079 # Grabs all OC environment variables based on max number of nodes
kelvin-onlaba4074292015-07-09 15:19:49 -070080 self.onosIps = {} # Dictionary of all possible ONOS ip
81
82 try:
83 if self.maxNodes:
kelvin-onlaba4074292015-07-09 15:19:49 -070084 for i in range( self.maxNodes ):
85 envString = "OC" + str( i + 1 )
kelvin-onlabc2b79102015-07-14 11:41:20 -070086 # If there is no more OC# then break the loop
87 if os.getenv( envString ):
88 self.onosIps[ envString ] = os.getenv( envString )
89 else:
90 self.maxNodes = len( self.onosIps )
91 main.log.info( self.name +
92 ": Created cluster data with " +
93 str( self.maxNodes ) +
94 " maximum number" +
95 " of nodes" )
96 break
kelvin-onlaba4074292015-07-09 15:19:49 -070097
98 if not self.onosIps:
Jon Hall3c0114c2020-08-11 15:07:42 -070099 main.log.info( self.name + ": Could not read any environment variable"
kelvin-onlaba4074292015-07-09 15:19:49 -0700100 + " please load a cell file with all" +
101 " onos IP" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700102 self.maxNodes = None
kelvin-onlaba4074292015-07-09 15:19:49 -0700103 else:
104 main.log.info( self.name + ": Found " +
105 str( self.onosIps.values() ) +
106 " ONOS IPs" )
kelvin-onlaba4074292015-07-09 15:19:49 -0700107 except KeyError:
Jon Hall3c0114c2020-08-11 15:07:42 -0700108 main.log.info( self.name + ": Invalid environment variable" )
kelvin-onlaba4074292015-07-09 15:19:49 -0700109 except Exception as inst:
110 main.log.error( "Uncaught exception: " + str( inst ) )
111
112 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700113 if os.getenv( str( self.ip_address ) ) is not None:
kelvin-onlaba4074292015-07-09 15:19:49 -0700114 self.ip_address = os.getenv( str( self.ip_address ) )
115 else:
116 main.log.info( self.name +
117 ": Trying to connect to " +
118 self.ip_address )
kelvin-onlaba4074292015-07-09 15:19:49 -0700119 except KeyError:
Jon Hall3c0114c2020-08-11 15:07:42 -0700120 main.log.info( self.name + ": Invalid host name," +
kelvin-onlaba4074292015-07-09 15:19:49 -0700121 " connecting to local host instead" )
122 self.ip_address = 'localhost'
123 except Exception as inst:
124 main.log.error( "Uncaught exception: " + str( inst ) )
125
kelvin8ec71442015-01-15 16:57:00 -0800126 self.handle = super( OnosDriver, self ).connect(
127 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -0800128 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -0800129 port=self.port,
130 pwd=self.pwd,
131 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -0400132 if self.handle:
Jon Hall500ed642019-06-17 18:25:46 +0000133 self.handle.setwinsize( 24, 250 )
Jon Hall0fc0d452015-07-14 09:49:58 -0700134 self.handle.sendline( "cd " + self.home )
Jon Hall4b668212019-06-17 11:08:49 -0700135 self.handle.expect( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700136 self.handle.expect( self.prompt )
Jon Hall05b2b432014-10-08 19:53:25 -0400137 return self.handle
kelvin8ec71442015-01-15 16:57:00 -0800138 else:
Jon Hall3c0114c2020-08-11 15:07:42 -0700139 main.log.info( self.name + ": Failed to create ONOS handle" )
Jon Hall05b2b432014-10-08 19:53:25 -0400140 return main.FALSE
141 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800142 main.log.error( self.name + ": EOF exception found" )
143 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700144 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800145 except Exception:
146 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700147 main.cleanAndExit()
Jon Hall05b2b432014-10-08 19:53:25 -0400148
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( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700157 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700158 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,
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000176 around a hundred milliseconds of difference (ascending) is
Jon Hall4ba53f02015-07-29 13:07:41 -0700177 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' )
Devin Limdc78e202017-06-09 18:30:07 -0700184 self.handle.expect( self.prompt )
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400185 epochMs = self.handle.before
186 return epochMs
187 except Exception:
188 main.log.exception( 'Uncaught exception getting epoch time' )
Devin Lim44075962017-08-11 10:56:37 -0700189 main.cleanAndExit()
andrew@onlab.usaee415a2015-06-05 14:38:58 -0400190
Jon Hall6c44c0b2016-04-20 15:21:00 -0700191 def onosPackage( self, opTimeout=180 ):
kelvin8ec71442015-01-15 16:57:00 -0800192 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400193 Produce a self-contained tar.gz file that can be deployed
Jon Hall64af8502015-12-15 10:09:33 -0800194 and executed on any platform with Java 8 JRE.
kelvin8ec71442015-01-15 16:57:00 -0800195 """
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400196 try:
Jon Hall64af8502015-12-15 10:09:33 -0800197 ret = main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800198 self.handle.sendline( "onos-package" )
199 self.handle.expect( "onos-package" )
Jon Hall96451092016-05-04 09:42:30 -0700200 while True:
201 i = self.handle.expect( [ "Downloading",
202 "Unknown options",
203 "No such file or directory",
204 "tar.gz",
Devin Limc20e79a2017-06-07 10:29:57 -0700205 self.prompt ],
Jon Hall96451092016-05-04 09:42:30 -0700206 opTimeout )
207 handle = str( self.handle.before + self.handle.after )
208 if i == 0:
209 # Give more time to download the file
210 continue # expect again
211 elif i == 1:
212 # Incorrect usage
213 main.log.error( "onos-package does not recognize the given options" )
214 ret = main.FALSE
215 continue # expect again
216 elif i == 2:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000217 # File(s) not found
Jon Hall96451092016-05-04 09:42:30 -0700218 main.log.error( "onos-package could not find a file or directory" )
219 ret = main.FALSE
220 continue # expect again
221 elif i == 3:
222 # tar.gz
223 continue # expect again
224 elif i == 4:
225 # Prompt returned
226 break
Jon Hall3c0114c2020-08-11 15:07:42 -0700227 main.log.info( self.name + ": onos-package command returned: " + handle )
kelvin8ec71442015-01-15 16:57:00 -0800228 # As long as the sendline does not time out,
229 # return true. However, be careful to interpret
230 # the results of the onos-package command return
Jon Hall64af8502015-12-15 10:09:33 -0800231 return ret
232 except pexpect.TIMEOUT:
233 main.log.exception( self.name + ": TIMEOUT exception found in onosPackage" )
234 main.log.error( self.name + ": " + self.handle.before )
You Wang141b43b2018-06-26 16:50:18 -0700235 self.handle.send( "\x03" ) # Control-C
236 self.handle.expect( self.prompt )
Jon Hall64af8502015-12-15 10:09:33 -0800237 return main.FALSE
andrewonlab7735d852014-10-09 13:02:47 -0400238 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800239 main.log.error( self.name + ": EOF exception found" )
240 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700241 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800242 except Exception:
243 main.log.exception( "Failed to package ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700244 main.cleanAndExit()
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400245
kelvin-onlabd3b64892015-01-20 13:26:24 -0800246 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800247 """
andrewonlab8790abb2014-11-06 13:51:54 -0500248 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800249 """
andrewonlab8790abb2014-11-06 13:51:54 -0500250 try:
kelvin8ec71442015-01-15 16:57:00 -0800251 self.handle.sendline( "onos-build" )
252 self.handle.expect( "onos-build" )
253 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800254 "BUILD SUCCESS",
255 "ERROR",
256 "BUILD FAILED" ],
257 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800258 handle = str( self.handle.before )
Devin Limc20e79a2017-06-07 10:29:57 -0700259 self.handle.expect( self.prompt )
andrewonlab8790abb2014-11-06 13:51:54 -0500260
Jon Hall3c0114c2020-08-11 15:07:42 -0700261 main.log.info( self.name + ": onos-build command returned: " +
kelvin8ec71442015-01-15 16:57:00 -0800262 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500263
264 if i == 0:
265 return main.TRUE
266 else:
267 return handle
268
269 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800270 main.log.error( self.name + ": EOF exception found" )
271 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800272 except Exception:
273 main.log.exception( "Failed to build ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700274 main.cleanAndExit()
andrewonlab8790abb2014-11-06 13:51:54 -0500275
shahshreya9f531fe2015-06-10 12:03:51 -0700276 def cleanInstall( self, skipTest=False, mciTimeout=600 ):
kelvin8ec71442015-01-15 16:57:00 -0800277 """
278 Runs mvn clean install in the root of the ONOS directory.
279 This will clean all ONOS artifacts then compile each module
shahshreya9f531fe2015-06-10 12:03:51 -0700280 Optional:
281 skipTest - Does "-DskipTests -Dcheckstyle.skip -U -T 1C" which
282 skip the test. This will make the building faster.
283 Disregarding the credibility of the build
kelvin8ec71442015-01-15 16:57:00 -0800284 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400285 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800286 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400287 try:
Jon Hall3c0114c2020-08-11 15:07:42 -0700288 main.log.info( self.name + ": Running 'mvn clean install' on " +
kelvin-onlabd3b64892015-01-20 13:26:24 -0800289 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800290 ". This may take some time." )
291 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700292 self.handle.expect( self.prompt )
Jon Hallea7818b2014-10-09 14:30:59 -0400293
kelvin8ec71442015-01-15 16:57:00 -0800294 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700295 self.handle.expect( self.prompt )
shahshreya9f531fe2015-06-10 12:03:51 -0700296
297 if not skipTest:
298 self.handle.sendline( "mvn clean install" )
299 self.handle.expect( "mvn clean install" )
300 else:
301 self.handle.sendline( "mvn clean install -DskipTests" +
302 " -Dcheckstyle.skip -U -T 1C" )
303 self.handle.expect( "mvn clean install -DskipTests" +
304 " -Dcheckstyle.skip -U -T 1C" )
kelvin8ec71442015-01-15 16:57:00 -0800305 while True:
306 i = self.handle.expect( [
Jon Hall274b6642015-02-17 11:57:17 -0800307 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
Jon Hallefbd9792015-03-05 16:11:36 -0800308 'Runtime\sEnvironment\sto\scontinue',
Jon Hallde9d9aa2014-10-08 20:36:02 -0400309 'BUILD\sFAILURE',
310 'BUILD\sSUCCESS',
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700311 'onos' + self.prompt, # TODO: fix this to be more generic?
Devin Limdc78e202017-06-09 18:30:07 -0700312 'ONOS' + self.prompt,
pingping-lin57a56ce2015-05-20 16:43:48 -0700313 pexpect.TIMEOUT ], mciTimeout )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400314 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800315 main.log.error( self.name + ":There is insufficient memory \
316 for the Java Runtime Environment to continue." )
317 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700318
319 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400320 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800321 main.log.error( self.name + ": Build failure!" )
322 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700323
324 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400325 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800326 main.log.info( self.name + ": Build success!" )
Jon Halle94919c2015-03-23 11:42:57 -0700327 elif i == 3 or i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800328 main.log.info( self.name + ": Build complete" )
329 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400330 for line in self.handle.before.splitlines():
331 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800332 main.log.info( line )
333 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700334 self.handle.expect( self.prompt, timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400335 return main.TRUE
Jon Halle94919c2015-03-23 11:42:57 -0700336 elif i == 5:
kelvin8ec71442015-01-15 16:57:00 -0800337 main.log.error(
338 self.name +
339 ": mvn clean install TIMEOUT!" )
340 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700341
342 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400343 else:
Jon Hall274b6642015-02-17 11:57:17 -0800344 main.log.error( self.name + ": unexpected response from " +
Jon Hallefbd9792015-03-05 16:11:36 -0800345 "mvn clean install" )
kelvin8ec71442015-01-15 16:57:00 -0800346 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700347
348 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400349 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800350 main.log.error( self.name + ": EOF exception found" )
351 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700352 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800353 except Exception:
354 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700355 main.cleanAndExit()
Jon Hallacabffd2014-10-09 12:36:53 -0400356
Jon Hall3576f572016-08-23 10:01:07 -0700357 def buckBuild( self, timeout=180 ):
358 """
359 Build onos using buck.
360 """
361 try:
362 ret = main.TRUE
363 self.handle.sendline( "buck build onos" )
364 self.handle.expect( "buck build onos" )
365 output = ""
366 while True:
367 i = self.handle.expect( [ "This does not appear to be the root of a Buck project.",
368 "\n",
369 "BUILD FAILED",
Jon Halld9066132018-03-01 14:52:53 -0800370 "no buck in",
Devin Limc20e79a2017-06-07 10:29:57 -0700371 self.prompt ],
Jon Hall3576f572016-08-23 10:01:07 -0700372 timeout=timeout )
373 output += str( self.handle.before + self.handle.after )
374 if i == 0:
375 main.log.error( "Wrong location" )
376 ret = main.FALSE
377 elif i == 1:
378 # end of a line, buck is still printing output
379 pass
380 elif i == 2:
381 # Build failed
382 main.log.error( "Build failed" )
383 ret = main.FALSE
384 elif i == 3:
Jon Halld9066132018-03-01 14:52:53 -0800385 main.log.error( "Could not find buck in your PATH." )
386 ret = main.FALSE
387 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -0700388 # 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 )
You Wang141b43b2018-06-26 16:50:18 -0700395 self.handle.send( "\x03" ) # Control-C
396 self.handle.expect( self.prompt )
Jon Hall3576f572016-08-23 10:01:07 -0700397 return main.FALSE
398 except pexpect.EOF:
399 main.log.error( self.name + ": EOF exception found" )
400 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700401 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700402 except Exception:
403 main.log.exception( "Failed to build and package ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700404 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700405
You Wangd54c7052018-08-07 16:06:27 -0700406 def bazelBuild( self, timeout=180 ):
407 """
408 Build onos using bazel.
409 """
410 try:
411 ret = main.TRUE
412 self.handle.sendline( "bazel build onos" )
413 self.handle.expect( "bazel build onos" )
414 output = ""
415 while True:
416 i = self.handle.expect( [ "command is only supported from within a workspace",
417 "\n",
418 "FAILED",
419 "ERROR",
420 "command not found",
421 self.prompt ],
422 timeout=timeout )
423 output += str( self.handle.before + self.handle.after )
424 if i == 0:
425 main.log.error( "Please run the build from root of ONOS project" )
426 ret = main.FALSE
427 elif i == 1:
428 # end of a line, buck is still printing output
429 pass
430 elif i == 2:
431 # Build failed
432 main.log.error( "Build failed" )
433 ret = main.FALSE
434 elif i == 3:
435 # Build failed
436 main.log.error( "Build failed" )
437 ret = main.FALSE
438 elif i == 4:
439 main.log.error( "Command not found" )
440 ret = main.FALSE
441 elif i == 5:
442 # Prompt returned
443 break
444 main.log.debug( output )
445 return ret
446 except pexpect.TIMEOUT:
447 main.log.exception( self.name + ": TIMEOUT exception found" )
448 main.log.error( self.name + ": " + self.handle.before )
449 self.handle.send( "\x03" ) # Control-C
450 self.handle.expect( self.prompt )
451 return main.FALSE
452 except pexpect.EOF:
453 main.log.error( self.name + ": EOF exception found" )
454 main.log.error( self.name + ": " + self.handle.before )
455 main.cleanAndExit()
456 except Exception:
457 main.log.exception( "Failed to build and package ONOS" )
458 main.cleanAndExit()
459
Jon Hall61282e32015-03-19 11:34:11 -0700460 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800461 """
Jon Hallacabffd2014-10-09 12:36:53 -0400462 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800463
Jon Hall61282e32015-03-19 11:34:11 -0700464 If the fastForward boolean is set to true, only git pulls that can
465 be fast forwarded will be performed. IE if you have not local commits
466 in your branch.
467
Jon Hallacabffd2014-10-09 12:36:53 -0400468 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800469 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400470 for the purpose of pulling from other nodes if necessary.
471
Jon Hall47a93fb2015-01-06 16:46:06 -0800472 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400473 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800474 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400475 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400476
kelvin8ec71442015-01-15 16:57:00 -0800477 """
Jon Hallacabffd2014-10-09 12:36:53 -0400478 try:
kelvin8ec71442015-01-15 16:57:00 -0800479 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700480 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700481 cmd = "git pull"
482 if comp1 != "":
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700483 cmd += ' ' + comp1
Jon Hall61282e32015-03-19 11:34:11 -0700484 if fastForward:
485 cmd += ' ' + " --ff-only"
486 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800487 i = self.handle.expect(
488 [
489 'fatal',
490 'Username\sfor\s(.*):\s',
491 '\sfile(s*) changed,\s',
492 'Already up-to-date',
493 'Aborting',
494 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800495 'You asked me to pull without telling me which branch you',
496 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700497 'Please enter a commit message to explain why this merge',
498 'Found a swap file by the name',
499 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800500 pexpect.TIMEOUT ],
501 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800502 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700503 main.log.error( self.name + ": Git pull had some issue" )
504 output = self.handle.after
Devin Limdc78e202017-06-09 18:30:07 -0700505 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700506 output += self.handle.before
507 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400508 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800509 elif i == 1:
510 main.log.error(
511 self.name +
512 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400513 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800514 elif i == 2:
515 main.log.info(
516 self.name +
517 ": Git Pull - pulling repository now" )
Devin Limc20e79a2017-06-07 10:29:57 -0700518 self.handle.expect( self.prompt, 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800519 # So that only when git pull is done, we do mvn clean compile
520 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800521 elif i == 3:
522 main.log.info( self.name + ": Git Pull - Already up to date" )
Devin Limc20e79a2017-06-07 10:29:57 -0700523 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800524 elif i == 4:
525 main.log.info(
526 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800527 ": Git Pull - Aborting..." +
528 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400529 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800530 elif i == 5:
531 main.log.info(
532 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800533 ": Git Pull - You are not currently " +
534 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400535 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800536 elif i == 6:
537 main.log.info(
538 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800539 ": Git Pull - You have not configured an upstream " +
540 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400541 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800542 elif i == 7:
543 main.log.info(
544 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800545 ": Git Pull - Pull is not possible because " +
546 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400547 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800548 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700549 # NOTE: abandoning test since we can't reliably handle this
550 # there could be different default text editors and we
551 # also don't know if we actually want to make the commit
552 main.log.error( "Git pull resulted in a merge commit message" +
553 ". Exiting test!" )
Devin Lim44075962017-08-11 10:56:37 -0700554
555 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700556 elif i == 9: # Merge commit message but swap file exists
557 main.log.error( "Git pull resulted in a merge commit message" +
558 " but a swap file exists." )
559 try:
560 self.handle.send( 'A' ) # Abort
Devin Limc20e79a2017-06-07 10:29:57 -0700561 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700562 return main.ERROR
563 except Exception:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700564 main.log.exception( "Couldn't exit editor prompt!" )
Devin Lim44075962017-08-11 10:56:37 -0700565
566 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700567 elif i == 10: # In the middle of a merge commit
568 main.log.error( "Git branch is in the middle of a merge. " )
569 main.log.warn( self.handle.before + self.handle.after )
570 return main.ERROR
571 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800572 main.log.error( self.name + ": Git Pull - TIMEOUT" )
573 main.log.error(
574 self.name + " Response was: " + str(
575 self.handle.before ) )
You Wang141b43b2018-06-26 16:50:18 -0700576 self.handle.send( "\x03" ) # Control-C
577 self.handle.expect( self.prompt )
Jon Hallacabffd2014-10-09 12:36:53 -0400578 return main.ERROR
579 else:
kelvin8ec71442015-01-15 16:57:00 -0800580 main.log.error(
581 self.name +
582 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400583 return main.ERROR
584 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800585 main.log.error( self.name + ": EOF exception found" )
586 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700587 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800588 except Exception:
589 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700590 main.cleanAndExit()
Jon Hallacabffd2014-10-09 12:36:53 -0400591
kelvin-onlabd3b64892015-01-20 13:26:24 -0800592 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800593 """
Jon Hallacabffd2014-10-09 12:36:53 -0400594 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800595
Jon Hallacabffd2014-10-09 12:36:53 -0400596 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800597 If used as gitCheckout( "branch" ) it will do git checkout
598 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400599
600 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800601 branch of the ONOS repository. If it has any problems, it will return
602 main.ERROR.
603 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400604 successful then the function will return main.TRUE.
605
kelvin8ec71442015-01-15 16:57:00 -0800606 """
Jon Hallacabffd2014-10-09 12:36:53 -0400607 try:
kelvin8ec71442015-01-15 16:57:00 -0800608 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700609 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800610 main.log.info( self.name +
611 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800612 cmd = "git checkout " + branch
613 self.handle.sendline( cmd )
614 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800615 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800616 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700617 'Username for (.*): ',
618 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700619 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800620 pexpect.TIMEOUT,
621 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800622 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800623 'error: you need to resolve your current index first',
624 "You are in 'detached HEAD' state.",
625 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800626 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800627 if i == 0:
628 main.log.error(
629 self.name +
630 ": Git checkout had some issue..." )
631 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400632 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800633 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800634 main.log.error(
635 self.name +
636 ": Git checkout asking for username." +
637 " Please configure your local git repository to be able " +
638 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800639 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400640 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800641 elif i == 2:
642 main.log.info(
643 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800644 ": Git Checkout %s : Already on this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700645 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -0700646 # main.log.info( self.name + ": DEBUG: after checkout cmd = "+
kelvin8ec71442015-01-15 16:57:00 -0800647 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400648 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800649 elif i == 3:
650 main.log.info(
651 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800652 ": Git checkout %s - Switched to this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700653 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -0700654 # main.log.info( self.name + ": DEBUG: after checkout cmd = "+
kelvin8ec71442015-01-15 16:57:00 -0800655 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400656 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800657 elif i == 4:
658 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
659 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800660 self.name + " Response was: " + str( self.handle.before ) )
You Wang141b43b2018-06-26 16:50:18 -0700661 self.handle.send( "\x03" ) # Control-C
662 self.handle.expect( self.prompt )
Jon Hallacabffd2014-10-09 12:36:53 -0400663 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800664 elif i == 5:
665 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800666 main.log.error(
667 self.name +
668 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800669 "Your local changes to the following files would" +
670 " be overwritten by checkout:" +
671 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700672 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500673 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800674 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800675 main.log.error(
676 self.name +
677 ": Git checkout error: \n" +
678 "You need to resolve your current index first:" +
679 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700680 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500681 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800682 elif i == 7:
683 main.log.info(
684 self.name +
685 ": Git checkout " + str( branch ) +
686 " - You are in 'detached HEAD' state. HEAD is now at " +
687 str( branch ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700688 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800689 return main.TRUE
690 elif i == 8: # Already in detached HEAD on the specified commit
691 main.log.info(
692 self.name +
693 ": Git Checkout %s : Already on commit" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700694 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800695 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400696 else:
kelvin8ec71442015-01-15 16:57:00 -0800697 main.log.error(
698 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800699 ": Git Checkout - Unexpected response, " +
700 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800701 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400702 return main.ERROR
703
704 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800705 main.log.error( self.name + ": EOF exception found" )
706 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700707 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800708 except Exception:
709 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700710 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400711
pingping-lin6d23d9e2015-02-02 16:54:24 -0800712 def getBranchName( self ):
You Wang9cdf9a22017-05-01 13:44:18 -0700713 import re
714 try:
Jon Hall3e6edb32018-08-21 16:20:30 -0700715 main.log.info( self.name + " home is " + self.home )
You Wang9cdf9a22017-05-01 13:44:18 -0700716 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700717 self.handle.expect( self.prompt )
You Wang9cdf9a22017-05-01 13:44:18 -0700718 self.handle.sendline( "git name-rev --name-only HEAD" )
719 self.handle.expect( "git name-rev --name-only HEAD" )
Devin Limc20e79a2017-06-07 10:29:57 -0700720 self.handle.expect( self.prompt )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700721 lines = self.handle.before.splitlines()
722 if lines[ 1 ] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[ 1 ] ):
723 return lines[ 1 ]
You Wang9cdf9a22017-05-01 13:44:18 -0700724 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700725 main.log.info( lines[ 1 ] )
You Wang9cdf9a22017-05-01 13:44:18 -0700726 return "unexpected ONOS branch"
727 except pexpect.EOF:
728 main.log.error( self.name + ": EOF exception found" )
729 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700730 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700731 except pexpect.TIMEOUT:
732 main.log.error( self.name + ": TIMEOUT exception found" )
733 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700734 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700735 except Exception:
736 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700737 main.cleanAndExit()
pingping-lin6d23d9e2015-02-02 16:54:24 -0800738
kelvin-onlabd3b64892015-01-20 13:26:24 -0800739 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800740 """
Jon Hall274b6642015-02-17 11:57:17 -0800741 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800742 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800743 """
Jon Hall45ec0922014-10-10 19:33:49 -0400744 try:
kelvin8ec71442015-01-15 16:57:00 -0800745 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700746 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800747 self.handle.sendline(
748 "cd " +
749 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800750 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
751 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800752 # NOTE: for some reason there are backspaces inserted in this
753 # phrase when run from Jenkins on some tests
754 self.handle.expect( "never" )
Devin Limc20e79a2017-06-07 10:29:57 -0700755 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800756 response = ( self.name + ": \n" + str(
757 self.handle.before + self.handle.after ) )
758 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700759 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800760 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400761 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500762 print line
763 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700764 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800765 for line in lines[ 2:-1 ]:
766 # Bracket replacement is for Wiki-compliant
767 # formatting. '<' or '>' are interpreted
768 # as xml specific tags that cause errors
769 line = line.replace( "<", "[" )
770 line = line.replace( ">", "]" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700771 # main.log.wiki( "\t" + line )
pingping-lin763ee042015-05-20 17:45:30 -0700772 main.log.wiki( line + "<br /> " )
773 main.log.summary( line )
774 main.log.wiki( "</blockquote>" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700775 main.log.summary( "\n" )
kelvin8ec71442015-01-15 16:57:00 -0800776 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400777 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800778 main.log.error( self.name + ": EOF exception found" )
779 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700780 main.cleanAndExit()
Jon Hall368769f2014-11-19 15:43:35 -0800781 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800782 main.log.error( self.name + ": TIMEOUT exception found" )
783 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700784 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800785 except Exception:
786 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700787 main.cleanAndExit()
Jon Hall45ec0922014-10-10 19:33:49 -0400788
kelvin-onlabd3b64892015-01-20 13:26:24 -0800789 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Jon Hall3e6edb32018-08-21 16:20:30 -0700790 appString, onosIpAddrs, atomixIps,
791 onosUser="sdn", useSSH=True ):
kelvin8ec71442015-01-15 16:57:00 -0800792 """
andrewonlab94282092014-10-10 13:00:11 -0400793 Creates a cell file based on arguments
794 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800795 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400796 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800797 * File name of the cell file ( fileName )
798 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800799 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400800 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800801 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400802 - Must be passed in as last arguments
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000803 * ONOS USER (onosUser)
Flavio Castrocc38a542016-03-03 13:15:46 -0800804 - optional argument to set ONOS_USER environment variable
kelvin8ec71442015-01-15 16:57:00 -0800805
andrewonlab94282092014-10-10 13:00:11 -0400806 NOTE: Assumes cells are located at:
807 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800808 """
andrewonlab94282092014-10-10 13:00:11 -0400809 try:
Devin Lim461f0872017-06-05 16:49:33 -0700810
Jon Hall2c8959e2016-12-16 12:17:34 -0800811 # Variable initialization
812 cellDirectory = self.home + "/tools/test/cells/"
813 # We want to create the cell file in the dependencies directory
814 # of TestON first, then copy over to ONOS bench
815 tempDirectory = "/tmp/"
816 # Create the cell file in the directory for writing ( w+ )
817 cellFile = open( tempDirectory + fileName, 'w+' )
818 if isinstance( onosIpAddrs, types.StringType ):
819 onosIpAddrs = [ onosIpAddrs ]
Jon Hall3e6edb32018-08-21 16:20:30 -0700820 if isinstance( atomixIps, types.StringType ):
821 atomixIps = [ atomixIps ]
Jon Hall2c8959e2016-12-16 12:17:34 -0800822
823 # App string is hardcoded environment variables
824 # That you may wish to use by default on startup.
825 # Note that you may not want certain apps listed
826 # on here.
827 appString = "export ONOS_APPS=" + appString
828 onosGroup = "export ONOS_GROUP=" + onosUser
829 onosUser = "export ONOS_USER=" + onosUser
830 if useSSH:
831 onosUseSSH = "export ONOS_USE_SSH=true"
832 mnString = "export OCN="
833 if mnIpAddrs == "":
834 mnString = ""
835 onosString = "export OC"
Jon Hall3e6edb32018-08-21 16:20:30 -0700836 atomixString = "export OCC"
Jon Hall2c8959e2016-12-16 12:17:34 -0800837
838 # Create ONOSNIC ip address prefix
839 tempOnosIp = str( onosIpAddrs[ 0 ] )
840 tempList = []
841 tempList = tempOnosIp.split( "." )
842 # Omit last element of list to format for NIC
843 tempList = tempList[ :-1 ]
844 # Structure the nic string ip
845 nicAddr = ".".join( tempList ) + ".*"
846 self.nicAddr = nicAddr
847 onosNicString = "export ONOS_NIC=" + nicAddr
848
kelvin8ec71442015-01-15 16:57:00 -0800849 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800850 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400851
Jon Hall3e6edb32018-08-21 16:20:30 -0700852 onosIndex = 1
kelvin-onlabd3b64892015-01-20 13:26:24 -0800853 for arg in onosIpAddrs:
854 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800855 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400856 # export OC1="10.128.20.11"
857 # export OC2="10.128.20.12"
Jon Hall3e6edb32018-08-21 16:20:30 -0700858 cellFile.write( onosString + str( onosIndex ) +
Jon Hall6f665652015-09-18 10:08:07 -0700859 "=\"" + arg + "\"\n" )
Jon Hall3e6edb32018-08-21 16:20:30 -0700860 onosIndex = onosIndex + 1
861
862 atomixIndex = 1
863 for ip in atomixIps:
864 cellFile.write( atomixString + str( atomixIndex ) +
865 "=\"" + ip + "\"\n" )
866 atomixIndex += 1
kelvin8ec71442015-01-15 16:57:00 -0800867
Jon Hall6f665652015-09-18 10:08:07 -0700868 cellFile.write( "export OCI=$OC1\n" )
Jon Hallab611372018-02-21 15:26:05 -0800869 if mnString:
870 cellFile.write( mnString + "\"" + str( mnIpAddrs ) + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700871 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800872 cellFile.write( onosGroup + "\n" )
873 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700874 if useSSH:
875 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800876 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400877
kelvin8ec71442015-01-15 16:57:00 -0800878 # We use os.system to send the command to TestON cluster
879 # to account for the case in which TestON is not located
880 # on the same cluster as the ONOS bench
881 # Note that even if TestON is located on the same cluster
882 # as ONOS bench, you must setup passwordless ssh
883 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700884 os.system( "scp " + tempDirectory + fileName + " " +
885 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400886
andrewonlab2a6c9342014-10-16 13:40:15 -0400887 return main.TRUE
888
andrewonlab94282092014-10-10 13:00:11 -0400889 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800890 main.log.error( self.name + ": EOF exception found" )
891 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700892 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800893 except Exception:
894 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700895 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -0400896
kelvin-onlabd3b64892015-01-20 13:26:24 -0800897 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800898 """
andrewonlab95ca1462014-10-09 14:04:24 -0400899 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800900 """
andrewonlab95ca1462014-10-09 14:04:24 -0400901 try:
902 if not cellname:
You Wang1cdc5f52017-12-19 16:47:51 -0800903 main.log.error( self.name + ": Must define cellname" )
Devin Lim44075962017-08-11 10:56:37 -0700904 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400905 else:
kelvin8ec71442015-01-15 16:57:00 -0800906 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800907 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800908 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400909 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700910 self.handle.expect( str( cellname ) )
Jon Hallab611372018-02-21 15:26:05 -0800911 response = self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800912 i = self.handle.expect( [ "No such cell",
Jon Hallab611372018-02-21 15:26:05 -0800913 "command not found",
914 self.prompt ], timeout=10 )
915 response += self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800916 if i == 0:
Jon Hallab611372018-02-21 15:26:05 -0800917 main.log.error( self.name + ": No such cell. Response: " + str( response ) )
You Wang1cdc5f52017-12-19 16:47:51 -0800918 main.cleanAndExit()
919 elif i == 1:
Jon Hallab611372018-02-21 15:26:05 -0800920 main.log.error( self.name + ": Error setting cell. Response: " + str( response ) )
921 main.cleanAndExit()
You Wang1cdc5f52017-12-19 16:47:51 -0800922 elif i == 2:
Jon Hallab611372018-02-21 15:26:05 -0800923 main.log.info( self.name + ": Successfully set cell: " + str( response ) )
andrewonlab95ca1462014-10-09 14:04:24 -0400924 return main.TRUE
You Wang1cdc5f52017-12-19 16:47:51 -0800925 except pexpect.TIMEOUT:
926 main.log.error( self.name + ": TIMEOUT exception found" )
927 main.log.error( self.name + ": " + self.handle.before )
928 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400929 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800930 main.log.error( self.name + ": EOF exception found" )
931 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700932 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800933 except Exception:
934 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700935 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400936
kelvin-onlabd3b64892015-01-20 13:26:24 -0800937 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800938 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400939 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800940 """
941 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400942
andrewonlabc03bf6c2014-10-09 14:56:18 -0400943 try:
kelvin8ec71442015-01-15 16:57:00 -0800944 # Clean handle by sending empty and expecting $
945 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700946 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800947 self.handle.sendline( "onos-verify-cell" )
Devin Limc20e79a2017-06-07 10:29:57 -0700948 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800949 handleBefore = self.handle.before
950 handleAfter = self.handle.after
Jon Hall3c0114c2020-08-11 15:07:42 -0700951 main.log.info( self.name + ": Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700952 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400953 return main.TRUE
Jon Hall3e6edb32018-08-21 16:20:30 -0700954 except pexpect.ExceptionPexpect:
Jon Hall3b489db2015-10-05 14:38:37 -0700955 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800956 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700957 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800958 except Exception:
959 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700960 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400961
jenkins1e99e7b2015-04-02 18:15:39 -0700962 def onosCfgSet( self, ONOSIp, configName, configParam ):
963 """
964 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700965 application.
966
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000967 ex)
jenkins1e99e7b2015-04-02 18:15:39 -0700968 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700969 ONOSIp = '10.0.0.1'
970 configName = 'org.onosproject.myapp'
971 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700972 """
Jon Hall72280bc2016-01-25 14:29:05 -0800973 try:
974 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
975 configName,
976 configParam )
977 self.handle.sendline( "" )
978 self.handle.expect( ":~" )
979 self.handle.sendline( cfgStr )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700980 self.handle.expect( "cfg set" )
Jon Hall72280bc2016-01-25 14:29:05 -0800981 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700982
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700983 paramValue = configParam.split( " " )[ 1 ]
984 paramName = configParam.split( " " )[ 0 ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700985
Jon Hall72280bc2016-01-25 14:29:05 -0800986 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700987
Jon Hall72280bc2016-01-25 14:29:05 -0800988 self.handle.sendline( checkStr )
989 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700990
Jon Hall72280bc2016-01-25 14:29:05 -0800991 if "value=" + paramValue + "," in self.handle.before:
Jon Hall3c0114c2020-08-11 15:07:42 -0700992 main.log.info( self.name + ": cfg " + configName + " successfully set to " + configParam )
Jon Hall72280bc2016-01-25 14:29:05 -0800993 return main.TRUE
Jon Hall3e6edb32018-08-21 16:20:30 -0700994 except pexpect.ExceptionPexpect:
Jon Hall72280bc2016-01-25 14:29:05 -0800995 main.log.exception( self.name + ": Pexpect exception found: " )
996 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700997 main.cleanAndExit()
Jon Hall72280bc2016-01-25 14:29:05 -0800998 except Exception:
999 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001000 main.cleanAndExit()
Jon Hall4ba53f02015-07-29 13:07:41 -07001001
You Wang54b1d672018-06-11 16:44:13 -07001002 def onosCli( self, ONOSIp, cmdstr, timeout=60 ):
kelvin8ec71442015-01-15 16:57:00 -08001003 """
andrewonlab05e362f2014-10-10 00:40:57 -04001004 Uses 'onos' command to send various ONOS CLI arguments.
1005 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001006 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -04001007 * cmdstr: specify the command string to send
You Wang54b1d672018-06-11 16:44:13 -07001008 Optional:
1009 * timeout: pexpect timeout for running the command
kelvin8ec71442015-01-15 16:57:00 -08001010
1011 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -04001012 CLI commands for ONOS. Try to use this function first
1013 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -08001014 function.
1015 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -04001016 by starting onos, and typing in 'onos' to enter the
1017 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -08001018 available commands.
1019 """
andrewonlab05e362f2014-10-10 00:40:57 -04001020 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001021 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -08001022 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -04001023 return main.FALSE
1024 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -08001025 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -04001026 return main.FALSE
1027
kelvin8ec71442015-01-15 16:57:00 -08001028 cmdstr = str( cmdstr )
1029 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001030 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -04001031
You Wangdd3dae52018-02-15 13:31:25 -08001032 self.handle.sendline( "onos-wait-for-start " + ONOSIp )
Jon Hall3c0114c2020-08-11 15:07:42 -07001033 i = self.handle.expect( [ self.prompt, "Password: " ] )
1034 if i == 1:
1035 self.handle.sendline( self.pwd )
1036 self.handle.expect( self.prompt )
You Wangdd3dae52018-02-15 13:31:25 -08001037
Jon Hall3c0114c2020-08-11 15:07:42 -07001038 self.handle.sendline( "ssh -q -p 8101 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null %s %s " % ( ONOSIp, cmdstr ) )
1039 i = self.handle.expect( [ self.prompt, "Password: ", pexpect.TIMEOUT ], timeout=timeout )
1040 if i == 1:
1041 self.handle.sendline( self.pwd )
1042 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ], timeout=timeout )
You Wang54b1d672018-06-11 16:44:13 -07001043 if i == 0:
1044 handleBefore = self.handle.before
Jon Hall3c0114c2020-08-11 15:07:42 -07001045 main.log.info( self.name + ": Command sent successfully" )
You Wang54b1d672018-06-11 16:44:13 -07001046 # Obtain return handle that consists of result from
1047 # the onos command. The string may need to be
1048 # configured further.
1049 returnString = handleBefore
1050 return returnString
1051 elif i == 1:
1052 main.log.error( self.name + ": Timeout when sending " + cmdstr )
Jon Hall3c0114c2020-08-11 15:07:42 -07001053 main.log.debug( self.handle.before )
You Wang141b43b2018-06-26 16:50:18 -07001054 self.handle.send( "\x03" ) # Control-C
You Wang54b1d672018-06-11 16:44:13 -07001055 self.handle.expect( self.prompt )
1056 return main.FALSE
You Wangd66de192018-04-30 17:30:12 -07001057 except pexpect.TIMEOUT:
1058 main.log.exception( self.name + ": Timeout when sending " + cmdstr )
1059 return main.FALSE
andrewonlab05e362f2014-10-10 00:40:57 -04001060 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001061 main.log.error( self.name + ": EOF exception found" )
1062 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001063 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001064 except Exception:
1065 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001066 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -04001067
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001068 def onosSecureSSH( self, userName="onos", userPWD="rocks", node="" ):
Pier88189b62016-09-07 17:01:53 -07001069 """
1070 Enables secure access to ONOS console
1071 by removing default users & keys.
1072
1073 onos-secure-ssh -u onos -p rocks node
1074
1075 Returns: main.TRUE on success and main.FALSE on failure
1076 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001077
Pier88189b62016-09-07 17:01:53 -07001078 try:
Chiyu Chengef109502016-11-21 15:51:38 -08001079 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001080 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001081 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
1082
1083 # NOTE: this timeout may need to change depending on the network
1084 # and size of ONOS
1085 # TODO: Handle the other possible error
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001086 i = self.handle.expect( [ "Network\sis\sunreachable",
1087 self.prompt,
1088 pexpect.TIMEOUT ], timeout=180 )
Pier88189b62016-09-07 17:01:53 -07001089 if i == 0:
1090 # can't reach ONOS node
Jon Hall3e6edb32018-08-21 16:20:30 -07001091 main.log.warn( self.name + ": Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001092 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001093 return main.FALSE
1094 elif i == 1:
1095 # Process started
Jon Hall3e6edb32018-08-21 16:20:30 -07001096 main.log.info( self.name + ": Secure SSH performed on " + node )
Pier88189b62016-09-07 17:01:53 -07001097 return main.TRUE
Jon Hall3e6edb32018-08-21 16:20:30 -07001098 elif i == 2:
1099 # timeout
1100 main.log.error( self.name + ": Failed to secure ssh on " + node )
1101 main.log.debug( self.handle.before )
Pier88189b62016-09-07 17:01:53 -07001102 except pexpect.EOF:
1103 main.log.error( self.name + ": EOF exception found" )
1104 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001105 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001106 except Exception:
1107 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001108 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001109
kelvin-onlabd3b64892015-01-20 13:26:24 -08001110 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001111 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001112 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001113 If -f option is provided, it also forces an uninstall.
1114 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001115 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001116 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001117 files to certain onos nodes
1118
1119 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001120 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001121 try:
andrewonlab114768a2014-11-14 12:44:44 -05001122 if options:
kelvin8ec71442015-01-15 16:57:00 -08001123 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001124 else:
kelvin8ec71442015-01-15 16:57:00 -08001125 self.handle.sendline( "onos-install " + node )
1126 self.handle.expect( "onos-install " )
1127 # NOTE: this timeout may need to change depending on the network
1128 # and size of ONOS
1129 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001130 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001131 "ONOS\sis\salready\sinstalled",
Jon Hall3576f572016-08-23 10:01:07 -07001132 "does not exist",
Devin Limc20e79a2017-06-07 10:29:57 -07001133 self.prompt,
Jon Hall6c44c0b2016-04-20 15:21:00 -07001134 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001135 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001136 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001137 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001138 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001139 return main.FALSE
1140 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001141 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001142 main.log.info(
1143 "ONOS was installed on " +
1144 node +
1145 " and started" )
Devin Limc20e79a2017-06-07 10:29:57 -07001146 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001147 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001148 elif i == 2:
Jon Hall3576f572016-08-23 10:01:07 -07001149 # same bits are already on ONOS node
Jon Hall3c0114c2020-08-11 15:07:42 -07001150 main.log.info( self.name + ": ONOS is already installed on " + node )
Devin Limc20e79a2017-06-07 10:29:57 -07001151 self.handle.expect( self.prompt )
Jeremyc72b2582016-02-26 18:27:38 -08001152 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001153 elif i == 3:
Jon Hall3576f572016-08-23 10:01:07 -07001154 # onos not packaged
1155 main.log.error( "ONOS package not found." )
Devin Limc20e79a2017-06-07 10:29:57 -07001156 self.handle.expect( self.prompt )
Jon Hall3576f572016-08-23 10:01:07 -07001157 return main.FALSE
You Wangd65ba842018-08-14 11:20:59 -07001158 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001159 # prompt
Jon Hall3c0114c2020-08-11 15:07:42 -07001160 main.log.info( self.name + ": ONOS was installed on {} {}.".format( node,
Jon Hall3e6edb32018-08-21 16:20:30 -07001161 "but not started" if 'n' in options else "and started" ) )
Jeremyc72b2582016-02-26 18:27:38 -08001162 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001163 elif i == 5:
Jon Hall3576f572016-08-23 10:01:07 -07001164 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001165 main.log.info(
1166 "Installation of ONOS on " +
1167 node +
1168 " timed out" )
Devin Limc20e79a2017-06-07 10:29:57 -07001169 self.handle.expect( self.prompt )
Jon Hall53c5e662016-04-13 16:06:56 -07001170 main.log.warn( self.handle.before )
You Wang141b43b2018-06-26 16:50:18 -07001171 self.handle.send( "\x03" ) # Control-C
1172 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001173 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001174 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001175 main.log.error( self.name + ": EOF exception found" )
1176 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001177 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001178 except Exception:
1179 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001180 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -04001181
kelvin-onlabd3b64892015-01-20 13:26:24 -08001182 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001183 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001184 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001185 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001186 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001187 try:
kelvin8ec71442015-01-15 16:57:00 -08001188 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001189 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001190 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001191 " start" )
1192 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001193 "Job\sis\salready\srunning",
1194 "start/running",
Devin Limc20e79a2017-06-07 10:29:57 -07001195 self.prompt,
andrewonlab8d0d7d72014-10-09 16:33:15 -04001196 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001197 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001198 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001199 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -07001200 main.log.info( self.name + ": Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001201 return main.TRUE
1202 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001203 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -07001204 main.log.info( self.name + ": ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001205 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001206 elif i == 2:
Jon Hall3c0114c2020-08-11 15:07:42 -07001207 main.log.info( self.name + ": ONOS service started" )
Jeremyd0e9a6d2016-03-02 11:28:52 -08001208 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001209 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001210 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001211 main.log.error( "ONOS service failed to start" )
Devin Lim44075962017-08-11 10:56:37 -07001212
1213 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001214 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001215 main.log.error( self.name + ": EOF exception found" )
1216 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001217 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001218 except Exception:
1219 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001220 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001221
kelvin-onlabd3b64892015-01-20 13:26:24 -08001222 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001223 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001224 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001225 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001226 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001227 try:
kelvin8ec71442015-01-15 16:57:00 -08001228 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001229 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001230 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001231 " stop" )
1232 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001233 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001234 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001235 "Unknown\sinstance",
Devin Limc20e79a2017-06-07 10:29:57 -07001236 self.prompt,
Jeremy Songster14c13572016-04-21 17:34:03 -07001237 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001238 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001239 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -07001240 main.log.info( self.name + ": ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001241 return main.TRUE
1242 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001243 self.handle.expect( self.prompt )
Jon Hall3c0114c2020-08-11 15:07:42 -07001244 main.log.info( self.name + ": onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001245 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001246 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001247 elif i == 2:
Devin Limc20e79a2017-06-07 10:29:57 -07001248 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -07001249 main.log.warn( "ONOS wasn't running" )
1250 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001251 elif i == 3:
Jon Hall3c0114c2020-08-11 15:07:42 -07001252 main.log.info( self.name + ": ONOS service stopped" )
YPZhang77badfc2016-03-09 10:28:59 -08001253 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001254 else:
kelvin8ec71442015-01-15 16:57:00 -08001255 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001256 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001257 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001258 main.log.error( self.name + ": EOF exception found" )
1259 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001260 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001261 except Exception:
1262 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001263 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001264
kelvin-onlabd3b64892015-01-20 13:26:24 -08001265 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001266 """
andrewonlabc8d47972014-10-09 16:52:36 -04001267 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001268 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001269 if needed
kelvin8ec71442015-01-15 16:57:00 -08001270 """
andrewonlabc8d47972014-10-09 16:52:36 -04001271 try:
kelvin8ec71442015-01-15 16:57:00 -08001272 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001273 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001274 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Devin Limc20e79a2017-06-07 10:29:57 -07001275 self.handle.expect( self.prompt, timeout=180 )
Jon Hall3c0114c2020-08-11 15:07:42 -07001276 main.log.info( self.name + ": ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001277 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001278 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001279 except pexpect.TIMEOUT:
1280 main.log.exception( self.name + ": Timeout in onosUninstall" )
You Wang141b43b2018-06-26 16:50:18 -07001281 self.handle.send( "\x03" ) # Control-C
1282 self.handle.expect( self.prompt )
pingping-lin763ee042015-05-20 17:45:30 -07001283 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001284 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001285 main.log.error( self.name + ": EOF exception found" )
1286 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001287 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001288 except Exception:
1289 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001290 main.cleanAndExit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001291
kelvin-onlabd3b64892015-01-20 13:26:24 -08001292 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001293 """
andrewonlabaedc8332014-12-04 12:43:03 -05001294 Issues the command 'onos-die <node-ip>'
1295 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001296 """
andrewonlabaedc8332014-12-04 12:43:03 -05001297 try:
kelvin8ec71442015-01-15 16:57:00 -08001298 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001299 self.handle.expect( self.prompt )
Jeremyf0aecdb2016-03-30 13:19:57 -07001300 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001301 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001302 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001303 "Killing\sONOS",
1304 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001305 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001306 if i == 0:
Jon Hall3c0114c2020-08-11 15:07:42 -07001307 main.log.info( self.name + ": ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001308 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001309 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001310 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001311 return main.TRUE
1312 elif i == 1:
Jon Hall3c0114c2020-08-11 15:07:42 -07001313 main.log.info( self.name + ": ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001314 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001315 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001316 return main.FALSE
1317 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001318 main.log.error( self.name + ": EOF exception found" )
1319 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001320 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001321 except Exception:
1322 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001323 main.cleanAndExit()
andrewonlabaedc8332014-12-04 12:43:03 -05001324
kelvin-onlabd3b64892015-01-20 13:26:24 -08001325 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001326 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001327 Calls the command: 'onos-kill [<node-ip>]'
1328 "Remotely, and unceremoniously kills the ONOS instance running on
1329 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001330 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001331 try:
kelvin8ec71442015-01-15 16:57:00 -08001332 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001333 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001334 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001335 i = self.handle.expect( [
Devin Limc20e79a2017-06-07 10:29:57 -07001336 self.prompt,
andrewonlabe8e56fd2014-10-09 17:12:44 -04001337 "No\sroute\sto\shost",
1338 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001339 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001340
andrewonlabe8e56fd2014-10-09 17:12:44 -04001341 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001342 main.log.info(
1343 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001344 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001345 return main.TRUE
1346 elif i == 1:
Jon Hall3c0114c2020-08-11 15:07:42 -07001347 main.log.info( self.name + ": No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001348 return main.FALSE
1349 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001350 main.log.info(
1351 "Passwordless login for host: " +
1352 str( nodeIp ) +
1353 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001354 return main.FALSE
1355 else:
Jon Hall3c0114c2020-08-11 15:07:42 -07001356 main.log.info( self.name + ": ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001357 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001358
andrewonlabe8e56fd2014-10-09 17:12:44 -04001359 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001360 main.log.error( self.name + ": EOF exception found" )
1361 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001362 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001363 except Exception:
1364 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001365 main.cleanAndExit()
andrewonlabe8e56fd2014-10-09 17:12:44 -04001366
You Wang5bf49592020-07-08 18:47:46 -07001367 def onosAppInstall( self, nodeIp, oarFile ):
1368 """
Jon Hall3c0114c2020-08-11 15:07:42 -07001369 Calls the command: 'onos-app nodeIp reinstall! oarFile'
You Wang5bf49592020-07-08 18:47:46 -07001370 Installs an ONOS application from an oar file
1371 """
1372 try:
Jon Hall3c0114c2020-08-11 15:07:42 -07001373 cmd = "onos-app " + str( nodeIp ) + " reinstall! " + str( oarFile )
You Wang5bf49592020-07-08 18:47:46 -07001374 self.handle.sendline( cmd )
Jon Hall3c0114c2020-08-11 15:07:42 -07001375 i = self.handle.expect( [ "409 Conflict", self.prompt ] )
1376 if i == 0:
1377 self.handle.expect( self.prompt )
1378 time.sleep( 30 )
1379 self.handle.sendline( cmd )
You Wang5bf49592020-07-08 18:47:46 -07001380 handle = self.handle.before
Jon Hall3c0114c2020-08-11 15:07:42 -07001381 main.log.debug( "%s: %s" % ( self.name, handle ) )
You Wang5bf49592020-07-08 18:47:46 -07001382 assert handle is not None, "Error in sendline"
1383 assert "Command not found:" not in handle, handle
1384 assert "error" not in handle, handle
1385 assert "usage:" not in handle, handle
1386 return main.TRUE
1387 except AssertionError:
1388 main.log.exception( "Error in onos-app output" )
1389 return main.FALSE
1390 except pexpect.TIMEOUT:
1391 main.log.exception( self.name + ": Timeout in onosAppInstall" )
1392 self.handle.send( "\x03" ) # Control-C
1393 self.handle.expect( self.prompt )
1394 return main.FALSE
1395 except pexpect.EOF:
1396 main.log.error( self.name + ": EOF exception found" )
1397 main.log.error( self.name + ": " + self.handle.before )
1398 main.cleanAndExit()
1399 except Exception:
1400 main.log.exception( self.name + ": Uncaught exception!" )
1401 main.cleanAndExit()
1402
kelvin-onlabd3b64892015-01-20 13:26:24 -08001403 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001404 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001405 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001406 a cleaner environment.
1407
andrewonlab19fbdca2014-11-14 12:55:59 -05001408 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001409 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001410 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001411 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001412 try:
kelvin8ec71442015-01-15 16:57:00 -08001413 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001414 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001415 self.handle.sendline( "onos-remove-raft-logs" )
1416 # Sometimes this command hangs
Devin Limc20e79a2017-06-07 10:29:57 -07001417 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001418 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001419 if i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001420 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001421 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001422 if i == 1:
1423 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001424 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001425 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001426 main.log.error( self.name + ": EOF exception found" )
1427 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001428 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001429 except Exception:
1430 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001431 main.cleanAndExit()
Jon Hallfcc88622014-11-25 13:09:54 -05001432
kelvin-onlabd3b64892015-01-20 13:26:24 -08001433 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001434 """
1435 Calls the command 'onos-start-network [ <mininet-topo> ]
1436 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001437 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001438 cell."
andrewonlab94282092014-10-10 13:00:11 -04001439 * Specify mininet topology file name for mntopo
1440 * Topo files should be placed at:
1441 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001442
andrewonlab94282092014-10-10 13:00:11 -04001443 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001444 """
andrewonlab94282092014-10-10 13:00:11 -04001445 try:
1446 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001447 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001448 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001449
kelvin8ec71442015-01-15 16:57:00 -08001450 mntopo = str( mntopo )
1451 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001452 self.handle.expect( self.prompt )
andrewonlab94282092014-10-10 13:00:11 -04001453
kelvin8ec71442015-01-15 16:57:00 -08001454 self.handle.sendline( "onos-start-network " + mntopo )
1455 self.handle.expect( "mininet>" )
Jon Hall3c0114c2020-08-11 15:07:42 -07001456 main.log.info( self.name + ": Network started, entered mininet prompt" )
kelvin8ec71442015-01-15 16:57:00 -08001457
1458 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001459
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 )
Devin Lim44075962017-08-11 10:56:37 -07001463 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001464 except Exception:
1465 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001466 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -04001467
Jeremy Songster14c13572016-04-21 17:34:03 -07001468 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001469 """
1470 Run's onos-wait-for-start which only returns once ONOS is at run
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001471 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001472
Jon Hall7993bfc2014-10-09 16:30:14 -04001473 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001474 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001475 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001476 self.handle.sendline( "onos-wait-for-start " + node )
1477 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001478 # NOTE: this timeout is arbitrary"
Jon Hallcababf72018-02-05 12:05:19 -08001479 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT, "Password:" ], timeout )
Jon Hall7993bfc2014-10-09 16:30:14 -04001480 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001481 main.log.info( self.name + ": " + node + " is up" )
You Wangb65f2e92018-12-21 11:31:34 -08001482 # FIXME: for now we sleep 5s for CLI to become ready
1483 time.sleep( 5 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001484 return main.TRUE
Jon Hallcababf72018-02-05 12:05:19 -08001485 elif i == 1 or i == 2:
kelvin8ec71442015-01-15 16:57:00 -08001486 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001487 # we will kill it on timeout
Jon Hallcababf72018-02-05 12:05:19 -08001488 if i == 1:
Jon Hall3e6edb32018-08-21 16:20:30 -07001489 main.log.error( "{}: ONOS {} has not started yet".format( self.name, node ) )
Jon Hallcababf72018-02-05 12:05:19 -08001490 elif i == 2:
Jon Hall3e6edb32018-08-21 16:20:30 -07001491 main.log.error( "{}: Cannot login to ONOS CLI {}, try using onos-secure-ssh".format( self.name, node ) )
kelvin8ec71442015-01-15 16:57:00 -08001492 self.handle.send( "\x03" ) # Control-C
Devin Limc20e79a2017-06-07 10:29:57 -07001493 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001494 return main.FALSE
1495 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001496 main.log.error( self.name + ": EOF exception found" )
1497 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001498 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001499 except Exception:
1500 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001501 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001502
Devin Lim142b5342017-07-20 15:22:39 -07001503 def preventAutoRespawn( self ):
1504 """
1505 Description:
1506 This will prevent ONOSservice to automatically
1507 respawn.
1508 """
1509 try:
1510 self.handle.sendline( "sed -i -e 's/^respawn$/#respawn/g' tools/package/init/onos.conf" )
1511 self.handle.expect( "\$" ) # $ from the command
1512 self.handle.sendline( "sed -i -e 's/^Restart=always/Restart=no/g' tools/package/init/onos.service" )
1513 self.handle.expect( "\$" ) # $ from the command
1514 self.handle.expect( "\$" ) # $ from the prompt
1515 except pexpect.EOF:
1516 main.log.error( self.name + ": EOF exception found" )
1517 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001518 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001519 except Exception:
1520 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001521 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001522
kelvin-onlabd3b64892015-01-20 13:26:24 -08001523 def pushTestIntentsShell(
1524 self,
1525 dpidSrc,
1526 dpidDst,
1527 numIntents,
1528 dirFile,
1529 onosIp,
1530 numMult="",
1531 appId="",
1532 report=True,
1533 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001534 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001535 Description:
kelvin8ec71442015-01-15 16:57:00 -08001536 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001537 better parallelize the results than the CLI
1538 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001539 * dpidSrc: specify source dpid
1540 * dpidDst: specify destination dpid
1541 * numIntents: specify number of intents to push
1542 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001543 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001544 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001545 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001546 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001547 """
1548 try:
1549 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001550 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001551 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001552 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001553 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001554 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001555
kelvin-onlabd3b64892015-01-20 13:26:24 -08001556 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1557 if not numMult:
1558 addIntents = addDpid + " " + str( numIntents )
1559 elif numMult:
1560 addIntents = addDpid + " " + str( numIntents ) + " " +\
1561 str( numMult )
1562 if appId:
1563 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001564 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001565 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001566
andrewonlabaedc8332014-12-04 12:43:03 -05001567 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001568 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001569 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001570 sendCmd = addApp + " &"
Jon Hall3c0114c2020-08-11 15:07:42 -07001571 main.log.info( self.name + ": Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001572
kelvin-onlabd3b64892015-01-20 13:26:24 -08001573 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001574
1575 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001576 main.log.error( self.name + ": EOF exception found" )
1577 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001578 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001579 except Exception:
1580 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001581 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001582
kelvin-onlabd3b64892015-01-20 13:26:24 -08001583 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001584 """
andrewonlab970399c2014-11-07 13:09:32 -05001585 Capture all packet activity and store in specified
1586 directory/file
1587
1588 Required:
1589 * interface: interface to capture
1590 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001591 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001592 try:
1593 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001594 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001595
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001596 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001597 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001598 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001599 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001600 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001601
Jon Hall3c0114c2020-08-11 15:07:42 -07001602 main.log.info( self.name + ": Tshark started capturing files on " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001603 str( interface ) + " and saving to directory: " +
1604 str( dirFile ) )
1605 except pexpect.EOF:
1606 main.log.error( self.name + ": EOF exception found" )
1607 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001608 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001609 except Exception:
1610 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001611 main.cleanAndExit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001612
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001613 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001614 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001615 Description:
1616 Execute onos-topo-cfg command
1617 Required:
1618 onosIp - IP of the onos node you want to send the json to
1619 jsonFile - File path of the json file
1620 Return:
1621 Returns main.TRUE if the command is successfull; Returns
1622 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001623 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001624 try:
kelvin8ec71442015-01-15 16:57:00 -08001625 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001626 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001627 cmd = "onos-topo-cfg "
1628 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1629 handle = self.handle.before
1630 print handle
1631 if "Error" in handle:
1632 main.log.error( self.name + ": " + self.handle.before )
1633 return main.FALSE
1634 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001635 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001636 return main.TRUE
1637
Jon Hallfebb1c72015-03-05 13:30:09 -08001638 except pexpect.EOF:
1639 main.log.error( self.name + ": EOF exception found" )
1640 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001641 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001642 except Exception:
1643 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001644 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001645
jenkins1e99e7b2015-04-02 18:15:39 -07001646 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001647 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001648 Required:
kelvin8ec71442015-01-15 16:57:00 -08001649 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001650 * directory to store results
1651 Optional:
1652 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001653 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001654 Description:
1655 Uses tshark command to grep specific group of packets
1656 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001657 The timestamp is hardcoded to be in epoch
1658 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001659 try:
1660 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001661 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001662 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001663 if grepOptions:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001664 grepStr = "grep " + str( grepOptions )
jenkins1e99e7b2015-04-02 18:15:39 -07001665 else:
1666 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001667
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001668 cmd = (
1669 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001670 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001671 " -t e | " +
1672 grepStr + " --line-buffered \"" +
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001673 str( grep ) +
Jon Hallfebb1c72015-03-05 13:30:09 -08001674 "\" >" +
1675 directory +
1676 " &" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001677 self.handle.sendline( cmd )
1678 main.log.info( cmd )
Jon Hallfebb1c72015-03-05 13:30:09 -08001679 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001680 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001681 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001682 except pexpect.EOF:
1683 main.log.error( self.name + ": EOF exception found" )
1684 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001685 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001686 except Exception:
1687 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001688 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001689
kelvin-onlabd3b64892015-01-20 13:26:24 -08001690 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001691 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001692 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001693 """
1694 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001695 try:
1696 self.execute( cmd="sudo rm /tmp/wireshark*" )
1697 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001698 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1699 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001700 self.handle.sendline( "" )
Jon Hall3c0114c2020-08-11 15:07:42 -07001701 main.log.info( self.name + ": Tshark stopped" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001702 except pexpect.EOF:
1703 main.log.error( self.name + ": EOF exception found" )
1704 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001705 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001706 except Exception:
1707 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001708 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001709
kelvin8ec71442015-01-15 16:57:00 -08001710 def ptpd( self, args ):
1711 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001712 Initiate ptp with user-specified args.
1713 Required:
1714 * args: specify string of args after command
1715 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001716 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001717 try:
kelvin8ec71442015-01-15 16:57:00 -08001718 self.handle.sendline( "sudo ptpd " + str( args ) )
1719 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001720 "Multiple",
1721 "Error",
Devin Limc20e79a2017-06-07 10:29:57 -07001722 self.prompt ] )
1723 self.handle.expect( self.prompt )
andrewonlabba44bcf2014-10-16 16:54:41 -04001724
andrewonlab0c38a4a2014-10-28 18:35:35 -04001725 if i == 0:
1726 handle = self.handle.before
Jon Hall3c0114c2020-08-11 15:07:42 -07001727 main.log.info( self.name + ": ptpd returned an error: " +
kelvin8ec71442015-01-15 16:57:00 -08001728 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001729 return handle
1730 elif i == 1:
1731 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001732 main.log.error( "ptpd returned an error: " +
1733 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001734 return handle
1735 else:
1736 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001737
andrewonlab0c38a4a2014-10-28 18:35:35 -04001738 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001739 main.log.error( self.name + ": EOF exception found" )
1740 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001741 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001742 except Exception:
1743 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001744 main.cleanAndExit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001745
You Wang54b1d672018-06-11 16:44:13 -07001746 def dumpONOSCmd( self, ONOSIp, CMD, destDir, filename, options="", timeout=60 ):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001747 """
Pier50f0bc62016-09-07 17:53:40 -07001748 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001749 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001750 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001751 Localtime will be attached to the filename
1752
1753 Required:
1754 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001755 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001756 * destDir: specify directory to copy to.
1757 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001758 * fileName: Name of the file
You Wang54b1d672018-06-11 16:44:13 -07001759 Optional:
Pier50f0bc62016-09-07 17:53:40 -07001760 * options: Options for ONOS command
You Wang54b1d672018-06-11 16:44:13 -07001761 * timeout: pexpect timeout for running the ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001762 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001763
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001764 localtime = time.strftime( '%x %X' )
1765 localtime = localtime.replace( "/", "" )
1766 localtime = localtime.replace( " ", "_" )
1767 localtime = localtime.replace( ":", "" )
1768 if destDir[ -1: ] != "/":
1769 destDir += "/"
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001770 cmd = CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
You Wang54b1d672018-06-11 16:44:13 -07001771 return self.onosCli( ONOSIp, cmd, timeout=timeout )
Flavio Castrob7718952016-05-18 08:53:41 -07001772
kelvin-onlabd3b64892015-01-20 13:26:24 -08001773 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001774 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001775 """
1776 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001777 Current implementation of ONOS deletes its karaf
1778 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001779 you may want to use this function to capture
1780 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001781 Localtime will be attached to the filename
1782
1783 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001784 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001785 copy.
kelvin8ec71442015-01-15 16:57:00 -08001786 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001787 For copying multiple files, leave copyFileName
1788 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001789 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001790 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001791 ex ) /tmp/
1792 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001793 * copyFileName: If you want to rename the log
1794 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001795 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001796 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001797 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001798 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001799 localtime = localtime.replace( "/", "" )
1800 localtime = localtime.replace( " ", "_" )
1801 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001802 if destDir[ -1: ] != "/":
1803 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001804
kelvin-onlabd3b64892015-01-20 13:26:24 -08001805 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001806 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1807 str( destDir ) + str( copyFileName ) +
1808 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001809 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001810 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001811 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001812 self.handle.sendline( "cp " + str( logToCopy ) +
1813 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001814 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001815 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001816
kelvin8ec71442015-01-15 16:57:00 -08001817 return self.handle.before
1818
1819 except pexpect.EOF:
1820 main.log.error( "Copying files failed" )
1821 main.log.error( self.name + ": EOF exception found" )
1822 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001823 except Exception:
1824 main.log.exception( "Copying files failed" )
1825
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001826 def checkLogs( self, onosIp, restart=False ):
kelvin8ec71442015-01-15 16:57:00 -08001827 """
Jon Hall94fd0472014-12-08 11:52:42 -08001828 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001829 If restart is True, use the old version of onos-check-logs which
1830 does not print the full stacktrace, but shows the entire log file,
1831 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001832 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001833 """
Jon Hall94fd0472014-12-08 11:52:42 -08001834 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001835 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001836 if restart:
1837 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001838 self.handle.sendline( cmd )
1839 self.handle.expect( cmd )
Devin Limdc78e202017-06-09 18:30:07 -07001840 self.handle.expect( self.prompt + " " )
Jon Hall94fd0472014-12-08 11:52:42 -08001841 response = self.handle.before
1842 return response
1843 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001844 main.log.error( "Lost ssh connection" )
1845 main.log.error( self.name + ": EOF exception found" )
1846 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001847 except Exception:
1848 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001849 main.cleanAndExit()
Jon Hall94fd0472014-12-08 11:52:42 -08001850
kelvin-onlabd3b64892015-01-20 13:26:24 -08001851 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001852 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001853 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001854 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001855 try:
kelvin8ec71442015-01-15 16:57:00 -08001856 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001857 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001858 self.handle.sendline( "onos-service " + str( node ) +
1859 " status" )
1860 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001861 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001862 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001863 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001864 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001865 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001866 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001867 self.handle.expect( self.prompt )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001868
You Wangef1e6572016-03-08 12:53:18 -08001869 if i == 0 or i == 1:
Jon Hall3c0114c2020-08-11 15:07:42 -07001870 main.log.info( self.name + ": ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001871 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001872 elif i == 2 or i == 3:
Jon Hall3c0114c2020-08-11 15:07:42 -07001873 main.log.info( self.name + ": ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001874 main.log.error( "ONOS service failed to check the status" )
Devin Lim44075962017-08-11 10:56:37 -07001875
1876 main.cleanAndExit()
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001877 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001878 main.log.error( self.name + ": EOF exception found" )
1879 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001880 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001881 except Exception:
1882 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001883 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001884
Jon Hall63604932015-02-26 17:09:50 -08001885 def setIpTables( self, ip, port='', action='add', packet_type='',
1886 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001887 """
Jon Hall21270ac2015-02-16 17:59:55 -08001888 Description:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001889 add or remove iptables rule to DROP (default) packets from
Jon Hall21270ac2015-02-16 17:59:55 -08001890 specific IP and PORT
1891 Usage:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001892 * specify action ('add' or 'remove')
Jon Hall21270ac2015-02-16 17:59:55 -08001893 when removing, pass in the same argument as you would add. It will
1894 delete that specific rule.
1895 * specify the ip to block
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001896 * specify the destination port to block (defaults to all ports)
1897 * optional packet type to block (default tcp)
1898 * optional iptables rule (default DROP)
1899 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001900 * States boolean toggles adding all supported tcp states to the
1901 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001902 Returns:
1903 main.TRUE on success or
1904 main.FALSE if given invalid input or
1905 main.ERROR if there is an error in response from iptables
1906 WARNING:
1907 * This function uses root privilege iptables command which may result
1908 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001909 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001910
Jon Hall21270ac2015-02-16 17:59:55 -08001911 # NOTE*********
1912 # The strict checking methods of this driver function is intentional
1913 # to discourage any misuse or error of iptables, which can cause
1914 # severe network errors
1915 # *************
1916
1917 # NOTE: Sleep needed to give some time for rule to be added and
1918 # registered to the instance. If you are calling this function
1919 # multiple times this sleep will prevent any errors.
1920 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001921 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001922 try:
1923 # input validation
1924 action_type = action.lower()
1925 rule = rule.upper()
1926 direction = direction.upper()
1927 if action_type != 'add' and action_type != 'remove':
1928 main.log.error( "Invalid action type. Use 'add' or "
1929 "'remove' table rule" )
1930 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1931 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1932 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1933 "'ACCEPT' or 'LOG' only." )
1934 if direction != 'INPUT' and direction != 'OUTPUT':
1935 # NOTE currently only supports rules INPUT and OUPTUT
1936 main.log.error( "Invalid rule. Valid directions are"
1937 " 'OUTPUT' or 'INPUT'" )
1938 return main.FALSE
1939 return main.FALSE
1940 return main.FALSE
1941 if action_type == 'add':
1942 # -A is the 'append' action of iptables
1943 actionFlag = '-A'
1944 elif action_type == 'remove':
1945 # -D is the 'delete' rule of iptables
1946 actionFlag = '-D'
1947 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001948 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001949 cmd = "sudo iptables " + actionFlag + " " +\
1950 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001951 " -s " + str( ip )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001952 # " -p " + str( packet_type ) +\
Jon Hall63604932015-02-26 17:09:50 -08001953 if packet_type:
1954 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001955 if port:
1956 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001957 if states:
1958 cmd += " -m state --state="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001959 # FIXME- Allow user to configure which states to block
Jon Hall63604932015-02-26 17:09:50 -08001960 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001961 cmd += " -j " + str( rule )
1962
1963 self.handle.sendline( cmd )
Devin Limc20e79a2017-06-07 10:29:57 -07001964 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001965 main.log.warn( self.handle.before )
1966
1967 info_string = "On " + str( self.name )
1968 info_string += " " + str( action_type )
1969 info_string += " iptable rule [ "
1970 info_string += " IP: " + str( ip )
1971 info_string += " Port: " + str( port )
1972 info_string += " Rule: " + str( rule )
1973 info_string += " Direction: " + str( direction ) + " ]"
1974 main.log.info( info_string )
1975 return main.TRUE
1976 except pexpect.TIMEOUT:
1977 main.log.exception( self.name + ": Timeout exception in "
1978 "setIpTables function" )
You Wang141b43b2018-06-26 16:50:18 -07001979 self.handle.send( "\x03" ) # Control-C
1980 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001981 return main.ERROR
1982 except pexpect.EOF:
1983 main.log.error( self.name + ": EOF exception found" )
1984 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001985 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001986 except Exception:
1987 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001988 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001989
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001990 def detailed_status( self, log_filename ):
Jon Hallefbd9792015-03-05 16:11:36 -08001991 """
Jon Hall0468b042015-02-19 19:08:21 -08001992 This method is used by STS to check the status of the controller
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001993 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001994 """
Jon Hall0468b042015-02-19 19:08:21 -08001995 import re
1996 try:
1997 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001998 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001999 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -07002000 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08002001 self.handle.sendline( "service onos status" )
Devin Limc20e79a2017-06-07 10:29:57 -07002002 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08002003 response = self.handle.before
2004 if re.search( "onos start/running", response ):
2005 # onos start/running, process 10457
2006 return 'RUNNING'
2007 # FIXME: Implement this case
2008 # elif re.search( pattern, response ):
2009 # return 'STARTING'
2010 elif re.search( "onos stop/", response ):
2011 # onos stop/waiting
2012 # FIXME handle this differently?: onos stop/pre-stop
2013 return 'STOPPED'
2014 # FIXME: Implement this case
2015 # elif re.search( pattern, response ):
2016 # return 'FROZEN'
2017 else:
2018 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08002019 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08002020 main.log.warn( response )
2021 return 'ERROR', "Unknown response: %s" % response
2022 except pexpect.TIMEOUT:
2023 main.log.exception( self.name + ": Timeout exception in "
2024 "setIpTables function" )
You Wang141b43b2018-06-26 16:50:18 -07002025 self.handle.send( "\x03" ) # Control-C
2026 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08002027 return 'ERROR', "Pexpect Timeout"
2028 except pexpect.EOF:
2029 main.log.error( self.name + ": EOF exception found" )
2030 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002031 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08002032 except Exception:
2033 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002034 main.cleanAndExit()
Jon Hall0468b042015-02-19 19:08:21 -08002035
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002036 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002037 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002038 Create/formats the LinkGraph.cfg file based on arguments
2039 -only creates a linear topology and connects islands
2040 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07002041 -must be called by ONOSbench
2042
Jon Hall4ba53f02015-07-29 13:07:41 -07002043 ONOSIpList - list of all of the node IPs to be used
2044
2045 deviceCount - number of switches to be assigned
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002046 '''
Jon Hall3c0114c2020-08-11 15:07:42 -07002047 main.log.info( self.name + ": Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002048 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07002049 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07002050
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002051 linkGraph = open( tempFile, 'w+' )
2052 linkGraph.write( "# NullLinkProvider topology description (config file).\n" )
2053 linkGraph.write( "# The NodeId is only added if the destination is another node's device.\n" )
2054 linkGraph.write( "# Bugs: Comments cannot be appended to a line to be read.\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002055
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002056 clusterCount = len( ONOSIpList )
Jon Hall4ba53f02015-07-29 13:07:41 -07002057
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002058 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
2059 deviceCount = int( deviceCount )
2060 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002061 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07002062
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002063 for node in range( 1, clusterCount + 1 ):
2064 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002065
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002066 for node in range( 1, ( deviceCount % clusterCount )+1 ):
2067 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002068
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002069 if isinstance( deviceCount, list ):
Jon Hall3c0114c2020-08-11 15:07:42 -07002070 main.log.info( self.name + ": Using provided device distribution" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002071 switchList = [ 0 ]
andrew@onlab.us3b087132015-03-11 15:00:08 -07002072 for i in deviceCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002073 switchList.append( int( i ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002074
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002075 tempList = [ '0' ]
2076 tempList.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002077 ONOSIpList = tempList
2078
2079 myPort = 6
2080 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002081 for node in range( 1, clusterCount+1 ):
2082 if switchList[ node ] == 0:
andrew@onlab.us3b087132015-03-11 15:00:08 -07002083 continue
2084
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002085 linkGraph.write( "graph " + ONOSIpList[ node ] + " {\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002086
andrew@onlab.us3b087132015-03-11 15:00:08 -07002087 if node > 1:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002088 # connect to last device on previous node
2089 line = ( "\t0:5 -> " + str( lastSwitch ) + ":6:" + lastIp + "\n" ) # ONOSIpList[node-1]
2090 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07002091
2092 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002093 for switch in range( 0, switchList[ node ]-1 ):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002094 line = ""
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002095 line = ( "\t" + str( switch ) + ":" + str( myPort ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002096 line += " -- "
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002097 line += ( str( switch+1 ) + ":" + str( myPort-1 ) + "\n" )
2098 linkGraph.write( line )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002099 lastSwitch = switch+1
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002100 lastIp = ONOSIpList[ node ]
Jon Hall4ba53f02015-07-29 13:07:41 -07002101
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002102 # lastSwitch += 1
2103 if node < ( clusterCount ):
2104 # connect to first device on the next node
2105 line = ( "\t" + str( lastSwitch ) + ":6 -> 0:5:" + ONOSIpList[ node+1 ] + "\n" )
2106 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07002107
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002108 linkGraph.write( "}\n" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002109 linkGraph.close()
2110
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002111 # SCP
2112 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath )
Jon Hall3c0114c2020-08-11 15:07:42 -07002113 main.log.info( self.name + ": linkGraph.cfg creation complete" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002114
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002115 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002116 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002117 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
2118 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07002119 numPorts = number of ports per device. Defaults to 10 both in this function and in ONOS. Optional arg
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002120 '''
2121
Jon Hall3c0114c2020-08-11 15:07:42 -07002122 main.log.info( self.name + ": Configuring Null Device Provider" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002123 clusterCount = len( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002124
Jon Hall4ba53f02015-07-29 13:07:41 -07002125 try:
2126
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002127 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
Jon Hall3c0114c2020-08-11 15:07:42 -07002128 main.log.info( self.name + ": Creating device distribution" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002129 deviceCount = int( deviceCount )
2130 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002131 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002132
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002133 for node in range( 1, clusterCount + 1 ):
2134 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002135
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002136 for node in range( 1, ( deviceCount % clusterCount )+1 ):
2137 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002138
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002139 if isinstance( deviceCount, list ):
Jon Hall3c0114c2020-08-11 15:07:42 -07002140 main.log.info( self.name + ": Using provided device distribution" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002141
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002142 if len( deviceCount ) == clusterCount:
2143 switchList = [ '0' ]
2144 switchList.extend( deviceCount )
Jon Hall4ba53f02015-07-29 13:07:41 -07002145
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002146 if len( deviceCount ) == ( clusterCount + 1 ):
2147 if deviceCount[ 0 ] == '0' or deviceCount[ 0 ] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002148 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002149
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002150 assert len( switchList ) == ( clusterCount + 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002151
cameron@onlab.us75900962015-03-30 13:22:49 -07002152 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002153 main.log.error( "Bad device/Ip list match" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002154 except TypeError:
2155 main.log.exception( self.name + ": Object not as expected" )
2156 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002157 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002158 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002159 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002160
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002161 ONOSIp = [ 0 ]
2162 ONOSIp.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002163
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002164 devicesString = "devConfigs = "
2165 for node in range( 1, len( ONOSIp ) ):
2166 devicesString += ( ONOSIp[ node ] + ":" + str( switchList[ node ] ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002167 if node < clusterCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002168 devicesString += ( "," )
Jon Hall4ba53f02015-07-29 13:07:41 -07002169
2170 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002171 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2172 self.handle.expect( ":~" )
2173 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str( numPorts ) )
2174 self.handle.expect( ":~" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002175
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002176 for i in range( 10 ):
2177 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider" )
2178 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002179 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002180 if ( " value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002181 break
2182 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002183 time.sleep( 1 )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002184
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002185 assert ( "value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002186
cameron@onlab.us75900962015-03-30 13:22:49 -07002187 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002188 main.log.error( "Incorrect Config settings: " + verification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002189 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002190 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002191 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002192
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002193 def configNullLink( self, fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002194 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002195 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002196 you want to use a different topology file than linkGraph.cfg
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002197 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002198
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002199 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002200 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str( eventRate ) )
2201 self.handle.expect( ":~" )
2202 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2203 self.handle.expect( ":~" )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002204
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002205 for i in range( 10 ):
2206 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider" )
2207 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002208 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002209 if ( " value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002210 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002211 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002212 time.sleep( 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002213
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002214 assert ( "value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002215
cameron@onlab.us75900962015-03-30 13:22:49 -07002216 except pexpect.EOF:
2217 main.log.error( self.name + ": EOF exception found" )
2218 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002219 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002220 except AssertionError:
Jon Hall3c0114c2020-08-11 15:07:42 -07002221 main.log.info( self.name + ": Settings did not post to ONOS" )
Jon Hall3e6edb32018-08-21 16:20:30 -07002222 main.log.error( verification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002223 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002224 main.log.exception( self.name + ": Uncaught exception!" )
Jon Hall3e6edb32018-08-21 16:20:30 -07002225 main.log.error( verification )
Devin Lim44075962017-08-11 10:56:37 -07002226 main.cleanAndExit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002227
kelvin-onlaba4074292015-07-09 15:19:49 -07002228 def getOnosIps( self ):
2229 """
2230 Get all onos IPs stored in
2231 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002232
kelvin-onlaba4074292015-07-09 15:19:49 -07002233 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002234
Chiyu Chengec63bde2016-11-17 18:11:36 -08002235 def listLog( self, nodeIp ):
2236 """
2237 Get a list of all the karaf log names
2238 """
2239 try:
2240 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2241 self.handle.sendline( cmd )
2242 self.handle.expect( ":~" )
2243 before = self.handle.before.splitlines()
2244 logNames = []
2245 for word in before:
2246 if 'karaf.log' in word:
2247 logNames.append( word )
2248 return logNames
2249 except pexpect.EOF:
2250 main.log.error( self.name + ": EOF exception found" )
2251 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002252 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002253 except pexpect.TIMEOUT:
2254 main.log.error( self.name + ": TIMEOUT exception found" )
2255 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002256 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002257 except Exception:
2258 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002259 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002260
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002261 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002262 """
2263 Searches the latest ONOS log file for the given search terms and
2264 prints the total occurances of each term. Returns to combined total of
2265 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002266
Jon Hallb4242222016-01-25 17:07:04 -08002267 Arguments:
2268 * nodeIp - The ip of the ONOS node where the log is located
2269 * searchTerms - A string to grep for or a list of strings to grep
2270 for in the ONOS log. Will print out the number of
2271 occurances for each term.
2272 Optional Arguments:
2273 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2274 containing each search term as well as the total
2275 number of occurances of each term. Defaults to 's',
2276 which prints the simple output of just the number
2277 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002278 * startStr - the start string to be given to stream editor command
2279 as the start point for extraction of data
2280 * endStr - the end string to be given to stream editor command as
2281 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002282 """
2283 try:
Jon Hall3c0114c2020-08-11 15:07:42 -07002284 main.log.info( self.name + ": Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002285 if isinstance( searchTerms, str ):
2286 searchTerms = [ searchTerms ]
Jon Hallb4242222016-01-25 17:07:04 -08002287 numTerms = len( searchTerms )
2288 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002289
Jon Hallb4242222016-01-25 17:07:04 -08002290 totalHits = 0
2291 logLines = []
2292 for termIndex in range( numTerms ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002293 term = searchTerms[ termIndex ]
2294 logLines.append( [ term ] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002295 if startStr and endStr:
2296 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2297 startStr,
2298 endStr,
2299 term )
2300 else:
2301 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2302 term )
Jon Hallb4242222016-01-25 17:07:04 -08002303 self.handle.sendline( cmd )
2304 self.handle.expect( ":~" )
2305 before = self.handle.before.splitlines()
2306 count = 0
2307 for line in before:
2308 if term in line and "grep" not in line:
2309 count += 1
2310 if before.index( line ) > ( len( before ) - 7 ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002311 logLines[ termIndex ].append( line )
Jon Hall3c0114c2020-08-11 15:07:42 -07002312 main.log.info( self.name + ": {}: {}".format( term, count ) )
Jon Hallb4242222016-01-25 17:07:04 -08002313 totalHits += count
2314 if termIndex == numTerms - 1:
2315 print "\n"
2316 if outputMode != "s":
2317 outputString = ""
2318 for term in logLines:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002319 outputString = term[ 0 ] + ": \n"
Jon Hallb4242222016-01-25 17:07:04 -08002320 for line in range( 1, len( term ) ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002321 outputString += ( "\t" + term[ line ] + "\n" )
2322 if outputString != ( term[ 0 ] + ": \n" ):
Jon Hallb4242222016-01-25 17:07:04 -08002323 main.log.info( outputString )
Jon Hall3c0114c2020-08-11 15:07:42 -07002324 main.log.info( self.name + ": =" * 70 )
Jon Hallb4242222016-01-25 17:07:04 -08002325 return totalHits
2326 except pexpect.EOF:
2327 main.log.error( self.name + ": EOF exception found" )
2328 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002329 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002330 except pexpect.TIMEOUT:
2331 main.log.error( self.name + ": TIMEOUT exception found" )
2332 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002333 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002334 except Exception:
2335 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002336 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002337
2338 def copyMininetFile( self, fileName, localPath, userName, ip,
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002339 mnPath='~/mininet/custom/', timeout = 60 ):
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002340 """
2341 Description:
2342 Copy mininet topology file from dependency folder in the test folder
2343 and paste it to the mininet machine's mininet/custom folder
2344 Required:
2345 fileName - Name of the topology file to copy
2346 localPath - File path of the mininet topology file
2347 userName - User name of the mininet machine to send the file to
2348 ip - Ip address of the mininet machine
2349 Optional:
2350 mnPath - of the mininet directory to send the file to
2351 Return:
2352 Return main.TRUE if successfully copied the file otherwise
2353 return main.FALSE
2354 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002355
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002356 try:
2357 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2358 str( ip ) + ":" + mnPath + fileName
2359
2360 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002361 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002362
2363 main.log.info( self.name + ": Execute: " + cmd )
2364
2365 self.handle.sendline( cmd )
2366
2367 i = self.handle.expect( [ 'No such file',
2368 "100%",
2369 pexpect.TIMEOUT ] )
2370
2371 if i == 0:
2372 main.log.error( self.name + ": File " + fileName +
2373 " does not exist!" )
2374 return main.FALSE
2375
2376 if i == 1:
2377 main.log.info( self.name + ": File " + fileName +
2378 " has been copied!" )
2379 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002380 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002381 return main.TRUE
2382
2383 except pexpect.EOF:
2384 main.log.error( self.name + ": EOF exception found" )
2385 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002386 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002387 except pexpect.TIMEOUT:
2388 main.log.error( self.name + ": TIMEOUT exception found" )
2389 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002390 main.cleanAndExit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002391
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002392 def jvmSet( self, memory=8 ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002393
cameron@onlab.us78b89652015-07-08 15:21:03 -07002394 import os
2395
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002396 homeDir = os.path.expanduser( '~' )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002397 filename = "/onos/tools/package/bin/onos-service"
2398
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002399 serviceConfig = open( homeDir + filename, 'w+' )
2400 serviceConfig.write( "#!/bin/bash\n " )
2401 serviceConfig.write( "#------------------------------------- \n " )
2402 serviceConfig.write( "# Starts ONOS Apache Karaf container\n " )
2403 serviceConfig.write( "#------------------------------------- \n " )
2404 serviceConfig.write( "#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n " )
2405 serviceConfig.write( """export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str( memory ) + "G -Xmx" + str( memory ) + """G}" \n """ )
2406 serviceConfig.write( "[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n" )
2407 serviceConfig.write( """${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """ )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002408 serviceConfig.close()
2409
Jon Hall6c44c0b2016-04-20 15:21:00 -07002410 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002411
cameron@onlab.us78b89652015-07-08 15:21:03 -07002412 filename = main.TEST + "DB"
2413 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002414
cameron@onlab.us78b89652015-07-08 15:21:03 -07002415 for item in testData:
Jon Hall3e6edb32018-08-21 16:20:30 -07002416 if isinstance( item, str ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002417 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002418 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002419 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002420 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002421
Jon Hall6c44c0b2016-04-20 15:21:00 -07002422 DBFile = open( filename, "a" )
2423 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002424 DBFile.close()
2425
Jon Hall6c44c0b2016-04-20 15:21:00 -07002426 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002427
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002428 self.handle.sendline( "onos " + ONOSIp + " summary" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002429 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002430
2431 summaryStr = self.handle.before
2432 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2433
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002434 # passed = "SCC(s)=1" in summaryStr
2435 # if deviceCount:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002436 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
cameron@onlab.us78b89652015-07-08 15:21:03 -07002437
GlennRC772363b2015-08-25 13:05:57 -07002438 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002439 if "SCC(s)=1," in summaryStr:
2440 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002441 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002442 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002443 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002444
2445 if deviceCount:
2446 print" ============================="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002447 checkStr = "devices=" + str( deviceCount[ 0 ] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002448 print "Checkstr: " + checkStr
2449 if checkStr not in summaryStr:
2450 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002451 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002452 else:
2453 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002454
2455 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002456
Jon Hall8f6d4622016-05-23 15:27:18 -07002457 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002458 """
2459 Update self.ip_address with numerical ip address. If multiple IP's are
2460 located on the device, will attempt to use self.nicAddr to choose the
2461 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2462 determine the correct address.
2463
2464 ONLY WORKS WITH IPV4 ADDRESSES
2465 """
2466 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002467 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002468 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2469 pattern = re.compile( ipPat )
2470 match = re.search( pattern, self.ip_address )
2471 if self.nicAddr:
2472 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2473 nicPat = re.compile( nicPat )
2474 else:
2475 nicPat = None
2476 # IF self.ip_address is an ip address and matches
2477 # self.nicAddr: return self.ip_address
2478 if match:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002479 curIp = match.group( 0 )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002480 if nicPat:
2481 nicMatch = re.search( nicPat, curIp )
2482 if nicMatch:
2483 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002484 # ELSE: IF iface, return ip of interface
2485 cmd = "ifconfig"
2486 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2487 if iface:
2488 cmd += " " + str( iface )
2489 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002490 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2491 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002492 if iface:
2493 if ips:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002494 ip = ips[ 0 ]
Jon Hall8f6d4622016-05-23 15:27:18 -07002495 self.ip_address = ip
2496 return ip
2497 else:
2498 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2499 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002500 if nicPat:
2501 for ip in ips:
2502 curMatch = re.search( nicPat, ip )
2503 if curMatch:
2504 self.ip_address = ip
2505 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002506 else: # If only one non-localhost ip, return that
2507 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002508 if len( tmpList ) == 1:
2509 curIp = tmpList[ 0 ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002510 self.ip_address = curIp
2511 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002512 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002513 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002514 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002515 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002516 main.log.exception( "Error executing ifconfig" )
2517 except IndexError:
2518 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002519 except Exception:
2520 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002521
Devin Lim461f0872017-06-05 16:49:33 -07002522 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002523 '''
suibin zhang116647a2016-05-06 16:30:09 -07002524 Start onos cluster with defined nodes, but only with drivers app
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002525 '''
suibin zhang116647a2016-05-06 16:30:09 -07002526 import time
2527
2528 self.createCellFile( self.ip_address,
Jon Hall3e6edb32018-08-21 16:20:30 -07002529 "temp",
2530 self.ip_address,
2531 "drivers",
2532 nodeList,
2533 nodeList,
2534 onosUser=onosUser )
suibin zhang116647a2016-05-06 16:30:09 -07002535
2536 main.log.info( self.name + ": Apply cell to environment" )
2537 cellResult = self.setCell( "temp" )
2538 verifyResult = self.verifyCell()
2539
2540 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002541 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002542
You Wangc669d212017-01-25 11:09:48 -08002543 main.log.info( self.name + ": Uninstalling ONOS" )
2544 for nd in nodeList:
2545 self.onosUninstall( nodeIp=nd )
2546
suibin zhang116647a2016-05-06 16:30:09 -07002547 main.log.info( self.name + ": Installing ONOS package" )
2548 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002549 self.onosInstall( node=nd )
2550
2551 main.log.info( self.name + ": Set up ONOS secure SSH" )
2552 for nd in nodeList:
2553 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002554
2555 main.log.info( self.name + ": Starting ONOS service" )
2556 time.sleep( onosStartupSleep )
2557
2558 onosStatus = True
2559 for nd in nodeList:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002560 onosStatus = onosStatus & self.isup( node = nd )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002561 # print "onosStatus is: " + str( onosStatus )
suibin zhang116647a2016-05-06 16:30:09 -07002562
2563 return main.TRUE if onosStatus else main.FALSE
2564
Jon Hall3c0114c2020-08-11 15:07:42 -07002565 def onosNetCfg( self, controllerIp, path, fileName, user=None, password=None):
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002566 """
2567 Push a specified json file to ONOS through the onos-netcfg service
2568
2569 Required:
Devin Lim02075272017-07-10 15:33:21 -07002570 controllerIp - the Ip of the ONOS node in the cluster
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002571 path - the location of the file to be sent
2572 fileName - name of the json file to be sent
2573
2574 Returns main.TRUE on successfully sending json file, and main.FALSE if
2575 there is an error.
2576 """
2577 try:
Jon Hall3c0114c2020-08-11 15:07:42 -07002578 cmd = "onos-netcfg "
2579 if user:
2580 cmd += "-u %s " % user
2581 if password:
2582 cmd += "-p %s " % password
2583 cmd += "{0} {1}{2}".format( controllerIp, path, fileName )
2584 main.log.info( self.name + ": Sending: " + cmd )
2585 self.handle.sendline( cmd )
2586 self.handle.expect( self.prompt )
Devin Lim02075272017-07-10 15:33:21 -07002587 handle = self.handle.before
Jon Hall3c0114c2020-08-11 15:07:42 -07002588 if "Error" in handle or\
2589 "No such file or directory" in handle or\
2590 "command not found" in handle or\
2591 "curl: " in handle:
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002592 main.log.error( self.name + ": " + handle + self.handle.after )
Devin Lim02075272017-07-10 15:33:21 -07002593 return main.FALSE
Jon Hall3c0114c2020-08-11 15:07:42 -07002594 main.log.debug( self.name + ": " + handle )
Devin Lim752dd7b2017-06-27 14:40:03 -07002595 return main.TRUE
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002596 except pexpect.EOF:
2597 main.log.error( self.name + ": EOF exception found" )
2598 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002599 main.cleanAndExit()
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002600 except Exception:
2601 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002602 main.cleanAndExit()
Devin Lim3ebd5e72017-11-14 10:38:00 -08002603
2604 def formCluster( self, onosIPs ):
2605 """
2606 From ONOS cluster for IP addresses in onosIPs list
2607 """
2608 try:
2609 onosIPs = " ".join( onosIPs )
2610 command = "onos-form-cluster {}".format( onosIPs )
Jon Hall3c0114c2020-08-11 15:07:42 -07002611 main.log.info( self.name + ": Sending: " + command )
Devin Lim3ebd5e72017-11-14 10:38:00 -08002612 self.handle.sendline( "" )
2613 self.handle.expect( self.prompt )
2614 self.handle.sendline( command )
2615 self.handle.expect( self.prompt )
2616 handle = self.handle.before
2617 main.log.debug( handle )
2618 assert handle is not None, "Error in sendline"
2619 assert "Command not found:" not in handle, handle
2620 assert "Error" not in handle, handle
2621 assert "Exception:" not in handle, handle
2622 assert "curl:" not in handle, handle
2623 return main.TRUE
2624 except AssertionError:
2625 main.log.exception( "{} Error in onos-form-cluster output:".format( self.name ) )
2626 return main.FALSE
2627 except TypeError:
2628 main.log.exception( self.name + ": Object not as expected" )
2629 return main.FALSE
2630 except pexpect.EOF:
2631 main.log.error( self.name + ": EOF exception found" )
2632 main.log.error( self.name + ": " + self.handle.before )
2633 main.cleanAndExit()
2634 except Exception:
2635 main.log.exception( self.name + ": Uncaught exception!" )
2636 main.cleanAndExit()
Jon Hall7ce46ea2018-02-05 12:20:59 -08002637
2638 def backupData( self, location ):
2639 """
2640 Backs up ONOS data and logs to a given location. Returns main.FALSE
2641 if there is an error executing the command, and main.TRUE otherwise.
2642 required arguments:
2643 loaction - The file path to save the backup to
2644 """
2645 try:
2646 cmd = "/opt/onos/bin/onos-backup " + str( location )
2647 self.handle.sendline( cmd )
2648 self.handle.expect( self.prompt )
2649 handle = self.handle.before
2650 main.log.debug( handle )
2651 assert handle is not None, "Error in sendline"
2652 assert "Command not found:" not in handle, handle
2653 assert "Error" not in handle, handle
2654 assert "Exception:" not in handle, handle
2655 return main.TRUE
2656 except AssertionError:
2657 main.log.exception( "{} Error in onos-backup output:".format( self.name ) )
2658 return main.FALSE
2659 except TypeError:
2660 main.log.exception( self.name + ": Object not as expected" )
2661 return main.FALSE
2662 except pexpect.EOF:
2663 main.log.error( self.name + ": EOF exception found" )
2664 main.log.error( self.name + ": " + self.handle.before )
2665 main.cleanAndExit()
2666 except Exception:
2667 main.log.exception( self.name + ": Uncaught exception!" )
2668 main.cleanAndExit()
2669
2670 def restoreData( self, location ):
2671 """
2672 Restores ONOS data and logs from a given location. Returns main.FALSE
2673 if there is an error executing the command, and main.TRUE otherwise.
2674 required arguments:
2675 loaction - The file path of a backup file
2676 """
2677 try:
2678 cmd = "/opt/onos/bin/onos-restore " + str( location )
2679 self.handle.sendline( cmd )
2680 self.handle.expect( self.prompt )
2681 handle = self.handle.before
2682 main.log.debug( handle )
2683 assert handle is not None, "Error in sendline"
2684 assert "Command not found:" not in handle, handle
2685 assert "Error" not in handle, handle
2686 assert "Exception:" not in handle, handle
2687 return main.TRUE
2688 except AssertionError:
2689 main.log.exception( "{} Error in onos-restore output:".format( self.name ) )
2690 return main.FALSE
2691 except TypeError:
2692 main.log.exception( self.name + ": Object not as expected" )
2693 return main.FALSE
2694 except pexpect.EOF:
2695 main.log.error( self.name + ": EOF exception found" )
2696 main.log.error( self.name + ": " + self.handle.before )
2697 main.cleanAndExit()
2698 except Exception:
2699 main.log.exception( self.name + ": Uncaught exception!" )
2700 main.cleanAndExit()
You Wang5df1c6d2018-04-06 18:02:02 -07002701
Jon Hall43060f62020-06-23 13:13:33 -07002702 def onosDiagnostics( self, onosIPs, dstDir, suffix, timeout=300, profile="TRELLIS_PROFILE" ):
You Wang5df1c6d2018-04-06 18:02:02 -07002703 """
2704 Run onos-diagnostics with given ONOS instance IPs and save output to dstDir
2705 with suffix specified E.g. onos-diags-suffix.tar.gz
Jon Hall0e240372018-05-02 11:21:57 -07002706 required arguments:
You Wang5df1c6d2018-04-06 18:02:02 -07002707 onosIPs - list of ONOS IPs for collecting diags
2708 dstDir - diags file will be saved under the directory specified
2709 suffix - diags file will be named with the suffix specified
2710 returns:
2711 main.FALSE if there's an error executing the command, and main.TRUE otherwise
2712 """
2713 try:
Jon Hall43060f62020-06-23 13:13:33 -07002714 self.handle.sendline( "export DIAGS_PROFILE=%s" % profile )
2715 self.handle.expect( self.prompt )
You Wang5df1c6d2018-04-06 18:02:02 -07002716 cmd = "onos-diagnostics"
2717 assert isinstance( onosIPs, list )
2718 for ip in onosIPs:
2719 cmd += " " + str( ip )
2720 self.handle.sendline( cmd )
You Wang5ac7db72018-07-17 11:17:52 -07002721 self.handle.expect( self.prompt, timeout=timeout )
You Wang5df1c6d2018-04-06 18:02:02 -07002722 handle = self.handle.before
2723 main.log.debug( handle )
2724 assert handle is not None, "Error in sendline"
2725 assert "Command not found:" not in handle, handle
2726 assert "Exception:" not in handle, handle
2727 # Rename and move diags file to dstDir from /tmp
2728 if dstDir[ -1: ] != "/":
2729 dstDir += "/"
2730 self.handle.sendline( "mv /tmp/onos-diags.tar.gz " + str( dstDir ) + "onos-diags" + str( suffix ) + ".tar.gz" )
2731 self.handle.expect( self.prompt )
2732 handle = self.handle.before
2733 main.log.debug( handle )
2734 assert handle is not None, "Error in sendline"
2735 assert "No such file or directory" not in handle, handle
2736 return main.TRUE
2737 except AssertionError:
2738 main.log.exception( "{} Error in onos-diagnostics output:".format( self.name ) )
2739 return main.FALSE
2740 except TypeError:
2741 main.log.exception( self.name + ": Object not as expected" )
2742 return main.FALSE
You Wang223faa32018-06-21 10:45:47 -07002743 except pexpect.TIMEOUT:
2744 main.log.exception( self.name + ": TIMEOUT exception found in onosDiagnostics" )
2745 main.log.error( self.name + ": " + self.handle.before )
You Wangb65d2372018-08-17 15:37:59 -07002746 self.exitFromCmd( self.prompt, 100 )
You Wang223faa32018-06-21 10:45:47 -07002747 return main.FALSE
You Wang5df1c6d2018-04-06 18:02:02 -07002748 except pexpect.EOF:
2749 main.log.error( self.name + ": EOF exception found" )
2750 main.log.error( self.name + ": " + self.handle.before )
2751 main.cleanAndExit()
2752 except Exception:
2753 main.log.exception( self.name + ": Uncaught exception!" )
2754 main.cleanAndExit()
Jon Hall0e240372018-05-02 11:21:57 -07002755
2756 def onosPower( self, onosIP, toggle, userName=None ):
2757 """
2758 Run onos-power script to tell the cell warden to simulate a power faulure
2759 for the given container.
2760 required :
2761 onosIP - ONOS node IP
2762 toggle - either "off" or "on", used to indicate whether
2763 the node should be powered off or on
2764 returns:
2765 main.FALSE if there's an error executing the command, and main.TRUE otherwise
2766 """
2767 try:
2768 cmd = "onos-power {} {}".format( onosIP, toggle )
2769 if userName:
2770 cmd += " {}".format( userName )
2771 self.handle.sendline( cmd )
2772 self.handle.expect( self.prompt )
2773 handle = self.handle.before
2774 main.log.debug( handle )
2775 assert handle is not None, "Error in sendline"
2776 assert "Command not found:" not in handle, handle
2777 assert "Exception:" not in handle, handle
2778 assert "usage:" not in handle, handle
2779 return main.TRUE
2780 except AssertionError:
2781 main.log.exception( "{} Error in onos-power output:".format( self.name ) )
2782 return main.FALSE
2783 except TypeError:
2784 main.log.exception( self.name + ": Object not as expected" )
2785 return main.FALSE
2786 except pexpect.EOF:
2787 main.log.error( self.name + ": EOF exception found" )
2788 main.log.error( self.name + ": " + self.handle.before )
2789 main.cleanAndExit()
2790 except Exception:
2791 main.log.exception( self.name + ": Uncaught exception!" )
2792 main.cleanAndExit()
You Wangf9d95be2018-08-01 14:35:37 -07002793
2794 def atomixKill( self, nodeIp ):
2795 """
2796 Calls the command: 'atomix-kill [<node-ip>]'
2797 Kills the Atomix instance running on the specified node
2798 """
2799 try:
2800 self.handle.sendline( "" )
2801 self.handle.expect( self.prompt )
2802 self.handle.sendline( "atomix-kill " + str( nodeIp ) )
2803 i = self.handle.expect( [
2804 self.prompt,
2805 "No\sroute\sto\shost",
2806 "password:",
2807 pexpect.TIMEOUT ], timeout=60 )
2808
2809 if i == 0:
Jon Hall3c0114c2020-08-11 15:07:42 -07002810 main.log.info( self.name + ": Atomix instance " + str( nodeIp ) + " was killed" )
You Wangf9d95be2018-08-01 14:35:37 -07002811 return main.TRUE
2812 elif i == 1:
Jon Hall3c0114c2020-08-11 15:07:42 -07002813 main.log.info( self.name + ": No route to host" )
You Wangf9d95be2018-08-01 14:35:37 -07002814 return main.FALSE
2815 elif i == 2:
Jon Hall3c0114c2020-08-11 15:07:42 -07002816 main.log.info( self.name + ": Passwordless login for host: " + str( nodeIp ) + " not configured" )
You Wangf9d95be2018-08-01 14:35:37 -07002817 return main.FALSE
2818 else:
Jon Hall3c0114c2020-08-11 15:07:42 -07002819 main.log.info( self.name + ": Atomix instance was not killed" )
You Wangf9d95be2018-08-01 14:35:37 -07002820 return main.FALSE
2821
2822 except pexpect.EOF:
2823 main.log.error( self.name + ": EOF exception found" )
2824 main.log.error( self.name + ": " + self.handle.before )
2825 main.cleanAndExit()
2826 except Exception:
2827 main.log.exception( self.name + ": Uncaught exception!" )
2828 main.cleanAndExit()
2829
2830 def atomixUninstall( self, nodeIp="" ):
2831 """
2832 Calls the command: 'atomix-uninstall'
2833 Uninstalls Atomix from the designated node, stopping if needed
2834 """
2835 try:
2836 self.handle.sendline( "" )
2837 self.handle.expect( self.prompt, timeout=180 )
2838 self.handle.sendline( "atomix-uninstall " + str( nodeIp ) )
2839 self.handle.expect( self.prompt, timeout=180 )
Jon Hall3c0114c2020-08-11 15:07:42 -07002840 main.log.info( self.name + ": Atomix " + nodeIp + " was uninstalled" )
You Wangf9d95be2018-08-01 14:35:37 -07002841 # onos-uninstall command does not return any text
2842 return main.TRUE
2843 except pexpect.TIMEOUT:
2844 main.log.exception( self.name + ": Timeout in atomixUninstall" )
2845 self.handle.send( "\x03" ) # Control-C
2846 self.handle.expect( self.prompt )
2847 return main.FALSE
2848 except pexpect.EOF:
2849 main.log.error( self.name + ": EOF exception found" )
2850 main.log.error( self.name + ": " + self.handle.before )
2851 main.cleanAndExit()
2852 except Exception:
2853 main.log.exception( self.name + ": Uncaught exception!" )
2854 main.cleanAndExit()
2855
2856 def atomixInstall( self, options="", node="" ):
2857 """
2858 Installs Atomix on the designated nodes.
2859 Returns: main.TRUE on success and main.FALSE on failure
2860 """
2861 try:
2862 if options:
2863 self.handle.sendline( "atomix-install " + options + " " + node )
2864 else:
2865 self.handle.sendline( "atomix-install " + node )
2866 self.handle.expect( "atomix-install " )
2867 i = self.handle.expect( [ "Network\sis\sunreachable",
2868 "is already installed",
2869 "saved",
2870 self.prompt,
2871 pexpect.TIMEOUT ], timeout=180 )
2872 if i == 0:
2873 # can't reach ONOS node
Jon Hall3e6edb32018-08-21 16:20:30 -07002874 main.log.warn( self.name + ": Network is unreachable" )
You Wangf9d95be2018-08-01 14:35:37 -07002875 self.handle.expect( self.prompt )
2876 return main.FALSE
2877 elif i == 1:
2878 # same bits are already on Atomix node
Jon Hall3e6edb32018-08-21 16:20:30 -07002879 main.log.info( self.name + ": Atomix is already installed on " + node )
You Wangf9d95be2018-08-01 14:35:37 -07002880 self.handle.expect( self.prompt )
2881 return main.TRUE
Jon Hallb685a1c2018-10-30 15:17:01 -07002882 elif i == 2:
Jon Hall3e6edb32018-08-21 16:20:30 -07002883 main.log.info( self.name + ": Atomix was installed on " + node )
You Wangf9d95be2018-08-01 14:35:37 -07002884 self.handle.expect( self.prompt )
2885 return main.TRUE
Jon Hallb685a1c2018-10-30 15:17:01 -07002886 elif i == 3:
2887 self.handle.sendline( "echo Return code: $?" )
2888 self.handle.expect( "\$\?" )
2889 self.handle.expect( self.prompt )
Jon Hallb685a1c2018-10-30 15:17:01 -07002890 match = re.search( "Return code: (\d+)", self.handle.before )
2891 if match:
2892 exitCode = int( match.group( 1 ) )
2893 else:
2894 # Didn't match pattern
2895 main.log.error( "Could not parse exit code of atomix-install" )
Jon Hall5e1469a2018-11-01 13:55:53 -07002896 main.log.debug( self.handle.before + self.handle.before )
Jon Hallb685a1c2018-10-30 15:17:01 -07002897 return main.FALSE
2898 if exitCode == 0:
2899 return main.TRUE
2900 else:
Jon Hall5e1469a2018-11-01 13:55:53 -07002901 main.log.error( "Unsuccessful exit code of atomix-install" )
2902 main.log.debug( self.handle.before + self.handle.before )
Jon Hallb685a1c2018-10-30 15:17:01 -07002903 return main.FALSE
You Wangf9d95be2018-08-01 14:35:37 -07002904 elif i == 4:
2905 # timeout
Jon Hall3e6edb32018-08-21 16:20:30 -07002906 main.log.info( self.name + ": Installation of Atomix on " + node + " timed out" )
You Wangf9d95be2018-08-01 14:35:37 -07002907 self.handle.expect( self.prompt )
2908 main.log.warn( self.handle.before )
2909 self.handle.send( "\x03" ) # Control-C
2910 self.handle.expect( self.prompt )
2911 return main.FALSE
2912 except pexpect.EOF:
2913 main.log.error( self.name + ": EOF exception found" )
2914 main.log.error( self.name + ": " + self.handle.before )
2915 main.cleanAndExit()
2916 except Exception:
2917 main.log.exception( self.name + ": Uncaught exception!" )
2918 main.cleanAndExit()
Jon Hall43060f62020-06-23 13:13:33 -07002919
2920 def onosFetchApp( self, url, dstPath=None ):
2921 """
2922 Fetch an external onos app
2923
2924 Required:
2925 url - url for where to download the app
2926 dstPath - where the file will be saved
2927
2928 Returns main.TRUE on successfully fetching file, and main.FALSE if
2929 there is an error.
2930 """
2931 try:
2932 cmd = "wget -q --backups=1 "
2933 if dstPath:
2934 cmd += "-P %s " % ( dstPath )
2935 cmd += str( url )
Jon Hall3c0114c2020-08-11 15:07:42 -07002936 main.log.info( self.name + ": Sending: " + cmd )
2937 self.handle.sendline( cmd )
2938 self.handle.expect( self.prompt )
Jon Hall43060f62020-06-23 13:13:33 -07002939 output = self.handle.before
2940 main.log.debug( output )
2941 if "Error" in output or "No such file or directory" in output:
2942 main.log.error( self.name + ": " + output + self.handle.after )
2943 return main.FALSE
2944 return main.TRUE
2945 except pexpect.EOF:
2946 main.log.error( self.name + ": EOF exception found" )
2947 main.log.error( self.name + ": " + self.handle.before )
2948 main.cleanAndExit()
2949 except Exception:
2950 main.log.exception( self.name + ": Uncaught exception!" )
2951 main.cleanAndExit()
2952
2953 def onosApp( self, onosIP, option, fileName, filePath='~/onos/'):
2954 """
2955 Wrapper for onos-app script
2956
2957 Required:
2958 - onosIP - The ip address of the onos instance
2959 - option - What command are we doing?
2960 [ list|install|install!|reinstall|reinstall!|activate|deactivate|uninstall ]
2961 - fileName - The name of the app file
2962 Optional Arguments:
2963 - filePath - The location of the file
2964
2965 Returns main.TRUE on successfully executing the command, and main.FALSE if
2966 there is an error.
2967 """
2968 # FIXME: Not all options may work, more testing is required, only tested with install(!)
2969 try:
2970 cmd = "onos-app %s %s %s/%s" % ( onosIP, option, filePath, fileName )
Jon Hall3c0114c2020-08-11 15:07:42 -07002971 main.log.info( self.name + ": Sending: " + cmd )
2972 self.handle.sendline( cmd )
2973 self.handle.expect( self.prompt )
Jon Hall43060f62020-06-23 13:13:33 -07002974 handle = self.handle.before
2975 main.log.debug( handle )
2976 if "Error" in handle or "usage: " in handle or "curl: " in handle:
2977 main.log.error( self.name + ": " + handle + self.handle.after )
2978 return main.FALSE
2979 return main.TRUE
2980 except pexpect.EOF:
2981 main.log.error( self.name + ": EOF exception found" )
2982 main.log.error( self.name + ": " + self.handle.before )
2983 main.cleanAndExit()
2984 except Exception:
2985 main.log.exception( self.name + ": Uncaught exception!" )
2986 main.cleanAndExit()
Jon Hall3c0114c2020-08-11 15:07:42 -07002987
2988 def makeDocker( self, path, cmd, prompt="Successfully tagged", timeout=600 ):
2989 """
2990 Build a docker image using a command, such as make
2991 Arguments:
2992 - path: a path where the script is located. will cd to path
2993 - cmd: the command to run
2994 Optional Arguments:
2995 - prompt: A custom prompt to expect after the command is finished,
2996 incase the host prompt is printed during the build
2997 - timeout: how long to wait for the build
2998 """
2999 try:
3000 main.log.warn( "%s: makeDocker()" % self.name )
3001 self.handle.sendline( "cd %s" % path )
3002 self.handle.expect( self.prompt )
3003 self.handle.sendline( cmd )
3004 self.handle.expect( prompt, timeout=timeout )
3005 fullResponse = self.handle.before
3006 tailResponse = self.handle.after
3007 # TODO: error checking, might be difficult with custom expects
3008 self.handle.expect( self.prompt )
3009 tailResponse += self.handle.before + self.handle.after
3010 fullResponse += tailResponse
3011 main.log.debug( self.name + ": " + tailResponse )
3012 self.handle.sendline( "cd %s" % self.home )
3013 self.handle.expect( self.prompt )
3014 return main.TRUE
3015 except pexpect.EOF:
3016 main.log.error( self.name + ": EOF exception found" )
3017 main.log.error( self.name + ": " + self.handle.before )
3018 main.cleanAndExit()
3019 except Exception:
3020 main.log.exception( self.name + ": Uncaught exception!" )
3021 main.log.debug( self.name + ": " + self.handle.before )
3022 main.cleanAndExit()
3023
3024 def generateOnosConfig( self, nodeIp, path="cluster.json" ):
3025 """
3026 Generate onos cluster configuration file
3027 Arguments:
3028 - nodeIp: ip of the node this file is fore
3029 Optional Arguments:
3030 - The path to save the file to
3031 """
3032 try:
3033 main.log.info( "%s: Generating onos config file for %s" % ( self.name, nodeIp ) )
3034 self.handle.sendline( "onos-gen-config %s %s" % ( nodeIp, path ) )
3035 i = self.handle.expect( [ self.prompt, "not found", "Error" ] )
3036 response = self.handle.before
3037 if i == 0:
3038 main.log.debug( "%s: %s" % ( self.name, response ) )
3039 return main.TRUE
3040 else:
3041 response += self.handle.after
3042 self.handle.expect( self.prompt )
3043 response += self.handle.before
3044 main.log.debug( "%s: %s" % ( self.name, response ) )
3045 return main.FALSE
3046 except pexpect.EOF:
3047 main.log.error( self.name + ": EOF exception found" )
3048 main.log.error( self.name + ": " + self.handle.before )
3049 main.cleanAndExit()
3050 except Exception:
3051 main.log.exception( self.name + ": Uncaught exception!" )
3052 main.log.debug( self.name + ": " + self.handle.before )
3053 main.cleanAndExit()
3054
3055 def generateAtomixConfig( self, nodeIp, path="atomix.json" ):
3056 """
3057 Generate atomix cluster configuration file
3058 Arguments:
3059 - nodeIp: ip of the node this file is fore
3060 Optional Arguments:
3061 - The path to save the file to
3062 """
3063 try:
3064 main.log.info( "%s: Generating atomix config file for %s" % ( self.name, nodeIp ) )
3065 self.handle.sendline( "atomix-gen-config %s %s" % ( nodeIp, path ) )
3066 i = self.handle.expect( [ self.prompt, "not found", "Error" ] )
3067 response = self.handle.before
3068 if i == 0:
3069 main.log.debug( "%s: %s" % ( self.name, response ) )
3070 return main.TRUE
3071 else:
3072 response += self.handle.after
3073 self.handle.expect( self.prompt )
3074 response += self.handle.before
3075 main.log.debug( "%s: %s" % ( self.name, response ) )
3076 return main.FALSE
3077 except pexpect.EOF:
3078 main.log.error( self.name + ": EOF exception found" )
3079 main.log.error( self.name + ": " + self.handle.before )
3080 main.cleanAndExit()
3081 except Exception:
3082 main.log.exception( self.name + ": Uncaught exception!" )
3083 main.log.debug( self.name + ": " + self.handle.before )
3084 main.cleanAndExit()