blob: ffcd080e9c8c9bd76eb67199d5166bdd651072b7 [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 )
235 return main.FALSE
andrewonlab7735d852014-10-09 13:02:47 -0400236 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800237 main.log.error( self.name + ": EOF exception found" )
238 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700239 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800240 except Exception:
241 main.log.exception( "Failed to package ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700242 main.cleanAndExit()
andrew@onlab.us9e2cd0f2014-10-08 20:32:32 -0400243
kelvin-onlabd3b64892015-01-20 13:26:24 -0800244 def onosBuild( self ):
kelvin8ec71442015-01-15 16:57:00 -0800245 """
andrewonlab8790abb2014-11-06 13:51:54 -0500246 Use the pre defined script to build onos via mvn
kelvin8ec71442015-01-15 16:57:00 -0800247 """
andrewonlab8790abb2014-11-06 13:51:54 -0500248 try:
kelvin8ec71442015-01-15 16:57:00 -0800249 self.handle.sendline( "onos-build" )
250 self.handle.expect( "onos-build" )
251 i = self.handle.expect( [
kelvin-onlabd3b64892015-01-20 13:26:24 -0800252 "BUILD SUCCESS",
253 "ERROR",
254 "BUILD FAILED" ],
255 timeout=120 )
kelvin8ec71442015-01-15 16:57:00 -0800256 handle = str( self.handle.before )
Devin Limc20e79a2017-06-07 10:29:57 -0700257 self.handle.expect( self.prompt )
andrewonlab8790abb2014-11-06 13:51:54 -0500258
kelvin8ec71442015-01-15 16:57:00 -0800259 main.log.info( "onos-build command returned: " +
260 handle )
andrewonlab8790abb2014-11-06 13:51:54 -0500261
262 if i == 0:
263 return main.TRUE
264 else:
265 return handle
266
267 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800268 main.log.error( self.name + ": EOF exception found" )
269 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -0800270 except Exception:
271 main.log.exception( "Failed to build ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700272 main.cleanAndExit()
andrewonlab8790abb2014-11-06 13:51:54 -0500273
shahshreya9f531fe2015-06-10 12:03:51 -0700274 def cleanInstall( self, skipTest=False, mciTimeout=600 ):
kelvin8ec71442015-01-15 16:57:00 -0800275 """
276 Runs mvn clean install in the root of the ONOS directory.
277 This will clean all ONOS artifacts then compile each module
shahshreya9f531fe2015-06-10 12:03:51 -0700278 Optional:
279 skipTest - Does "-DskipTests -Dcheckstyle.skip -U -T 1C" which
280 skip the test. This will make the building faster.
281 Disregarding the credibility of the build
kelvin8ec71442015-01-15 16:57:00 -0800282 Returns: main.TRUE on success
Jon Hallde9d9aa2014-10-08 20:36:02 -0400283 On Failure, exits the test
kelvin8ec71442015-01-15 16:57:00 -0800284 """
Jon Hallde9d9aa2014-10-08 20:36:02 -0400285 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800286 main.log.info( "Running 'mvn clean install' on " +
287 str( self.name ) +
kelvin8ec71442015-01-15 16:57:00 -0800288 ". This may take some time." )
289 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700290 self.handle.expect( self.prompt )
Jon Hallea7818b2014-10-09 14:30:59 -0400291
kelvin8ec71442015-01-15 16:57:00 -0800292 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700293 self.handle.expect( self.prompt )
shahshreya9f531fe2015-06-10 12:03:51 -0700294
295 if not skipTest:
296 self.handle.sendline( "mvn clean install" )
297 self.handle.expect( "mvn clean install" )
298 else:
299 self.handle.sendline( "mvn clean install -DskipTests" +
300 " -Dcheckstyle.skip -U -T 1C" )
301 self.handle.expect( "mvn clean install -DskipTests" +
302 " -Dcheckstyle.skip -U -T 1C" )
kelvin8ec71442015-01-15 16:57:00 -0800303 while True:
304 i = self.handle.expect( [
Jon Hall274b6642015-02-17 11:57:17 -0800305 'There\sis\sinsufficient\smemory\sfor\sthe\sJava\s' +
Jon Hallefbd9792015-03-05 16:11:36 -0800306 'Runtime\sEnvironment\sto\scontinue',
Jon Hallde9d9aa2014-10-08 20:36:02 -0400307 'BUILD\sFAILURE',
308 'BUILD\sSUCCESS',
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700309 'onos' + self.prompt, # TODO: fix this to be more generic?
Devin Limdc78e202017-06-09 18:30:07 -0700310 'ONOS' + self.prompt,
pingping-lin57a56ce2015-05-20 16:43:48 -0700311 pexpect.TIMEOUT ], mciTimeout )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400312 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -0800313 main.log.error( self.name + ":There is insufficient memory \
314 for the Java Runtime Environment to continue." )
315 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700316
317 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400318 if i == 1:
kelvin8ec71442015-01-15 16:57:00 -0800319 main.log.error( self.name + ": Build failure!" )
320 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700321
322 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400323 elif i == 2:
kelvin8ec71442015-01-15 16:57:00 -0800324 main.log.info( self.name + ": Build success!" )
Jon Halle94919c2015-03-23 11:42:57 -0700325 elif i == 3 or i == 4:
kelvin8ec71442015-01-15 16:57:00 -0800326 main.log.info( self.name + ": Build complete" )
327 # Print the build time
Jon Hallf8ef52c2014-10-09 19:37:33 -0400328 for line in self.handle.before.splitlines():
329 if "Total time:" in line:
kelvin8ec71442015-01-15 16:57:00 -0800330 main.log.info( line )
331 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700332 self.handle.expect( self.prompt, timeout=60 )
Jon Hallde9d9aa2014-10-08 20:36:02 -0400333 return main.TRUE
Jon Halle94919c2015-03-23 11:42:57 -0700334 elif i == 5:
kelvin8ec71442015-01-15 16:57:00 -0800335 main.log.error(
336 self.name +
337 ": mvn clean install TIMEOUT!" )
338 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700339
340 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400341 else:
Jon Hall274b6642015-02-17 11:57:17 -0800342 main.log.error( self.name + ": unexpected response from " +
Jon Hallefbd9792015-03-05 16:11:36 -0800343 "mvn clean install" )
kelvin8ec71442015-01-15 16:57:00 -0800344 # return main.FALSE
Devin Lim44075962017-08-11 10:56:37 -0700345
346 main.cleanAndExit()
Jon Hallde9d9aa2014-10-08 20:36:02 -0400347 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800348 main.log.error( self.name + ": EOF exception found" )
349 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700350 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800351 except Exception:
352 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700353 main.cleanAndExit()
Jon Hallacabffd2014-10-09 12:36:53 -0400354
Jon Hall3576f572016-08-23 10:01:07 -0700355 def buckBuild( self, timeout=180 ):
356 """
357 Build onos using buck.
358 """
359 try:
360 ret = main.TRUE
361 self.handle.sendline( "buck build onos" )
362 self.handle.expect( "buck build onos" )
363 output = ""
364 while True:
365 i = self.handle.expect( [ "This does not appear to be the root of a Buck project.",
366 "\n",
367 "BUILD FAILED",
Devin Limc20e79a2017-06-07 10:29:57 -0700368 self.prompt ],
Jon Hall3576f572016-08-23 10:01:07 -0700369 timeout=timeout )
370 output += str( self.handle.before + self.handle.after )
371 if i == 0:
372 main.log.error( "Wrong location" )
373 ret = main.FALSE
374 elif i == 1:
375 # end of a line, buck is still printing output
376 pass
377 elif i == 2:
378 # Build failed
379 main.log.error( "Build failed" )
380 ret = main.FALSE
381 elif i == 3:
382 # Prompt returned
383 break
384 main.log.debug( output )
385 return ret
386 except pexpect.TIMEOUT:
387 main.log.exception( self.name + ": TIMEOUT exception found" )
388 main.log.error( self.name + ": " + self.handle.before )
389 return main.FALSE
390 except pexpect.EOF:
391 main.log.error( self.name + ": EOF exception found" )
392 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700393 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700394 except Exception:
395 main.log.exception( "Failed to build and package ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700396 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700397
Jon Hall61282e32015-03-19 11:34:11 -0700398 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800399 """
Jon Hallacabffd2014-10-09 12:36:53 -0400400 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800401
Jon Hall61282e32015-03-19 11:34:11 -0700402 If the fastForward boolean is set to true, only git pulls that can
403 be fast forwarded will be performed. IE if you have not local commits
404 in your branch.
405
Jon Hallacabffd2014-10-09 12:36:53 -0400406 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800407 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400408 for the purpose of pulling from other nodes if necessary.
409
Jon Hall47a93fb2015-01-06 16:46:06 -0800410 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400411 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800412 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400413 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400414
kelvin8ec71442015-01-15 16:57:00 -0800415 """
Jon Hallacabffd2014-10-09 12:36:53 -0400416 try:
kelvin8ec71442015-01-15 16:57:00 -0800417 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700418 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700419 cmd = "git pull"
420 if comp1 != "":
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700421 cmd += ' ' + comp1
Jon Hall61282e32015-03-19 11:34:11 -0700422 if fastForward:
423 cmd += ' ' + " --ff-only"
424 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800425 i = self.handle.expect(
426 [
427 'fatal',
428 'Username\sfor\s(.*):\s',
429 '\sfile(s*) changed,\s',
430 'Already up-to-date',
431 'Aborting',
432 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800433 'You asked me to pull without telling me which branch you',
434 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700435 'Please enter a commit message to explain why this merge',
436 'Found a swap file by the name',
437 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800438 pexpect.TIMEOUT ],
439 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800440 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700441 main.log.error( self.name + ": Git pull had some issue" )
442 output = self.handle.after
Devin Limdc78e202017-06-09 18:30:07 -0700443 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700444 output += self.handle.before
445 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400446 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800447 elif i == 1:
448 main.log.error(
449 self.name +
450 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400451 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800452 elif i == 2:
453 main.log.info(
454 self.name +
455 ": Git Pull - pulling repository now" )
Devin Limc20e79a2017-06-07 10:29:57 -0700456 self.handle.expect( self.prompt, 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800457 # So that only when git pull is done, we do mvn clean compile
458 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800459 elif i == 3:
460 main.log.info( self.name + ": Git Pull - Already up to date" )
Devin Limc20e79a2017-06-07 10:29:57 -0700461 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800462 elif i == 4:
463 main.log.info(
464 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800465 ": Git Pull - Aborting..." +
466 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400467 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800468 elif i == 5:
469 main.log.info(
470 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800471 ": Git Pull - You are not currently " +
472 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400473 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800474 elif i == 6:
475 main.log.info(
476 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800477 ": Git Pull - You have not configured an upstream " +
478 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400479 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800480 elif i == 7:
481 main.log.info(
482 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800483 ": Git Pull - Pull is not possible because " +
484 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400485 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800486 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700487 # NOTE: abandoning test since we can't reliably handle this
488 # there could be different default text editors and we
489 # also don't know if we actually want to make the commit
490 main.log.error( "Git pull resulted in a merge commit message" +
491 ". Exiting test!" )
Devin Lim44075962017-08-11 10:56:37 -0700492
493 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700494 elif i == 9: # Merge commit message but swap file exists
495 main.log.error( "Git pull resulted in a merge commit message" +
496 " but a swap file exists." )
497 try:
498 self.handle.send( 'A' ) # Abort
Devin Limc20e79a2017-06-07 10:29:57 -0700499 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700500 return main.ERROR
501 except Exception:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700502 main.log.exception( "Couldn't exit editor prompt!" )
Devin Lim44075962017-08-11 10:56:37 -0700503
504 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700505 elif i == 10: # In the middle of a merge commit
506 main.log.error( "Git branch is in the middle of a merge. " )
507 main.log.warn( self.handle.before + self.handle.after )
508 return main.ERROR
509 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800510 main.log.error( self.name + ": Git Pull - TIMEOUT" )
511 main.log.error(
512 self.name + " Response was: " + str(
513 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400514 return main.ERROR
515 else:
kelvin8ec71442015-01-15 16:57:00 -0800516 main.log.error(
517 self.name +
518 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400519 return main.ERROR
520 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800521 main.log.error( self.name + ": EOF exception found" )
522 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700523 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800524 except Exception:
525 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700526 main.cleanAndExit()
Jon Hallacabffd2014-10-09 12:36:53 -0400527
kelvin-onlabd3b64892015-01-20 13:26:24 -0800528 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800529 """
Jon Hallacabffd2014-10-09 12:36:53 -0400530 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800531
Jon Hallacabffd2014-10-09 12:36:53 -0400532 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800533 If used as gitCheckout( "branch" ) it will do git checkout
534 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400535
536 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800537 branch of the ONOS repository. If it has any problems, it will return
538 main.ERROR.
539 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400540 successful then the function will return main.TRUE.
541
kelvin8ec71442015-01-15 16:57:00 -0800542 """
Jon Hallacabffd2014-10-09 12:36:53 -0400543 try:
kelvin8ec71442015-01-15 16:57:00 -0800544 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700545 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800546 main.log.info( self.name +
547 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800548 cmd = "git checkout " + branch
549 self.handle.sendline( cmd )
550 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800551 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800552 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700553 'Username for (.*): ',
554 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700555 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800556 pexpect.TIMEOUT,
557 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800558 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800559 'error: you need to resolve your current index first',
560 "You are in 'detached HEAD' state.",
561 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800562 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800563 if i == 0:
564 main.log.error(
565 self.name +
566 ": Git checkout had some issue..." )
567 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400568 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800569 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800570 main.log.error(
571 self.name +
572 ": Git checkout asking for username." +
573 " Please configure your local git repository to be able " +
574 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800575 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400576 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800577 elif i == 2:
578 main.log.info(
579 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800580 ": Git Checkout %s : Already on this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700581 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800582 # main.log.info( "DEBUG: after checkout cmd = "+
583 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400584 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800585 elif i == 3:
586 main.log.info(
587 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800588 ": Git checkout %s - Switched to this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700589 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800590 # main.log.info( "DEBUG: after checkout cmd = "+
591 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400592 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800593 elif i == 4:
594 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
595 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800596 self.name + " Response was: " + str( self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400597 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800598 elif i == 5:
599 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800600 main.log.error(
601 self.name +
602 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800603 "Your local changes to the following files would" +
604 " be overwritten by checkout:" +
605 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700606 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500607 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800608 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800609 main.log.error(
610 self.name +
611 ": Git checkout error: \n" +
612 "You need to resolve your current index first:" +
613 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700614 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500615 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800616 elif i == 7:
617 main.log.info(
618 self.name +
619 ": Git checkout " + str( branch ) +
620 " - You are in 'detached HEAD' state. HEAD is now at " +
621 str( branch ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700622 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800623 return main.TRUE
624 elif i == 8: # Already in detached HEAD on the specified commit
625 main.log.info(
626 self.name +
627 ": Git Checkout %s : Already on commit" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700628 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800629 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400630 else:
kelvin8ec71442015-01-15 16:57:00 -0800631 main.log.error(
632 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800633 ": Git Checkout - Unexpected response, " +
634 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800635 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400636 return main.ERROR
637
638 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800639 main.log.error( self.name + ": EOF exception found" )
640 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700641 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800642 except Exception:
643 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700644 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400645
pingping-lin6d23d9e2015-02-02 16:54:24 -0800646 def getBranchName( self ):
You Wang9cdf9a22017-05-01 13:44:18 -0700647 import re
648 try:
649 main.log.info( "self.home = " )
650 main.log.info( self.home )
651 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700652 self.handle.expect( self.prompt )
You Wang9cdf9a22017-05-01 13:44:18 -0700653 self.handle.sendline( "git name-rev --name-only HEAD" )
654 self.handle.expect( "git name-rev --name-only HEAD" )
Devin Limc20e79a2017-06-07 10:29:57 -0700655 self.handle.expect( self.prompt )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700656 lines = self.handle.before.splitlines()
657 if lines[ 1 ] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[ 1 ] ):
658 return lines[ 1 ]
You Wang9cdf9a22017-05-01 13:44:18 -0700659 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700660 main.log.info( lines[ 1 ] )
You Wang9cdf9a22017-05-01 13:44:18 -0700661 return "unexpected ONOS branch"
662 except pexpect.EOF:
663 main.log.error( self.name + ": EOF exception found" )
664 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700665 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700666 except pexpect.TIMEOUT:
667 main.log.error( self.name + ": TIMEOUT exception found" )
668 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700669 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700670 except Exception:
671 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700672 main.cleanAndExit()
pingping-lin6d23d9e2015-02-02 16:54:24 -0800673
kelvin-onlabd3b64892015-01-20 13:26:24 -0800674 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800675 """
Jon Hall274b6642015-02-17 11:57:17 -0800676 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800677 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800678 """
Jon Hall45ec0922014-10-10 19:33:49 -0400679 try:
kelvin8ec71442015-01-15 16:57:00 -0800680 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700681 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800682 self.handle.sendline(
683 "cd " +
684 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800685 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
686 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800687 # NOTE: for some reason there are backspaces inserted in this
688 # phrase when run from Jenkins on some tests
689 self.handle.expect( "never" )
Devin Limc20e79a2017-06-07 10:29:57 -0700690 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800691 response = ( self.name + ": \n" + str(
692 self.handle.before + self.handle.after ) )
693 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700694 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800695 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400696 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500697 print line
698 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700699 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800700 for line in lines[ 2:-1 ]:
701 # Bracket replacement is for Wiki-compliant
702 # formatting. '<' or '>' are interpreted
703 # as xml specific tags that cause errors
704 line = line.replace( "<", "[" )
705 line = line.replace( ">", "]" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700706 # main.log.wiki( "\t" + line )
pingping-lin763ee042015-05-20 17:45:30 -0700707 main.log.wiki( line + "<br /> " )
708 main.log.summary( line )
709 main.log.wiki( "</blockquote>" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700710 main.log.summary( "\n" )
kelvin8ec71442015-01-15 16:57:00 -0800711 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400712 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800713 main.log.error( self.name + ": EOF exception found" )
714 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700715 main.cleanAndExit()
Jon Hall368769f2014-11-19 15:43:35 -0800716 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800717 main.log.error( self.name + ": TIMEOUT exception found" )
718 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700719 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800720 except Exception:
721 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700722 main.cleanAndExit()
Jon Hall45ec0922014-10-10 19:33:49 -0400723
kelvin-onlabd3b64892015-01-20 13:26:24 -0800724 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Jon Hall810b67d2016-12-05 10:19:01 -0800725 appString, onosIpAddrs, onosUser="sdn", useSSH=True ):
kelvin8ec71442015-01-15 16:57:00 -0800726 """
andrewonlab94282092014-10-10 13:00:11 -0400727 Creates a cell file based on arguments
728 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800729 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400730 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800731 * File name of the cell file ( fileName )
732 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800733 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400734 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800735 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400736 - Must be passed in as last arguments
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000737 * ONOS USER (onosUser)
Flavio Castrocc38a542016-03-03 13:15:46 -0800738 - optional argument to set ONOS_USER environment variable
kelvin8ec71442015-01-15 16:57:00 -0800739
andrewonlab94282092014-10-10 13:00:11 -0400740 NOTE: Assumes cells are located at:
741 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800742 """
andrewonlab94282092014-10-10 13:00:11 -0400743 try:
Devin Lim461f0872017-06-05 16:49:33 -0700744
Jon Hall2c8959e2016-12-16 12:17:34 -0800745 # Variable initialization
746 cellDirectory = self.home + "/tools/test/cells/"
747 # We want to create the cell file in the dependencies directory
748 # of TestON first, then copy over to ONOS bench
749 tempDirectory = "/tmp/"
750 # Create the cell file in the directory for writing ( w+ )
751 cellFile = open( tempDirectory + fileName, 'w+' )
752 if isinstance( onosIpAddrs, types.StringType ):
753 onosIpAddrs = [ onosIpAddrs ]
754
755 # App string is hardcoded environment variables
756 # That you may wish to use by default on startup.
757 # Note that you may not want certain apps listed
758 # on here.
759 appString = "export ONOS_APPS=" + appString
760 onosGroup = "export ONOS_GROUP=" + onosUser
761 onosUser = "export ONOS_USER=" + onosUser
762 if useSSH:
763 onosUseSSH = "export ONOS_USE_SSH=true"
764 mnString = "export OCN="
765 if mnIpAddrs == "":
766 mnString = ""
767 onosString = "export OC"
768 tempCount = 1
769
770 # Create ONOSNIC ip address prefix
771 tempOnosIp = str( onosIpAddrs[ 0 ] )
772 tempList = []
773 tempList = tempOnosIp.split( "." )
774 # Omit last element of list to format for NIC
775 tempList = tempList[ :-1 ]
776 # Structure the nic string ip
777 nicAddr = ".".join( tempList ) + ".*"
778 self.nicAddr = nicAddr
779 onosNicString = "export ONOS_NIC=" + nicAddr
780
kelvin8ec71442015-01-15 16:57:00 -0800781 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800782 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400783
kelvin-onlabd3b64892015-01-20 13:26:24 -0800784 for arg in onosIpAddrs:
785 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800786 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400787 # export OC1="10.128.20.11"
788 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800789 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700790 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800791 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800792
Jon Hall6f665652015-09-18 10:08:07 -0700793 cellFile.write( "export OCI=$OC1\n" )
794 cellFile.write( mnString + "\"" + mnIpAddrs + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700795 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800796 cellFile.write( onosGroup + "\n" )
797 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700798 if useSSH:
799 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800800 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400801
kelvin8ec71442015-01-15 16:57:00 -0800802 # We use os.system to send the command to TestON cluster
803 # to account for the case in which TestON is not located
804 # on the same cluster as the ONOS bench
805 # Note that even if TestON is located on the same cluster
806 # as ONOS bench, you must setup passwordless ssh
807 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700808 os.system( "scp " + tempDirectory + fileName + " " +
809 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400810
andrewonlab2a6c9342014-10-16 13:40:15 -0400811 return main.TRUE
812
andrewonlab94282092014-10-10 13:00:11 -0400813 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800814 main.log.error( self.name + ": EOF exception found" )
815 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700816 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800817 except Exception:
818 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700819 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -0400820
kelvin-onlabd3b64892015-01-20 13:26:24 -0800821 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800822 """
andrewonlab95ca1462014-10-09 14:04:24 -0400823 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800824 """
andrewonlab95ca1462014-10-09 14:04:24 -0400825 try:
826 if not cellname:
You Wang1cdc5f52017-12-19 16:47:51 -0800827 main.log.error( self.name + ": Must define cellname" )
Devin Lim44075962017-08-11 10:56:37 -0700828 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400829 else:
kelvin8ec71442015-01-15 16:57:00 -0800830 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800831 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800832 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400833 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700834 self.handle.expect( str( cellname ) )
You Wang1cdc5f52017-12-19 16:47:51 -0800835 i = self.handle.expect( [ "No such cell",
836 self.prompt,
837 pexpect.TIMEOUT ], timeout=10 )
838 if i == 0:
839 main.log.error( self.name + ": No such cell. Response: " + str( self.handle.before ) )
840 main.cleanAndExit()
841 elif i == 1:
842 main.log.info( self.name + ": Successfully set cell: " + str( self.handle.before ) )
843 elif i == 2:
844 main.log.error( self.name + ": Set cell timed out. Response: " + str( self.handle.before ) )
845 main.cleanAndExit()
846 else:
847 main.log.error( self.name + ": Unexpected response: " + str( self.handle.before ) )
Devin Lim44075962017-08-11 10:56:37 -0700848 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400849 return main.TRUE
You Wang1cdc5f52017-12-19 16:47:51 -0800850 except pexpect.TIMEOUT:
851 main.log.error( self.name + ": TIMEOUT exception found" )
852 main.log.error( self.name + ": " + self.handle.before )
853 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400854 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800855 main.log.error( self.name + ": EOF exception found" )
856 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700857 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800858 except Exception:
859 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700860 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400861
kelvin-onlabd3b64892015-01-20 13:26:24 -0800862 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800863 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400864 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800865 """
866 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400867
andrewonlabc03bf6c2014-10-09 14:56:18 -0400868 try:
kelvin8ec71442015-01-15 16:57:00 -0800869 # Clean handle by sending empty and expecting $
870 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700871 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800872 self.handle.sendline( "onos-verify-cell" )
Devin Limc20e79a2017-06-07 10:29:57 -0700873 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800874 handleBefore = self.handle.before
875 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800876 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700877 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400878 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800879 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700880 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800881 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700882 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800883 except Exception:
884 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700885 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400886
jenkins1e99e7b2015-04-02 18:15:39 -0700887 def onosCfgSet( self, ONOSIp, configName, configParam ):
888 """
889 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700890 application.
891
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000892 ex)
jenkins1e99e7b2015-04-02 18:15:39 -0700893 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700894 ONOSIp = '10.0.0.1'
895 configName = 'org.onosproject.myapp'
896 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700897 """
Jon Hall72280bc2016-01-25 14:29:05 -0800898 try:
899 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
900 configName,
901 configParam )
902 self.handle.sendline( "" )
903 self.handle.expect( ":~" )
904 self.handle.sendline( cfgStr )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700905 self.handle.expect( "cfg set" )
Jon Hall72280bc2016-01-25 14:29:05 -0800906 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700907
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700908 paramValue = configParam.split( " " )[ 1 ]
909 paramName = configParam.split( " " )[ 0 ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700910
Jon Hall72280bc2016-01-25 14:29:05 -0800911 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700912
Jon Hall72280bc2016-01-25 14:29:05 -0800913 self.handle.sendline( checkStr )
914 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700915
Jon Hall72280bc2016-01-25 14:29:05 -0800916 if "value=" + paramValue + "," in self.handle.before:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700917 main.log.info( "cfg " + configName + " successfully set to " + configParam )
Jon Hall72280bc2016-01-25 14:29:05 -0800918 return main.TRUE
919 except pexpect.ExceptionPexpect as e:
920 main.log.exception( self.name + ": Pexpect exception found: " )
921 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700922 main.cleanAndExit()
Jon Hall72280bc2016-01-25 14:29:05 -0800923 except Exception:
924 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700925 main.cleanAndExit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700926
kelvin-onlabd3b64892015-01-20 13:26:24 -0800927 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800928 """
andrewonlab05e362f2014-10-10 00:40:57 -0400929 Uses 'onos' command to send various ONOS CLI arguments.
930 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800931 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400932 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800933
934 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400935 CLI commands for ONOS. Try to use this function first
936 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800937 function.
938 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400939 by starting onos, and typing in 'onos' to enter the
940 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800941 available commands.
942 """
andrewonlab05e362f2014-10-10 00:40:57 -0400943 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800944 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800945 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400946 return main.FALSE
947 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800948 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400949 return main.FALSE
950
kelvin8ec71442015-01-15 16:57:00 -0800951 cmdstr = str( cmdstr )
952 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700953 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -0400954
You Wangdd3dae52018-02-15 13:31:25 -0800955 self.handle.sendline( "onos-wait-for-start " + ONOSIp )
956 self.handle.expect( self.prompt )
957
958 self.handle.sendline( "onos " + ONOSIp + " " + cmdstr )
Devin Limc20e79a2017-06-07 10:29:57 -0700959 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -0400960
kelvin-onlabd3b64892015-01-20 13:26:24 -0800961 handleBefore = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -0800962 main.log.info( "Command sent successfully" )
kelvin8ec71442015-01-15 16:57:00 -0800963 # Obtain return handle that consists of result from
964 # the onos command. The string may need to be
965 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800966 returnString = handleBefore
kelvin-onlabd3b64892015-01-20 13:26:24 -0800967 return returnString
andrewonlab05e362f2014-10-10 00:40:57 -0400968 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800969 main.log.error( self.name + ": EOF exception found" )
970 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700971 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800972 except Exception:
973 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700974 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400975
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700976 def onosSecureSSH( self, userName="onos", userPWD="rocks", node="" ):
Pier88189b62016-09-07 17:01:53 -0700977 """
978 Enables secure access to ONOS console
979 by removing default users & keys.
980
981 onos-secure-ssh -u onos -p rocks node
982
983 Returns: main.TRUE on success and main.FALSE on failure
984 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000985
Pier88189b62016-09-07 17:01:53 -0700986 try:
Chiyu Chengef109502016-11-21 15:51:38 -0800987 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700988 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -0700989 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
990
991 # NOTE: this timeout may need to change depending on the network
992 # and size of ONOS
993 # TODO: Handle the other possible error
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700994 i = self.handle.expect( [ "Network\sis\sunreachable",
995 self.prompt,
996 pexpect.TIMEOUT ], timeout=180 )
Pier88189b62016-09-07 17:01:53 -0700997 if i == 0:
998 # can't reach ONOS node
999 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001000 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001001 return main.FALSE
1002 elif i == 1:
1003 # Process started
1004 main.log.info(
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001005 "Secure SSH performed on " +
1006 node )
Pier88189b62016-09-07 17:01:53 -07001007 return main.TRUE
1008 except pexpect.EOF:
1009 main.log.error( self.name + ": EOF exception found" )
1010 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001011 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001012 except Exception:
1013 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001014 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001015
kelvin-onlabd3b64892015-01-20 13:26:24 -08001016 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001017 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001018 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001019 If -f option is provided, it also forces an uninstall.
1020 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001021 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001022 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001023 files to certain onos nodes
1024
1025 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001026 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001027 try:
andrewonlab114768a2014-11-14 12:44:44 -05001028 if options:
kelvin8ec71442015-01-15 16:57:00 -08001029 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001030 else:
kelvin8ec71442015-01-15 16:57:00 -08001031 self.handle.sendline( "onos-install " + node )
1032 self.handle.expect( "onos-install " )
1033 # NOTE: this timeout may need to change depending on the network
1034 # and size of ONOS
1035 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001036 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001037 "ONOS\sis\salready\sinstalled",
Jeremyc72b2582016-02-26 18:27:38 -08001038 "already\sup-to-date",
Jon Hall3576f572016-08-23 10:01:07 -07001039 "does not exist",
Devin Limc20e79a2017-06-07 10:29:57 -07001040 self.prompt,
Jon Hall6c44c0b2016-04-20 15:21:00 -07001041 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001042 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001043 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001044 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001045 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001046 return main.FALSE
1047 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001048 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001049 main.log.info(
1050 "ONOS was installed on " +
1051 node +
1052 " and started" )
Devin Limc20e79a2017-06-07 10:29:57 -07001053 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001054 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001055 elif i == 2 or i == 3:
1056 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001057 main.log.info( "ONOS is already installed on " + node )
Devin Limc20e79a2017-06-07 10:29:57 -07001058 self.handle.expect( self.prompt )
Jeremyc72b2582016-02-26 18:27:38 -08001059 return main.TRUE
1060 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001061 # onos not packaged
1062 main.log.error( "ONOS package not found." )
Devin Limc20e79a2017-06-07 10:29:57 -07001063 self.handle.expect( self.prompt )
Jon Hall3576f572016-08-23 10:01:07 -07001064 return main.FALSE
1065 elif i == 5:
1066 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001067 main.log.info( "ONOS was installed on " + node )
1068 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001069 elif i == 6:
1070 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001071 main.log.info(
1072 "Installation of ONOS on " +
1073 node +
1074 " timed out" )
Devin Limc20e79a2017-06-07 10:29:57 -07001075 self.handle.expect( self.prompt )
Jon Hall53c5e662016-04-13 16:06:56 -07001076 main.log.warn( self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001077 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001078 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001079 main.log.error( self.name + ": EOF exception found" )
1080 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001081 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001082 except Exception:
1083 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001084 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -04001085
kelvin-onlabd3b64892015-01-20 13:26:24 -08001086 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001087 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001088 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001089 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001090 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001091 try:
kelvin8ec71442015-01-15 16:57:00 -08001092 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001093 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001094 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001095 " start" )
1096 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001097 "Job\sis\salready\srunning",
1098 "start/running",
Devin Limc20e79a2017-06-07 10:29:57 -07001099 self.prompt,
andrewonlab8d0d7d72014-10-09 16:33:15 -04001100 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001101 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001102 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001103 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001104 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001105 return main.TRUE
1106 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001107 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001108 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001109 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001110 elif i == 2:
1111 main.log.info( "ONOS service started" )
1112 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001113 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001114 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001115 main.log.error( "ONOS service failed to start" )
Devin Lim44075962017-08-11 10:56:37 -07001116
1117 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001118 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001119 main.log.error( self.name + ": EOF exception found" )
1120 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001121 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001122 except Exception:
1123 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001124 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001125
kelvin-onlabd3b64892015-01-20 13:26:24 -08001126 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001127 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001128 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001129 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001130 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001131 try:
kelvin8ec71442015-01-15 16:57:00 -08001132 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001133 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001134 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001135 " stop" )
1136 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001137 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001138 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001139 "Unknown\sinstance",
Devin Limc20e79a2017-06-07 10:29:57 -07001140 self.prompt,
Jeremy Songster14c13572016-04-21 17:34:03 -07001141 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001142 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001143 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001144 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001145 return main.TRUE
1146 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001147 self.handle.expect( self.prompt )
Jon Hall65844a32015-03-09 19:09:37 -07001148 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001149 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001150 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001151 elif i == 2:
Devin Limc20e79a2017-06-07 10:29:57 -07001152 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -07001153 main.log.warn( "ONOS wasn't running" )
1154 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001155 elif i == 3:
1156 main.log.info( "ONOS service stopped" )
1157 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001158 else:
kelvin8ec71442015-01-15 16:57:00 -08001159 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001160 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001161 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001162 main.log.error( self.name + ": EOF exception found" )
1163 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001164 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001165 except Exception:
1166 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001167 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001168
kelvin-onlabd3b64892015-01-20 13:26:24 -08001169 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001170 """
andrewonlabc8d47972014-10-09 16:52:36 -04001171 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001172 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001173 if needed
kelvin8ec71442015-01-15 16:57:00 -08001174 """
andrewonlabc8d47972014-10-09 16:52:36 -04001175 try:
kelvin8ec71442015-01-15 16:57:00 -08001176 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001177 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001178 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Devin Limc20e79a2017-06-07 10:29:57 -07001179 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001180 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001181 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001182 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001183 except pexpect.TIMEOUT:
1184 main.log.exception( self.name + ": Timeout in onosUninstall" )
1185 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001186 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001187 main.log.error( self.name + ": EOF exception found" )
1188 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001189 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001190 except Exception:
1191 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001192 main.cleanAndExit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001193
kelvin-onlabd3b64892015-01-20 13:26:24 -08001194 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001195 """
andrewonlabaedc8332014-12-04 12:43:03 -05001196 Issues the command 'onos-die <node-ip>'
1197 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001198 """
andrewonlabaedc8332014-12-04 12:43:03 -05001199 try:
kelvin8ec71442015-01-15 16:57:00 -08001200 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001201 self.handle.expect( self.prompt )
Jeremyf0aecdb2016-03-30 13:19:57 -07001202 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001203 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001204 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001205 "Killing\sONOS",
1206 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001207 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001208 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001209 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001210 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001211 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001212 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001213 return main.TRUE
1214 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001215 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001216 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001217 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001218 return main.FALSE
1219 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001220 main.log.error( self.name + ": EOF exception found" )
1221 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001222 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001223 except Exception:
1224 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001225 main.cleanAndExit()
andrewonlabaedc8332014-12-04 12:43:03 -05001226
kelvin-onlabd3b64892015-01-20 13:26:24 -08001227 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001228 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001229 Calls the command: 'onos-kill [<node-ip>]'
1230 "Remotely, and unceremoniously kills the ONOS instance running on
1231 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001232 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001233 try:
kelvin8ec71442015-01-15 16:57:00 -08001234 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001235 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001236 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001237 i = self.handle.expect( [
Devin Limc20e79a2017-06-07 10:29:57 -07001238 self.prompt,
andrewonlabe8e56fd2014-10-09 17:12:44 -04001239 "No\sroute\sto\shost",
1240 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001241 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001242
andrewonlabe8e56fd2014-10-09 17:12:44 -04001243 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001244 main.log.info(
1245 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001246 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001247 return main.TRUE
1248 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001249 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001250 return main.FALSE
1251 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001252 main.log.info(
1253 "Passwordless login for host: " +
1254 str( nodeIp ) +
1255 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001256 return main.FALSE
1257 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001258 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001259 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001260
andrewonlabe8e56fd2014-10-09 17:12:44 -04001261 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001262 main.log.error( self.name + ": EOF exception found" )
1263 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001264 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001265 except Exception:
1266 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001267 main.cleanAndExit()
andrewonlabe8e56fd2014-10-09 17:12:44 -04001268
kelvin-onlabd3b64892015-01-20 13:26:24 -08001269 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001270 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001271 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001272 a cleaner environment.
1273
andrewonlab19fbdca2014-11-14 12:55:59 -05001274 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001275 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001276 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001277 """
andrewonlab19fbdca2014-11-14 12:55:59 -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 )
kelvin8ec71442015-01-15 16:57:00 -08001281 self.handle.sendline( "onos-remove-raft-logs" )
1282 # Sometimes this command hangs
Devin Limc20e79a2017-06-07 10:29:57 -07001283 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001284 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001285 if i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001286 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001287 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001288 if i == 1:
1289 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001290 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001291 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001292 main.log.error( self.name + ": EOF exception found" )
1293 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001294 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001295 except Exception:
1296 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001297 main.cleanAndExit()
Jon Hallfcc88622014-11-25 13:09:54 -05001298
kelvin-onlabd3b64892015-01-20 13:26:24 -08001299 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001300 """
1301 Calls the command 'onos-start-network [ <mininet-topo> ]
1302 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001303 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001304 cell."
andrewonlab94282092014-10-10 13:00:11 -04001305 * Specify mininet topology file name for mntopo
1306 * Topo files should be placed at:
1307 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001308
andrewonlab94282092014-10-10 13:00:11 -04001309 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001310 """
andrewonlab94282092014-10-10 13:00:11 -04001311 try:
1312 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001313 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001314 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001315
kelvin8ec71442015-01-15 16:57:00 -08001316 mntopo = str( mntopo )
1317 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001318 self.handle.expect( self.prompt )
andrewonlab94282092014-10-10 13:00:11 -04001319
kelvin8ec71442015-01-15 16:57:00 -08001320 self.handle.sendline( "onos-start-network " + mntopo )
1321 self.handle.expect( "mininet>" )
1322 main.log.info( "Network started, entered mininet prompt" )
1323
1324 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001325
1326 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001327 main.log.error( self.name + ": EOF exception found" )
1328 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001329 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001330 except Exception:
1331 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001332 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -04001333
Jeremy Songster14c13572016-04-21 17:34:03 -07001334 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001335 """
1336 Run's onos-wait-for-start which only returns once ONOS is at run
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001337 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001338
Jon Hall7993bfc2014-10-09 16:30:14 -04001339 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001340 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001341 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001342 self.handle.sendline( "onos-wait-for-start " + node )
1343 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001344 # NOTE: this timeout is arbitrary"
Jon Hallcababf72018-02-05 12:05:19 -08001345 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT, "Password:" ], timeout )
Jon Hall7993bfc2014-10-09 16:30:14 -04001346 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001347 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001348 return main.TRUE
Jon Hallcababf72018-02-05 12:05:19 -08001349 elif i == 1 or i == 2:
kelvin8ec71442015-01-15 16:57:00 -08001350 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001351 # we will kill it on timeout
Jon Hallcababf72018-02-05 12:05:19 -08001352 if i == 1:
1353 main.log.error( "ONOS has not started yet" )
1354 elif i == 2:
1355 main.log.error( "Cannot login to ONOS CLI, try using onos-secure-ssh" )
kelvin8ec71442015-01-15 16:57:00 -08001356 self.handle.send( "\x03" ) # Control-C
Devin Limc20e79a2017-06-07 10:29:57 -07001357 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001358 return main.FALSE
1359 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001360 main.log.error( self.name + ": EOF exception found" )
1361 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001362 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001363 except Exception:
1364 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001365 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001366
Devin Lim142b5342017-07-20 15:22:39 -07001367 def preventAutoRespawn( self ):
1368 """
1369 Description:
1370 This will prevent ONOSservice to automatically
1371 respawn.
1372 """
1373 try:
1374 self.handle.sendline( "sed -i -e 's/^respawn$/#respawn/g' tools/package/init/onos.conf" )
1375 self.handle.expect( "\$" ) # $ from the command
1376 self.handle.sendline( "sed -i -e 's/^Restart=always/Restart=no/g' tools/package/init/onos.service" )
1377 self.handle.expect( "\$" ) # $ from the command
1378 self.handle.expect( "\$" ) # $ from the prompt
1379 except pexpect.EOF:
1380 main.log.error( self.name + ": EOF exception found" )
1381 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001382 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001383 except Exception:
1384 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001385 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001386
kelvin-onlabd3b64892015-01-20 13:26:24 -08001387 def pushTestIntentsShell(
1388 self,
1389 dpidSrc,
1390 dpidDst,
1391 numIntents,
1392 dirFile,
1393 onosIp,
1394 numMult="",
1395 appId="",
1396 report=True,
1397 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001398 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001399 Description:
kelvin8ec71442015-01-15 16:57:00 -08001400 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001401 better parallelize the results than the CLI
1402 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001403 * dpidSrc: specify source dpid
1404 * dpidDst: specify destination dpid
1405 * numIntents: specify number of intents to push
1406 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001407 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001408 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001409 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001410 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001411 """
1412 try:
1413 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001414 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001415 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001416 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001417 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001418 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001419
kelvin-onlabd3b64892015-01-20 13:26:24 -08001420 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1421 if not numMult:
1422 addIntents = addDpid + " " + str( numIntents )
1423 elif numMult:
1424 addIntents = addDpid + " " + str( numIntents ) + " " +\
1425 str( numMult )
1426 if appId:
1427 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001428 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001429 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001430
andrewonlabaedc8332014-12-04 12:43:03 -05001431 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001432 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001433 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001434 sendCmd = addApp + " &"
1435 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001436
kelvin-onlabd3b64892015-01-20 13:26:24 -08001437 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001438
1439 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001440 main.log.error( self.name + ": EOF exception found" )
1441 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001442 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001443 except Exception:
1444 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001445 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001446
kelvin-onlabd3b64892015-01-20 13:26:24 -08001447 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001448 """
andrewonlab970399c2014-11-07 13:09:32 -05001449 Capture all packet activity and store in specified
1450 directory/file
1451
1452 Required:
1453 * interface: interface to capture
1454 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001455 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001456 try:
1457 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001458 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001459
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001460 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001461 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001462 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001463 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001464 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001465
Jon Hallfebb1c72015-03-05 13:30:09 -08001466 main.log.info( "Tshark started capturing files on " +
1467 str( interface ) + " and saving to directory: " +
1468 str( dirFile ) )
1469 except pexpect.EOF:
1470 main.log.error( self.name + ": EOF exception found" )
1471 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001472 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001473 except Exception:
1474 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001475 main.cleanAndExit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001476
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001477 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001478 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001479 Description:
1480 Execute onos-topo-cfg command
1481 Required:
1482 onosIp - IP of the onos node you want to send the json to
1483 jsonFile - File path of the json file
1484 Return:
1485 Returns main.TRUE if the command is successfull; Returns
1486 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001487 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001488 try:
kelvin8ec71442015-01-15 16:57:00 -08001489 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001490 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001491 cmd = "onos-topo-cfg "
1492 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1493 handle = self.handle.before
1494 print handle
1495 if "Error" in handle:
1496 main.log.error( self.name + ": " + self.handle.before )
1497 return main.FALSE
1498 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001499 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001500 return main.TRUE
1501
Jon Hallfebb1c72015-03-05 13:30:09 -08001502 except pexpect.EOF:
1503 main.log.error( self.name + ": EOF exception found" )
1504 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001505 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001506 except Exception:
1507 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001508 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001509
jenkins1e99e7b2015-04-02 18:15:39 -07001510 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001511 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001512 Required:
kelvin8ec71442015-01-15 16:57:00 -08001513 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001514 * directory to store results
1515 Optional:
1516 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001517 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001518 Description:
1519 Uses tshark command to grep specific group of packets
1520 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001521 The timestamp is hardcoded to be in epoch
1522 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001523 try:
1524 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001525 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001526 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001527 if grepOptions:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001528 grepStr = "grep " + str( grepOptions )
jenkins1e99e7b2015-04-02 18:15:39 -07001529 else:
1530 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001531
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001532 cmd = (
1533 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001534 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001535 " -t e | " +
1536 grepStr + " --line-buffered \"" +
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001537 str( grep ) +
Jon Hallfebb1c72015-03-05 13:30:09 -08001538 "\" >" +
1539 directory +
1540 " &" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001541 self.handle.sendline( cmd )
1542 main.log.info( cmd )
Jon Hallfebb1c72015-03-05 13:30:09 -08001543 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001544 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001545 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001546 except pexpect.EOF:
1547 main.log.error( self.name + ": EOF exception found" )
1548 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001549 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001550 except Exception:
1551 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001552 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001553
kelvin-onlabd3b64892015-01-20 13:26:24 -08001554 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001555 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001556 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001557 """
1558 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001559 try:
1560 self.execute( cmd="sudo rm /tmp/wireshark*" )
1561 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001562 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1563 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001564 self.handle.sendline( "" )
1565 main.log.info( "Tshark stopped" )
1566 except pexpect.EOF:
1567 main.log.error( self.name + ": EOF exception found" )
1568 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001569 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001570 except Exception:
1571 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001572 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001573
kelvin8ec71442015-01-15 16:57:00 -08001574 def ptpd( self, args ):
1575 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001576 Initiate ptp with user-specified args.
1577 Required:
1578 * args: specify string of args after command
1579 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001580 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001581 try:
kelvin8ec71442015-01-15 16:57:00 -08001582 self.handle.sendline( "sudo ptpd " + str( args ) )
1583 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001584 "Multiple",
1585 "Error",
Devin Limc20e79a2017-06-07 10:29:57 -07001586 self.prompt ] )
1587 self.handle.expect( self.prompt )
andrewonlabba44bcf2014-10-16 16:54:41 -04001588
andrewonlab0c38a4a2014-10-28 18:35:35 -04001589 if i == 0:
1590 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001591 main.log.info( "ptpd returned an error: " +
1592 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001593 return handle
1594 elif i == 1:
1595 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001596 main.log.error( "ptpd returned an error: " +
1597 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001598 return handle
1599 else:
1600 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001601
andrewonlab0c38a4a2014-10-28 18:35:35 -04001602 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001603 main.log.error( self.name + ": EOF exception found" )
1604 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001605 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001606 except Exception:
1607 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001608 main.cleanAndExit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001609
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001610 def dumpONOSCmd( self, ONOSIp, CMD, destDir, filename, options="" ):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001611 """
Pier50f0bc62016-09-07 17:53:40 -07001612 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001613 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001614 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001615 Localtime will be attached to the filename
1616
1617 Required:
1618 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001619 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001620 * destDir: specify directory to copy to.
1621 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001622 * fileName: Name of the file
Pier50f0bc62016-09-07 17:53:40 -07001623 * options: Options for ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001624 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001625
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001626 localtime = time.strftime( '%x %X' )
1627 localtime = localtime.replace( "/", "" )
1628 localtime = localtime.replace( " ", "_" )
1629 localtime = localtime.replace( ":", "" )
1630 if destDir[ -1: ] != "/":
1631 destDir += "/"
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001632 cmd = CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
1633 return self.onosCli( ONOSIp, cmd )
Flavio Castrob7718952016-05-18 08:53:41 -07001634
kelvin-onlabd3b64892015-01-20 13:26:24 -08001635 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001636 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001637 """
1638 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001639 Current implementation of ONOS deletes its karaf
1640 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001641 you may want to use this function to capture
1642 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001643 Localtime will be attached to the filename
1644
1645 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001646 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001647 copy.
kelvin8ec71442015-01-15 16:57:00 -08001648 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001649 For copying multiple files, leave copyFileName
1650 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001651 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001652 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001653 ex ) /tmp/
1654 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001655 * copyFileName: If you want to rename the log
1656 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001657 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001658 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001659 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001660 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001661 localtime = localtime.replace( "/", "" )
1662 localtime = localtime.replace( " ", "_" )
1663 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001664 if destDir[ -1: ] != "/":
1665 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001666
kelvin-onlabd3b64892015-01-20 13:26:24 -08001667 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001668 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1669 str( destDir ) + str( copyFileName ) +
1670 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001671 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001672 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001673 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001674 self.handle.sendline( "cp " + str( logToCopy ) +
1675 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001676 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001677 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001678
kelvin8ec71442015-01-15 16:57:00 -08001679 return self.handle.before
1680
1681 except pexpect.EOF:
1682 main.log.error( "Copying files failed" )
1683 main.log.error( self.name + ": EOF exception found" )
1684 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001685 except Exception:
1686 main.log.exception( "Copying files failed" )
1687
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001688 def checkLogs( self, onosIp, restart=False ):
kelvin8ec71442015-01-15 16:57:00 -08001689 """
Jon Hall94fd0472014-12-08 11:52:42 -08001690 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001691 If restart is True, use the old version of onos-check-logs which
1692 does not print the full stacktrace, but shows the entire log file,
1693 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001694 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001695 """
Jon Hall94fd0472014-12-08 11:52:42 -08001696 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001697 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001698 if restart:
1699 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001700 self.handle.sendline( cmd )
1701 self.handle.expect( cmd )
Devin Limdc78e202017-06-09 18:30:07 -07001702 self.handle.expect( self.prompt + " " )
Jon Hall94fd0472014-12-08 11:52:42 -08001703 response = self.handle.before
1704 return response
1705 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001706 main.log.error( "Lost ssh connection" )
1707 main.log.error( self.name + ": EOF exception found" )
1708 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001709 except Exception:
1710 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001711 main.cleanAndExit()
Jon Hall94fd0472014-12-08 11:52:42 -08001712
kelvin-onlabd3b64892015-01-20 13:26:24 -08001713 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001714 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001715 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001716 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001717 try:
kelvin8ec71442015-01-15 16:57:00 -08001718 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001719 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001720 self.handle.sendline( "onos-service " + str( node ) +
1721 " status" )
1722 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001723 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001724 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001725 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001726 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001727 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001728 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001729 self.handle.expect( self.prompt )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001730
You Wangef1e6572016-03-08 12:53:18 -08001731 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001732 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001733 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001734 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001735 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001736 main.log.error( "ONOS service failed to check the status" )
Devin Lim44075962017-08-11 10:56:37 -07001737
1738 main.cleanAndExit()
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001739 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001740 main.log.error( self.name + ": EOF exception found" )
1741 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001742 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001743 except Exception:
1744 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001745 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001746
Jon Hall63604932015-02-26 17:09:50 -08001747 def setIpTables( self, ip, port='', action='add', packet_type='',
1748 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001749 """
Jon Hall21270ac2015-02-16 17:59:55 -08001750 Description:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001751 add or remove iptables rule to DROP (default) packets from
Jon Hall21270ac2015-02-16 17:59:55 -08001752 specific IP and PORT
1753 Usage:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001754 * specify action ('add' or 'remove')
Jon Hall21270ac2015-02-16 17:59:55 -08001755 when removing, pass in the same argument as you would add. It will
1756 delete that specific rule.
1757 * specify the ip to block
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001758 * specify the destination port to block (defaults to all ports)
1759 * optional packet type to block (default tcp)
1760 * optional iptables rule (default DROP)
1761 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001762 * States boolean toggles adding all supported tcp states to the
1763 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001764 Returns:
1765 main.TRUE on success or
1766 main.FALSE if given invalid input or
1767 main.ERROR if there is an error in response from iptables
1768 WARNING:
1769 * This function uses root privilege iptables command which may result
1770 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001771 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001772
Jon Hall21270ac2015-02-16 17:59:55 -08001773 # NOTE*********
1774 # The strict checking methods of this driver function is intentional
1775 # to discourage any misuse or error of iptables, which can cause
1776 # severe network errors
1777 # *************
1778
1779 # NOTE: Sleep needed to give some time for rule to be added and
1780 # registered to the instance. If you are calling this function
1781 # multiple times this sleep will prevent any errors.
1782 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001783 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001784 try:
1785 # input validation
1786 action_type = action.lower()
1787 rule = rule.upper()
1788 direction = direction.upper()
1789 if action_type != 'add' and action_type != 'remove':
1790 main.log.error( "Invalid action type. Use 'add' or "
1791 "'remove' table rule" )
1792 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1793 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1794 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1795 "'ACCEPT' or 'LOG' only." )
1796 if direction != 'INPUT' and direction != 'OUTPUT':
1797 # NOTE currently only supports rules INPUT and OUPTUT
1798 main.log.error( "Invalid rule. Valid directions are"
1799 " 'OUTPUT' or 'INPUT'" )
1800 return main.FALSE
1801 return main.FALSE
1802 return main.FALSE
1803 if action_type == 'add':
1804 # -A is the 'append' action of iptables
1805 actionFlag = '-A'
1806 elif action_type == 'remove':
1807 # -D is the 'delete' rule of iptables
1808 actionFlag = '-D'
1809 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001810 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001811 cmd = "sudo iptables " + actionFlag + " " +\
1812 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001813 " -s " + str( ip )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001814 # " -p " + str( packet_type ) +\
Jon Hall63604932015-02-26 17:09:50 -08001815 if packet_type:
1816 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001817 if port:
1818 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001819 if states:
1820 cmd += " -m state --state="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001821 # FIXME- Allow user to configure which states to block
Jon Hall63604932015-02-26 17:09:50 -08001822 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001823 cmd += " -j " + str( rule )
1824
1825 self.handle.sendline( cmd )
Devin Limc20e79a2017-06-07 10:29:57 -07001826 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001827 main.log.warn( self.handle.before )
1828
1829 info_string = "On " + str( self.name )
1830 info_string += " " + str( action_type )
1831 info_string += " iptable rule [ "
1832 info_string += " IP: " + str( ip )
1833 info_string += " Port: " + str( port )
1834 info_string += " Rule: " + str( rule )
1835 info_string += " Direction: " + str( direction ) + " ]"
1836 main.log.info( info_string )
1837 return main.TRUE
1838 except pexpect.TIMEOUT:
1839 main.log.exception( self.name + ": Timeout exception in "
1840 "setIpTables function" )
1841 return main.ERROR
1842 except pexpect.EOF:
1843 main.log.error( self.name + ": EOF exception found" )
1844 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001845 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001846 except Exception:
1847 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001848 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001849
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001850 def detailed_status( self, log_filename ):
Jon Hallefbd9792015-03-05 16:11:36 -08001851 """
Jon Hall0468b042015-02-19 19:08:21 -08001852 This method is used by STS to check the status of the controller
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001853 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001854 """
Jon Hall0468b042015-02-19 19:08:21 -08001855 import re
1856 try:
1857 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001858 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001859 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -07001860 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001861 self.handle.sendline( "service onos status" )
Devin Limc20e79a2017-06-07 10:29:57 -07001862 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001863 response = self.handle.before
1864 if re.search( "onos start/running", response ):
1865 # onos start/running, process 10457
1866 return 'RUNNING'
1867 # FIXME: Implement this case
1868 # elif re.search( pattern, response ):
1869 # return 'STARTING'
1870 elif re.search( "onos stop/", response ):
1871 # onos stop/waiting
1872 # FIXME handle this differently?: onos stop/pre-stop
1873 return 'STOPPED'
1874 # FIXME: Implement this case
1875 # elif re.search( pattern, response ):
1876 # return 'FROZEN'
1877 else:
1878 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001879 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001880 main.log.warn( response )
1881 return 'ERROR', "Unknown response: %s" % response
1882 except pexpect.TIMEOUT:
1883 main.log.exception( self.name + ": Timeout exception in "
1884 "setIpTables function" )
1885 return 'ERROR', "Pexpect Timeout"
1886 except pexpect.EOF:
1887 main.log.error( self.name + ": EOF exception found" )
1888 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001889 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001890 except Exception:
1891 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001892 main.cleanAndExit()
Jon Hall0468b042015-02-19 19:08:21 -08001893
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001894 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001895 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001896 Create/formats the LinkGraph.cfg file based on arguments
1897 -only creates a linear topology and connects islands
1898 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001899 -must be called by ONOSbench
1900
Jon Hall4ba53f02015-07-29 13:07:41 -07001901 ONOSIpList - list of all of the node IPs to be used
1902
1903 deviceCount - number of switches to be assigned
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001904 '''
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001905 main.log.info( "Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001906 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001907 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001908
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001909 linkGraph = open( tempFile, 'w+' )
1910 linkGraph.write( "# NullLinkProvider topology description (config file).\n" )
1911 linkGraph.write( "# The NodeId is only added if the destination is another node's device.\n" )
1912 linkGraph.write( "# Bugs: Comments cannot be appended to a line to be read.\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001913
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001914 clusterCount = len( ONOSIpList )
Jon Hall4ba53f02015-07-29 13:07:41 -07001915
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001916 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
1917 deviceCount = int( deviceCount )
1918 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001919 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07001920
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001921 for node in range( 1, clusterCount + 1 ):
1922 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001923
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001924 for node in range( 1, ( deviceCount % clusterCount )+1 ):
1925 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001926
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001927 if isinstance( deviceCount, list ):
1928 main.log.info( "Using provided device distribution" )
1929 switchList = [ 0 ]
andrew@onlab.us3b087132015-03-11 15:00:08 -07001930 for i in deviceCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001931 switchList.append( int( i ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001932
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001933 tempList = [ '0' ]
1934 tempList.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001935 ONOSIpList = tempList
1936
1937 myPort = 6
1938 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001939 for node in range( 1, clusterCount+1 ):
1940 if switchList[ node ] == 0:
andrew@onlab.us3b087132015-03-11 15:00:08 -07001941 continue
1942
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001943 linkGraph.write( "graph " + ONOSIpList[ node ] + " {\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001944
andrew@onlab.us3b087132015-03-11 15:00:08 -07001945 if node > 1:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001946 # connect to last device on previous node
1947 line = ( "\t0:5 -> " + str( lastSwitch ) + ":6:" + lastIp + "\n" ) # ONOSIpList[node-1]
1948 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07001949
1950 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001951 for switch in range( 0, switchList[ node ]-1 ):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001952 line = ""
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001953 line = ( "\t" + str( switch ) + ":" + str( myPort ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001954 line += " -- "
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001955 line += ( str( switch+1 ) + ":" + str( myPort-1 ) + "\n" )
1956 linkGraph.write( line )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001957 lastSwitch = switch+1
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001958 lastIp = ONOSIpList[ node ]
Jon Hall4ba53f02015-07-29 13:07:41 -07001959
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001960 # lastSwitch += 1
1961 if node < ( clusterCount ):
1962 # connect to first device on the next node
1963 line = ( "\t" + str( lastSwitch ) + ":6 -> 0:5:" + ONOSIpList[ node+1 ] + "\n" )
1964 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07001965
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001966 linkGraph.write( "}\n" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001967 linkGraph.close()
1968
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001969 # SCP
1970 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath )
1971 main.log.info( "linkGraph.cfg creation complete" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001972
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001973 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001974 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001975 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
1976 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07001977 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 +00001978 '''
1979
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001980 main.log.info( "Configuring Null Device Provider" )
1981 clusterCount = len( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001982
Jon Hall4ba53f02015-07-29 13:07:41 -07001983 try:
1984
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001985 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
1986 main.log.info( "Creating device distribution" )
1987 deviceCount = int( deviceCount )
1988 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001989 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001990
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001991 for node in range( 1, clusterCount + 1 ):
1992 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001993
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001994 for node in range( 1, ( deviceCount % clusterCount )+1 ):
1995 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001996
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001997 if isinstance( deviceCount, list ):
1998 main.log.info( "Using provided device distribution" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001999
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002000 if len( deviceCount ) == clusterCount:
2001 switchList = [ '0' ]
2002 switchList.extend( deviceCount )
Jon Hall4ba53f02015-07-29 13:07:41 -07002003
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002004 if len( deviceCount ) == ( clusterCount + 1 ):
2005 if deviceCount[ 0 ] == '0' or deviceCount[ 0 ] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002006 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002007
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002008 assert len( switchList ) == ( clusterCount + 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002009
cameron@onlab.us75900962015-03-30 13:22:49 -07002010 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002011 main.log.error( "Bad device/Ip list match" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002012 except TypeError:
2013 main.log.exception( self.name + ": Object not as expected" )
2014 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002015 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002016 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002017 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002018
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002019 ONOSIp = [ 0 ]
2020 ONOSIp.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002021
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002022 devicesString = "devConfigs = "
2023 for node in range( 1, len( ONOSIp ) ):
2024 devicesString += ( ONOSIp[ node ] + ":" + str( switchList[ node ] ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002025 if node < clusterCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002026 devicesString += ( "," )
Jon Hall4ba53f02015-07-29 13:07:41 -07002027
2028 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002029 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2030 self.handle.expect( ":~" )
2031 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str( numPorts ) )
2032 self.handle.expect( ":~" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002033
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002034 for i in range( 10 ):
2035 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider" )
2036 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002037 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002038 if ( " value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002039 break
2040 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002041 time.sleep( 1 )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002042
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002043 assert ( "value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002044
cameron@onlab.us75900962015-03-30 13:22:49 -07002045 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002046 main.log.error( "Incorrect Config settings: " + verification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002047 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002048 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002049 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002050
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002051 def configNullLink( self, fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002052 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002053 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002054 you want to use a different topology file than linkGraph.cfg
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002055 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002056
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002057 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002058 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str( eventRate ) )
2059 self.handle.expect( ":~" )
2060 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2061 self.handle.expect( ":~" )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002062
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002063 for i in range( 10 ):
2064 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider" )
2065 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002066 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002067 if ( " value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002068 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002069 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002070 time.sleep( 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002071
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002072 assert ( "value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002073
cameron@onlab.us75900962015-03-30 13:22:49 -07002074 except pexpect.EOF:
2075 main.log.error( self.name + ": EOF exception found" )
2076 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002077 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002078 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002079 main.log.info( "Settings did not post to ONOS" )
2080 main.log.error( varification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002081 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002082 main.log.exception( self.name + ": Uncaught exception!" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002083 main.log.error( varification )
Devin Lim44075962017-08-11 10:56:37 -07002084 main.cleanAndExit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002085
kelvin-onlaba4074292015-07-09 15:19:49 -07002086 def getOnosIps( self ):
2087 """
2088 Get all onos IPs stored in
2089 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002090
kelvin-onlaba4074292015-07-09 15:19:49 -07002091 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002092
Chiyu Chengec63bde2016-11-17 18:11:36 -08002093 def listLog( self, nodeIp ):
2094 """
2095 Get a list of all the karaf log names
2096 """
2097 try:
2098 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2099 self.handle.sendline( cmd )
2100 self.handle.expect( ":~" )
2101 before = self.handle.before.splitlines()
2102 logNames = []
2103 for word in before:
2104 if 'karaf.log' in word:
2105 logNames.append( word )
2106 return logNames
2107 except pexpect.EOF:
2108 main.log.error( self.name + ": EOF exception found" )
2109 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002110 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002111 except pexpect.TIMEOUT:
2112 main.log.error( self.name + ": TIMEOUT exception found" )
2113 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002114 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002115 except Exception:
2116 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002117 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002118
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002119 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002120 """
2121 Searches the latest ONOS log file for the given search terms and
2122 prints the total occurances of each term. Returns to combined total of
2123 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002124
Jon Hallb4242222016-01-25 17:07:04 -08002125 Arguments:
2126 * nodeIp - The ip of the ONOS node where the log is located
2127 * searchTerms - A string to grep for or a list of strings to grep
2128 for in the ONOS log. Will print out the number of
2129 occurances for each term.
2130 Optional Arguments:
2131 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2132 containing each search term as well as the total
2133 number of occurances of each term. Defaults to 's',
2134 which prints the simple output of just the number
2135 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002136 * startStr - the start string to be given to stream editor command
2137 as the start point for extraction of data
2138 * endStr - the end string to be given to stream editor command as
2139 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002140 """
2141 try:
2142 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002143 if isinstance( searchTerms, str ):
2144 searchTerms = [ searchTerms ]
Jon Hallb4242222016-01-25 17:07:04 -08002145 numTerms = len( searchTerms )
2146 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002147
Jon Hallb4242222016-01-25 17:07:04 -08002148 totalHits = 0
2149 logLines = []
2150 for termIndex in range( numTerms ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002151 term = searchTerms[ termIndex ]
2152 logLines.append( [ term ] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002153 if startStr and endStr:
2154 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2155 startStr,
2156 endStr,
2157 term )
2158 else:
2159 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2160 term )
Jon Hallb4242222016-01-25 17:07:04 -08002161 self.handle.sendline( cmd )
2162 self.handle.expect( ":~" )
2163 before = self.handle.before.splitlines()
2164 count = 0
2165 for line in before:
2166 if term in line and "grep" not in line:
2167 count += 1
2168 if before.index( line ) > ( len( before ) - 7 ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002169 logLines[ termIndex ].append( line )
Jon Hallb4242222016-01-25 17:07:04 -08002170 main.log.info( "{}: {}".format( term, count ) )
2171 totalHits += count
2172 if termIndex == numTerms - 1:
2173 print "\n"
2174 if outputMode != "s":
2175 outputString = ""
2176 for term in logLines:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002177 outputString = term[ 0 ] + ": \n"
Jon Hallb4242222016-01-25 17:07:04 -08002178 for line in range( 1, len( term ) ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002179 outputString += ( "\t" + term[ line ] + "\n" )
2180 if outputString != ( term[ 0 ] + ": \n" ):
Jon Hallb4242222016-01-25 17:07:04 -08002181 main.log.info( outputString )
2182 main.log.info( "=" * 70 )
2183 return totalHits
2184 except pexpect.EOF:
2185 main.log.error( self.name + ": EOF exception found" )
2186 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002187 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002188 except pexpect.TIMEOUT:
2189 main.log.error( self.name + ": TIMEOUT exception found" )
2190 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002191 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002192 except Exception:
2193 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002194 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002195
2196 def copyMininetFile( self, fileName, localPath, userName, ip,
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002197 mnPath='~/mininet/custom/', timeout = 60 ):
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002198 """
2199 Description:
2200 Copy mininet topology file from dependency folder in the test folder
2201 and paste it to the mininet machine's mininet/custom folder
2202 Required:
2203 fileName - Name of the topology file to copy
2204 localPath - File path of the mininet topology file
2205 userName - User name of the mininet machine to send the file to
2206 ip - Ip address of the mininet machine
2207 Optional:
2208 mnPath - of the mininet directory to send the file to
2209 Return:
2210 Return main.TRUE if successfully copied the file otherwise
2211 return main.FALSE
2212 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002213
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002214 try:
2215 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2216 str( ip ) + ":" + mnPath + fileName
2217
2218 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002219 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002220
2221 main.log.info( self.name + ": Execute: " + cmd )
2222
2223 self.handle.sendline( cmd )
2224
2225 i = self.handle.expect( [ 'No such file',
2226 "100%",
2227 pexpect.TIMEOUT ] )
2228
2229 if i == 0:
2230 main.log.error( self.name + ": File " + fileName +
2231 " does not exist!" )
2232 return main.FALSE
2233
2234 if i == 1:
2235 main.log.info( self.name + ": File " + fileName +
2236 " has been copied!" )
2237 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002238 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002239 return main.TRUE
2240
2241 except pexpect.EOF:
2242 main.log.error( self.name + ": EOF exception found" )
2243 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002244 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002245 except pexpect.TIMEOUT:
2246 main.log.error( self.name + ": TIMEOUT exception found" )
2247 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002248 main.cleanAndExit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002249
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002250 def jvmSet( self, memory=8 ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002251
cameron@onlab.us78b89652015-07-08 15:21:03 -07002252 import os
2253
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002254 homeDir = os.path.expanduser( '~' )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002255 filename = "/onos/tools/package/bin/onos-service"
2256
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002257 serviceConfig = open( homeDir + filename, 'w+' )
2258 serviceConfig.write( "#!/bin/bash\n " )
2259 serviceConfig.write( "#------------------------------------- \n " )
2260 serviceConfig.write( "# Starts ONOS Apache Karaf container\n " )
2261 serviceConfig.write( "#------------------------------------- \n " )
2262 serviceConfig.write( "#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n " )
2263 serviceConfig.write( """export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str( memory ) + "G -Xmx" + str( memory ) + """G}" \n """ )
2264 serviceConfig.write( "[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n" )
2265 serviceConfig.write( """${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """ )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002266 serviceConfig.close()
2267
Jon Hall6c44c0b2016-04-20 15:21:00 -07002268 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002269
cameron@onlab.us78b89652015-07-08 15:21:03 -07002270 filename = main.TEST + "DB"
2271 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002272
cameron@onlab.us78b89652015-07-08 15:21:03 -07002273 for item in testData:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002274 if isinstance( item, string ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002275 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002276 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002277 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002278 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002279
Jon Hall6c44c0b2016-04-20 15:21:00 -07002280 DBFile = open( filename, "a" )
2281 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002282 DBFile.close()
2283
Jon Hall6c44c0b2016-04-20 15:21:00 -07002284 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002285
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002286 self.handle.sendline( "onos " + ONOSIp + " summary" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002287 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002288
2289 summaryStr = self.handle.before
2290 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2291
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002292 # passed = "SCC(s)=1" in summaryStr
2293 # if deviceCount:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002294 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
cameron@onlab.us78b89652015-07-08 15:21:03 -07002295
GlennRC772363b2015-08-25 13:05:57 -07002296 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002297 if "SCC(s)=1," in summaryStr:
2298 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002299 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002300 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002301 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002302
2303 if deviceCount:
2304 print" ============================="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002305 checkStr = "devices=" + str( deviceCount[ 0 ] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002306 print "Checkstr: " + checkStr
2307 if checkStr not in summaryStr:
2308 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002309 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002310 else:
2311 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002312
2313 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002314
Jon Hall8f6d4622016-05-23 15:27:18 -07002315 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002316 """
2317 Update self.ip_address with numerical ip address. If multiple IP's are
2318 located on the device, will attempt to use self.nicAddr to choose the
2319 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2320 determine the correct address.
2321
2322 ONLY WORKS WITH IPV4 ADDRESSES
2323 """
2324 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002325 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002326 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2327 pattern = re.compile( ipPat )
2328 match = re.search( pattern, self.ip_address )
2329 if self.nicAddr:
2330 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2331 nicPat = re.compile( nicPat )
2332 else:
2333 nicPat = None
2334 # IF self.ip_address is an ip address and matches
2335 # self.nicAddr: return self.ip_address
2336 if match:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002337 curIp = match.group( 0 )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002338 if nicPat:
2339 nicMatch = re.search( nicPat, curIp )
2340 if nicMatch:
2341 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002342 # ELSE: IF iface, return ip of interface
2343 cmd = "ifconfig"
2344 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2345 if iface:
2346 cmd += " " + str( iface )
2347 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002348 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2349 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002350 if iface:
2351 if ips:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002352 ip = ips[ 0 ]
Jon Hall8f6d4622016-05-23 15:27:18 -07002353 self.ip_address = ip
2354 return ip
2355 else:
2356 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2357 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002358 if nicPat:
2359 for ip in ips:
2360 curMatch = re.search( nicPat, ip )
2361 if curMatch:
2362 self.ip_address = ip
2363 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002364 else: # If only one non-localhost ip, return that
2365 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002366 if len( tmpList ) == 1:
2367 curIp = tmpList[ 0 ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002368 self.ip_address = curIp
2369 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002370 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002371 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002372 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002373 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002374 main.log.exception( "Error executing ifconfig" )
2375 except IndexError:
2376 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002377 except Exception:
2378 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002379
Devin Lim461f0872017-06-05 16:49:33 -07002380 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002381 '''
suibin zhang116647a2016-05-06 16:30:09 -07002382 Start onos cluster with defined nodes, but only with drivers app
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002383 '''
suibin zhang116647a2016-05-06 16:30:09 -07002384 import time
2385
2386 self.createCellFile( self.ip_address,
2387 "temp",
2388 self.ip_address,
2389 "drivers",
Devin Lim461f0872017-06-05 16:49:33 -07002390 nodeList, onosUser )
suibin zhang116647a2016-05-06 16:30:09 -07002391
2392 main.log.info( self.name + ": Apply cell to environment" )
2393 cellResult = self.setCell( "temp" )
2394 verifyResult = self.verifyCell()
2395
2396 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002397 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002398
You Wangc669d212017-01-25 11:09:48 -08002399 main.log.info( self.name + ": Uninstalling ONOS" )
2400 for nd in nodeList:
2401 self.onosUninstall( nodeIp=nd )
2402
suibin zhang116647a2016-05-06 16:30:09 -07002403 main.log.info( self.name + ": Installing ONOS package" )
2404 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002405 self.onosInstall( node=nd )
2406
2407 main.log.info( self.name + ": Set up ONOS secure SSH" )
2408 for nd in nodeList:
2409 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002410
2411 main.log.info( self.name + ": Starting ONOS service" )
2412 time.sleep( onosStartupSleep )
2413
2414 onosStatus = True
2415 for nd in nodeList:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002416 onosStatus = onosStatus & self.isup( node = nd )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002417 # print "onosStatus is: " + str( onosStatus )
suibin zhang116647a2016-05-06 16:30:09 -07002418
2419 return main.TRUE if onosStatus else main.FALSE
2420
Devin Lim02075272017-07-10 15:33:21 -07002421 def onosNetCfg( self, controllerIp, path, fileName ):
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002422 """
2423 Push a specified json file to ONOS through the onos-netcfg service
2424
2425 Required:
Devin Lim02075272017-07-10 15:33:21 -07002426 controllerIp - the Ip of the ONOS node in the cluster
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002427 path - the location of the file to be sent
2428 fileName - name of the json file to be sent
2429
2430 Returns main.TRUE on successfully sending json file, and main.FALSE if
2431 there is an error.
2432 """
2433 try:
Devin Lim02075272017-07-10 15:33:21 -07002434 cmd = "onos-netcfg {0} {1}{2}".format( controllerIp, path, fileName )
2435 main.log.info( "Sending: " + cmd )
2436 main.ONOSbench.handle.sendline( cmd )
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002437 main.ONOSbench.handle.expect( self.prompt )
Devin Lim02075272017-07-10 15:33:21 -07002438 handle = self.handle.before
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002439 if "Error" in handle or "No such file or directory" in handle or "curl: " in handle:
2440 main.log.error( self.name + ": " + handle + self.handle.after )
Devin Lim02075272017-07-10 15:33:21 -07002441 return main.FALSE
Devin Lim752dd7b2017-06-27 14:40:03 -07002442 return main.TRUE
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002443 except pexpect.EOF:
2444 main.log.error( self.name + ": EOF exception found" )
2445 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002446 main.cleanAndExit()
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002447 except Exception:
2448 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002449 main.cleanAndExit()
Devin Lim3ebd5e72017-11-14 10:38:00 -08002450
2451 def formCluster( self, onosIPs ):
2452 """
2453 From ONOS cluster for IP addresses in onosIPs list
2454 """
2455 try:
2456 onosIPs = " ".join( onosIPs )
2457 command = "onos-form-cluster {}".format( onosIPs )
2458 main.log.info( "Sending: " + command )
2459 self.handle.sendline( "" )
2460 self.handle.expect( self.prompt )
2461 self.handle.sendline( command )
2462 self.handle.expect( self.prompt )
2463 handle = self.handle.before
2464 main.log.debug( handle )
2465 assert handle is not None, "Error in sendline"
2466 assert "Command not found:" not in handle, handle
2467 assert "Error" not in handle, handle
2468 assert "Exception:" not in handle, handle
2469 assert "curl:" not in handle, handle
2470 return main.TRUE
2471 except AssertionError:
2472 main.log.exception( "{} Error in onos-form-cluster output:".format( self.name ) )
2473 return main.FALSE
2474 except TypeError:
2475 main.log.exception( self.name + ": Object not as expected" )
2476 return main.FALSE
2477 except pexpect.EOF:
2478 main.log.error( self.name + ": EOF exception found" )
2479 main.log.error( self.name + ": " + self.handle.before )
2480 main.cleanAndExit()
2481 except Exception:
2482 main.log.exception( self.name + ": Uncaught exception!" )
2483 main.cleanAndExit()
Jon Hall7ce46ea2018-02-05 12:20:59 -08002484
2485 def backupData( self, location ):
2486 """
2487 Backs up ONOS data and logs to a given location. Returns main.FALSE
2488 if there is an error executing the command, and main.TRUE otherwise.
2489 required arguments:
2490 loaction - The file path to save the backup to
2491 """
2492 try:
2493 cmd = "/opt/onos/bin/onos-backup " + str( location )
2494 self.handle.sendline( cmd )
2495 self.handle.expect( self.prompt )
2496 handle = self.handle.before
2497 main.log.debug( handle )
2498 assert handle is not None, "Error in sendline"
2499 assert "Command not found:" not in handle, handle
2500 assert "Error" not in handle, handle
2501 assert "Exception:" not in handle, handle
2502 return main.TRUE
2503 except AssertionError:
2504 main.log.exception( "{} Error in onos-backup output:".format( self.name ) )
2505 return main.FALSE
2506 except TypeError:
2507 main.log.exception( self.name + ": Object not as expected" )
2508 return main.FALSE
2509 except pexpect.EOF:
2510 main.log.error( self.name + ": EOF exception found" )
2511 main.log.error( self.name + ": " + self.handle.before )
2512 main.cleanAndExit()
2513 except Exception:
2514 main.log.exception( self.name + ": Uncaught exception!" )
2515 main.cleanAndExit()
2516
2517 def restoreData( self, location ):
2518 """
2519 Restores ONOS data and logs from a given location. Returns main.FALSE
2520 if there is an error executing the command, and main.TRUE otherwise.
2521 required arguments:
2522 loaction - The file path of a backup file
2523 """
2524 try:
2525 cmd = "/opt/onos/bin/onos-restore " + str( location )
2526 self.handle.sendline( cmd )
2527 self.handle.expect( self.prompt )
2528 handle = self.handle.before
2529 main.log.debug( handle )
2530 assert handle is not None, "Error in sendline"
2531 assert "Command not found:" not in handle, handle
2532 assert "Error" not in handle, handle
2533 assert "Exception:" not in handle, handle
2534 return main.TRUE
2535 except AssertionError:
2536 main.log.exception( "{} Error in onos-restore output:".format( self.name ) )
2537 return main.FALSE
2538 except TypeError:
2539 main.log.exception( self.name + ": Object not as expected" )
2540 return main.FALSE
2541 except pexpect.EOF:
2542 main.log.error( self.name + ": EOF exception found" )
2543 main.log.error( self.name + ": " + self.handle.before )
2544 main.cleanAndExit()
2545 except Exception:
2546 main.log.exception( self.name + ": Uncaught exception!" )
2547 main.cleanAndExit()