blob: 08138c2dc98886310d8389b788f93f7b3032fe38 [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
pingping-lin6d23d9e2015-02-02 16:54:24 -080032from requests.models import Response
Jon Hall05b2b432014-10-08 19:53:25 -040033from drivers.common.clidriver import CLI
34
kelvin8ec71442015-01-15 16:57:00 -080035class OnosDriver( CLI ):
Jon Hall05b2b432014-10-08 19:53:25 -040036
kelvin8ec71442015-01-15 16:57:00 -080037 def __init__( self ):
38 """
39 Initialize client
40 """
Jon Hallefbd9792015-03-05 16:11:36 -080041 self.name = None
42 self.home = None
43 self.handle = None
Jon Hall6c44c0b2016-04-20 15:21:00 -070044 self.nicAddr = None
Devin Limdc78e202017-06-09 18:30:07 -070045 super( OnosDriver, self ).__init__()
kelvin8ec71442015-01-15 16:57:00 -080046
47 def connect( self, **connectargs ):
48 """
Jon Hall05b2b432014-10-08 19:53:25 -040049 Creates ssh handle for ONOS "bench".
kelvin-onlaba4074292015-07-09 15:19:49 -070050 NOTE:
51 The ip_address would come from the topo file using the host tag, the
52 value can be an environment variable as well as a "localhost" to get
53 the ip address needed to ssh to the "bench"
kelvin8ec71442015-01-15 16:57:00 -080054 """
Jon Hall05b2b432014-10-08 19:53:25 -040055 try:
Devin Limdc78e202017-06-09 18:30:07 -070056
Jon Hall05b2b432014-10-08 19:53:25 -040057 for key in connectargs:
kelvin8ec71442015-01-15 16:57:00 -080058 vars( self )[ key ] = connectargs[ key ]
andrew@onlab.us3b087132015-03-11 15:00:08 -070059 self.home = "~/onos"
Jon Hall05b2b432014-10-08 19:53:25 -040060 for key in self.options:
61 if key == "home":
kelvin8ec71442015-01-15 16:57:00 -080062 self.home = self.options[ 'home' ]
Jon Hall05b2b432014-10-08 19:53:25 -040063 break
Jon Hall274b6642015-02-17 11:57:17 -080064 if self.home is None or self.home == "":
Jon Halle94919c2015-03-23 11:42:57 -070065 self.home = "~/onos"
Jon Hall21270ac2015-02-16 17:59:55 -080066
kelvin8ec71442015-01-15 16:57:00 -080067 self.name = self.options[ 'name' ]
kelvin-onlaba4074292015-07-09 15:19:49 -070068
kelvin-onlabc2b79102015-07-14 11:41:20 -070069 # The 'nodes' tag is optional and it is not required in .topo file
kelvin-onlaba4074292015-07-09 15:19:49 -070070 for key in self.options:
71 if key == "nodes":
kelvin-onlabc2b79102015-07-14 11:41:20 -070072 # Maximum number of ONOS nodes to run, if there is any
kelvin-onlaba4074292015-07-09 15:19:49 -070073 self.maxNodes = int( self.options[ 'nodes' ] )
74 break
75 self.maxNodes = None
76
Jeremy Ronquillo82705492017-10-18 14:19:55 -070077 if self.maxNodes is None or self.maxNodes == "":
kelvin-onlabc2b79102015-07-14 11:41:20 -070078 self.maxNodes = 100
kelvin-onlaba4074292015-07-09 15:19:49 -070079
kelvin-onlabc2b79102015-07-14 11:41:20 -070080 # Grabs all OC environment variables based on max number of nodes
kelvin-onlaba4074292015-07-09 15:19:49 -070081 self.onosIps = {} # Dictionary of all possible ONOS ip
82
83 try:
84 if self.maxNodes:
kelvin-onlaba4074292015-07-09 15:19:49 -070085 for i in range( self.maxNodes ):
86 envString = "OC" + str( i + 1 )
kelvin-onlabc2b79102015-07-14 11:41:20 -070087 # If there is no more OC# then break the loop
88 if os.getenv( envString ):
89 self.onosIps[ envString ] = os.getenv( envString )
90 else:
91 self.maxNodes = len( self.onosIps )
92 main.log.info( self.name +
93 ": Created cluster data with " +
94 str( self.maxNodes ) +
95 " maximum number" +
96 " of nodes" )
97 break
kelvin-onlaba4074292015-07-09 15:19:49 -070098
99 if not self.onosIps:
100 main.log.info( "Could not read any environment variable"
101 + " please load a cell file with all" +
102 " onos IP" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700103 self.maxNodes = None
kelvin-onlaba4074292015-07-09 15:19:49 -0700104 else:
105 main.log.info( self.name + ": Found " +
106 str( self.onosIps.values() ) +
107 " ONOS IPs" )
kelvin-onlaba4074292015-07-09 15:19:49 -0700108 except KeyError:
109 main.log.info( "Invalid environment variable" )
110 except Exception as inst:
111 main.log.error( "Uncaught exception: " + str( inst ) )
112
113 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700114 if os.getenv( str( self.ip_address ) ) is not None:
kelvin-onlaba4074292015-07-09 15:19:49 -0700115 self.ip_address = os.getenv( str( self.ip_address ) )
116 else:
117 main.log.info( self.name +
118 ": Trying to connect to " +
119 self.ip_address )
kelvin-onlaba4074292015-07-09 15:19:49 -0700120 except KeyError:
121 main.log.info( "Invalid host name," +
122 " connecting to local host instead" )
123 self.ip_address = 'localhost'
124 except Exception as inst:
125 main.log.error( "Uncaught exception: " + str( inst ) )
126
kelvin8ec71442015-01-15 16:57:00 -0800127 self.handle = super( OnosDriver, self ).connect(
128 user_name=self.user_name,
kelvin-onlab08679eb2015-01-21 16:11:48 -0800129 ip_address=self.ip_address,
kelvin-onlabd3b64892015-01-20 13:26:24 -0800130 port=self.port,
131 pwd=self.pwd,
132 home=self.home )
Jon Hall05b2b432014-10-08 19:53:25 -0400133
Jon Hall05b2b432014-10-08 19:53:25 -0400134 if self.handle:
Jon Hall0fc0d452015-07-14 09:49:58 -0700135 self.handle.sendline( "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 Hall0fc0d452015-07-14 09:49:58 -0700139 main.log.info( "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 Hallc6793552016-01-19 14:18:37 -0800227 main.log.info( "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
kelvin8ec71442015-01-15 16:57:00 -0800261 main.log.info( "onos-build command returned: " +
262 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:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800288 main.log.info( "Running 'mvn clean install' on " +
289 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 )
kelvin8ec71442015-01-15 16:57:00 -0800646 # main.log.info( "DEBUG: after checkout cmd = "+
647 # 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 )
kelvin8ec71442015-01-15 16:57:00 -0800654 # main.log.info( "DEBUG: after checkout cmd = "+
655 # 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:
715 main.log.info( "self.home = " )
716 main.log.info( self.home )
717 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700718 self.handle.expect( self.prompt )
You Wang9cdf9a22017-05-01 13:44:18 -0700719 self.handle.sendline( "git name-rev --name-only HEAD" )
720 self.handle.expect( "git name-rev --name-only HEAD" )
Devin Limc20e79a2017-06-07 10:29:57 -0700721 self.handle.expect( self.prompt )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700722 lines = self.handle.before.splitlines()
723 if lines[ 1 ] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[ 1 ] ):
724 return lines[ 1 ]
You Wang9cdf9a22017-05-01 13:44:18 -0700725 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700726 main.log.info( lines[ 1 ] )
You Wang9cdf9a22017-05-01 13:44:18 -0700727 return "unexpected ONOS branch"
728 except pexpect.EOF:
729 main.log.error( self.name + ": EOF exception found" )
730 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700731 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700732 except pexpect.TIMEOUT:
733 main.log.error( self.name + ": TIMEOUT exception found" )
734 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700735 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700736 except Exception:
737 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700738 main.cleanAndExit()
pingping-lin6d23d9e2015-02-02 16:54:24 -0800739
kelvin-onlabd3b64892015-01-20 13:26:24 -0800740 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800741 """
Jon Hall274b6642015-02-17 11:57:17 -0800742 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800743 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800744 """
Jon Hall45ec0922014-10-10 19:33:49 -0400745 try:
kelvin8ec71442015-01-15 16:57:00 -0800746 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700747 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800748 self.handle.sendline(
749 "cd " +
750 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800751 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
752 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800753 # NOTE: for some reason there are backspaces inserted in this
754 # phrase when run from Jenkins on some tests
755 self.handle.expect( "never" )
Devin Limc20e79a2017-06-07 10:29:57 -0700756 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800757 response = ( self.name + ": \n" + str(
758 self.handle.before + self.handle.after ) )
759 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700760 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800761 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400762 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500763 print line
764 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700765 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800766 for line in lines[ 2:-1 ]:
767 # Bracket replacement is for Wiki-compliant
768 # formatting. '<' or '>' are interpreted
769 # as xml specific tags that cause errors
770 line = line.replace( "<", "[" )
771 line = line.replace( ">", "]" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700772 # main.log.wiki( "\t" + line )
pingping-lin763ee042015-05-20 17:45:30 -0700773 main.log.wiki( line + "<br /> " )
774 main.log.summary( line )
775 main.log.wiki( "</blockquote>" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700776 main.log.summary( "\n" )
kelvin8ec71442015-01-15 16:57:00 -0800777 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400778 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800779 main.log.error( self.name + ": EOF exception found" )
780 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700781 main.cleanAndExit()
Jon Hall368769f2014-11-19 15:43:35 -0800782 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800783 main.log.error( self.name + ": TIMEOUT exception found" )
784 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700785 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800786 except Exception:
787 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700788 main.cleanAndExit()
Jon Hall45ec0922014-10-10 19:33:49 -0400789
kelvin-onlabd3b64892015-01-20 13:26:24 -0800790 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Jon Hall810b67d2016-12-05 10:19:01 -0800791 appString, onosIpAddrs, 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 ]
820
821 # App string is hardcoded environment variables
822 # That you may wish to use by default on startup.
823 # Note that you may not want certain apps listed
824 # on here.
825 appString = "export ONOS_APPS=" + appString
826 onosGroup = "export ONOS_GROUP=" + onosUser
827 onosUser = "export ONOS_USER=" + onosUser
828 if useSSH:
829 onosUseSSH = "export ONOS_USE_SSH=true"
830 mnString = "export OCN="
831 if mnIpAddrs == "":
832 mnString = ""
833 onosString = "export OC"
834 tempCount = 1
835
836 # Create ONOSNIC ip address prefix
837 tempOnosIp = str( onosIpAddrs[ 0 ] )
838 tempList = []
839 tempList = tempOnosIp.split( "." )
840 # Omit last element of list to format for NIC
841 tempList = tempList[ :-1 ]
842 # Structure the nic string ip
843 nicAddr = ".".join( tempList ) + ".*"
844 self.nicAddr = nicAddr
845 onosNicString = "export ONOS_NIC=" + nicAddr
846
kelvin8ec71442015-01-15 16:57:00 -0800847 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800848 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400849
kelvin-onlabd3b64892015-01-20 13:26:24 -0800850 for arg in onosIpAddrs:
851 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800852 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400853 # export OC1="10.128.20.11"
854 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800855 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700856 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800857 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800858
Jon Hall6f665652015-09-18 10:08:07 -0700859 cellFile.write( "export OCI=$OC1\n" )
Jon Hallab611372018-02-21 15:26:05 -0800860 if mnString:
861 cellFile.write( mnString + "\"" + str( mnIpAddrs ) + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700862 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800863 cellFile.write( onosGroup + "\n" )
864 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700865 if useSSH:
866 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800867 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400868
kelvin8ec71442015-01-15 16:57:00 -0800869 # We use os.system to send the command to TestON cluster
870 # to account for the case in which TestON is not located
871 # on the same cluster as the ONOS bench
872 # Note that even if TestON is located on the same cluster
873 # as ONOS bench, you must setup passwordless ssh
874 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700875 os.system( "scp " + tempDirectory + fileName + " " +
876 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400877
andrewonlab2a6c9342014-10-16 13:40:15 -0400878 return main.TRUE
879
andrewonlab94282092014-10-10 13:00:11 -0400880 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800881 main.log.error( self.name + ": EOF exception found" )
882 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700883 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800884 except Exception:
885 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700886 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -0400887
kelvin-onlabd3b64892015-01-20 13:26:24 -0800888 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800889 """
andrewonlab95ca1462014-10-09 14:04:24 -0400890 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800891 """
andrewonlab95ca1462014-10-09 14:04:24 -0400892 try:
893 if not cellname:
You Wang1cdc5f52017-12-19 16:47:51 -0800894 main.log.error( self.name + ": Must define cellname" )
Devin Lim44075962017-08-11 10:56:37 -0700895 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400896 else:
kelvin8ec71442015-01-15 16:57:00 -0800897 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800898 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800899 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400900 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700901 self.handle.expect( str( cellname ) )
Jon Hallab611372018-02-21 15:26:05 -0800902 response = self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800903 i = self.handle.expect( [ "No such cell",
Jon Hallab611372018-02-21 15:26:05 -0800904 "command not found",
905 self.prompt ], timeout=10 )
906 response += self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800907 if i == 0:
Jon Hallab611372018-02-21 15:26:05 -0800908 main.log.error( self.name + ": No such cell. Response: " + str( response ) )
You Wang1cdc5f52017-12-19 16:47:51 -0800909 main.cleanAndExit()
910 elif i == 1:
Jon Hallab611372018-02-21 15:26:05 -0800911 main.log.error( self.name + ": Error setting cell. Response: " + str( response ) )
912 main.cleanAndExit()
You Wang1cdc5f52017-12-19 16:47:51 -0800913 elif i == 2:
Jon Hallab611372018-02-21 15:26:05 -0800914 main.log.info( self.name + ": Successfully set cell: " + str( response ) )
andrewonlab95ca1462014-10-09 14:04:24 -0400915 return main.TRUE
You Wang1cdc5f52017-12-19 16:47:51 -0800916 except pexpect.TIMEOUT:
917 main.log.error( self.name + ": TIMEOUT exception found" )
918 main.log.error( self.name + ": " + self.handle.before )
919 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400920 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800921 main.log.error( self.name + ": EOF exception found" )
922 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700923 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800924 except Exception:
925 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700926 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400927
kelvin-onlabd3b64892015-01-20 13:26:24 -0800928 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800929 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400930 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800931 """
932 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400933
andrewonlabc03bf6c2014-10-09 14:56:18 -0400934 try:
kelvin8ec71442015-01-15 16:57:00 -0800935 # Clean handle by sending empty and expecting $
936 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700937 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800938 self.handle.sendline( "onos-verify-cell" )
Devin Limc20e79a2017-06-07 10:29:57 -0700939 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800940 handleBefore = self.handle.before
941 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800942 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700943 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400944 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800945 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700946 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800947 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700948 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800949 except Exception:
950 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700951 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400952
jenkins1e99e7b2015-04-02 18:15:39 -0700953 def onosCfgSet( self, ONOSIp, configName, configParam ):
954 """
955 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700956 application.
957
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000958 ex)
jenkins1e99e7b2015-04-02 18:15:39 -0700959 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700960 ONOSIp = '10.0.0.1'
961 configName = 'org.onosproject.myapp'
962 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700963 """
Jon Hall72280bc2016-01-25 14:29:05 -0800964 try:
965 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
966 configName,
967 configParam )
968 self.handle.sendline( "" )
969 self.handle.expect( ":~" )
970 self.handle.sendline( cfgStr )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700971 self.handle.expect( "cfg set" )
Jon Hall72280bc2016-01-25 14:29:05 -0800972 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700973
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700974 paramValue = configParam.split( " " )[ 1 ]
975 paramName = configParam.split( " " )[ 0 ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700976
Jon Hall72280bc2016-01-25 14:29:05 -0800977 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700978
Jon Hall72280bc2016-01-25 14:29:05 -0800979 self.handle.sendline( checkStr )
980 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700981
Jon Hall72280bc2016-01-25 14:29:05 -0800982 if "value=" + paramValue + "," in self.handle.before:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700983 main.log.info( "cfg " + configName + " successfully set to " + configParam )
Jon Hall72280bc2016-01-25 14:29:05 -0800984 return main.TRUE
985 except pexpect.ExceptionPexpect as e:
986 main.log.exception( self.name + ": Pexpect exception found: " )
987 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700988 main.cleanAndExit()
Jon Hall72280bc2016-01-25 14:29:05 -0800989 except Exception:
990 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700991 main.cleanAndExit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700992
You Wang54b1d672018-06-11 16:44:13 -0700993 def onosCli( self, ONOSIp, cmdstr, timeout=60 ):
kelvin8ec71442015-01-15 16:57:00 -0800994 """
andrewonlab05e362f2014-10-10 00:40:57 -0400995 Uses 'onos' command to send various ONOS CLI arguments.
996 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800997 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400998 * cmdstr: specify the command string to send
You Wang54b1d672018-06-11 16:44:13 -0700999 Optional:
1000 * timeout: pexpect timeout for running the command
kelvin8ec71442015-01-15 16:57:00 -08001001
1002 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -04001003 CLI commands for ONOS. Try to use this function first
1004 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -08001005 function.
1006 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -04001007 by starting onos, and typing in 'onos' to enter the
1008 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -08001009 available commands.
1010 """
andrewonlab05e362f2014-10-10 00:40:57 -04001011 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001012 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -08001013 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -04001014 return main.FALSE
1015 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -08001016 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -04001017 return main.FALSE
1018
kelvin8ec71442015-01-15 16:57:00 -08001019 cmdstr = str( cmdstr )
1020 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001021 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -04001022
You Wangdd3dae52018-02-15 13:31:25 -08001023 self.handle.sendline( "onos-wait-for-start " + ONOSIp )
1024 self.handle.expect( self.prompt )
1025
1026 self.handle.sendline( "onos " + ONOSIp + " " + cmdstr )
You Wang54b1d672018-06-11 16:44:13 -07001027 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ], timeout=timeout )
1028 if i == 0:
1029 handleBefore = self.handle.before
1030 main.log.info( "Command sent successfully" )
1031 # Obtain return handle that consists of result from
1032 # the onos command. The string may need to be
1033 # configured further.
1034 returnString = handleBefore
1035 return returnString
1036 elif i == 1:
1037 main.log.error( self.name + ": Timeout when sending " + cmdstr )
You Wang141b43b2018-06-26 16:50:18 -07001038 self.handle.send( "\x03" ) # Control-C
You Wang54b1d672018-06-11 16:44:13 -07001039 self.handle.expect( self.prompt )
1040 return main.FALSE
You Wangd66de192018-04-30 17:30:12 -07001041 except pexpect.TIMEOUT:
1042 main.log.exception( self.name + ": Timeout when sending " + cmdstr )
1043 return main.FALSE
andrewonlab05e362f2014-10-10 00:40:57 -04001044 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001045 main.log.error( self.name + ": EOF exception found" )
1046 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001047 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001048 except Exception:
1049 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001050 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -04001051
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001052 def onosSecureSSH( self, userName="onos", userPWD="rocks", node="" ):
Pier88189b62016-09-07 17:01:53 -07001053 """
1054 Enables secure access to ONOS console
1055 by removing default users & keys.
1056
1057 onos-secure-ssh -u onos -p rocks node
1058
1059 Returns: main.TRUE on success and main.FALSE on failure
1060 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001061
Pier88189b62016-09-07 17:01:53 -07001062 try:
Chiyu Chengef109502016-11-21 15:51:38 -08001063 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001064 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001065 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
1066
1067 # NOTE: this timeout may need to change depending on the network
1068 # and size of ONOS
1069 # TODO: Handle the other possible error
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001070 i = self.handle.expect( [ "Network\sis\sunreachable",
1071 self.prompt,
1072 pexpect.TIMEOUT ], timeout=180 )
Pier88189b62016-09-07 17:01:53 -07001073 if i == 0:
1074 # can't reach ONOS node
1075 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001076 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001077 return main.FALSE
1078 elif i == 1:
1079 # Process started
1080 main.log.info(
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001081 "Secure SSH performed on " +
1082 node )
Pier88189b62016-09-07 17:01:53 -07001083 return main.TRUE
1084 except pexpect.EOF:
1085 main.log.error( self.name + ": EOF exception found" )
1086 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001087 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001088 except Exception:
1089 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001090 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001091
kelvin-onlabd3b64892015-01-20 13:26:24 -08001092 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001093 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001094 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001095 If -f option is provided, it also forces an uninstall.
1096 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001097 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001098 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001099 files to certain onos nodes
1100
1101 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001102 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001103 try:
andrewonlab114768a2014-11-14 12:44:44 -05001104 if options:
kelvin8ec71442015-01-15 16:57:00 -08001105 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001106 else:
kelvin8ec71442015-01-15 16:57:00 -08001107 self.handle.sendline( "onos-install " + node )
1108 self.handle.expect( "onos-install " )
1109 # NOTE: this timeout may need to change depending on the network
1110 # and size of ONOS
1111 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001112 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001113 "ONOS\sis\salready\sinstalled",
Jon Hall3576f572016-08-23 10:01:07 -07001114 "does not exist",
Devin Limc20e79a2017-06-07 10:29:57 -07001115 self.prompt,
Jon Hall6c44c0b2016-04-20 15:21:00 -07001116 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001117 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001118 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001119 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001120 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001121 return main.FALSE
1122 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001123 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001124 main.log.info(
1125 "ONOS was installed on " +
1126 node +
1127 " and started" )
Devin Limc20e79a2017-06-07 10:29:57 -07001128 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001129 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001130 elif i == 2:
Jon Hall3576f572016-08-23 10:01:07 -07001131 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001132 main.log.info( "ONOS is already installed on " + node )
Devin Limc20e79a2017-06-07 10:29:57 -07001133 self.handle.expect( self.prompt )
Jeremyc72b2582016-02-26 18:27:38 -08001134 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001135 elif i == 3:
Jon Hall3576f572016-08-23 10:01:07 -07001136 # onos not packaged
1137 main.log.error( "ONOS package not found." )
Devin Limc20e79a2017-06-07 10:29:57 -07001138 self.handle.expect( self.prompt )
Jon Hall3576f572016-08-23 10:01:07 -07001139 return main.FALSE
You Wangd65ba842018-08-14 11:20:59 -07001140 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001141 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001142 main.log.info( "ONOS was installed on " + node )
1143 return main.TRUE
You Wangd65ba842018-08-14 11:20:59 -07001144 elif i == 5:
Jon Hall3576f572016-08-23 10:01:07 -07001145 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001146 main.log.info(
1147 "Installation of ONOS on " +
1148 node +
1149 " timed out" )
Devin Limc20e79a2017-06-07 10:29:57 -07001150 self.handle.expect( self.prompt )
Jon Hall53c5e662016-04-13 16:06:56 -07001151 main.log.warn( self.handle.before )
You Wang141b43b2018-06-26 16:50:18 -07001152 self.handle.send( "\x03" ) # Control-C
1153 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001154 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001155 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001156 main.log.error( self.name + ": EOF exception found" )
1157 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001158 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001159 except Exception:
1160 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001161 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -04001162
kelvin-onlabd3b64892015-01-20 13:26:24 -08001163 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001164 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001165 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001166 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001167 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001168 try:
kelvin8ec71442015-01-15 16:57:00 -08001169 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001170 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001171 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001172 " start" )
1173 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001174 "Job\sis\salready\srunning",
1175 "start/running",
Devin Limc20e79a2017-06-07 10:29:57 -07001176 self.prompt,
andrewonlab8d0d7d72014-10-09 16:33:15 -04001177 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001178 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001179 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001180 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001181 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001182 return main.TRUE
1183 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001184 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001185 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001186 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001187 elif i == 2:
1188 main.log.info( "ONOS service started" )
1189 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001190 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001191 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001192 main.log.error( "ONOS service failed to start" )
Devin Lim44075962017-08-11 10:56:37 -07001193
1194 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001195 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001196 main.log.error( self.name + ": EOF exception found" )
1197 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001198 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001199 except Exception:
1200 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001201 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001202
kelvin-onlabd3b64892015-01-20 13:26:24 -08001203 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001204 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001205 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001206 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001207 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001208 try:
kelvin8ec71442015-01-15 16:57:00 -08001209 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001210 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001211 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001212 " stop" )
1213 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001214 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001215 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001216 "Unknown\sinstance",
Devin Limc20e79a2017-06-07 10:29:57 -07001217 self.prompt,
Jeremy Songster14c13572016-04-21 17:34:03 -07001218 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001219 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001220 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001221 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001222 return main.TRUE
1223 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001224 self.handle.expect( self.prompt )
Jon Hall65844a32015-03-09 19:09:37 -07001225 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001226 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001227 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001228 elif i == 2:
Devin Limc20e79a2017-06-07 10:29:57 -07001229 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -07001230 main.log.warn( "ONOS wasn't running" )
1231 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001232 elif i == 3:
1233 main.log.info( "ONOS service stopped" )
1234 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001235 else:
kelvin8ec71442015-01-15 16:57:00 -08001236 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001237 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001238 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001239 main.log.error( self.name + ": EOF exception found" )
1240 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001241 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001242 except Exception:
1243 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001244 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001245
kelvin-onlabd3b64892015-01-20 13:26:24 -08001246 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001247 """
andrewonlabc8d47972014-10-09 16:52:36 -04001248 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001249 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001250 if needed
kelvin8ec71442015-01-15 16:57:00 -08001251 """
andrewonlabc8d47972014-10-09 16:52:36 -04001252 try:
kelvin8ec71442015-01-15 16:57:00 -08001253 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001254 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001255 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Devin Limc20e79a2017-06-07 10:29:57 -07001256 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001257 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001258 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001259 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001260 except pexpect.TIMEOUT:
1261 main.log.exception( self.name + ": Timeout in onosUninstall" )
You Wang141b43b2018-06-26 16:50:18 -07001262 self.handle.send( "\x03" ) # Control-C
1263 self.handle.expect( self.prompt )
pingping-lin763ee042015-05-20 17:45:30 -07001264 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001265 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001266 main.log.error( self.name + ": EOF exception found" )
1267 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001268 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001269 except Exception:
1270 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001271 main.cleanAndExit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001272
kelvin-onlabd3b64892015-01-20 13:26:24 -08001273 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001274 """
andrewonlabaedc8332014-12-04 12:43:03 -05001275 Issues the command 'onos-die <node-ip>'
1276 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001277 """
andrewonlabaedc8332014-12-04 12:43:03 -05001278 try:
kelvin8ec71442015-01-15 16:57:00 -08001279 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001280 self.handle.expect( self.prompt )
Jeremyf0aecdb2016-03-30 13:19:57 -07001281 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001282 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001283 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001284 "Killing\sONOS",
1285 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001286 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001287 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001288 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001289 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001290 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001291 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001292 return main.TRUE
1293 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001294 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001295 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001296 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001297 return main.FALSE
1298 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001299 main.log.error( self.name + ": EOF exception found" )
1300 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001301 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001302 except Exception:
1303 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001304 main.cleanAndExit()
andrewonlabaedc8332014-12-04 12:43:03 -05001305
kelvin-onlabd3b64892015-01-20 13:26:24 -08001306 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001307 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001308 Calls the command: 'onos-kill [<node-ip>]'
1309 "Remotely, and unceremoniously kills the ONOS instance running on
1310 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001311 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001312 try:
kelvin8ec71442015-01-15 16:57:00 -08001313 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001314 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001315 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001316 i = self.handle.expect( [
Devin Limc20e79a2017-06-07 10:29:57 -07001317 self.prompt,
andrewonlabe8e56fd2014-10-09 17:12:44 -04001318 "No\sroute\sto\shost",
1319 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001320 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001321
andrewonlabe8e56fd2014-10-09 17:12:44 -04001322 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001323 main.log.info(
1324 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001325 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001326 return main.TRUE
1327 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001328 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001329 return main.FALSE
1330 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001331 main.log.info(
1332 "Passwordless login for host: " +
1333 str( nodeIp ) +
1334 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001335 return main.FALSE
1336 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001337 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001338 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001339
andrewonlabe8e56fd2014-10-09 17:12:44 -04001340 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001341 main.log.error( self.name + ": EOF exception found" )
1342 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001343 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001344 except Exception:
1345 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001346 main.cleanAndExit()
andrewonlabe8e56fd2014-10-09 17:12:44 -04001347
kelvin-onlabd3b64892015-01-20 13:26:24 -08001348 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001349 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001350 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001351 a cleaner environment.
1352
andrewonlab19fbdca2014-11-14 12:55:59 -05001353 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001354 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001355 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001356 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001357 try:
kelvin8ec71442015-01-15 16:57:00 -08001358 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001359 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001360 self.handle.sendline( "onos-remove-raft-logs" )
1361 # Sometimes this command hangs
Devin Limc20e79a2017-06-07 10:29:57 -07001362 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001363 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001364 if i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001365 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001366 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001367 if i == 1:
1368 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001369 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001370 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001371 main.log.error( self.name + ": EOF exception found" )
1372 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001373 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001374 except Exception:
1375 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001376 main.cleanAndExit()
Jon Hallfcc88622014-11-25 13:09:54 -05001377
kelvin-onlabd3b64892015-01-20 13:26:24 -08001378 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001379 """
1380 Calls the command 'onos-start-network [ <mininet-topo> ]
1381 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001382 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001383 cell."
andrewonlab94282092014-10-10 13:00:11 -04001384 * Specify mininet topology file name for mntopo
1385 * Topo files should be placed at:
1386 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001387
andrewonlab94282092014-10-10 13:00:11 -04001388 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001389 """
andrewonlab94282092014-10-10 13:00:11 -04001390 try:
1391 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001392 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001393 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001394
kelvin8ec71442015-01-15 16:57:00 -08001395 mntopo = str( mntopo )
1396 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001397 self.handle.expect( self.prompt )
andrewonlab94282092014-10-10 13:00:11 -04001398
kelvin8ec71442015-01-15 16:57:00 -08001399 self.handle.sendline( "onos-start-network " + mntopo )
1400 self.handle.expect( "mininet>" )
1401 main.log.info( "Network started, entered mininet prompt" )
1402
1403 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001404
1405 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001406 main.log.error( self.name + ": EOF exception found" )
1407 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001408 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001409 except Exception:
1410 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001411 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -04001412
Jeremy Songster14c13572016-04-21 17:34:03 -07001413 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001414 """
1415 Run's onos-wait-for-start which only returns once ONOS is at run
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001416 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001417
Jon Hall7993bfc2014-10-09 16:30:14 -04001418 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001419 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001420 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001421 self.handle.sendline( "onos-wait-for-start " + node )
1422 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001423 # NOTE: this timeout is arbitrary"
Jon Hallcababf72018-02-05 12:05:19 -08001424 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT, "Password:" ], timeout )
Jon Hall7993bfc2014-10-09 16:30:14 -04001425 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001426 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001427 return main.TRUE
Jon Hallcababf72018-02-05 12:05:19 -08001428 elif i == 1 or i == 2:
kelvin8ec71442015-01-15 16:57:00 -08001429 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001430 # we will kill it on timeout
Jon Hallcababf72018-02-05 12:05:19 -08001431 if i == 1:
1432 main.log.error( "ONOS has not started yet" )
1433 elif i == 2:
1434 main.log.error( "Cannot login to ONOS CLI, try using onos-secure-ssh" )
kelvin8ec71442015-01-15 16:57:00 -08001435 self.handle.send( "\x03" ) # Control-C
Devin Limc20e79a2017-06-07 10:29:57 -07001436 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001437 return main.FALSE
1438 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001439 main.log.error( self.name + ": EOF exception found" )
1440 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001441 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001442 except Exception:
1443 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001444 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001445
Devin Lim142b5342017-07-20 15:22:39 -07001446 def preventAutoRespawn( self ):
1447 """
1448 Description:
1449 This will prevent ONOSservice to automatically
1450 respawn.
1451 """
1452 try:
1453 self.handle.sendline( "sed -i -e 's/^respawn$/#respawn/g' tools/package/init/onos.conf" )
1454 self.handle.expect( "\$" ) # $ from the command
1455 self.handle.sendline( "sed -i -e 's/^Restart=always/Restart=no/g' tools/package/init/onos.service" )
1456 self.handle.expect( "\$" ) # $ from the command
1457 self.handle.expect( "\$" ) # $ from the prompt
1458 except pexpect.EOF:
1459 main.log.error( self.name + ": EOF exception found" )
1460 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001461 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001462 except Exception:
1463 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001464 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001465
kelvin-onlabd3b64892015-01-20 13:26:24 -08001466 def pushTestIntentsShell(
1467 self,
1468 dpidSrc,
1469 dpidDst,
1470 numIntents,
1471 dirFile,
1472 onosIp,
1473 numMult="",
1474 appId="",
1475 report=True,
1476 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001477 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001478 Description:
kelvin8ec71442015-01-15 16:57:00 -08001479 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001480 better parallelize the results than the CLI
1481 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001482 * dpidSrc: specify source dpid
1483 * dpidDst: specify destination dpid
1484 * numIntents: specify number of intents to push
1485 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001486 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001487 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001488 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001489 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001490 """
1491 try:
1492 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001493 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001494 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001495 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001496 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001497 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001498
kelvin-onlabd3b64892015-01-20 13:26:24 -08001499 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1500 if not numMult:
1501 addIntents = addDpid + " " + str( numIntents )
1502 elif numMult:
1503 addIntents = addDpid + " " + str( numIntents ) + " " +\
1504 str( numMult )
1505 if appId:
1506 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001507 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001508 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001509
andrewonlabaedc8332014-12-04 12:43:03 -05001510 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001511 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001512 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001513 sendCmd = addApp + " &"
1514 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001515
kelvin-onlabd3b64892015-01-20 13:26:24 -08001516 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001517
1518 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001519 main.log.error( self.name + ": EOF exception found" )
1520 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001521 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001522 except Exception:
1523 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001524 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001525
kelvin-onlabd3b64892015-01-20 13:26:24 -08001526 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001527 """
andrewonlab970399c2014-11-07 13:09:32 -05001528 Capture all packet activity and store in specified
1529 directory/file
1530
1531 Required:
1532 * interface: interface to capture
1533 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001534 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001535 try:
1536 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001537 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001538
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001539 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001540 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001541 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001542 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001543 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001544
Jon Hallfebb1c72015-03-05 13:30:09 -08001545 main.log.info( "Tshark started capturing files on " +
1546 str( interface ) + " and saving to directory: " +
1547 str( dirFile ) )
1548 except pexpect.EOF:
1549 main.log.error( self.name + ": EOF exception found" )
1550 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001551 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001552 except Exception:
1553 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001554 main.cleanAndExit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001555
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001556 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001557 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001558 Description:
1559 Execute onos-topo-cfg command
1560 Required:
1561 onosIp - IP of the onos node you want to send the json to
1562 jsonFile - File path of the json file
1563 Return:
1564 Returns main.TRUE if the command is successfull; Returns
1565 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001566 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001567 try:
kelvin8ec71442015-01-15 16:57:00 -08001568 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001569 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001570 cmd = "onos-topo-cfg "
1571 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1572 handle = self.handle.before
1573 print handle
1574 if "Error" in handle:
1575 main.log.error( self.name + ": " + self.handle.before )
1576 return main.FALSE
1577 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001578 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001579 return main.TRUE
1580
Jon Hallfebb1c72015-03-05 13:30:09 -08001581 except pexpect.EOF:
1582 main.log.error( self.name + ": EOF exception found" )
1583 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001584 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001585 except Exception:
1586 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001587 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001588
jenkins1e99e7b2015-04-02 18:15:39 -07001589 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001590 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001591 Required:
kelvin8ec71442015-01-15 16:57:00 -08001592 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001593 * directory to store results
1594 Optional:
1595 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001596 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001597 Description:
1598 Uses tshark command to grep specific group of packets
1599 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001600 The timestamp is hardcoded to be in epoch
1601 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001602 try:
1603 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001604 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001605 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001606 if grepOptions:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001607 grepStr = "grep " + str( grepOptions )
jenkins1e99e7b2015-04-02 18:15:39 -07001608 else:
1609 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001610
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001611 cmd = (
1612 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001613 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001614 " -t e | " +
1615 grepStr + " --line-buffered \"" +
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001616 str( grep ) +
Jon Hallfebb1c72015-03-05 13:30:09 -08001617 "\" >" +
1618 directory +
1619 " &" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001620 self.handle.sendline( cmd )
1621 main.log.info( cmd )
Jon Hallfebb1c72015-03-05 13:30:09 -08001622 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001623 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001624 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001625 except pexpect.EOF:
1626 main.log.error( self.name + ": EOF exception found" )
1627 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001628 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001629 except Exception:
1630 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001631 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001632
kelvin-onlabd3b64892015-01-20 13:26:24 -08001633 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001634 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001635 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001636 """
1637 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001638 try:
1639 self.execute( cmd="sudo rm /tmp/wireshark*" )
1640 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001641 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1642 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001643 self.handle.sendline( "" )
1644 main.log.info( "Tshark stopped" )
1645 except pexpect.EOF:
1646 main.log.error( self.name + ": EOF exception found" )
1647 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001648 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001649 except Exception:
1650 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001651 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001652
kelvin8ec71442015-01-15 16:57:00 -08001653 def ptpd( self, args ):
1654 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001655 Initiate ptp with user-specified args.
1656 Required:
1657 * args: specify string of args after command
1658 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001659 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001660 try:
kelvin8ec71442015-01-15 16:57:00 -08001661 self.handle.sendline( "sudo ptpd " + str( args ) )
1662 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001663 "Multiple",
1664 "Error",
Devin Limc20e79a2017-06-07 10:29:57 -07001665 self.prompt ] )
1666 self.handle.expect( self.prompt )
andrewonlabba44bcf2014-10-16 16:54:41 -04001667
andrewonlab0c38a4a2014-10-28 18:35:35 -04001668 if i == 0:
1669 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001670 main.log.info( "ptpd returned an error: " +
1671 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001672 return handle
1673 elif i == 1:
1674 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001675 main.log.error( "ptpd returned an error: " +
1676 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001677 return handle
1678 else:
1679 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001680
andrewonlab0c38a4a2014-10-28 18:35:35 -04001681 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001682 main.log.error( self.name + ": EOF exception found" )
1683 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001684 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001685 except Exception:
1686 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001687 main.cleanAndExit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001688
You Wang54b1d672018-06-11 16:44:13 -07001689 def dumpONOSCmd( self, ONOSIp, CMD, destDir, filename, options="", timeout=60 ):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001690 """
Pier50f0bc62016-09-07 17:53:40 -07001691 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001692 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001693 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001694 Localtime will be attached to the filename
1695
1696 Required:
1697 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001698 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001699 * destDir: specify directory to copy to.
1700 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001701 * fileName: Name of the file
You Wang54b1d672018-06-11 16:44:13 -07001702 Optional:
Pier50f0bc62016-09-07 17:53:40 -07001703 * options: Options for ONOS command
You Wang54b1d672018-06-11 16:44:13 -07001704 * timeout: pexpect timeout for running the ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001705 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001706
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001707 localtime = time.strftime( '%x %X' )
1708 localtime = localtime.replace( "/", "" )
1709 localtime = localtime.replace( " ", "_" )
1710 localtime = localtime.replace( ":", "" )
1711 if destDir[ -1: ] != "/":
1712 destDir += "/"
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001713 cmd = CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
You Wang54b1d672018-06-11 16:44:13 -07001714 return self.onosCli( ONOSIp, cmd, timeout=timeout )
Flavio Castrob7718952016-05-18 08:53:41 -07001715
kelvin-onlabd3b64892015-01-20 13:26:24 -08001716 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001717 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001718 """
1719 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001720 Current implementation of ONOS deletes its karaf
1721 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001722 you may want to use this function to capture
1723 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001724 Localtime will be attached to the filename
1725
1726 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001727 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001728 copy.
kelvin8ec71442015-01-15 16:57:00 -08001729 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001730 For copying multiple files, leave copyFileName
1731 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001732 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001733 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001734 ex ) /tmp/
1735 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001736 * copyFileName: If you want to rename the log
1737 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001738 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001739 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001740 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001741 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001742 localtime = localtime.replace( "/", "" )
1743 localtime = localtime.replace( " ", "_" )
1744 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001745 if destDir[ -1: ] != "/":
1746 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001747
kelvin-onlabd3b64892015-01-20 13:26:24 -08001748 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001749 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1750 str( destDir ) + str( copyFileName ) +
1751 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001752 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001753 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001754 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001755 self.handle.sendline( "cp " + str( logToCopy ) +
1756 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001757 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001758 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001759
kelvin8ec71442015-01-15 16:57:00 -08001760 return self.handle.before
1761
1762 except pexpect.EOF:
1763 main.log.error( "Copying files failed" )
1764 main.log.error( self.name + ": EOF exception found" )
1765 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001766 except Exception:
1767 main.log.exception( "Copying files failed" )
1768
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001769 def checkLogs( self, onosIp, restart=False ):
kelvin8ec71442015-01-15 16:57:00 -08001770 """
Jon Hall94fd0472014-12-08 11:52:42 -08001771 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001772 If restart is True, use the old version of onos-check-logs which
1773 does not print the full stacktrace, but shows the entire log file,
1774 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001775 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001776 """
Jon Hall94fd0472014-12-08 11:52:42 -08001777 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001778 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001779 if restart:
1780 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001781 self.handle.sendline( cmd )
1782 self.handle.expect( cmd )
Devin Limdc78e202017-06-09 18:30:07 -07001783 self.handle.expect( self.prompt + " " )
Jon Hall94fd0472014-12-08 11:52:42 -08001784 response = self.handle.before
1785 return response
1786 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001787 main.log.error( "Lost ssh connection" )
1788 main.log.error( self.name + ": EOF exception found" )
1789 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001790 except Exception:
1791 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001792 main.cleanAndExit()
Jon Hall94fd0472014-12-08 11:52:42 -08001793
kelvin-onlabd3b64892015-01-20 13:26:24 -08001794 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001795 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001796 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001797 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001798 try:
kelvin8ec71442015-01-15 16:57:00 -08001799 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001800 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001801 self.handle.sendline( "onos-service " + str( node ) +
1802 " status" )
1803 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001804 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001805 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001806 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001807 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001808 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001809 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001810 self.handle.expect( self.prompt )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001811
You Wangef1e6572016-03-08 12:53:18 -08001812 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001813 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001814 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001815 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001816 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001817 main.log.error( "ONOS service failed to check the status" )
Devin Lim44075962017-08-11 10:56:37 -07001818
1819 main.cleanAndExit()
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001820 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001821 main.log.error( self.name + ": EOF exception found" )
1822 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001823 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001824 except Exception:
1825 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001826 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001827
Jon Hall63604932015-02-26 17:09:50 -08001828 def setIpTables( self, ip, port='', action='add', packet_type='',
1829 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001830 """
Jon Hall21270ac2015-02-16 17:59:55 -08001831 Description:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001832 add or remove iptables rule to DROP (default) packets from
Jon Hall21270ac2015-02-16 17:59:55 -08001833 specific IP and PORT
1834 Usage:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001835 * specify action ('add' or 'remove')
Jon Hall21270ac2015-02-16 17:59:55 -08001836 when removing, pass in the same argument as you would add. It will
1837 delete that specific rule.
1838 * specify the ip to block
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001839 * specify the destination port to block (defaults to all ports)
1840 * optional packet type to block (default tcp)
1841 * optional iptables rule (default DROP)
1842 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001843 * States boolean toggles adding all supported tcp states to the
1844 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001845 Returns:
1846 main.TRUE on success or
1847 main.FALSE if given invalid input or
1848 main.ERROR if there is an error in response from iptables
1849 WARNING:
1850 * This function uses root privilege iptables command which may result
1851 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001852 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001853
Jon Hall21270ac2015-02-16 17:59:55 -08001854 # NOTE*********
1855 # The strict checking methods of this driver function is intentional
1856 # to discourage any misuse or error of iptables, which can cause
1857 # severe network errors
1858 # *************
1859
1860 # NOTE: Sleep needed to give some time for rule to be added and
1861 # registered to the instance. If you are calling this function
1862 # multiple times this sleep will prevent any errors.
1863 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001864 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001865 try:
1866 # input validation
1867 action_type = action.lower()
1868 rule = rule.upper()
1869 direction = direction.upper()
1870 if action_type != 'add' and action_type != 'remove':
1871 main.log.error( "Invalid action type. Use 'add' or "
1872 "'remove' table rule" )
1873 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1874 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1875 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1876 "'ACCEPT' or 'LOG' only." )
1877 if direction != 'INPUT' and direction != 'OUTPUT':
1878 # NOTE currently only supports rules INPUT and OUPTUT
1879 main.log.error( "Invalid rule. Valid directions are"
1880 " 'OUTPUT' or 'INPUT'" )
1881 return main.FALSE
1882 return main.FALSE
1883 return main.FALSE
1884 if action_type == 'add':
1885 # -A is the 'append' action of iptables
1886 actionFlag = '-A'
1887 elif action_type == 'remove':
1888 # -D is the 'delete' rule of iptables
1889 actionFlag = '-D'
1890 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001891 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001892 cmd = "sudo iptables " + actionFlag + " " +\
1893 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001894 " -s " + str( ip )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001895 # " -p " + str( packet_type ) +\
Jon Hall63604932015-02-26 17:09:50 -08001896 if packet_type:
1897 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001898 if port:
1899 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001900 if states:
1901 cmd += " -m state --state="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001902 # FIXME- Allow user to configure which states to block
Jon Hall63604932015-02-26 17:09:50 -08001903 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001904 cmd += " -j " + str( rule )
1905
1906 self.handle.sendline( cmd )
Devin Limc20e79a2017-06-07 10:29:57 -07001907 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001908 main.log.warn( self.handle.before )
1909
1910 info_string = "On " + str( self.name )
1911 info_string += " " + str( action_type )
1912 info_string += " iptable rule [ "
1913 info_string += " IP: " + str( ip )
1914 info_string += " Port: " + str( port )
1915 info_string += " Rule: " + str( rule )
1916 info_string += " Direction: " + str( direction ) + " ]"
1917 main.log.info( info_string )
1918 return main.TRUE
1919 except pexpect.TIMEOUT:
1920 main.log.exception( self.name + ": Timeout exception in "
1921 "setIpTables function" )
You Wang141b43b2018-06-26 16:50:18 -07001922 self.handle.send( "\x03" ) # Control-C
1923 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001924 return main.ERROR
1925 except pexpect.EOF:
1926 main.log.error( self.name + ": EOF exception found" )
1927 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001928 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001929 except Exception:
1930 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001931 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001932
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001933 def detailed_status( self, log_filename ):
Jon Hallefbd9792015-03-05 16:11:36 -08001934 """
Jon Hall0468b042015-02-19 19:08:21 -08001935 This method is used by STS to check the status of the controller
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001936 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001937 """
Jon Hall0468b042015-02-19 19:08:21 -08001938 import re
1939 try:
1940 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001941 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001942 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -07001943 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001944 self.handle.sendline( "service onos status" )
Devin Limc20e79a2017-06-07 10:29:57 -07001945 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001946 response = self.handle.before
1947 if re.search( "onos start/running", response ):
1948 # onos start/running, process 10457
1949 return 'RUNNING'
1950 # FIXME: Implement this case
1951 # elif re.search( pattern, response ):
1952 # return 'STARTING'
1953 elif re.search( "onos stop/", response ):
1954 # onos stop/waiting
1955 # FIXME handle this differently?: onos stop/pre-stop
1956 return 'STOPPED'
1957 # FIXME: Implement this case
1958 # elif re.search( pattern, response ):
1959 # return 'FROZEN'
1960 else:
1961 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001962 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001963 main.log.warn( response )
1964 return 'ERROR', "Unknown response: %s" % response
1965 except pexpect.TIMEOUT:
1966 main.log.exception( self.name + ": Timeout exception in "
1967 "setIpTables function" )
You Wang141b43b2018-06-26 16:50:18 -07001968 self.handle.send( "\x03" ) # Control-C
1969 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001970 return 'ERROR', "Pexpect Timeout"
1971 except pexpect.EOF:
1972 main.log.error( self.name + ": EOF exception found" )
1973 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001974 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001975 except Exception:
1976 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001977 main.cleanAndExit()
Jon Hall0468b042015-02-19 19:08:21 -08001978
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001979 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001980 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001981 Create/formats the LinkGraph.cfg file based on arguments
1982 -only creates a linear topology and connects islands
1983 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001984 -must be called by ONOSbench
1985
Jon Hall4ba53f02015-07-29 13:07:41 -07001986 ONOSIpList - list of all of the node IPs to be used
1987
1988 deviceCount - number of switches to be assigned
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001989 '''
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001990 main.log.info( "Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001991 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001992 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001993
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001994 linkGraph = open( tempFile, 'w+' )
1995 linkGraph.write( "# NullLinkProvider topology description (config file).\n" )
1996 linkGraph.write( "# The NodeId is only added if the destination is another node's device.\n" )
1997 linkGraph.write( "# Bugs: Comments cannot be appended to a line to be read.\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001998
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001999 clusterCount = len( ONOSIpList )
Jon Hall4ba53f02015-07-29 13:07:41 -07002000
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002001 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
2002 deviceCount = int( deviceCount )
2003 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002004 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07002005
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002006 for node in range( 1, clusterCount + 1 ):
2007 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002008
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002009 for node in range( 1, ( deviceCount % clusterCount )+1 ):
2010 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002011
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002012 if isinstance( deviceCount, list ):
2013 main.log.info( "Using provided device distribution" )
2014 switchList = [ 0 ]
andrew@onlab.us3b087132015-03-11 15:00:08 -07002015 for i in deviceCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002016 switchList.append( int( i ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002017
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002018 tempList = [ '0' ]
2019 tempList.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002020 ONOSIpList = tempList
2021
2022 myPort = 6
2023 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002024 for node in range( 1, clusterCount+1 ):
2025 if switchList[ node ] == 0:
andrew@onlab.us3b087132015-03-11 15:00:08 -07002026 continue
2027
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002028 linkGraph.write( "graph " + ONOSIpList[ node ] + " {\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002029
andrew@onlab.us3b087132015-03-11 15:00:08 -07002030 if node > 1:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002031 # connect to last device on previous node
2032 line = ( "\t0:5 -> " + str( lastSwitch ) + ":6:" + lastIp + "\n" ) # ONOSIpList[node-1]
2033 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07002034
2035 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002036 for switch in range( 0, switchList[ node ]-1 ):
andrew@onlab.us3b087132015-03-11 15:00:08 -07002037 line = ""
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002038 line = ( "\t" + str( switch ) + ":" + str( myPort ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002039 line += " -- "
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002040 line += ( str( switch+1 ) + ":" + str( myPort-1 ) + "\n" )
2041 linkGraph.write( line )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002042 lastSwitch = switch+1
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002043 lastIp = ONOSIpList[ node ]
Jon Hall4ba53f02015-07-29 13:07:41 -07002044
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002045 # lastSwitch += 1
2046 if node < ( clusterCount ):
2047 # connect to first device on the next node
2048 line = ( "\t" + str( lastSwitch ) + ":6 -> 0:5:" + ONOSIpList[ node+1 ] + "\n" )
2049 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07002050
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002051 linkGraph.write( "}\n" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002052 linkGraph.close()
2053
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002054 # SCP
2055 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath )
2056 main.log.info( "linkGraph.cfg creation complete" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002057
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002058 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002059 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002060 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
2061 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07002062 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 +00002063 '''
2064
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002065 main.log.info( "Configuring Null Device Provider" )
2066 clusterCount = len( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002067
Jon Hall4ba53f02015-07-29 13:07:41 -07002068 try:
2069
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002070 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
2071 main.log.info( "Creating device distribution" )
2072 deviceCount = int( deviceCount )
2073 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002074 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002075
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002076 for node in range( 1, clusterCount + 1 ):
2077 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002078
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002079 for node in range( 1, ( deviceCount % clusterCount )+1 ):
2080 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002081
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002082 if isinstance( deviceCount, list ):
2083 main.log.info( "Using provided device distribution" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002084
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002085 if len( deviceCount ) == clusterCount:
2086 switchList = [ '0' ]
2087 switchList.extend( deviceCount )
Jon Hall4ba53f02015-07-29 13:07:41 -07002088
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002089 if len( deviceCount ) == ( clusterCount + 1 ):
2090 if deviceCount[ 0 ] == '0' or deviceCount[ 0 ] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002091 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002092
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002093 assert len( switchList ) == ( clusterCount + 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002094
cameron@onlab.us75900962015-03-30 13:22:49 -07002095 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002096 main.log.error( "Bad device/Ip list match" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002097 except TypeError:
2098 main.log.exception( self.name + ": Object not as expected" )
2099 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002100 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002101 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002102 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002103
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002104 ONOSIp = [ 0 ]
2105 ONOSIp.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002106
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002107 devicesString = "devConfigs = "
2108 for node in range( 1, len( ONOSIp ) ):
2109 devicesString += ( ONOSIp[ node ] + ":" + str( switchList[ node ] ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002110 if node < clusterCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002111 devicesString += ( "," )
Jon Hall4ba53f02015-07-29 13:07:41 -07002112
2113 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002114 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2115 self.handle.expect( ":~" )
2116 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str( numPorts ) )
2117 self.handle.expect( ":~" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002118
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002119 for i in range( 10 ):
2120 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider" )
2121 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002122 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002123 if ( " value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002124 break
2125 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002126 time.sleep( 1 )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002127
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002128 assert ( "value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002129
cameron@onlab.us75900962015-03-30 13:22:49 -07002130 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002131 main.log.error( "Incorrect Config settings: " + verification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002132 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002133 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002134 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002135
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002136 def configNullLink( self, fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002137 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002138 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002139 you want to use a different topology file than linkGraph.cfg
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002140 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002141
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002142 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002143 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str( eventRate ) )
2144 self.handle.expect( ":~" )
2145 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2146 self.handle.expect( ":~" )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002147
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002148 for i in range( 10 ):
2149 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider" )
2150 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002151 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002152 if ( " value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002153 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002154 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002155 time.sleep( 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002156
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002157 assert ( "value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002158
cameron@onlab.us75900962015-03-30 13:22:49 -07002159 except pexpect.EOF:
2160 main.log.error( self.name + ": EOF exception found" )
2161 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002162 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002163 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002164 main.log.info( "Settings did not post to ONOS" )
2165 main.log.error( varification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002166 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002167 main.log.exception( self.name + ": Uncaught exception!" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002168 main.log.error( varification )
Devin Lim44075962017-08-11 10:56:37 -07002169 main.cleanAndExit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002170
kelvin-onlaba4074292015-07-09 15:19:49 -07002171 def getOnosIps( self ):
2172 """
2173 Get all onos IPs stored in
2174 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002175
kelvin-onlaba4074292015-07-09 15:19:49 -07002176 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002177
Chiyu Chengec63bde2016-11-17 18:11:36 -08002178 def listLog( self, nodeIp ):
2179 """
2180 Get a list of all the karaf log names
2181 """
2182 try:
2183 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2184 self.handle.sendline( cmd )
2185 self.handle.expect( ":~" )
2186 before = self.handle.before.splitlines()
2187 logNames = []
2188 for word in before:
2189 if 'karaf.log' in word:
2190 logNames.append( word )
2191 return logNames
2192 except pexpect.EOF:
2193 main.log.error( self.name + ": EOF exception found" )
2194 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002195 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002196 except pexpect.TIMEOUT:
2197 main.log.error( self.name + ": TIMEOUT exception found" )
2198 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002199 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002200 except Exception:
2201 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002202 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002203
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002204 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002205 """
2206 Searches the latest ONOS log file for the given search terms and
2207 prints the total occurances of each term. Returns to combined total of
2208 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002209
Jon Hallb4242222016-01-25 17:07:04 -08002210 Arguments:
2211 * nodeIp - The ip of the ONOS node where the log is located
2212 * searchTerms - A string to grep for or a list of strings to grep
2213 for in the ONOS log. Will print out the number of
2214 occurances for each term.
2215 Optional Arguments:
2216 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2217 containing each search term as well as the total
2218 number of occurances of each term. Defaults to 's',
2219 which prints the simple output of just the number
2220 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002221 * startStr - the start string to be given to stream editor command
2222 as the start point for extraction of data
2223 * endStr - the end string to be given to stream editor command as
2224 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002225 """
2226 try:
2227 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002228 if isinstance( searchTerms, str ):
2229 searchTerms = [ searchTerms ]
Jon Hallb4242222016-01-25 17:07:04 -08002230 numTerms = len( searchTerms )
2231 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002232
Jon Hallb4242222016-01-25 17:07:04 -08002233 totalHits = 0
2234 logLines = []
2235 for termIndex in range( numTerms ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002236 term = searchTerms[ termIndex ]
2237 logLines.append( [ term ] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002238 if startStr and endStr:
2239 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2240 startStr,
2241 endStr,
2242 term )
2243 else:
2244 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2245 term )
Jon Hallb4242222016-01-25 17:07:04 -08002246 self.handle.sendline( cmd )
2247 self.handle.expect( ":~" )
2248 before = self.handle.before.splitlines()
2249 count = 0
2250 for line in before:
2251 if term in line and "grep" not in line:
2252 count += 1
2253 if before.index( line ) > ( len( before ) - 7 ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002254 logLines[ termIndex ].append( line )
Jon Hallb4242222016-01-25 17:07:04 -08002255 main.log.info( "{}: {}".format( term, count ) )
2256 totalHits += count
2257 if termIndex == numTerms - 1:
2258 print "\n"
2259 if outputMode != "s":
2260 outputString = ""
2261 for term in logLines:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002262 outputString = term[ 0 ] + ": \n"
Jon Hallb4242222016-01-25 17:07:04 -08002263 for line in range( 1, len( term ) ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002264 outputString += ( "\t" + term[ line ] + "\n" )
2265 if outputString != ( term[ 0 ] + ": \n" ):
Jon Hallb4242222016-01-25 17:07:04 -08002266 main.log.info( outputString )
2267 main.log.info( "=" * 70 )
2268 return totalHits
2269 except pexpect.EOF:
2270 main.log.error( self.name + ": EOF exception found" )
2271 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002272 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002273 except pexpect.TIMEOUT:
2274 main.log.error( self.name + ": TIMEOUT exception found" )
2275 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002276 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002277 except Exception:
2278 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002279 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002280
2281 def copyMininetFile( self, fileName, localPath, userName, ip,
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002282 mnPath='~/mininet/custom/', timeout = 60 ):
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002283 """
2284 Description:
2285 Copy mininet topology file from dependency folder in the test folder
2286 and paste it to the mininet machine's mininet/custom folder
2287 Required:
2288 fileName - Name of the topology file to copy
2289 localPath - File path of the mininet topology file
2290 userName - User name of the mininet machine to send the file to
2291 ip - Ip address of the mininet machine
2292 Optional:
2293 mnPath - of the mininet directory to send the file to
2294 Return:
2295 Return main.TRUE if successfully copied the file otherwise
2296 return main.FALSE
2297 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002298
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002299 try:
2300 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2301 str( ip ) + ":" + mnPath + fileName
2302
2303 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002304 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002305
2306 main.log.info( self.name + ": Execute: " + cmd )
2307
2308 self.handle.sendline( cmd )
2309
2310 i = self.handle.expect( [ 'No such file',
2311 "100%",
2312 pexpect.TIMEOUT ] )
2313
2314 if i == 0:
2315 main.log.error( self.name + ": File " + fileName +
2316 " does not exist!" )
2317 return main.FALSE
2318
2319 if i == 1:
2320 main.log.info( self.name + ": File " + fileName +
2321 " has been copied!" )
2322 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002323 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002324 return main.TRUE
2325
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()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002330 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()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002334
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002335 def jvmSet( self, memory=8 ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002336
cameron@onlab.us78b89652015-07-08 15:21:03 -07002337 import os
2338
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002339 homeDir = os.path.expanduser( '~' )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002340 filename = "/onos/tools/package/bin/onos-service"
2341
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002342 serviceConfig = open( homeDir + filename, 'w+' )
2343 serviceConfig.write( "#!/bin/bash\n " )
2344 serviceConfig.write( "#------------------------------------- \n " )
2345 serviceConfig.write( "# Starts ONOS Apache Karaf container\n " )
2346 serviceConfig.write( "#------------------------------------- \n " )
2347 serviceConfig.write( "#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n " )
2348 serviceConfig.write( """export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str( memory ) + "G -Xmx" + str( memory ) + """G}" \n """ )
2349 serviceConfig.write( "[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n" )
2350 serviceConfig.write( """${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """ )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002351 serviceConfig.close()
2352
Jon Hall6c44c0b2016-04-20 15:21:00 -07002353 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002354
cameron@onlab.us78b89652015-07-08 15:21:03 -07002355 filename = main.TEST + "DB"
2356 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002357
cameron@onlab.us78b89652015-07-08 15:21:03 -07002358 for item in testData:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002359 if isinstance( item, string ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002360 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002361 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002362 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002363 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002364
Jon Hall6c44c0b2016-04-20 15:21:00 -07002365 DBFile = open( filename, "a" )
2366 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002367 DBFile.close()
2368
Jon Hall6c44c0b2016-04-20 15:21:00 -07002369 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002370
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002371 self.handle.sendline( "onos " + ONOSIp + " summary" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002372 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002373
2374 summaryStr = self.handle.before
2375 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2376
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002377 # passed = "SCC(s)=1" in summaryStr
2378 # if deviceCount:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002379 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
cameron@onlab.us78b89652015-07-08 15:21:03 -07002380
GlennRC772363b2015-08-25 13:05:57 -07002381 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002382 if "SCC(s)=1," in summaryStr:
2383 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002384 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002385 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002386 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002387
2388 if deviceCount:
2389 print" ============================="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002390 checkStr = "devices=" + str( deviceCount[ 0 ] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002391 print "Checkstr: " + checkStr
2392 if checkStr not in summaryStr:
2393 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002394 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002395 else:
2396 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002397
2398 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002399
Jon Hall8f6d4622016-05-23 15:27:18 -07002400 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002401 """
2402 Update self.ip_address with numerical ip address. If multiple IP's are
2403 located on the device, will attempt to use self.nicAddr to choose the
2404 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2405 determine the correct address.
2406
2407 ONLY WORKS WITH IPV4 ADDRESSES
2408 """
2409 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002410 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002411 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2412 pattern = re.compile( ipPat )
2413 match = re.search( pattern, self.ip_address )
2414 if self.nicAddr:
2415 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2416 nicPat = re.compile( nicPat )
2417 else:
2418 nicPat = None
2419 # IF self.ip_address is an ip address and matches
2420 # self.nicAddr: return self.ip_address
2421 if match:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002422 curIp = match.group( 0 )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002423 if nicPat:
2424 nicMatch = re.search( nicPat, curIp )
2425 if nicMatch:
2426 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002427 # ELSE: IF iface, return ip of interface
2428 cmd = "ifconfig"
2429 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2430 if iface:
2431 cmd += " " + str( iface )
2432 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002433 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2434 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002435 if iface:
2436 if ips:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002437 ip = ips[ 0 ]
Jon Hall8f6d4622016-05-23 15:27:18 -07002438 self.ip_address = ip
2439 return ip
2440 else:
2441 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2442 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002443 if nicPat:
2444 for ip in ips:
2445 curMatch = re.search( nicPat, ip )
2446 if curMatch:
2447 self.ip_address = ip
2448 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002449 else: # If only one non-localhost ip, return that
2450 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002451 if len( tmpList ) == 1:
2452 curIp = tmpList[ 0 ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002453 self.ip_address = curIp
2454 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002455 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002456 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002457 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002458 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002459 main.log.exception( "Error executing ifconfig" )
2460 except IndexError:
2461 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002462 except Exception:
2463 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002464
Devin Lim461f0872017-06-05 16:49:33 -07002465 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002466 '''
suibin zhang116647a2016-05-06 16:30:09 -07002467 Start onos cluster with defined nodes, but only with drivers app
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002468 '''
suibin zhang116647a2016-05-06 16:30:09 -07002469 import time
2470
2471 self.createCellFile( self.ip_address,
2472 "temp",
2473 self.ip_address,
2474 "drivers",
Devin Lim461f0872017-06-05 16:49:33 -07002475 nodeList, onosUser )
suibin zhang116647a2016-05-06 16:30:09 -07002476
2477 main.log.info( self.name + ": Apply cell to environment" )
2478 cellResult = self.setCell( "temp" )
2479 verifyResult = self.verifyCell()
2480
2481 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002482 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002483
You Wangc669d212017-01-25 11:09:48 -08002484 main.log.info( self.name + ": Uninstalling ONOS" )
2485 for nd in nodeList:
2486 self.onosUninstall( nodeIp=nd )
2487
suibin zhang116647a2016-05-06 16:30:09 -07002488 main.log.info( self.name + ": Installing ONOS package" )
2489 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002490 self.onosInstall( node=nd )
2491
2492 main.log.info( self.name + ": Set up ONOS secure SSH" )
2493 for nd in nodeList:
2494 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002495
2496 main.log.info( self.name + ": Starting ONOS service" )
2497 time.sleep( onosStartupSleep )
2498
2499 onosStatus = True
2500 for nd in nodeList:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002501 onosStatus = onosStatus & self.isup( node = nd )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002502 # print "onosStatus is: " + str( onosStatus )
suibin zhang116647a2016-05-06 16:30:09 -07002503
2504 return main.TRUE if onosStatus else main.FALSE
2505
Devin Lim02075272017-07-10 15:33:21 -07002506 def onosNetCfg( self, controllerIp, path, fileName ):
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002507 """
2508 Push a specified json file to ONOS through the onos-netcfg service
2509
2510 Required:
Devin Lim02075272017-07-10 15:33:21 -07002511 controllerIp - the Ip of the ONOS node in the cluster
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002512 path - the location of the file to be sent
2513 fileName - name of the json file to be sent
2514
2515 Returns main.TRUE on successfully sending json file, and main.FALSE if
2516 there is an error.
2517 """
2518 try:
Devin Lim02075272017-07-10 15:33:21 -07002519 cmd = "onos-netcfg {0} {1}{2}".format( controllerIp, path, fileName )
2520 main.log.info( "Sending: " + cmd )
2521 main.ONOSbench.handle.sendline( cmd )
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002522 main.ONOSbench.handle.expect( self.prompt )
Devin Lim02075272017-07-10 15:33:21 -07002523 handle = self.handle.before
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002524 if "Error" in handle or "No such file or directory" in handle or "curl: " in handle:
2525 main.log.error( self.name + ": " + handle + self.handle.after )
Devin Lim02075272017-07-10 15:33:21 -07002526 return main.FALSE
Devin Lim752dd7b2017-06-27 14:40:03 -07002527 return main.TRUE
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002528 except pexpect.EOF:
2529 main.log.error( self.name + ": EOF exception found" )
2530 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002531 main.cleanAndExit()
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002532 except Exception:
2533 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002534 main.cleanAndExit()
Devin Lim3ebd5e72017-11-14 10:38:00 -08002535
2536 def formCluster( self, onosIPs ):
2537 """
2538 From ONOS cluster for IP addresses in onosIPs list
2539 """
2540 try:
2541 onosIPs = " ".join( onosIPs )
2542 command = "onos-form-cluster {}".format( onosIPs )
2543 main.log.info( "Sending: " + command )
2544 self.handle.sendline( "" )
2545 self.handle.expect( self.prompt )
2546 self.handle.sendline( command )
2547 self.handle.expect( self.prompt )
2548 handle = self.handle.before
2549 main.log.debug( handle )
2550 assert handle is not None, "Error in sendline"
2551 assert "Command not found:" not in handle, handle
2552 assert "Error" not in handle, handle
2553 assert "Exception:" not in handle, handle
2554 assert "curl:" not in handle, handle
2555 return main.TRUE
2556 except AssertionError:
2557 main.log.exception( "{} Error in onos-form-cluster output:".format( self.name ) )
2558 return main.FALSE
2559 except TypeError:
2560 main.log.exception( self.name + ": Object not as expected" )
2561 return main.FALSE
2562 except pexpect.EOF:
2563 main.log.error( self.name + ": EOF exception found" )
2564 main.log.error( self.name + ": " + self.handle.before )
2565 main.cleanAndExit()
2566 except Exception:
2567 main.log.exception( self.name + ": Uncaught exception!" )
2568 main.cleanAndExit()
Jon Hall7ce46ea2018-02-05 12:20:59 -08002569
2570 def backupData( self, location ):
2571 """
2572 Backs up ONOS data and logs to a given location. Returns main.FALSE
2573 if there is an error executing the command, and main.TRUE otherwise.
2574 required arguments:
2575 loaction - The file path to save the backup to
2576 """
2577 try:
2578 cmd = "/opt/onos/bin/onos-backup " + str( location )
2579 self.handle.sendline( cmd )
2580 self.handle.expect( self.prompt )
2581 handle = self.handle.before
2582 main.log.debug( handle )
2583 assert handle is not None, "Error in sendline"
2584 assert "Command not found:" not in handle, handle
2585 assert "Error" not in handle, handle
2586 assert "Exception:" not in handle, handle
2587 return main.TRUE
2588 except AssertionError:
2589 main.log.exception( "{} Error in onos-backup output:".format( self.name ) )
2590 return main.FALSE
2591 except TypeError:
2592 main.log.exception( self.name + ": Object not as expected" )
2593 return main.FALSE
2594 except pexpect.EOF:
2595 main.log.error( self.name + ": EOF exception found" )
2596 main.log.error( self.name + ": " + self.handle.before )
2597 main.cleanAndExit()
2598 except Exception:
2599 main.log.exception( self.name + ": Uncaught exception!" )
2600 main.cleanAndExit()
2601
2602 def restoreData( self, location ):
2603 """
2604 Restores ONOS data and logs from a given location. Returns main.FALSE
2605 if there is an error executing the command, and main.TRUE otherwise.
2606 required arguments:
2607 loaction - The file path of a backup file
2608 """
2609 try:
2610 cmd = "/opt/onos/bin/onos-restore " + str( location )
2611 self.handle.sendline( cmd )
2612 self.handle.expect( self.prompt )
2613 handle = self.handle.before
2614 main.log.debug( handle )
2615 assert handle is not None, "Error in sendline"
2616 assert "Command not found:" not in handle, handle
2617 assert "Error" not in handle, handle
2618 assert "Exception:" not in handle, handle
2619 return main.TRUE
2620 except AssertionError:
2621 main.log.exception( "{} Error in onos-restore output:".format( self.name ) )
2622 return main.FALSE
2623 except TypeError:
2624 main.log.exception( self.name + ": Object not as expected" )
2625 return main.FALSE
2626 except pexpect.EOF:
2627 main.log.error( self.name + ": EOF exception found" )
2628 main.log.error( self.name + ": " + self.handle.before )
2629 main.cleanAndExit()
2630 except Exception:
2631 main.log.exception( self.name + ": Uncaught exception!" )
2632 main.cleanAndExit()
You Wang5df1c6d2018-04-06 18:02:02 -07002633
You Wang5ac7db72018-07-17 11:17:52 -07002634 def onosDiagnostics( self, onosIPs, dstDir, suffix, timeout=300 ):
You Wang5df1c6d2018-04-06 18:02:02 -07002635 """
2636 Run onos-diagnostics with given ONOS instance IPs and save output to dstDir
2637 with suffix specified E.g. onos-diags-suffix.tar.gz
Jon Hall0e240372018-05-02 11:21:57 -07002638 required arguments:
You Wang5df1c6d2018-04-06 18:02:02 -07002639 onosIPs - list of ONOS IPs for collecting diags
2640 dstDir - diags file will be saved under the directory specified
2641 suffix - diags file will be named with the suffix specified
2642 returns:
2643 main.FALSE if there's an error executing the command, and main.TRUE otherwise
2644 """
2645 try:
2646 cmd = "onos-diagnostics"
2647 assert isinstance( onosIPs, list )
2648 for ip in onosIPs:
2649 cmd += " " + str( ip )
2650 self.handle.sendline( cmd )
You Wang5ac7db72018-07-17 11:17:52 -07002651 self.handle.expect( self.prompt, timeout=timeout )
You Wang5df1c6d2018-04-06 18:02:02 -07002652 handle = self.handle.before
2653 main.log.debug( handle )
2654 assert handle is not None, "Error in sendline"
2655 assert "Command not found:" not in handle, handle
2656 assert "Exception:" not in handle, handle
2657 # Rename and move diags file to dstDir from /tmp
2658 if dstDir[ -1: ] != "/":
2659 dstDir += "/"
2660 self.handle.sendline( "mv /tmp/onos-diags.tar.gz " + str( dstDir ) + "onos-diags" + str( suffix ) + ".tar.gz" )
2661 self.handle.expect( self.prompt )
2662 handle = self.handle.before
2663 main.log.debug( handle )
2664 assert handle is not None, "Error in sendline"
2665 assert "No such file or directory" not in handle, handle
2666 return main.TRUE
2667 except AssertionError:
2668 main.log.exception( "{} Error in onos-diagnostics output:".format( self.name ) )
2669 return main.FALSE
2670 except TypeError:
2671 main.log.exception( self.name + ": Object not as expected" )
2672 return main.FALSE
You Wang223faa32018-06-21 10:45:47 -07002673 except pexpect.TIMEOUT:
2674 main.log.exception( self.name + ": TIMEOUT exception found in onosDiagnostics" )
2675 main.log.error( self.name + ": " + self.handle.before )
You Wangb65d2372018-08-17 15:37:59 -07002676 self.exitFromCmd( self.prompt, 100 )
You Wang223faa32018-06-21 10:45:47 -07002677 return main.FALSE
You Wang5df1c6d2018-04-06 18:02:02 -07002678 except pexpect.EOF:
2679 main.log.error( self.name + ": EOF exception found" )
2680 main.log.error( self.name + ": " + self.handle.before )
2681 main.cleanAndExit()
2682 except Exception:
2683 main.log.exception( self.name + ": Uncaught exception!" )
2684 main.cleanAndExit()
Jon Hall0e240372018-05-02 11:21:57 -07002685
2686 def onosPower( self, onosIP, toggle, userName=None ):
2687 """
2688 Run onos-power script to tell the cell warden to simulate a power faulure
2689 for the given container.
2690 required :
2691 onosIP - ONOS node IP
2692 toggle - either "off" or "on", used to indicate whether
2693 the node should be powered off or on
2694 returns:
2695 main.FALSE if there's an error executing the command, and main.TRUE otherwise
2696 """
2697 try:
2698 cmd = "onos-power {} {}".format( onosIP, toggle )
2699 if userName:
2700 cmd += " {}".format( userName )
2701 self.handle.sendline( cmd )
2702 self.handle.expect( self.prompt )
2703 handle = self.handle.before
2704 main.log.debug( handle )
2705 assert handle is not None, "Error in sendline"
2706 assert "Command not found:" not in handle, handle
2707 assert "Exception:" not in handle, handle
2708 assert "usage:" not in handle, handle
2709 return main.TRUE
2710 except AssertionError:
2711 main.log.exception( "{} Error in onos-power output:".format( self.name ) )
2712 return main.FALSE
2713 except TypeError:
2714 main.log.exception( self.name + ": Object not as expected" )
2715 return main.FALSE
2716 except pexpect.EOF:
2717 main.log.error( self.name + ": EOF exception found" )
2718 main.log.error( self.name + ": " + self.handle.before )
2719 main.cleanAndExit()
2720 except Exception:
2721 main.log.exception( self.name + ": Uncaught exception!" )
2722 main.cleanAndExit()
You Wangf9d95be2018-08-01 14:35:37 -07002723
2724 def atomixKill( self, nodeIp ):
2725 """
2726 Calls the command: 'atomix-kill [<node-ip>]'
2727 Kills the Atomix instance running on the specified node
2728 """
2729 try:
2730 self.handle.sendline( "" )
2731 self.handle.expect( self.prompt )
2732 self.handle.sendline( "atomix-kill " + str( nodeIp ) )
2733 i = self.handle.expect( [
2734 self.prompt,
2735 "No\sroute\sto\shost",
2736 "password:",
2737 pexpect.TIMEOUT ], timeout=60 )
2738
2739 if i == 0:
2740 main.log.info( "Atomix instance " + str( nodeIp ) + " was killed" )
2741 return main.TRUE
2742 elif i == 1:
2743 main.log.info( "No route to host" )
2744 return main.FALSE
2745 elif i == 2:
2746 main.log.info( "Passwordless login for host: " + str( nodeIp ) + " not configured" )
2747 return main.FALSE
2748 else:
2749 main.log.info( "Atomix instance was not killed" )
2750 return main.FALSE
2751
2752 except pexpect.EOF:
2753 main.log.error( self.name + ": EOF exception found" )
2754 main.log.error( self.name + ": " + self.handle.before )
2755 main.cleanAndExit()
2756 except Exception:
2757 main.log.exception( self.name + ": Uncaught exception!" )
2758 main.cleanAndExit()
2759
2760 def atomixUninstall( self, nodeIp="" ):
2761 """
2762 Calls the command: 'atomix-uninstall'
2763 Uninstalls Atomix from the designated node, stopping if needed
2764 """
2765 try:
2766 self.handle.sendline( "" )
2767 self.handle.expect( self.prompt, timeout=180 )
2768 self.handle.sendline( "atomix-uninstall " + str( nodeIp ) )
2769 self.handle.expect( self.prompt, timeout=180 )
2770 main.log.info( "Atomix " + nodeIp + " was uninstalled" )
2771 # onos-uninstall command does not return any text
2772 return main.TRUE
2773 except pexpect.TIMEOUT:
2774 main.log.exception( self.name + ": Timeout in atomixUninstall" )
2775 self.handle.send( "\x03" ) # Control-C
2776 self.handle.expect( self.prompt )
2777 return main.FALSE
2778 except pexpect.EOF:
2779 main.log.error( self.name + ": EOF exception found" )
2780 main.log.error( self.name + ": " + self.handle.before )
2781 main.cleanAndExit()
2782 except Exception:
2783 main.log.exception( self.name + ": Uncaught exception!" )
2784 main.cleanAndExit()
2785
2786 def atomixInstall( self, options="", node="" ):
2787 """
2788 Installs Atomix on the designated nodes.
2789 Returns: main.TRUE on success and main.FALSE on failure
2790 """
2791 try:
2792 if options:
2793 self.handle.sendline( "atomix-install " + options + " " + node )
2794 else:
2795 self.handle.sendline( "atomix-install " + node )
2796 self.handle.expect( "atomix-install " )
2797 i = self.handle.expect( [ "Network\sis\sunreachable",
2798 "is already installed",
2799 "saved",
2800 self.prompt,
2801 pexpect.TIMEOUT ], timeout=180 )
2802 if i == 0:
2803 # can't reach ONOS node
2804 main.log.warn( "Network is unreachable" )
2805 self.handle.expect( self.prompt )
2806 return main.FALSE
2807 elif i == 1:
2808 # same bits are already on Atomix node
2809 main.log.info( "Atomix is already installed on " + node )
2810 self.handle.expect( self.prompt )
2811 return main.TRUE
2812 elif i == 2 or i == 3:
2813 main.log.info( "Atomix was installed on " + node )
2814 self.handle.expect( self.prompt )
2815 return main.TRUE
2816 elif i == 4:
2817 # timeout
2818 main.log.info( "Installation of Atomix on " + node + " timed out" )
2819 self.handle.expect( self.prompt )
2820 main.log.warn( self.handle.before )
2821 self.handle.send( "\x03" ) # Control-C
2822 self.handle.expect( self.prompt )
2823 return main.FALSE
2824 except pexpect.EOF:
2825 main.log.error( self.name + ": EOF exception found" )
2826 main.log.error( self.name + ": " + self.handle.before )
2827 main.cleanAndExit()
2828 except Exception:
2829 main.log.exception( self.name + ": Uncaught exception!" )
2830 main.cleanAndExit()