blob: 0cb30a5d03911bba1d3583caedff5175d6f2fea4 [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",
Jon Halld9066132018-03-01 14:52:53 -0800368 "no buck in",
Devin Limc20e79a2017-06-07 10:29:57 -0700369 self.prompt ],
Jon Hall3576f572016-08-23 10:01:07 -0700370 timeout=timeout )
371 output += str( self.handle.before + self.handle.after )
372 if i == 0:
373 main.log.error( "Wrong location" )
374 ret = main.FALSE
375 elif i == 1:
376 # end of a line, buck is still printing output
377 pass
378 elif i == 2:
379 # Build failed
380 main.log.error( "Build failed" )
381 ret = main.FALSE
382 elif i == 3:
Jon Halld9066132018-03-01 14:52:53 -0800383 main.log.error( "Could not find buck in your PATH." )
384 ret = main.FALSE
385 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -0700386 # Prompt returned
387 break
388 main.log.debug( output )
389 return ret
390 except pexpect.TIMEOUT:
391 main.log.exception( self.name + ": TIMEOUT exception found" )
392 main.log.error( self.name + ": " + self.handle.before )
393 return main.FALSE
394 except pexpect.EOF:
395 main.log.error( self.name + ": EOF exception found" )
396 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700397 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700398 except Exception:
399 main.log.exception( "Failed to build and package ONOS" )
Devin Lim44075962017-08-11 10:56:37 -0700400 main.cleanAndExit()
Jon Hall3576f572016-08-23 10:01:07 -0700401
Jon Hall61282e32015-03-19 11:34:11 -0700402 def gitPull( self, comp1="", fastForward=True ):
kelvin8ec71442015-01-15 16:57:00 -0800403 """
Jon Hallacabffd2014-10-09 12:36:53 -0400404 Assumes that "git pull" works without login
Jon Hall47a93fb2015-01-06 16:46:06 -0800405
Jon Hall61282e32015-03-19 11:34:11 -0700406 If the fastForward boolean is set to true, only git pulls that can
407 be fast forwarded will be performed. IE if you have not local commits
408 in your branch.
409
Jon Hallacabffd2014-10-09 12:36:53 -0400410 This function will perform a git pull on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800411 If used as gitPull( "NODE" ) it will do git pull + NODE. This is
Jon Hallacabffd2014-10-09 12:36:53 -0400412 for the purpose of pulling from other nodes if necessary.
413
Jon Hall47a93fb2015-01-06 16:46:06 -0800414 Otherwise, this function will perform a git pull in the
Jon Hallacabffd2014-10-09 12:36:53 -0400415 ONOS repository. If it has any problems, it will return main.ERROR
kelvin-onlabd3b64892015-01-20 13:26:24 -0800416 If it successfully does a gitPull, it will return a 1 ( main.TRUE )
Shreya Shahee15f6c2014-10-28 18:12:30 -0400417 If it has no updates, it will return 3.
Jon Hallacabffd2014-10-09 12:36:53 -0400418
kelvin8ec71442015-01-15 16:57:00 -0800419 """
Jon Hallacabffd2014-10-09 12:36:53 -0400420 try:
kelvin8ec71442015-01-15 16:57:00 -0800421 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700422 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700423 cmd = "git pull"
424 if comp1 != "":
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700425 cmd += ' ' + comp1
Jon Hall61282e32015-03-19 11:34:11 -0700426 if fastForward:
427 cmd += ' ' + " --ff-only"
428 self.handle.sendline( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800429 i = self.handle.expect(
430 [
431 'fatal',
432 'Username\sfor\s(.*):\s',
433 '\sfile(s*) changed,\s',
434 'Already up-to-date',
435 'Aborting',
436 'You\sare\snot\scurrently\son\sa\sbranch',
Jon Hall274b6642015-02-17 11:57:17 -0800437 'You asked me to pull without telling me which branch you',
438 'Pull is not possible because you have unmerged files',
Jon Hall61282e32015-03-19 11:34:11 -0700439 'Please enter a commit message to explain why this merge',
440 'Found a swap file by the name',
441 'Please, commit your changes before you can merge.',
kelvin-onlabd3b64892015-01-20 13:26:24 -0800442 pexpect.TIMEOUT ],
443 timeout=300 )
kelvin8ec71442015-01-15 16:57:00 -0800444 if i == 0:
Jon Hall61282e32015-03-19 11:34:11 -0700445 main.log.error( self.name + ": Git pull had some issue" )
446 output = self.handle.after
Devin Limdc78e202017-06-09 18:30:07 -0700447 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700448 output += self.handle.before
449 main.log.warn( output )
Jon Hallacabffd2014-10-09 12:36:53 -0400450 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800451 elif i == 1:
452 main.log.error(
453 self.name +
454 ": Git Pull Asking for username. " )
Jon Hallacabffd2014-10-09 12:36:53 -0400455 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800456 elif i == 2:
457 main.log.info(
458 self.name +
459 ": Git Pull - pulling repository now" )
Devin Limc20e79a2017-06-07 10:29:57 -0700460 self.handle.expect( self.prompt, 120 )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800461 # So that only when git pull is done, we do mvn clean compile
462 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800463 elif i == 3:
464 main.log.info( self.name + ": Git Pull - Already up to date" )
Devin Limc20e79a2017-06-07 10:29:57 -0700465 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800466 elif i == 4:
467 main.log.info(
468 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800469 ": Git Pull - Aborting..." +
470 "Are there conflicting git files?" )
Jon Hallacabffd2014-10-09 12:36:53 -0400471 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800472 elif i == 5:
473 main.log.info(
474 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800475 ": Git Pull - You are not currently " +
476 "on a branch so git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400477 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800478 elif i == 6:
479 main.log.info(
480 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800481 ": Git Pull - You have not configured an upstream " +
482 "branch to pull from. Git pull failed!" )
Jon Hallacabffd2014-10-09 12:36:53 -0400483 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800484 elif i == 7:
485 main.log.info(
486 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800487 ": Git Pull - Pull is not possible because " +
488 "you have unmerged files." )
Jon Hallacabffd2014-10-09 12:36:53 -0400489 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800490 elif i == 8:
Jon Hall61282e32015-03-19 11:34:11 -0700491 # NOTE: abandoning test since we can't reliably handle this
492 # there could be different default text editors and we
493 # also don't know if we actually want to make the commit
494 main.log.error( "Git pull resulted in a merge commit message" +
495 ". Exiting test!" )
Devin Lim44075962017-08-11 10:56:37 -0700496
497 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700498 elif i == 9: # Merge commit message but swap file exists
499 main.log.error( "Git pull resulted in a merge commit message" +
500 " but a swap file exists." )
501 try:
502 self.handle.send( 'A' ) # Abort
Devin Limc20e79a2017-06-07 10:29:57 -0700503 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -0700504 return main.ERROR
505 except Exception:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700506 main.log.exception( "Couldn't exit editor prompt!" )
Devin Lim44075962017-08-11 10:56:37 -0700507
508 main.cleanAndExit()
Jon Hall61282e32015-03-19 11:34:11 -0700509 elif i == 10: # In the middle of a merge commit
510 main.log.error( "Git branch is in the middle of a merge. " )
511 main.log.warn( self.handle.before + self.handle.after )
512 return main.ERROR
513 elif i == 11:
kelvin8ec71442015-01-15 16:57:00 -0800514 main.log.error( self.name + ": Git Pull - TIMEOUT" )
515 main.log.error(
516 self.name + " Response was: " + str(
517 self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400518 return main.ERROR
519 else:
kelvin8ec71442015-01-15 16:57:00 -0800520 main.log.error(
521 self.name +
522 ": Git Pull - Unexpected response, check for pull errors" )
Jon Hallacabffd2014-10-09 12:36:53 -0400523 return main.ERROR
524 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800525 main.log.error( self.name + ": EOF exception found" )
526 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700527 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800528 except Exception:
529 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700530 main.cleanAndExit()
Jon Hallacabffd2014-10-09 12:36:53 -0400531
kelvin-onlabd3b64892015-01-20 13:26:24 -0800532 def gitCheckout( self, branch="master" ):
kelvin8ec71442015-01-15 16:57:00 -0800533 """
Jon Hallacabffd2014-10-09 12:36:53 -0400534 Assumes that "git pull" works without login
kelvin8ec71442015-01-15 16:57:00 -0800535
Jon Hallacabffd2014-10-09 12:36:53 -0400536 This function will perform a git git checkout on the ONOS instance.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800537 If used as gitCheckout( "branch" ) it will do git checkout
538 of the "branch".
Jon Hallacabffd2014-10-09 12:36:53 -0400539
540 Otherwise, this function will perform a git checkout of the master
kelvin8ec71442015-01-15 16:57:00 -0800541 branch of the ONOS repository. If it has any problems, it will return
542 main.ERROR.
543 If the branch was already the specified branch, or the git checkout was
Jon Hallacabffd2014-10-09 12:36:53 -0400544 successful then the function will return main.TRUE.
545
kelvin8ec71442015-01-15 16:57:00 -0800546 """
Jon Hallacabffd2014-10-09 12:36:53 -0400547 try:
kelvin8ec71442015-01-15 16:57:00 -0800548 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700549 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800550 main.log.info( self.name +
551 ": Checking out git branch/ref: " + branch + "..." )
kelvin8ec71442015-01-15 16:57:00 -0800552 cmd = "git checkout " + branch
553 self.handle.sendline( cmd )
554 self.handle.expect( cmd )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800555 i = self.handle.expect(
Jon Hall274b6642015-02-17 11:57:17 -0800556 [ 'fatal',
Jon Hall61282e32015-03-19 11:34:11 -0700557 'Username for (.*): ',
558 'Already on \'',
Jon Hall7a8354f2015-06-10 15:37:00 -0700559 'Switched to (a new )?branch \'' + str( branch ),
Jon Hall274b6642015-02-17 11:57:17 -0800560 pexpect.TIMEOUT,
561 'error: Your local changes to the following files' +
Jon Hallefbd9792015-03-05 16:11:36 -0800562 'would be overwritten by checkout:',
Jon Hall274b6642015-02-17 11:57:17 -0800563 'error: you need to resolve your current index first',
564 "You are in 'detached HEAD' state.",
565 "HEAD is now at " ],
kelvin-onlabd3b64892015-01-20 13:26:24 -0800566 timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -0800567 if i == 0:
568 main.log.error(
569 self.name +
570 ": Git checkout had some issue..." )
571 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400572 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800573 elif i == 1:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800574 main.log.error(
575 self.name +
576 ": Git checkout asking for username." +
577 " Please configure your local git repository to be able " +
578 "to access your remote repository passwordlessly" )
Jon Hall274b6642015-02-17 11:57:17 -0800579 # TODO add support for authenticating
Jon Hallacabffd2014-10-09 12:36:53 -0400580 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800581 elif i == 2:
582 main.log.info(
583 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800584 ": Git Checkout %s : Already on this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700585 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800586 # main.log.info( "DEBUG: after checkout cmd = "+
587 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400588 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800589 elif i == 3:
590 main.log.info(
591 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800592 ": Git checkout %s - Switched to this branch" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700593 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800594 # main.log.info( "DEBUG: after checkout cmd = "+
595 # self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400596 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -0800597 elif i == 4:
598 main.log.error( self.name + ": Git Checkout- TIMEOUT" )
599 main.log.error(
Jon Hall274b6642015-02-17 11:57:17 -0800600 self.name + " Response was: " + str( self.handle.before ) )
Jon Hallacabffd2014-10-09 12:36:53 -0400601 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800602 elif i == 5:
603 self.handle.expect( "Aborting" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800604 main.log.error(
605 self.name +
606 ": Git checkout error: \n" +
Jon Hall274b6642015-02-17 11:57:17 -0800607 "Your local changes to the following files would" +
608 " be overwritten by checkout:" +
609 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700610 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500611 return main.ERROR
kelvin8ec71442015-01-15 16:57:00 -0800612 elif i == 6:
Jon Hall274b6642015-02-17 11:57:17 -0800613 main.log.error(
614 self.name +
615 ": Git checkout error: \n" +
616 "You need to resolve your current index first:" +
617 str( self.handle.before ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700618 self.handle.expect( self.prompt )
Jon Hall81e29af2014-11-04 20:41:23 -0500619 return main.ERROR
Jon Hall274b6642015-02-17 11:57:17 -0800620 elif i == 7:
621 main.log.info(
622 self.name +
623 ": Git checkout " + str( branch ) +
624 " - You are in 'detached HEAD' state. HEAD is now at " +
625 str( branch ) )
Devin Limc20e79a2017-06-07 10:29:57 -0700626 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800627 return main.TRUE
628 elif i == 8: # Already in detached HEAD on the specified commit
629 main.log.info(
630 self.name +
631 ": Git Checkout %s : Already on commit" % branch )
Devin Limc20e79a2017-06-07 10:29:57 -0700632 self.handle.expect( self.prompt )
Jon Hall274b6642015-02-17 11:57:17 -0800633 return main.TRUE
Jon Hallacabffd2014-10-09 12:36:53 -0400634 else:
kelvin8ec71442015-01-15 16:57:00 -0800635 main.log.error(
636 self.name +
Jon Hall274b6642015-02-17 11:57:17 -0800637 ": Git Checkout - Unexpected response, " +
638 "check for pull errors" )
kelvin8ec71442015-01-15 16:57:00 -0800639 main.log.error( self.name + ": " + self.handle.before )
Jon Hallacabffd2014-10-09 12:36:53 -0400640 return main.ERROR
641
642 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800643 main.log.error( self.name + ": EOF exception found" )
644 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700645 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800646 except Exception:
647 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700648 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400649
pingping-lin6d23d9e2015-02-02 16:54:24 -0800650 def getBranchName( self ):
You Wang9cdf9a22017-05-01 13:44:18 -0700651 import re
652 try:
653 main.log.info( "self.home = " )
654 main.log.info( self.home )
655 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700656 self.handle.expect( self.prompt )
You Wang9cdf9a22017-05-01 13:44:18 -0700657 self.handle.sendline( "git name-rev --name-only HEAD" )
658 self.handle.expect( "git name-rev --name-only HEAD" )
Devin Limc20e79a2017-06-07 10:29:57 -0700659 self.handle.expect( self.prompt )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700660 lines = self.handle.before.splitlines()
661 if lines[ 1 ] == "master" or re.search( "^onos-\d+(\.\d+)+$", lines[ 1 ] ):
662 return lines[ 1 ]
You Wang9cdf9a22017-05-01 13:44:18 -0700663 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700664 main.log.info( lines[ 1 ] )
You Wang9cdf9a22017-05-01 13:44:18 -0700665 return "unexpected ONOS branch"
666 except pexpect.EOF:
667 main.log.error( self.name + ": EOF 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 pexpect.TIMEOUT:
671 main.log.error( self.name + ": TIMEOUT exception found" )
672 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700673 main.cleanAndExit()
You Wang9cdf9a22017-05-01 13:44:18 -0700674 except Exception:
675 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700676 main.cleanAndExit()
pingping-lin6d23d9e2015-02-02 16:54:24 -0800677
kelvin-onlabd3b64892015-01-20 13:26:24 -0800678 def getVersion( self, report=False ):
kelvin8ec71442015-01-15 16:57:00 -0800679 """
Jon Hall274b6642015-02-17 11:57:17 -0800680 Writes the COMMIT number to the report to be parsed
Jon Hallefbd9792015-03-05 16:11:36 -0800681 by Jenkins data collector.
kelvin8ec71442015-01-15 16:57:00 -0800682 """
Jon Hall45ec0922014-10-10 19:33:49 -0400683 try:
kelvin8ec71442015-01-15 16:57:00 -0800684 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700685 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800686 self.handle.sendline(
687 "cd " +
688 self.home +
Jon Hall274b6642015-02-17 11:57:17 -0800689 "; git log -1 --pretty=fuller --decorate=short | grep -A 6 " +
690 " \"commit\" --color=never" )
kelvin8ec71442015-01-15 16:57:00 -0800691 # NOTE: for some reason there are backspaces inserted in this
692 # phrase when run from Jenkins on some tests
693 self.handle.expect( "never" )
Devin Limc20e79a2017-06-07 10:29:57 -0700694 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800695 response = ( self.name + ": \n" + str(
696 self.handle.before + self.handle.after ) )
697 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -0700698 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800699 lines = response.splitlines()
Jon Hall45ec0922014-10-10 19:33:49 -0400700 for line in lines:
Jon Hallfd191202014-11-07 18:36:09 -0500701 print line
702 if report:
pingping-lin763ee042015-05-20 17:45:30 -0700703 main.log.wiki( "<blockquote>" )
kelvin8ec71442015-01-15 16:57:00 -0800704 for line in lines[ 2:-1 ]:
705 # Bracket replacement is for Wiki-compliant
706 # formatting. '<' or '>' are interpreted
707 # as xml specific tags that cause errors
708 line = line.replace( "<", "[" )
709 line = line.replace( ">", "]" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700710 # main.log.wiki( "\t" + line )
pingping-lin763ee042015-05-20 17:45:30 -0700711 main.log.wiki( line + "<br /> " )
712 main.log.summary( line )
713 main.log.wiki( "</blockquote>" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700714 main.log.summary( "\n" )
kelvin8ec71442015-01-15 16:57:00 -0800715 return lines[ 2 ]
Jon Hall45ec0922014-10-10 19:33:49 -0400716 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800717 main.log.error( self.name + ": EOF exception found" )
718 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700719 main.cleanAndExit()
Jon Hall368769f2014-11-19 15:43:35 -0800720 except pexpect.TIMEOUT:
kelvin8ec71442015-01-15 16:57:00 -0800721 main.log.error( self.name + ": TIMEOUT exception found" )
722 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700723 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800724 except Exception:
725 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700726 main.cleanAndExit()
Jon Hall45ec0922014-10-10 19:33:49 -0400727
kelvin-onlabd3b64892015-01-20 13:26:24 -0800728 def createCellFile( self, benchIp, fileName, mnIpAddrs,
Jon Hall810b67d2016-12-05 10:19:01 -0800729 appString, onosIpAddrs, onosUser="sdn", useSSH=True ):
kelvin8ec71442015-01-15 16:57:00 -0800730 """
andrewonlab94282092014-10-10 13:00:11 -0400731 Creates a cell file based on arguments
732 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800733 * Bench IP address ( benchIp )
andrewonlab94282092014-10-10 13:00:11 -0400734 - Needed to copy the cell file over
kelvin-onlabd3b64892015-01-20 13:26:24 -0800735 * File name of the cell file ( fileName )
736 * Mininet IP address ( mnIpAddrs )
kelvin8ec71442015-01-15 16:57:00 -0800737 - Note that only 1 ip address is
andrewonlab94282092014-10-10 13:00:11 -0400738 supported currently
kelvin-onlabd3b64892015-01-20 13:26:24 -0800739 * ONOS IP addresses ( onosIpAddrs )
andrewonlab94282092014-10-10 13:00:11 -0400740 - Must be passed in as last arguments
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000741 * ONOS USER (onosUser)
Flavio Castrocc38a542016-03-03 13:15:46 -0800742 - optional argument to set ONOS_USER environment variable
kelvin8ec71442015-01-15 16:57:00 -0800743
andrewonlab94282092014-10-10 13:00:11 -0400744 NOTE: Assumes cells are located at:
745 ~/<self.home>/tools/test/cells/
kelvin8ec71442015-01-15 16:57:00 -0800746 """
andrewonlab94282092014-10-10 13:00:11 -0400747 try:
Devin Lim461f0872017-06-05 16:49:33 -0700748
Jon Hall2c8959e2016-12-16 12:17:34 -0800749 # Variable initialization
750 cellDirectory = self.home + "/tools/test/cells/"
751 # We want to create the cell file in the dependencies directory
752 # of TestON first, then copy over to ONOS bench
753 tempDirectory = "/tmp/"
754 # Create the cell file in the directory for writing ( w+ )
755 cellFile = open( tempDirectory + fileName, 'w+' )
756 if isinstance( onosIpAddrs, types.StringType ):
757 onosIpAddrs = [ onosIpAddrs ]
758
759 # App string is hardcoded environment variables
760 # That you may wish to use by default on startup.
761 # Note that you may not want certain apps listed
762 # on here.
763 appString = "export ONOS_APPS=" + appString
764 onosGroup = "export ONOS_GROUP=" + onosUser
765 onosUser = "export ONOS_USER=" + onosUser
766 if useSSH:
767 onosUseSSH = "export ONOS_USE_SSH=true"
768 mnString = "export OCN="
769 if mnIpAddrs == "":
770 mnString = ""
771 onosString = "export OC"
772 tempCount = 1
773
774 # Create ONOSNIC ip address prefix
775 tempOnosIp = str( onosIpAddrs[ 0 ] )
776 tempList = []
777 tempList = tempOnosIp.split( "." )
778 # Omit last element of list to format for NIC
779 tempList = tempList[ :-1 ]
780 # Structure the nic string ip
781 nicAddr = ".".join( tempList ) + ".*"
782 self.nicAddr = nicAddr
783 onosNicString = "export ONOS_NIC=" + nicAddr
784
kelvin8ec71442015-01-15 16:57:00 -0800785 # Start writing to file
kelvin-onlabd3b64892015-01-20 13:26:24 -0800786 cellFile.write( onosNicString + "\n" )
andrewonlab94282092014-10-10 13:00:11 -0400787
kelvin-onlabd3b64892015-01-20 13:26:24 -0800788 for arg in onosIpAddrs:
789 # For each argument in onosIpAddrs, write to file
kelvin8ec71442015-01-15 16:57:00 -0800790 # Output should look like the following:
andrewonlabd4940492014-10-24 12:21:27 -0400791 # export OC1="10.128.20.11"
792 # export OC2="10.128.20.12"
kelvin-onlabd3b64892015-01-20 13:26:24 -0800793 cellFile.write( onosString + str( tempCount ) +
Jon Hall6f665652015-09-18 10:08:07 -0700794 "=\"" + arg + "\"\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800795 tempCount = tempCount + 1
kelvin8ec71442015-01-15 16:57:00 -0800796
Jon Hall6f665652015-09-18 10:08:07 -0700797 cellFile.write( "export OCI=$OC1\n" )
Jon Hallab611372018-02-21 15:26:05 -0800798 if mnString:
799 cellFile.write( mnString + "\"" + str( mnIpAddrs ) + "\"\n" )
cameron@onlab.us75900962015-03-30 13:22:49 -0700800 cellFile.write( appString + "\n" )
Flavio Castrocc38a542016-03-03 13:15:46 -0800801 cellFile.write( onosGroup + "\n" )
802 cellFile.write( onosUser + "\n" )
Pier88189b62016-09-07 17:01:53 -0700803 if useSSH:
804 cellFile.write( onosUseSSH + "\n" )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800805 cellFile.close()
andrewonlab94282092014-10-10 13:00:11 -0400806
kelvin8ec71442015-01-15 16:57:00 -0800807 # We use os.system to send the command to TestON cluster
808 # to account for the case in which TestON is not located
809 # on the same cluster as the ONOS bench
810 # Note that even if TestON is located on the same cluster
811 # as ONOS bench, you must setup passwordless ssh
812 # between TestON and ONOS bench in order to automate the test.
kelvin-onlabc2b79102015-07-14 11:41:20 -0700813 os.system( "scp " + tempDirectory + fileName + " " +
814 self.user_name + "@" + self.ip_address + ":" + cellDirectory )
andrewonlab94282092014-10-10 13:00:11 -0400815
andrewonlab2a6c9342014-10-16 13:40:15 -0400816 return main.TRUE
817
andrewonlab94282092014-10-10 13:00:11 -0400818 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800819 main.log.error( self.name + ": EOF exception found" )
820 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700821 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800822 except Exception:
823 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700824 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -0400825
kelvin-onlabd3b64892015-01-20 13:26:24 -0800826 def setCell( self, cellname ):
kelvin8ec71442015-01-15 16:57:00 -0800827 """
andrewonlab95ca1462014-10-09 14:04:24 -0400828 Calls 'cell <name>' to set the environment variables on ONOSbench
kelvin8ec71442015-01-15 16:57:00 -0800829 """
andrewonlab95ca1462014-10-09 14:04:24 -0400830 try:
831 if not cellname:
You Wang1cdc5f52017-12-19 16:47:51 -0800832 main.log.error( self.name + ": Must define cellname" )
Devin Lim44075962017-08-11 10:56:37 -0700833 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400834 else:
kelvin8ec71442015-01-15 16:57:00 -0800835 self.handle.sendline( "cell " + str( cellname ) )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800836 # Expect the cellname in the ONOSCELL variable.
kelvin8ec71442015-01-15 16:57:00 -0800837 # Note that this variable name is subject to change
andrewonlab95ca1462014-10-09 14:04:24 -0400838 # and that this driver will have to change accordingly
Jon Hall3b489db2015-10-05 14:38:37 -0700839 self.handle.expect( str( cellname ) )
Jon Hallab611372018-02-21 15:26:05 -0800840 response = self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800841 i = self.handle.expect( [ "No such cell",
Jon Hallab611372018-02-21 15:26:05 -0800842 "command not found",
843 self.prompt ], timeout=10 )
844 response += self.handle.before + self.handle.after
You Wang1cdc5f52017-12-19 16:47:51 -0800845 if i == 0:
Jon Hallab611372018-02-21 15:26:05 -0800846 main.log.error( self.name + ": No such cell. Response: " + str( response ) )
You Wang1cdc5f52017-12-19 16:47:51 -0800847 main.cleanAndExit()
848 elif i == 1:
Jon Hallab611372018-02-21 15:26:05 -0800849 main.log.error( self.name + ": Error setting cell. Response: " + str( response ) )
850 main.cleanAndExit()
You Wang1cdc5f52017-12-19 16:47:51 -0800851 elif i == 2:
Jon Hallab611372018-02-21 15:26:05 -0800852 main.log.info( self.name + ": Successfully set cell: " + str( response ) )
andrewonlab95ca1462014-10-09 14:04:24 -0400853 return main.TRUE
You Wang1cdc5f52017-12-19 16:47:51 -0800854 except pexpect.TIMEOUT:
855 main.log.error( self.name + ": TIMEOUT exception found" )
856 main.log.error( self.name + ": " + self.handle.before )
857 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400858 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800859 main.log.error( self.name + ": EOF exception found" )
860 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700861 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800862 except Exception:
863 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700864 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -0400865
kelvin-onlabd3b64892015-01-20 13:26:24 -0800866 def verifyCell( self ):
kelvin8ec71442015-01-15 16:57:00 -0800867 """
andrewonlabc03bf6c2014-10-09 14:56:18 -0400868 Calls 'onos-verify-cell' to check for cell installation
kelvin8ec71442015-01-15 16:57:00 -0800869 """
870 # TODO: Add meaningful expect value
andrewonlab8d0d7d72014-10-09 16:33:15 -0400871
andrewonlabc03bf6c2014-10-09 14:56:18 -0400872 try:
kelvin8ec71442015-01-15 16:57:00 -0800873 # Clean handle by sending empty and expecting $
874 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700875 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -0800876 self.handle.sendline( "onos-verify-cell" )
Devin Limc20e79a2017-06-07 10:29:57 -0700877 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -0800878 handleBefore = self.handle.before
879 handleAfter = self.handle.after
kelvin-onlabd3b64892015-01-20 13:26:24 -0800880 main.log.info( "Verify cell returned: " + handleBefore +
Jon Hall3b489db2015-10-05 14:38:37 -0700881 handleAfter )
andrewonlabc03bf6c2014-10-09 14:56:18 -0400882 return main.TRUE
Jon Halla5cb6172015-02-23 09:28:28 -0800883 except pexpect.ExceptionPexpect as e:
Jon Hall3b489db2015-10-05 14:38:37 -0700884 main.log.exception( self.name + ": Pexpect exception found: " )
kelvin8ec71442015-01-15 16:57:00 -0800885 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700886 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800887 except Exception:
888 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700889 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400890
jenkins1e99e7b2015-04-02 18:15:39 -0700891 def onosCfgSet( self, ONOSIp, configName, configParam ):
892 """
893 Uses 'onos <node-ip> cfg set' to change a parameter value of an
Jon Hall4ba53f02015-07-29 13:07:41 -0700894 application.
895
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000896 ex)
jenkins1e99e7b2015-04-02 18:15:39 -0700897 onos 10.0.0.1 cfg set org.onosproject.myapp appSetting 1
jenkins1e99e7b2015-04-02 18:15:39 -0700898 ONOSIp = '10.0.0.1'
899 configName = 'org.onosproject.myapp'
900 configParam = 'appSetting 1'
jenkins1e99e7b2015-04-02 18:15:39 -0700901 """
Jon Hall72280bc2016-01-25 14:29:05 -0800902 try:
903 cfgStr = "onos {} cfg set {} {}".format( ONOSIp,
904 configName,
905 configParam )
906 self.handle.sendline( "" )
907 self.handle.expect( ":~" )
908 self.handle.sendline( cfgStr )
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700909 self.handle.expect( "cfg set" )
Jon Hall72280bc2016-01-25 14:29:05 -0800910 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700911
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700912 paramValue = configParam.split( " " )[ 1 ]
913 paramName = configParam.split( " " )[ 0 ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700914
Jon Hall72280bc2016-01-25 14:29:05 -0800915 checkStr = 'onos {} cfg get " {} {} " '.format( ONOSIp, configName, paramName )
Jon Hall4ba53f02015-07-29 13:07:41 -0700916
Jon Hall72280bc2016-01-25 14:29:05 -0800917 self.handle.sendline( checkStr )
918 self.handle.expect( ":~" )
jenkins1e99e7b2015-04-02 18:15:39 -0700919
Jon Hall72280bc2016-01-25 14:29:05 -0800920 if "value=" + paramValue + "," in self.handle.before:
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700921 main.log.info( "cfg " + configName + " successfully set to " + configParam )
Jon Hall72280bc2016-01-25 14:29:05 -0800922 return main.TRUE
923 except pexpect.ExceptionPexpect as e:
924 main.log.exception( self.name + ": Pexpect exception found: " )
925 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700926 main.cleanAndExit()
Jon Hall72280bc2016-01-25 14:29:05 -0800927 except Exception:
928 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700929 main.cleanAndExit()
Jon Hall4ba53f02015-07-29 13:07:41 -0700930
kelvin-onlabd3b64892015-01-20 13:26:24 -0800931 def onosCli( self, ONOSIp, cmdstr ):
kelvin8ec71442015-01-15 16:57:00 -0800932 """
andrewonlab05e362f2014-10-10 00:40:57 -0400933 Uses 'onos' command to send various ONOS CLI arguments.
934 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800935 * ONOSIp: specify the ip of the cell machine
andrewonlab94282092014-10-10 13:00:11 -0400936 * cmdstr: specify the command string to send
kelvin8ec71442015-01-15 16:57:00 -0800937
938 This function is intended to expose the entire karaf
andrewonlab6e20c342014-10-10 18:08:48 -0400939 CLI commands for ONOS. Try to use this function first
940 before attempting to write a ONOS CLI specific driver
kelvin8ec71442015-01-15 16:57:00 -0800941 function.
942 You can see a list of available 'cmdstr' arguments
andrewonlab6e20c342014-10-10 18:08:48 -0400943 by starting onos, and typing in 'onos' to enter the
944 onos> CLI. Then, type 'help' to see the list of
kelvin8ec71442015-01-15 16:57:00 -0800945 available commands.
946 """
andrewonlab05e362f2014-10-10 00:40:57 -0400947 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -0800948 if not ONOSIp:
kelvin8ec71442015-01-15 16:57:00 -0800949 main.log.error( "You must specify the IP address" )
andrewonlab05e362f2014-10-10 00:40:57 -0400950 return main.FALSE
951 if not cmdstr:
kelvin8ec71442015-01-15 16:57:00 -0800952 main.log.error( "You must specify the command string" )
andrewonlab05e362f2014-10-10 00:40:57 -0400953 return main.FALSE
954
kelvin8ec71442015-01-15 16:57:00 -0800955 cmdstr = str( cmdstr )
956 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700957 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -0400958
You Wangdd3dae52018-02-15 13:31:25 -0800959 self.handle.sendline( "onos-wait-for-start " + ONOSIp )
960 self.handle.expect( self.prompt )
961
962 self.handle.sendline( "onos " + ONOSIp + " " + cmdstr )
Devin Limc20e79a2017-06-07 10:29:57 -0700963 self.handle.expect( self.prompt )
andrewonlab05e362f2014-10-10 00:40:57 -0400964
kelvin-onlabd3b64892015-01-20 13:26:24 -0800965 handleBefore = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -0800966 main.log.info( "Command sent successfully" )
kelvin8ec71442015-01-15 16:57:00 -0800967 # Obtain return handle that consists of result from
968 # the onos command. The string may need to be
969 # configured further.
kelvin-onlabd3b64892015-01-20 13:26:24 -0800970 returnString = handleBefore
kelvin-onlabd3b64892015-01-20 13:26:24 -0800971 return returnString
You Wangd66de192018-04-30 17:30:12 -0700972 except pexpect.TIMEOUT:
973 main.log.exception( self.name + ": Timeout when sending " + cmdstr )
974 return main.FALSE
andrewonlab05e362f2014-10-10 00:40:57 -0400975 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -0800976 main.log.error( self.name + ": EOF exception found" )
977 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -0700978 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -0800979 except Exception:
980 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -0700981 main.cleanAndExit()
Jon Hall7993bfc2014-10-09 16:30:14 -0400982
Jeremy Ronquillo82705492017-10-18 14:19:55 -0700983 def onosSecureSSH( self, userName="onos", userPWD="rocks", node="" ):
Pier88189b62016-09-07 17:01:53 -0700984 """
985 Enables secure access to ONOS console
986 by removing default users & keys.
987
988 onos-secure-ssh -u onos -p rocks node
989
990 Returns: main.TRUE on success and main.FALSE on failure
991 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000992
Pier88189b62016-09-07 17:01:53 -0700993 try:
Chiyu Chengef109502016-11-21 15:51:38 -0800994 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -0700995 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -0700996 self.handle.sendline( " onos-secure-ssh -u " + userName + " -p " + userPWD + " " + node )
997
998 # NOTE: this timeout may need to change depending on the network
999 # and size of ONOS
1000 # TODO: Handle the other possible error
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001001 i = self.handle.expect( [ "Network\sis\sunreachable",
1002 self.prompt,
1003 pexpect.TIMEOUT ], timeout=180 )
Pier88189b62016-09-07 17:01:53 -07001004 if i == 0:
1005 # can't reach ONOS node
1006 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001007 self.handle.expect( self.prompt )
Pier88189b62016-09-07 17:01:53 -07001008 return main.FALSE
1009 elif i == 1:
1010 # Process started
1011 main.log.info(
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001012 "Secure SSH performed on " +
1013 node )
Pier88189b62016-09-07 17:01:53 -07001014 return main.TRUE
1015 except pexpect.EOF:
1016 main.log.error( self.name + ": EOF exception found" )
1017 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001018 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001019 except Exception:
1020 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001021 main.cleanAndExit()
Pier88189b62016-09-07 17:01:53 -07001022
kelvin-onlabd3b64892015-01-20 13:26:24 -08001023 def onosInstall( self, options="-f", node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001024 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001025 Installs ONOS bits on the designated cell machine.
kelvin8ec71442015-01-15 16:57:00 -08001026 If -f option is provided, it also forces an uninstall.
1027 Presently, install also includes onos-push-bits and
Jon Hall7993bfc2014-10-09 16:30:14 -04001028 onos-config within.
kelvin8ec71442015-01-15 16:57:00 -08001029 The node option allows you to selectively only push the jar
Jon Hall7993bfc2014-10-09 16:30:14 -04001030 files to certain onos nodes
1031
1032 Returns: main.TRUE on success and main.FALSE on failure
kelvin8ec71442015-01-15 16:57:00 -08001033 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001034 try:
andrewonlab114768a2014-11-14 12:44:44 -05001035 if options:
kelvin8ec71442015-01-15 16:57:00 -08001036 self.handle.sendline( "onos-install " + options + " " + node )
andrewonlab114768a2014-11-14 12:44:44 -05001037 else:
kelvin8ec71442015-01-15 16:57:00 -08001038 self.handle.sendline( "onos-install " + node )
1039 self.handle.expect( "onos-install " )
1040 # NOTE: this timeout may need to change depending on the network
1041 # and size of ONOS
1042 i = self.handle.expect( [ "Network\sis\sunreachable",
kelvin-onlabd3b64892015-01-20 13:26:24 -08001043 "onos\sstart/running,\sprocess",
kelvin8ec71442015-01-15 16:57:00 -08001044 "ONOS\sis\salready\sinstalled",
Jeremyc72b2582016-02-26 18:27:38 -08001045 "already\sup-to-date",
Jon Hall3576f572016-08-23 10:01:07 -07001046 "does not exist",
Devin Limc20e79a2017-06-07 10:29:57 -07001047 self.prompt,
Jon Hall6c44c0b2016-04-20 15:21:00 -07001048 pexpect.TIMEOUT ], timeout=180 )
Jon Hall7993bfc2014-10-09 16:30:14 -04001049 if i == 0:
Jon Hall3576f572016-08-23 10:01:07 -07001050 # can't reach ONOS node
kelvin8ec71442015-01-15 16:57:00 -08001051 main.log.warn( "Network is unreachable" )
Devin Limc20e79a2017-06-07 10:29:57 -07001052 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001053 return main.FALSE
1054 elif i == 1:
Jon Hall3576f572016-08-23 10:01:07 -07001055 # Process started
kelvin8ec71442015-01-15 16:57:00 -08001056 main.log.info(
1057 "ONOS was installed on " +
1058 node +
1059 " and started" )
Devin Limc20e79a2017-06-07 10:29:57 -07001060 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001061 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001062 elif i == 2 or i == 3:
1063 # same bits are already on ONOS node
Jeremyc72b2582016-02-26 18:27:38 -08001064 main.log.info( "ONOS is already installed on " + node )
Devin Limc20e79a2017-06-07 10:29:57 -07001065 self.handle.expect( self.prompt )
Jeremyc72b2582016-02-26 18:27:38 -08001066 return main.TRUE
1067 elif i == 4:
Jon Hall3576f572016-08-23 10:01:07 -07001068 # onos not packaged
1069 main.log.error( "ONOS package not found." )
Devin Limc20e79a2017-06-07 10:29:57 -07001070 self.handle.expect( self.prompt )
Jon Hall3576f572016-08-23 10:01:07 -07001071 return main.FALSE
1072 elif i == 5:
1073 # prompt
Jeremyc72b2582016-02-26 18:27:38 -08001074 main.log.info( "ONOS was installed on " + node )
1075 return main.TRUE
Jon Hall3576f572016-08-23 10:01:07 -07001076 elif i == 6:
1077 # timeout
kelvin8ec71442015-01-15 16:57:00 -08001078 main.log.info(
1079 "Installation of ONOS on " +
1080 node +
1081 " timed out" )
Devin Limc20e79a2017-06-07 10:29:57 -07001082 self.handle.expect( self.prompt )
Jon Hall53c5e662016-04-13 16:06:56 -07001083 main.log.warn( self.handle.before )
Jon Hall7993bfc2014-10-09 16:30:14 -04001084 return main.FALSE
andrewonlabc03bf6c2014-10-09 14:56:18 -04001085 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001086 main.log.error( self.name + ": EOF exception found" )
1087 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001088 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001089 except Exception:
1090 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001091 main.cleanAndExit()
andrewonlab95ca1462014-10-09 14:04:24 -04001092
kelvin-onlabd3b64892015-01-20 13:26:24 -08001093 def onosStart( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001094 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001095 Calls onos command: 'onos-service [<node-ip>] start'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001096 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001097 """
andrewonlab8d0d7d72014-10-09 16:33:15 -04001098 try:
kelvin8ec71442015-01-15 16:57:00 -08001099 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001100 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001101 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001102 " start" )
1103 i = self.handle.expect( [
andrewonlab8d0d7d72014-10-09 16:33:15 -04001104 "Job\sis\salready\srunning",
1105 "start/running",
Devin Limc20e79a2017-06-07 10:29:57 -07001106 self.prompt,
andrewonlab8d0d7d72014-10-09 16:33:15 -04001107 "Unknown\sinstance",
Jeremy Songster14c13572016-04-21 17:34:03 -07001108 pexpect.TIMEOUT ], timeout=180 )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001109 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001110 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001111 main.log.info( "Service is already running" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001112 return main.TRUE
1113 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001114 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001115 main.log.info( "ONOS service started" )
andrewonlab8d0d7d72014-10-09 16:33:15 -04001116 return main.TRUE
Jeremyd0e9a6d2016-03-02 11:28:52 -08001117 elif i == 2:
1118 main.log.info( "ONOS service started" )
1119 return main.TRUE
andrewonlab8d0d7d72014-10-09 16:33:15 -04001120 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001121 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001122 main.log.error( "ONOS service failed to start" )
Devin Lim44075962017-08-11 10:56:37 -07001123
1124 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001125 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001126 main.log.error( self.name + ": EOF exception found" )
1127 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001128 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001129 except Exception:
1130 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001131 main.cleanAndExit()
andrewonlab8d0d7d72014-10-09 16:33:15 -04001132
kelvin-onlabd3b64892015-01-20 13:26:24 -08001133 def onosStop( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001134 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001135 Calls onos command: 'onos-service [<node-ip>] stop'
andrewonlabe8e56fd2014-10-09 17:12:44 -04001136 This command is a remote management of the ONOS upstart daemon
kelvin8ec71442015-01-15 16:57:00 -08001137 """
andrewonlab2b30bd32014-10-09 16:48:55 -04001138 try:
kelvin8ec71442015-01-15 16:57:00 -08001139 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001140 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001141 self.handle.sendline( "onos-service " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001142 " stop" )
1143 i = self.handle.expect( [
andrewonlab2b30bd32014-10-09 16:48:55 -04001144 "stop/waiting",
Jon Hall61282e32015-03-19 11:34:11 -07001145 "Could not resolve hostname",
andrewonlab2b30bd32014-10-09 16:48:55 -04001146 "Unknown\sinstance",
Devin Limc20e79a2017-06-07 10:29:57 -07001147 self.prompt,
Jeremy Songster14c13572016-04-21 17:34:03 -07001148 pexpect.TIMEOUT ], timeout=180 )
andrewonlab2b30bd32014-10-09 16:48:55 -04001149 if i == 0:
Devin Limc20e79a2017-06-07 10:29:57 -07001150 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001151 main.log.info( "ONOS service stopped" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001152 return main.TRUE
1153 elif i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001154 self.handle.expect( self.prompt )
Jon Hall65844a32015-03-09 19:09:37 -07001155 main.log.info( "onosStop() Unknown ONOS instance specified: " +
kelvin-onlabd3b64892015-01-20 13:26:24 -08001156 str( nodeIp ) )
andrewonlab2b30bd32014-10-09 16:48:55 -04001157 return main.FALSE
Jon Hall61282e32015-03-19 11:34:11 -07001158 elif i == 2:
Devin Limc20e79a2017-06-07 10:29:57 -07001159 self.handle.expect( self.prompt )
Jon Hall61282e32015-03-19 11:34:11 -07001160 main.log.warn( "ONOS wasn't running" )
1161 return main.TRUE
YPZhang77badfc2016-03-09 10:28:59 -08001162 elif i == 3:
1163 main.log.info( "ONOS service stopped" )
1164 return main.TRUE
andrewonlab2b30bd32014-10-09 16:48:55 -04001165 else:
kelvin8ec71442015-01-15 16:57:00 -08001166 main.log.error( "ONOS service failed to stop" )
andrewonlab2b30bd32014-10-09 16:48:55 -04001167 return main.FALSE
andrewonlab2b30bd32014-10-09 16:48:55 -04001168 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001169 main.log.error( self.name + ": EOF exception found" )
1170 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001171 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001172 except Exception:
1173 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001174 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001175
kelvin-onlabd3b64892015-01-20 13:26:24 -08001176 def onosUninstall( self, nodeIp="" ):
kelvin8ec71442015-01-15 16:57:00 -08001177 """
andrewonlabc8d47972014-10-09 16:52:36 -04001178 Calls the command: 'onos-uninstall'
kelvin8ec71442015-01-15 16:57:00 -08001179 Uninstalls ONOS from the designated cell machine, stopping
andrewonlabe8e56fd2014-10-09 17:12:44 -04001180 if needed
kelvin8ec71442015-01-15 16:57:00 -08001181 """
andrewonlabc8d47972014-10-09 16:52:36 -04001182 try:
kelvin8ec71442015-01-15 16:57:00 -08001183 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001184 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001185 self.handle.sendline( "onos-uninstall " + str( nodeIp ) )
Devin Limc20e79a2017-06-07 10:29:57 -07001186 self.handle.expect( self.prompt, timeout=180 )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001187 main.log.info( "ONOS " + nodeIp + " was uninstalled" )
kelvin8ec71442015-01-15 16:57:00 -08001188 # onos-uninstall command does not return any text
andrewonlabc8d47972014-10-09 16:52:36 -04001189 return main.TRUE
pingping-lin763ee042015-05-20 17:45:30 -07001190 except pexpect.TIMEOUT:
1191 main.log.exception( self.name + ": Timeout in onosUninstall" )
1192 return main.FALSE
andrewonlabc8d47972014-10-09 16:52:36 -04001193 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001194 main.log.error( self.name + ": EOF exception found" )
1195 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001196 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001197 except Exception:
1198 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001199 main.cleanAndExit()
andrewonlab2b30bd32014-10-09 16:48:55 -04001200
kelvin-onlabd3b64892015-01-20 13:26:24 -08001201 def onosDie( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001202 """
andrewonlabaedc8332014-12-04 12:43:03 -05001203 Issues the command 'onos-die <node-ip>'
1204 This command calls onos-kill and also stops the node
kelvin8ec71442015-01-15 16:57:00 -08001205 """
andrewonlabaedc8332014-12-04 12:43:03 -05001206 try:
kelvin8ec71442015-01-15 16:57:00 -08001207 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001208 self.handle.expect( self.prompt )
Jeremyf0aecdb2016-03-30 13:19:57 -07001209 cmdStr = "onos-die " + str( nodeIp )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001210 self.handle.sendline( cmdStr )
kelvin8ec71442015-01-15 16:57:00 -08001211 i = self.handle.expect( [
andrewonlabaedc8332014-12-04 12:43:03 -05001212 "Killing\sONOS",
1213 "ONOS\sprocess\sis\snot\srunning",
Jeremy Songster14c13572016-04-21 17:34:03 -07001214 pexpect.TIMEOUT ], timeout=60 )
andrewonlabaedc8332014-12-04 12:43:03 -05001215 if i == 0:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001216 main.log.info( "ONOS instance " + str( nodeIp ) +
kelvin8ec71442015-01-15 16:57:00 -08001217 " was killed and stopped" )
Jon Hall53c5e662016-04-13 16:06:56 -07001218 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001219 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001220 return main.TRUE
1221 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001222 main.log.info( "ONOS process was not running" )
Jon Hall53c5e662016-04-13 16:06:56 -07001223 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001224 self.handle.expect( self.prompt )
andrewonlabaedc8332014-12-04 12:43:03 -05001225 return main.FALSE
1226 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001227 main.log.error( self.name + ": EOF exception found" )
1228 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001229 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001230 except Exception:
1231 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001232 main.cleanAndExit()
andrewonlabaedc8332014-12-04 12:43:03 -05001233
kelvin-onlabd3b64892015-01-20 13:26:24 -08001234 def onosKill( self, nodeIp ):
kelvin8ec71442015-01-15 16:57:00 -08001235 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001236 Calls the command: 'onos-kill [<node-ip>]'
1237 "Remotely, and unceremoniously kills the ONOS instance running on
1238 the specified cell machine" - Tom V
kelvin8ec71442015-01-15 16:57:00 -08001239 """
andrewonlabe8e56fd2014-10-09 17:12:44 -04001240 try:
kelvin8ec71442015-01-15 16:57:00 -08001241 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001242 self.handle.expect( self.prompt )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001243 self.handle.sendline( "onos-kill " + str( nodeIp ) )
kelvin8ec71442015-01-15 16:57:00 -08001244 i = self.handle.expect( [
Devin Limc20e79a2017-06-07 10:29:57 -07001245 self.prompt,
andrewonlabe8e56fd2014-10-09 17:12:44 -04001246 "No\sroute\sto\shost",
1247 "password:",
Jeremy Songster14c13572016-04-21 17:34:03 -07001248 pexpect.TIMEOUT ], timeout=60 )
kelvin8ec71442015-01-15 16:57:00 -08001249
andrewonlabe8e56fd2014-10-09 17:12:44 -04001250 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001251 main.log.info(
1252 "ONOS instance " + str(
kelvin-onlabd3b64892015-01-20 13:26:24 -08001253 nodeIp ) + " was killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001254 return main.TRUE
1255 elif i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001256 main.log.info( "No route to host" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001257 return main.FALSE
1258 elif i == 2:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001259 main.log.info(
1260 "Passwordless login for host: " +
1261 str( nodeIp ) +
1262 " not configured" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001263 return main.FALSE
1264 else:
Jon Hallefbd9792015-03-05 16:11:36 -08001265 main.log.info( "ONOS instance was not killed" )
andrewonlabe8e56fd2014-10-09 17:12:44 -04001266 return main.FALSE
kelvin8ec71442015-01-15 16:57:00 -08001267
andrewonlabe8e56fd2014-10-09 17:12:44 -04001268 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001269 main.log.error( self.name + ": EOF exception found" )
1270 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001271 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001272 except Exception:
1273 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001274 main.cleanAndExit()
andrewonlabe8e56fd2014-10-09 17:12:44 -04001275
kelvin-onlabd3b64892015-01-20 13:26:24 -08001276 def onosRemoveRaftLogs( self ):
kelvin8ec71442015-01-15 16:57:00 -08001277 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001278 Removes Raft / Copy cat files from ONOS to ensure
Jon Hallfcc88622014-11-25 13:09:54 -05001279 a cleaner environment.
1280
andrewonlab19fbdca2014-11-14 12:55:59 -05001281 Description:
Jon Hallfcc88622014-11-25 13:09:54 -05001282 Stops all ONOS defined in the cell,
andrewonlab19fbdca2014-11-14 12:55:59 -05001283 wipes the raft / copycat log files
kelvin8ec71442015-01-15 16:57:00 -08001284 """
andrewonlab19fbdca2014-11-14 12:55:59 -05001285 try:
kelvin8ec71442015-01-15 16:57:00 -08001286 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001287 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001288 self.handle.sendline( "onos-remove-raft-logs" )
1289 # Sometimes this command hangs
Devin Limc20e79a2017-06-07 10:29:57 -07001290 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001291 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001292 if i == 1:
Devin Limc20e79a2017-06-07 10:29:57 -07001293 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
kelvin8ec71442015-01-15 16:57:00 -08001294 timeout=120 )
Jon Hallfcc88622014-11-25 13:09:54 -05001295 if i == 1:
1296 return main.FALSE
andrewonlab19fbdca2014-11-14 12:55:59 -05001297 return main.TRUE
andrewonlab19fbdca2014-11-14 12:55:59 -05001298 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001299 main.log.error( self.name + ": EOF exception found" )
1300 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001301 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001302 except Exception:
1303 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001304 main.cleanAndExit()
Jon Hallfcc88622014-11-25 13:09:54 -05001305
kelvin-onlabd3b64892015-01-20 13:26:24 -08001306 def onosStartNetwork( self, mntopo ):
kelvin8ec71442015-01-15 16:57:00 -08001307 """
1308 Calls the command 'onos-start-network [ <mininet-topo> ]
1309 "remotely starts the specified topology on the cell's
andrewonlab94282092014-10-10 13:00:11 -04001310 mininet machine against all controllers configured in the
kelvin8ec71442015-01-15 16:57:00 -08001311 cell."
andrewonlab94282092014-10-10 13:00:11 -04001312 * Specify mininet topology file name for mntopo
1313 * Topo files should be placed at:
1314 ~/<your-onos-directory>/tools/test/topos
kelvin8ec71442015-01-15 16:57:00 -08001315
andrewonlab94282092014-10-10 13:00:11 -04001316 NOTE: This function will take you to the mininet prompt
kelvin8ec71442015-01-15 16:57:00 -08001317 """
andrewonlab94282092014-10-10 13:00:11 -04001318 try:
1319 if not mntopo:
kelvin8ec71442015-01-15 16:57:00 -08001320 main.log.error( "You must specify a topo file to execute" )
andrewonlab94282092014-10-10 13:00:11 -04001321 return main.FALSE
andrewonlab94282092014-10-10 13:00:11 -04001322
kelvin8ec71442015-01-15 16:57:00 -08001323 mntopo = str( mntopo )
1324 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001325 self.handle.expect( self.prompt )
andrewonlab94282092014-10-10 13:00:11 -04001326
kelvin8ec71442015-01-15 16:57:00 -08001327 self.handle.sendline( "onos-start-network " + mntopo )
1328 self.handle.expect( "mininet>" )
1329 main.log.info( "Network started, entered mininet prompt" )
1330
1331 # TODO: Think about whether return is necessary or not
andrewonlab94282092014-10-10 13:00:11 -04001332
1333 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001334 main.log.error( self.name + ": EOF exception found" )
1335 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001336 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001337 except Exception:
1338 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001339 main.cleanAndExit()
andrewonlab94282092014-10-10 13:00:11 -04001340
Jeremy Songster14c13572016-04-21 17:34:03 -07001341 def isup( self, node="", timeout=240 ):
kelvin8ec71442015-01-15 16:57:00 -08001342 """
1343 Run's onos-wait-for-start which only returns once ONOS is at run
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001344 level 100(ready for use)
andrewonlab8d0d7d72014-10-09 16:33:15 -04001345
Jon Hall7993bfc2014-10-09 16:30:14 -04001346 Returns: main.TRUE if ONOS is running and main.FALSE on timeout
kelvin8ec71442015-01-15 16:57:00 -08001347 """
Jon Hall7993bfc2014-10-09 16:30:14 -04001348 try:
Jon Hall3b489db2015-10-05 14:38:37 -07001349 self.handle.sendline( "onos-wait-for-start " + node )
1350 self.handle.expect( "onos-wait-for-start" )
kelvin8ec71442015-01-15 16:57:00 -08001351 # NOTE: this timeout is arbitrary"
Jon Hallcababf72018-02-05 12:05:19 -08001352 i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT, "Password:" ], timeout )
Jon Hall7993bfc2014-10-09 16:30:14 -04001353 if i == 0:
kelvin8ec71442015-01-15 16:57:00 -08001354 main.log.info( self.name + ": " + node + " is up" )
Jon Hall7993bfc2014-10-09 16:30:14 -04001355 return main.TRUE
Jon Hallcababf72018-02-05 12:05:19 -08001356 elif i == 1 or i == 2:
kelvin8ec71442015-01-15 16:57:00 -08001357 # NOTE: since this function won't return until ONOS is ready,
Jon Hall7993bfc2014-10-09 16:30:14 -04001358 # we will kill it on timeout
Jon Hallcababf72018-02-05 12:05:19 -08001359 if i == 1:
1360 main.log.error( "ONOS has not started yet" )
1361 elif i == 2:
1362 main.log.error( "Cannot login to ONOS CLI, try using onos-secure-ssh" )
kelvin8ec71442015-01-15 16:57:00 -08001363 self.handle.send( "\x03" ) # Control-C
Devin Limc20e79a2017-06-07 10:29:57 -07001364 self.handle.expect( self.prompt )
Jon Hall7993bfc2014-10-09 16:30:14 -04001365 return main.FALSE
1366 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001367 main.log.error( self.name + ": EOF exception found" )
1368 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001369 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001370 except Exception:
1371 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001372 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001373
Devin Lim142b5342017-07-20 15:22:39 -07001374 def preventAutoRespawn( self ):
1375 """
1376 Description:
1377 This will prevent ONOSservice to automatically
1378 respawn.
1379 """
1380 try:
1381 self.handle.sendline( "sed -i -e 's/^respawn$/#respawn/g' tools/package/init/onos.conf" )
1382 self.handle.expect( "\$" ) # $ from the command
1383 self.handle.sendline( "sed -i -e 's/^Restart=always/Restart=no/g' tools/package/init/onos.service" )
1384 self.handle.expect( "\$" ) # $ from the command
1385 self.handle.expect( "\$" ) # $ from the prompt
1386 except pexpect.EOF:
1387 main.log.error( self.name + ": EOF exception found" )
1388 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001389 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001390 except Exception:
1391 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001392 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -07001393
kelvin-onlabd3b64892015-01-20 13:26:24 -08001394 def pushTestIntentsShell(
1395 self,
1396 dpidSrc,
1397 dpidDst,
1398 numIntents,
1399 dirFile,
1400 onosIp,
1401 numMult="",
1402 appId="",
1403 report=True,
1404 options="" ):
kelvin8ec71442015-01-15 16:57:00 -08001405 """
andrewonlabb66dfa12014-12-02 15:51:10 -05001406 Description:
kelvin8ec71442015-01-15 16:57:00 -08001407 Use the linux prompt to push test intents to
andrewonlabb66dfa12014-12-02 15:51:10 -05001408 better parallelize the results than the CLI
1409 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001410 * dpidSrc: specify source dpid
1411 * dpidDst: specify destination dpid
1412 * numIntents: specify number of intents to push
1413 * dirFile: specify directory and file name to save
andrewonlabb66dfa12014-12-02 15:51:10 -05001414 results
kelvin-onlabd3b64892015-01-20 13:26:24 -08001415 * onosIp: specify the IP of ONOS to install on
kelvin8ec71442015-01-15 16:57:00 -08001416 NOTE:
andrewonlabb66dfa12014-12-02 15:51:10 -05001417 You must invoke this command at linux shell prompt
kelvin8ec71442015-01-15 16:57:00 -08001418 """
1419 try:
1420 # Create the string to sendline
andrewonlabaedc8332014-12-04 12:43:03 -05001421 if options:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001422 baseCmd = "onos " + str( onosIp ) + " push-test-intents " +\
kelvin8ec71442015-01-15 16:57:00 -08001423 options + " "
andrewonlabaedc8332014-12-04 12:43:03 -05001424 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001425 baseCmd = "onos " + str( onosIp ) + " push-test-intents "
kelvin8ec71442015-01-15 16:57:00 -08001426
kelvin-onlabd3b64892015-01-20 13:26:24 -08001427 addDpid = baseCmd + str( dpidSrc ) + " " + str( dpidDst )
1428 if not numMult:
1429 addIntents = addDpid + " " + str( numIntents )
1430 elif numMult:
1431 addIntents = addDpid + " " + str( numIntents ) + " " +\
1432 str( numMult )
1433 if appId:
1434 addApp = addIntents + " " + str( appId )
andrewonlabb66dfa12014-12-02 15:51:10 -05001435 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001436 addApp = addIntents
andrewonlabb66dfa12014-12-02 15:51:10 -05001437
andrewonlabaedc8332014-12-04 12:43:03 -05001438 if report:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001439 sendCmd = addApp + " > " + str( dirFile ) + " &"
andrewonlabaedc8332014-12-04 12:43:03 -05001440 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001441 sendCmd = addApp + " &"
1442 main.log.info( "Send cmd: " + sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001443
kelvin-onlabd3b64892015-01-20 13:26:24 -08001444 self.handle.sendline( sendCmd )
andrewonlabb66dfa12014-12-02 15:51:10 -05001445
1446 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001447 main.log.error( self.name + ": EOF exception found" )
1448 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001449 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001450 except Exception:
1451 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001452 main.cleanAndExit()
andrewonlab05e362f2014-10-10 00:40:57 -04001453
kelvin-onlabd3b64892015-01-20 13:26:24 -08001454 def tsharkPcap( self, interface, dirFile ):
kelvin8ec71442015-01-15 16:57:00 -08001455 """
andrewonlab970399c2014-11-07 13:09:32 -05001456 Capture all packet activity and store in specified
1457 directory/file
1458
1459 Required:
1460 * interface: interface to capture
1461 * dir: directory/filename to store pcap
kelvin8ec71442015-01-15 16:57:00 -08001462 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001463 try:
1464 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001465 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001466
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001467 self.handle.sendline( "tshark -i " + str( interface ) + " -t e -w " + str( dirFile ) + " &" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001468 self.handle.sendline( "\n" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001469 self.handle.expect( "Capturing on" )
Jon Hall5ec6b1b2015-09-17 18:20:14 -07001470 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001471 self.handle.expect( self.prompt )
andrewonlab970399c2014-11-07 13:09:32 -05001472
Jon Hallfebb1c72015-03-05 13:30:09 -08001473 main.log.info( "Tshark started capturing files on " +
1474 str( interface ) + " and saving to directory: " +
1475 str( dirFile ) )
1476 except pexpect.EOF:
1477 main.log.error( self.name + ": EOF exception found" )
1478 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001479 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001480 except Exception:
1481 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001482 main.cleanAndExit()
Shreya Shaha73aaad2014-10-27 18:03:09 -04001483
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001484 def onosTopoCfg( self, onosIp, jsonFile ):
kelvin8ec71442015-01-15 16:57:00 -08001485 """
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001486 Description:
1487 Execute onos-topo-cfg command
1488 Required:
1489 onosIp - IP of the onos node you want to send the json to
1490 jsonFile - File path of the json file
1491 Return:
1492 Returns main.TRUE if the command is successfull; Returns
1493 main.FALSE if there was an error
kelvin8ec71442015-01-15 16:57:00 -08001494 """
shahshreyae6c7cf42014-11-26 16:39:01 -08001495 try:
kelvin8ec71442015-01-15 16:57:00 -08001496 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001497 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001498 cmd = "onos-topo-cfg "
1499 self.handle.sendline( cmd + str( onosIp ) + " " + jsonFile )
1500 handle = self.handle.before
1501 print handle
1502 if "Error" in handle:
1503 main.log.error( self.name + ": " + self.handle.before )
1504 return main.FALSE
1505 else:
Devin Limc20e79a2017-06-07 10:29:57 -07001506 self.handle.expect( self.prompt )
kelvin-onlabd9e23de2015-08-06 10:34:44 -07001507 return main.TRUE
1508
Jon Hallfebb1c72015-03-05 13:30:09 -08001509 except pexpect.EOF:
1510 main.log.error( self.name + ": EOF exception found" )
1511 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001512 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001513 except Exception:
1514 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001515 main.cleanAndExit()
kelvin8ec71442015-01-15 16:57:00 -08001516
jenkins1e99e7b2015-04-02 18:15:39 -07001517 def tsharkGrep( self, grep, directory, interface='eth0', grepOptions='' ):
kelvin8ec71442015-01-15 16:57:00 -08001518 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001519 Required:
kelvin8ec71442015-01-15 16:57:00 -08001520 * grep string
andrewonlabba44bcf2014-10-16 16:54:41 -04001521 * directory to store results
1522 Optional:
1523 * interface - default: eth0
Jon Hall4ba53f02015-07-29 13:07:41 -07001524 * grepOptions - options for grep
andrewonlabba44bcf2014-10-16 16:54:41 -04001525 Description:
1526 Uses tshark command to grep specific group of packets
1527 and stores the results to specified directory.
kelvin8ec71442015-01-15 16:57:00 -08001528 The timestamp is hardcoded to be in epoch
1529 """
Jon Hallfebb1c72015-03-05 13:30:09 -08001530 try:
1531 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001532 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001533 self.handle.sendline( "" )
jenkins1e99e7b2015-04-02 18:15:39 -07001534 if grepOptions:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001535 grepStr = "grep " + str( grepOptions )
jenkins1e99e7b2015-04-02 18:15:39 -07001536 else:
1537 grepStr = "grep"
Jon Hall4ba53f02015-07-29 13:07:41 -07001538
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001539 cmd = (
1540 "sudo tshark -i " +
Jon Hallfebb1c72015-03-05 13:30:09 -08001541 str( interface ) +
jenkins1e99e7b2015-04-02 18:15:39 -07001542 " -t e | " +
1543 grepStr + " --line-buffered \"" +
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001544 str( grep ) +
Jon Hallfebb1c72015-03-05 13:30:09 -08001545 "\" >" +
1546 directory +
1547 " &" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001548 self.handle.sendline( cmd )
1549 main.log.info( cmd )
Jon Hallfebb1c72015-03-05 13:30:09 -08001550 self.handle.expect( "Capturing on" )
cameron@onlab.us21106ea2015-07-23 15:32:51 -07001551 self.handle.sendline( "\n" )
Devin Limc20e79a2017-06-07 10:29:57 -07001552 self.handle.expect( self.prompt )
Jon Hallfebb1c72015-03-05 13:30:09 -08001553 except pexpect.EOF:
1554 main.log.error( self.name + ": EOF exception found" )
1555 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001556 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001557 except Exception:
1558 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001559 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001560
kelvin-onlabd3b64892015-01-20 13:26:24 -08001561 def tsharkStop( self ):
kelvin8ec71442015-01-15 16:57:00 -08001562 """
andrewonlabba44bcf2014-10-16 16:54:41 -04001563 Removes wireshark files from /tmp and kills all tshark processes
kelvin8ec71442015-01-15 16:57:00 -08001564 """
1565 # Remove all pcap from previous captures
Jon Hallfebb1c72015-03-05 13:30:09 -08001566 try:
1567 self.execute( cmd="sudo rm /tmp/wireshark*" )
1568 self.handle.sendline( "" )
Jon Hallefbd9792015-03-05 16:11:36 -08001569 self.handle.sendline( "sudo kill -9 `ps -ef | grep \"tshark -i\"" +
1570 " | grep -v grep | awk '{print $2}'`" )
Jon Hallfebb1c72015-03-05 13:30:09 -08001571 self.handle.sendline( "" )
1572 main.log.info( "Tshark stopped" )
1573 except pexpect.EOF:
1574 main.log.error( self.name + ": EOF exception found" )
1575 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001576 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001577 except Exception:
1578 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001579 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001580
kelvin8ec71442015-01-15 16:57:00 -08001581 def ptpd( self, args ):
1582 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001583 Initiate ptp with user-specified args.
1584 Required:
1585 * args: specify string of args after command
1586 'sudo ptpd'
kelvin8ec71442015-01-15 16:57:00 -08001587 """
andrewonlab0c38a4a2014-10-28 18:35:35 -04001588 try:
kelvin8ec71442015-01-15 16:57:00 -08001589 self.handle.sendline( "sudo ptpd " + str( args ) )
1590 i = self.handle.expect( [
andrewonlab0c38a4a2014-10-28 18:35:35 -04001591 "Multiple",
1592 "Error",
Devin Limc20e79a2017-06-07 10:29:57 -07001593 self.prompt ] )
1594 self.handle.expect( self.prompt )
andrewonlabba44bcf2014-10-16 16:54:41 -04001595
andrewonlab0c38a4a2014-10-28 18:35:35 -04001596 if i == 0:
1597 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001598 main.log.info( "ptpd returned an error: " +
1599 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001600 return handle
1601 elif i == 1:
1602 handle = self.handle.before
kelvin8ec71442015-01-15 16:57:00 -08001603 main.log.error( "ptpd returned an error: " +
1604 str( handle ) )
andrewonlab0c38a4a2014-10-28 18:35:35 -04001605 return handle
1606 else:
1607 return main.TRUE
kelvin8ec71442015-01-15 16:57:00 -08001608
andrewonlab0c38a4a2014-10-28 18:35:35 -04001609 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001610 main.log.error( self.name + ": EOF exception found" )
1611 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001612 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001613 except Exception:
1614 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001615 main.cleanAndExit()
andrewonlabba44bcf2014-10-16 16:54:41 -04001616
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001617 def dumpONOSCmd( self, ONOSIp, CMD, destDir, filename, options="" ):
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001618 """
Pier50f0bc62016-09-07 17:53:40 -07001619 Dump Cmd to a desired directory.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001620 For debugging purposes, you may want to use
Pier50f0bc62016-09-07 17:53:40 -07001621 this function to capture Cmd at a given point in time.
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001622 Localtime will be attached to the filename
1623
1624 Required:
1625 * ONOSIp: the IP of the target ONOS instance
Pier50f0bc62016-09-07 17:53:40 -07001626 * CMD: the command to dump;
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001627 * destDir: specify directory to copy to.
1628 ex ) /tmp/
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001629 * fileName: Name of the file
Pier50f0bc62016-09-07 17:53:40 -07001630 * options: Options for ONOS command
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001631 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001632
Flavio Castrod2ffffa2016-04-26 15:56:56 -07001633 localtime = time.strftime( '%x %X' )
1634 localtime = localtime.replace( "/", "" )
1635 localtime = localtime.replace( " ", "_" )
1636 localtime = localtime.replace( ":", "" )
1637 if destDir[ -1: ] != "/":
1638 destDir += "/"
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001639 cmd = CMD + " " + options + " > " + str( destDir ) + str( filename ) + localtime
1640 return self.onosCli( ONOSIp, cmd )
Flavio Castrob7718952016-05-18 08:53:41 -07001641
kelvin-onlabd3b64892015-01-20 13:26:24 -08001642 def cpLogsToDir( self, logToCopy,
Jon Hallefbd9792015-03-05 16:11:36 -08001643 destDir, copyFileName="" ):
kelvin8ec71442015-01-15 16:57:00 -08001644 """
1645 Copies logs to a desired directory.
andrewonlab5d7a8f32014-11-10 13:07:56 -05001646 Current implementation of ONOS deletes its karaf
1647 logs on every iteration. For debugging purposes,
kelvin8ec71442015-01-15 16:57:00 -08001648 you may want to use this function to capture
1649 certain karaf logs. ( or any other logs if needed )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001650 Localtime will be attached to the filename
1651
1652 Required:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001653 * logToCopy: specify directory and log name to
andrewonlab5d7a8f32014-11-10 13:07:56 -05001654 copy.
kelvin8ec71442015-01-15 16:57:00 -08001655 ex ) /opt/onos/log/karaf.log.1
kelvin-onlabd3b64892015-01-20 13:26:24 -08001656 For copying multiple files, leave copyFileName
1657 empty and only specify destDir -
kelvin8ec71442015-01-15 16:57:00 -08001658 ex ) /opt/onos/log/karaf*
kelvin-onlabd3b64892015-01-20 13:26:24 -08001659 * destDir: specify directory to copy to.
kelvin8ec71442015-01-15 16:57:00 -08001660 ex ) /tmp/
1661 Optional:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001662 * copyFileName: If you want to rename the log
1663 file, specify copyFileName. This will not work
andrewonlab5d7a8f32014-11-10 13:07:56 -05001664 with multiple file copying
kelvin8ec71442015-01-15 16:57:00 -08001665 """
andrewonlab5d7a8f32014-11-10 13:07:56 -05001666 try:
Flavio Castro09ab59d2016-05-25 17:01:35 -07001667 localtime = time.strftime( '%H %M' )
kelvin8ec71442015-01-15 16:57:00 -08001668 localtime = localtime.replace( "/", "" )
1669 localtime = localtime.replace( " ", "_" )
1670 localtime = localtime.replace( ":", "" )
kelvin-onlabd3b64892015-01-20 13:26:24 -08001671 if destDir[ -1: ] != "/":
1672 destDir += "/"
andrewonlab5d7a8f32014-11-10 13:07:56 -05001673
kelvin-onlabd3b64892015-01-20 13:26:24 -08001674 if copyFileName:
Jon Hallfebb1c72015-03-05 13:30:09 -08001675 self.handle.sendline( "cp " + str( logToCopy ) + " " +
1676 str( destDir ) + str( copyFileName ) +
1677 localtime )
kelvin8ec71442015-01-15 16:57:00 -08001678 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001679 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001680 else:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001681 self.handle.sendline( "cp " + str( logToCopy ) +
1682 " " + str( destDir ) )
kelvin8ec71442015-01-15 16:57:00 -08001683 self.handle.expect( "cp" )
Devin Limc20e79a2017-06-07 10:29:57 -07001684 self.handle.expect( self.prompt )
andrewonlab5d7a8f32014-11-10 13:07:56 -05001685
kelvin8ec71442015-01-15 16:57:00 -08001686 return self.handle.before
1687
1688 except pexpect.EOF:
1689 main.log.error( "Copying files failed" )
1690 main.log.error( self.name + ": EOF exception found" )
1691 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001692 except Exception:
1693 main.log.exception( "Copying files failed" )
1694
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001695 def checkLogs( self, onosIp, restart=False ):
kelvin8ec71442015-01-15 16:57:00 -08001696 """
Jon Hall94fd0472014-12-08 11:52:42 -08001697 runs onos-check-logs on the given onos node
Jon Hall80daded2015-05-27 16:07:00 -07001698 If restart is True, use the old version of onos-check-logs which
1699 does not print the full stacktrace, but shows the entire log file,
1700 including across restarts
Jon Hall94fd0472014-12-08 11:52:42 -08001701 returns the response
kelvin8ec71442015-01-15 16:57:00 -08001702 """
Jon Hall94fd0472014-12-08 11:52:42 -08001703 try:
kelvin-onlabd3b64892015-01-20 13:26:24 -08001704 cmd = "onos-check-logs " + str( onosIp )
Jon Hall16b72c42015-05-20 10:23:36 -07001705 if restart:
1706 cmd += " old"
kelvin8ec71442015-01-15 16:57:00 -08001707 self.handle.sendline( cmd )
1708 self.handle.expect( cmd )
Devin Limdc78e202017-06-09 18:30:07 -07001709 self.handle.expect( self.prompt + " " )
Jon Hall94fd0472014-12-08 11:52:42 -08001710 response = self.handle.before
1711 return response
1712 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001713 main.log.error( "Lost ssh connection" )
1714 main.log.error( self.name + ": EOF exception found" )
1715 main.log.error( self.name + ": " + self.handle.before )
Jon Hallfebb1c72015-03-05 13:30:09 -08001716 except Exception:
1717 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001718 main.cleanAndExit()
Jon Hall94fd0472014-12-08 11:52:42 -08001719
kelvin-onlabd3b64892015-01-20 13:26:24 -08001720 def onosStatus( self, node="" ):
kelvin8ec71442015-01-15 16:57:00 -08001721 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001722 Calls onos command: 'onos-service [<node-ip>] status'
kelvin8ec71442015-01-15 16:57:00 -08001723 """
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001724 try:
kelvin8ec71442015-01-15 16:57:00 -08001725 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001726 self.handle.expect( self.prompt )
kelvin8ec71442015-01-15 16:57:00 -08001727 self.handle.sendline( "onos-service " + str( node ) +
1728 " status" )
1729 i = self.handle.expect( [
You Wangef1e6572016-03-08 12:53:18 -08001730 "start/running",
You Wang7bd83062016-03-01 11:50:00 -08001731 "Running ...",
You Wangef1e6572016-03-08 12:53:18 -08001732 "stop/waiting",
You Wang7bd83062016-03-01 11:50:00 -08001733 "Not Running ...",
kelvin8ec71442015-01-15 16:57:00 -08001734 pexpect.TIMEOUT ], timeout=120 )
YPZhangfebf7302016-05-24 16:45:56 -07001735 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001736 self.handle.expect( self.prompt )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001737
You Wangef1e6572016-03-08 12:53:18 -08001738 if i == 0 or i == 1:
kelvin8ec71442015-01-15 16:57:00 -08001739 main.log.info( "ONOS is running" )
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001740 return main.TRUE
You Wangef1e6572016-03-08 12:53:18 -08001741 elif i == 2 or i == 3:
kelvin8ec71442015-01-15 16:57:00 -08001742 main.log.info( "ONOS is stopped" )
kelvin8ec71442015-01-15 16:57:00 -08001743 main.log.error( "ONOS service failed to check the status" )
Devin Lim44075962017-08-11 10:56:37 -07001744
1745 main.cleanAndExit()
Hari Krishnaa43d4e92014-12-19 13:22:40 -08001746 except pexpect.EOF:
kelvin8ec71442015-01-15 16:57:00 -08001747 main.log.error( self.name + ": EOF exception found" )
1748 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001749 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001750 except Exception:
1751 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001752 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001753
Jon Hall63604932015-02-26 17:09:50 -08001754 def setIpTables( self, ip, port='', action='add', packet_type='',
1755 direction='INPUT', rule='DROP', states=True ):
Jon Hallefbd9792015-03-05 16:11:36 -08001756 """
Jon Hall21270ac2015-02-16 17:59:55 -08001757 Description:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001758 add or remove iptables rule to DROP (default) packets from
Jon Hall21270ac2015-02-16 17:59:55 -08001759 specific IP and PORT
1760 Usage:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001761 * specify action ('add' or 'remove')
Jon Hall21270ac2015-02-16 17:59:55 -08001762 when removing, pass in the same argument as you would add. It will
1763 delete that specific rule.
1764 * specify the ip to block
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001765 * specify the destination port to block (defaults to all ports)
1766 * optional packet type to block (default tcp)
1767 * optional iptables rule (default DROP)
1768 * optional direction to block (default 'INPUT')
Jon Hall63604932015-02-26 17:09:50 -08001769 * States boolean toggles adding all supported tcp states to the
1770 firewall rule
Jon Hall21270ac2015-02-16 17:59:55 -08001771 Returns:
1772 main.TRUE on success or
1773 main.FALSE if given invalid input or
1774 main.ERROR if there is an error in response from iptables
1775 WARNING:
1776 * This function uses root privilege iptables command which may result
1777 in unwanted network errors. USE WITH CAUTION
Jon Hallefbd9792015-03-05 16:11:36 -08001778 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001779
Jon Hall21270ac2015-02-16 17:59:55 -08001780 # NOTE*********
1781 # The strict checking methods of this driver function is intentional
1782 # to discourage any misuse or error of iptables, which can cause
1783 # severe network errors
1784 # *************
1785
1786 # NOTE: Sleep needed to give some time for rule to be added and
1787 # registered to the instance. If you are calling this function
1788 # multiple times this sleep will prevent any errors.
1789 # DO NOT REMOVE
Jon Hall63604932015-02-26 17:09:50 -08001790 # time.sleep( 5 )
Jon Hall21270ac2015-02-16 17:59:55 -08001791 try:
1792 # input validation
1793 action_type = action.lower()
1794 rule = rule.upper()
1795 direction = direction.upper()
1796 if action_type != 'add' and action_type != 'remove':
1797 main.log.error( "Invalid action type. Use 'add' or "
1798 "'remove' table rule" )
1799 if rule != 'DROP' and rule != 'ACCEPT' and rule != 'LOG':
1800 # NOTE Currently only supports rules DROP, ACCEPT, and LOG
1801 main.log.error( "Invalid rule. Valid rules are 'DROP' or "
1802 "'ACCEPT' or 'LOG' only." )
1803 if direction != 'INPUT' and direction != 'OUTPUT':
1804 # NOTE currently only supports rules INPUT and OUPTUT
1805 main.log.error( "Invalid rule. Valid directions are"
1806 " 'OUTPUT' or 'INPUT'" )
1807 return main.FALSE
1808 return main.FALSE
1809 return main.FALSE
1810 if action_type == 'add':
1811 # -A is the 'append' action of iptables
1812 actionFlag = '-A'
1813 elif action_type == 'remove':
1814 # -D is the 'delete' rule of iptables
1815 actionFlag = '-D'
1816 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001817 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001818 cmd = "sudo iptables " + actionFlag + " " +\
1819 direction +\
Jon Hall21270ac2015-02-16 17:59:55 -08001820 " -s " + str( ip )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001821 # " -p " + str( packet_type ) +\
Jon Hall63604932015-02-26 17:09:50 -08001822 if packet_type:
1823 cmd += " -p " + str( packet_type )
Jon Hall21270ac2015-02-16 17:59:55 -08001824 if port:
1825 cmd += " --dport " + str( port )
Jon Hall63604932015-02-26 17:09:50 -08001826 if states:
1827 cmd += " -m state --state="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001828 # FIXME- Allow user to configure which states to block
Jon Hall63604932015-02-26 17:09:50 -08001829 cmd += "INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED"
Jon Hall21270ac2015-02-16 17:59:55 -08001830 cmd += " -j " + str( rule )
1831
1832 self.handle.sendline( cmd )
Devin Limc20e79a2017-06-07 10:29:57 -07001833 self.handle.expect( self.prompt )
Jon Hall21270ac2015-02-16 17:59:55 -08001834 main.log.warn( self.handle.before )
1835
1836 info_string = "On " + str( self.name )
1837 info_string += " " + str( action_type )
1838 info_string += " iptable rule [ "
1839 info_string += " IP: " + str( ip )
1840 info_string += " Port: " + str( port )
1841 info_string += " Rule: " + str( rule )
1842 info_string += " Direction: " + str( direction ) + " ]"
1843 main.log.info( info_string )
1844 return main.TRUE
1845 except pexpect.TIMEOUT:
1846 main.log.exception( self.name + ": Timeout exception in "
1847 "setIpTables function" )
1848 return main.ERROR
1849 except pexpect.EOF:
1850 main.log.error( self.name + ": EOF exception found" )
1851 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001852 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001853 except Exception:
1854 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001855 main.cleanAndExit()
Jon Hall21270ac2015-02-16 17:59:55 -08001856
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001857 def detailed_status( self, log_filename ):
Jon Hallefbd9792015-03-05 16:11:36 -08001858 """
Jon Hall0468b042015-02-19 19:08:21 -08001859 This method is used by STS to check the status of the controller
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001860 Reports RUNNING, STARTING, STOPPED, FROZEN, ERROR (and reason)
Jon Hallefbd9792015-03-05 16:11:36 -08001861 """
Jon Hall0468b042015-02-19 19:08:21 -08001862 import re
1863 try:
1864 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07001865 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001866 self.handle.sendline( "cd " + self.home )
Devin Limc20e79a2017-06-07 10:29:57 -07001867 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001868 self.handle.sendline( "service onos status" )
Devin Limc20e79a2017-06-07 10:29:57 -07001869 self.handle.expect( self.prompt )
Jon Hall0468b042015-02-19 19:08:21 -08001870 response = self.handle.before
1871 if re.search( "onos start/running", response ):
1872 # onos start/running, process 10457
1873 return 'RUNNING'
1874 # FIXME: Implement this case
1875 # elif re.search( pattern, response ):
1876 # return 'STARTING'
1877 elif re.search( "onos stop/", response ):
1878 # onos stop/waiting
1879 # FIXME handle this differently?: onos stop/pre-stop
1880 return 'STOPPED'
1881 # FIXME: Implement this case
1882 # elif re.search( pattern, response ):
1883 # return 'FROZEN'
1884 else:
1885 main.log.warn( self.name +
Jon Hallefbd9792015-03-05 16:11:36 -08001886 " WARNING: status received unknown response" )
Jon Hall0468b042015-02-19 19:08:21 -08001887 main.log.warn( response )
1888 return 'ERROR', "Unknown response: %s" % response
1889 except pexpect.TIMEOUT:
1890 main.log.exception( self.name + ": Timeout exception in "
1891 "setIpTables function" )
1892 return 'ERROR', "Pexpect Timeout"
1893 except pexpect.EOF:
1894 main.log.error( self.name + ": EOF exception found" )
1895 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07001896 main.cleanAndExit()
Jon Hallfebb1c72015-03-05 13:30:09 -08001897 except Exception:
1898 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07001899 main.cleanAndExit()
Jon Hall0468b042015-02-19 19:08:21 -08001900
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001901 def createLinkGraphFile( self, benchIp, ONOSIpList, deviceCount ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001902 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001903 Create/formats the LinkGraph.cfg file based on arguments
1904 -only creates a linear topology and connects islands
1905 -evenly distributes devices
andrew@onlab.us3b087132015-03-11 15:00:08 -07001906 -must be called by ONOSbench
1907
Jon Hall4ba53f02015-07-29 13:07:41 -07001908 ONOSIpList - list of all of the node IPs to be used
1909
1910 deviceCount - number of switches to be assigned
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001911 '''
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001912 main.log.info( "Creating link graph configuration file." )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001913 linkGraphPath = self.home + "/tools/package/etc/linkGraph.cfg"
Jon Hall4ba53f02015-07-29 13:07:41 -07001914 tempFile = "/tmp/linkGraph.cfg"
andrew@onlab.us3b087132015-03-11 15:00:08 -07001915
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001916 linkGraph = open( tempFile, 'w+' )
1917 linkGraph.write( "# NullLinkProvider topology description (config file).\n" )
1918 linkGraph.write( "# The NodeId is only added if the destination is another node's device.\n" )
1919 linkGraph.write( "# Bugs: Comments cannot be appended to a line to be read.\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001920
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001921 clusterCount = len( ONOSIpList )
Jon Hall4ba53f02015-07-29 13:07:41 -07001922
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001923 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
1924 deviceCount = int( deviceCount )
1925 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001926 baselineSwitchCount = deviceCount/clusterCount
Jon Hall4ba53f02015-07-29 13:07:41 -07001927
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001928 for node in range( 1, clusterCount + 1 ):
1929 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001930
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001931 for node in range( 1, ( deviceCount % clusterCount )+1 ):
1932 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07001933
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001934 if isinstance( deviceCount, list ):
1935 main.log.info( "Using provided device distribution" )
1936 switchList = [ 0 ]
andrew@onlab.us3b087132015-03-11 15:00:08 -07001937 for i in deviceCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001938 switchList.append( int( i ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001939
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001940 tempList = [ '0' ]
1941 tempList.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001942 ONOSIpList = tempList
1943
1944 myPort = 6
1945 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001946 for node in range( 1, clusterCount+1 ):
1947 if switchList[ node ] == 0:
andrew@onlab.us3b087132015-03-11 15:00:08 -07001948 continue
1949
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001950 linkGraph.write( "graph " + ONOSIpList[ node ] + " {\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -07001951
andrew@onlab.us3b087132015-03-11 15:00:08 -07001952 if node > 1:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001953 # connect to last device on previous node
1954 line = ( "\t0:5 -> " + str( lastSwitch ) + ":6:" + lastIp + "\n" ) # ONOSIpList[node-1]
1955 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07001956
1957 lastSwitch = 0
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001958 for switch in range( 0, switchList[ node ]-1 ):
andrew@onlab.us3b087132015-03-11 15:00:08 -07001959 line = ""
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001960 line = ( "\t" + str( switch ) + ":" + str( myPort ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001961 line += " -- "
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001962 line += ( str( switch+1 ) + ":" + str( myPort-1 ) + "\n" )
1963 linkGraph.write( line )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001964 lastSwitch = switch+1
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001965 lastIp = ONOSIpList[ node ]
Jon Hall4ba53f02015-07-29 13:07:41 -07001966
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001967 # lastSwitch += 1
1968 if node < ( clusterCount ):
1969 # connect to first device on the next node
1970 line = ( "\t" + str( lastSwitch ) + ":6 -> 0:5:" + ONOSIpList[ node+1 ] + "\n" )
1971 linkGraph.write( line )
Jon Hall4ba53f02015-07-29 13:07:41 -07001972
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001973 linkGraph.write( "}\n" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001974 linkGraph.close()
1975
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001976 # SCP
1977 os.system( "scp " + tempFile + " " + self.user_name + "@" + benchIp + ":" + linkGraphPath )
1978 main.log.info( "linkGraph.cfg creation complete" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001979
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001980 def configNullDev( self, ONOSIpList, deviceCount, numPorts=10 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001981 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07001982 ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
1983 deviceCount = number of switches to distribute, or list of values to use as custom distribution
cameron@onlab.us75900962015-03-30 13:22:49 -07001984 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 +00001985 '''
1986
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001987 main.log.info( "Configuring Null Device Provider" )
1988 clusterCount = len( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07001989
Jon Hall4ba53f02015-07-29 13:07:41 -07001990 try:
1991
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001992 if isinstance( deviceCount, int ) or isinstance( deviceCount, str ):
1993 main.log.info( "Creating device distribution" )
1994 deviceCount = int( deviceCount )
1995 switchList = [ 0 ]*( clusterCount+1 )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001996 baselineSwitchCount = deviceCount/clusterCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07001997
Jeremy Ronquillo82705492017-10-18 14:19:55 -07001998 for node in range( 1, clusterCount + 1 ):
1999 switchList[ node ] = baselineSwitchCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002000
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002001 for node in range( 1, ( deviceCount % clusterCount )+1 ):
2002 switchList[ node ] += 1
Jon Hall4ba53f02015-07-29 13:07:41 -07002003
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002004 if isinstance( deviceCount, list ):
2005 main.log.info( "Using provided device distribution" )
Jon Hall4ba53f02015-07-29 13:07:41 -07002006
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002007 if len( deviceCount ) == clusterCount:
2008 switchList = [ '0' ]
2009 switchList.extend( deviceCount )
Jon Hall4ba53f02015-07-29 13:07:41 -07002010
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002011 if len( deviceCount ) == ( clusterCount + 1 ):
2012 if deviceCount[ 0 ] == '0' or deviceCount[ 0 ] == 0:
cameron@onlab.us75900962015-03-30 13:22:49 -07002013 switchList = deviceCount
andrew@onlab.us3b087132015-03-11 15:00:08 -07002014
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002015 assert len( switchList ) == ( clusterCount + 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002016
cameron@onlab.us75900962015-03-30 13:22:49 -07002017 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002018 main.log.error( "Bad device/Ip list match" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002019 except TypeError:
2020 main.log.exception( self.name + ": Object not as expected" )
2021 return None
Jon Hall77ba41c2015-04-06 10:25:40 -07002022 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002023 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002024 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002025
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002026 ONOSIp = [ 0 ]
2027 ONOSIp.extend( ONOSIpList )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002028
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002029 devicesString = "devConfigs = "
2030 for node in range( 1, len( ONOSIp ) ):
2031 devicesString += ( ONOSIp[ node ] + ":" + str( switchList[ node ] ) )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002032 if node < clusterCount:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002033 devicesString += ( "," )
Jon Hall4ba53f02015-07-29 13:07:41 -07002034
2035 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002036 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
2037 self.handle.expect( ":~" )
2038 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str( numPorts ) )
2039 self.handle.expect( ":~" )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002040
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002041 for i in range( 10 ):
2042 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider" )
2043 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002044 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002045 if ( " value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002046 break
2047 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002048 time.sleep( 1 )
andrew@onlab.us3b087132015-03-11 15:00:08 -07002049
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002050 assert ( "value=" + str( numPorts ) ) in verification and ( " value=" + devicesString ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002051
cameron@onlab.us75900962015-03-30 13:22:49 -07002052 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002053 main.log.error( "Incorrect Config settings: " + verification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002054 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002055 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002056 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002057
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002058 def configNullLink( self, fileName="/opt/onos/apache-karaf-3.0.3/etc/linkGraph.cfg", eventRate=0 ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002059 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002060 fileName default is currently the same as the default on ONOS, specify alternate file if
cameron@onlab.us75900962015-03-30 13:22:49 -07002061 you want to use a different topology file than linkGraph.cfg
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002062 '''
Jon Hall4ba53f02015-07-29 13:07:41 -07002063
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002064 try:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002065 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str( eventRate ) )
2066 self.handle.expect( ":~" )
2067 self.handle.sendline( "onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
2068 self.handle.expect( ":~" )
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002069
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002070 for i in range( 10 ):
2071 self.handle.sendline( "onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider" )
2072 self.handle.expect( ":~" )
cameron@onlab.us75900962015-03-30 13:22:49 -07002073 verification = self.handle.before
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002074 if ( " value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification:
cameron@onlab.us75900962015-03-30 13:22:49 -07002075 break
Jon Hall4ba53f02015-07-29 13:07:41 -07002076 else:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002077 time.sleep( 1 )
Jon Hall4ba53f02015-07-29 13:07:41 -07002078
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002079 assert ( "value=" + str( eventRate ) ) in verification and ( " value=" + fileName ) in verification
Jon Hall4ba53f02015-07-29 13:07:41 -07002080
cameron@onlab.us75900962015-03-30 13:22:49 -07002081 except pexpect.EOF:
2082 main.log.error( self.name + ": EOF exception found" )
2083 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002084 main.cleanAndExit()
cameron@onlab.us75900962015-03-30 13:22:49 -07002085 except AssertionError:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002086 main.log.info( "Settings did not post to ONOS" )
2087 main.log.error( varification )
Jon Hall77ba41c2015-04-06 10:25:40 -07002088 except Exception:
cameron@onlab.us75900962015-03-30 13:22:49 -07002089 main.log.exception( self.name + ": Uncaught exception!" )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002090 main.log.error( varification )
Devin Lim44075962017-08-11 10:56:37 -07002091 main.cleanAndExit()
andrew@onlab.us3b087132015-03-11 15:00:08 -07002092
kelvin-onlaba4074292015-07-09 15:19:49 -07002093 def getOnosIps( self ):
2094 """
2095 Get all onos IPs stored in
2096 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002097
kelvin-onlaba4074292015-07-09 15:19:49 -07002098 return sorted( self.onosIps.values() )
cameron@onlab.us59d29d92015-05-11 14:31:54 -07002099
Chiyu Chengec63bde2016-11-17 18:11:36 -08002100 def listLog( self, nodeIp ):
2101 """
2102 Get a list of all the karaf log names
2103 """
2104 try:
2105 cmd = "onos-ssh " + nodeIp + " ls -tr /opt/onos/log"
2106 self.handle.sendline( cmd )
2107 self.handle.expect( ":~" )
2108 before = self.handle.before.splitlines()
2109 logNames = []
2110 for word in before:
2111 if 'karaf.log' in word:
2112 logNames.append( word )
2113 return logNames
2114 except pexpect.EOF:
2115 main.log.error( self.name + ": EOF exception found" )
2116 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002117 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002118 except pexpect.TIMEOUT:
2119 main.log.error( self.name + ": TIMEOUT exception found" )
2120 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002121 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002122 except Exception:
2123 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002124 main.cleanAndExit()
Chiyu Chengec63bde2016-11-17 18:11:36 -08002125
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002126 def logReport( self, nodeIp, searchTerms, outputMode="s", startStr=None, endStr=None ):
Jon Hallb4242222016-01-25 17:07:04 -08002127 """
2128 Searches the latest ONOS log file for the given search terms and
2129 prints the total occurances of each term. Returns to combined total of
2130 all occurances.
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002131
Jon Hallb4242222016-01-25 17:07:04 -08002132 Arguments:
2133 * nodeIp - The ip of the ONOS node where the log is located
2134 * searchTerms - A string to grep for or a list of strings to grep
2135 for in the ONOS log. Will print out the number of
2136 occurances for each term.
2137 Optional Arguments:
2138 * outputMode - 's' or 'd'. If 'd' will print the last 5 lines
2139 containing each search term as well as the total
2140 number of occurances of each term. Defaults to 's',
2141 which prints the simple output of just the number
2142 of occurances for each term.
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002143 * startStr - the start string to be given to stream editor command
2144 as the start point for extraction of data
2145 * endStr - the end string to be given to stream editor command as
2146 the end point for extraction of data
Jon Hallb4242222016-01-25 17:07:04 -08002147 """
2148 try:
2149 main.log.info( " Log Report for {} ".format( nodeIp ).center( 70, '=' ) )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002150 if isinstance( searchTerms, str ):
2151 searchTerms = [ searchTerms ]
Jon Hallb4242222016-01-25 17:07:04 -08002152 numTerms = len( searchTerms )
2153 outputMode = outputMode.lower()
cameron@onlab.us70dd8c62015-05-14 11:19:39 -07002154
Jon Hallb4242222016-01-25 17:07:04 -08002155 totalHits = 0
2156 logLines = []
2157 for termIndex in range( numTerms ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002158 term = searchTerms[ termIndex ]
2159 logLines.append( [ term ] )
Pratik Parab3b2ab5a2017-02-14 13:15:14 -08002160 if startStr and endStr:
2161 cmd = "onos-ssh {} \"sed -n '/{}/,/{}/p' /opt/onos/log/karaf.log | grep {}\"".format( nodeIp,
2162 startStr,
2163 endStr,
2164 term )
2165 else:
2166 cmd = "onos-ssh {} cat /opt/onos/log/karaf.log | grep {}".format( nodeIp,
2167 term )
Jon Hallb4242222016-01-25 17:07:04 -08002168 self.handle.sendline( cmd )
2169 self.handle.expect( ":~" )
2170 before = self.handle.before.splitlines()
2171 count = 0
2172 for line in before:
2173 if term in line and "grep" not in line:
2174 count += 1
2175 if before.index( line ) > ( len( before ) - 7 ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002176 logLines[ termIndex ].append( line )
Jon Hallb4242222016-01-25 17:07:04 -08002177 main.log.info( "{}: {}".format( term, count ) )
2178 totalHits += count
2179 if termIndex == numTerms - 1:
2180 print "\n"
2181 if outputMode != "s":
2182 outputString = ""
2183 for term in logLines:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002184 outputString = term[ 0 ] + ": \n"
Jon Hallb4242222016-01-25 17:07:04 -08002185 for line in range( 1, len( term ) ):
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002186 outputString += ( "\t" + term[ line ] + "\n" )
2187 if outputString != ( term[ 0 ] + ": \n" ):
Jon Hallb4242222016-01-25 17:07:04 -08002188 main.log.info( outputString )
2189 main.log.info( "=" * 70 )
2190 return totalHits
2191 except pexpect.EOF:
2192 main.log.error( self.name + ": EOF exception found" )
2193 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002194 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002195 except pexpect.TIMEOUT:
2196 main.log.error( self.name + ": TIMEOUT exception found" )
2197 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002198 main.cleanAndExit()
Jon Hallb4242222016-01-25 17:07:04 -08002199 except Exception:
2200 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002201 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002202
2203 def copyMininetFile( self, fileName, localPath, userName, ip,
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002204 mnPath='~/mininet/custom/', timeout = 60 ):
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002205 """
2206 Description:
2207 Copy mininet topology file from dependency folder in the test folder
2208 and paste it to the mininet machine's mininet/custom folder
2209 Required:
2210 fileName - Name of the topology file to copy
2211 localPath - File path of the mininet topology file
2212 userName - User name of the mininet machine to send the file to
2213 ip - Ip address of the mininet machine
2214 Optional:
2215 mnPath - of the mininet directory to send the file to
2216 Return:
2217 Return main.TRUE if successfully copied the file otherwise
2218 return main.FALSE
2219 """
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002220
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002221 try:
2222 cmd = "scp " + localPath + fileName + " " + userName + "@" + \
2223 str( ip ) + ":" + mnPath + fileName
2224
2225 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002226 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002227
2228 main.log.info( self.name + ": Execute: " + cmd )
2229
2230 self.handle.sendline( cmd )
2231
2232 i = self.handle.expect( [ 'No such file',
2233 "100%",
2234 pexpect.TIMEOUT ] )
2235
2236 if i == 0:
2237 main.log.error( self.name + ": File " + fileName +
2238 " does not exist!" )
2239 return main.FALSE
2240
2241 if i == 1:
2242 main.log.info( self.name + ": File " + fileName +
2243 " has been copied!" )
2244 self.handle.sendline( "" )
Devin Limc20e79a2017-06-07 10:29:57 -07002245 self.handle.expect( self.prompt )
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002246 return main.TRUE
2247
2248 except pexpect.EOF:
2249 main.log.error( self.name + ": EOF exception found" )
2250 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002251 main.cleanAndExit()
kelvin-onlab7a719bb2015-07-08 11:09:51 -07002252 except pexpect.TIMEOUT:
2253 main.log.error( self.name + ": TIMEOUT exception found" )
2254 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002255 main.cleanAndExit()
cameron@onlab.us78b89652015-07-08 15:21:03 -07002256
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002257 def jvmSet( self, memory=8 ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002258
cameron@onlab.us78b89652015-07-08 15:21:03 -07002259 import os
2260
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002261 homeDir = os.path.expanduser( '~' )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002262 filename = "/onos/tools/package/bin/onos-service"
2263
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002264 serviceConfig = open( homeDir + filename, 'w+' )
2265 serviceConfig.write( "#!/bin/bash\n " )
2266 serviceConfig.write( "#------------------------------------- \n " )
2267 serviceConfig.write( "# Starts ONOS Apache Karaf container\n " )
2268 serviceConfig.write( "#------------------------------------- \n " )
2269 serviceConfig.write( "#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n " )
2270 serviceConfig.write( """export JAVA_OPTS="${JAVA_OPTS:--Xms""" + str( memory ) + "G -Xmx" + str( memory ) + """G}" \n """ )
2271 serviceConfig.write( "[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n" )
2272 serviceConfig.write( """${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """ )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002273 serviceConfig.close()
2274
Jon Hall6c44c0b2016-04-20 15:21:00 -07002275 def createDBFile( self, testData ):
Jon Hall4ba53f02015-07-29 13:07:41 -07002276
cameron@onlab.us78b89652015-07-08 15:21:03 -07002277 filename = main.TEST + "DB"
2278 DBString = ""
Jon Hall4ba53f02015-07-29 13:07:41 -07002279
cameron@onlab.us78b89652015-07-08 15:21:03 -07002280 for item in testData:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002281 if isinstance( item, string ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002282 item = "'" + item + "'"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002283 if testData.index( item ) < len( testData - 1 ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002284 item += ","
Jon Hall6c44c0b2016-04-20 15:21:00 -07002285 DBString += str( item )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002286
Jon Hall6c44c0b2016-04-20 15:21:00 -07002287 DBFile = open( filename, "a" )
2288 DBFile.write( DBString )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002289 DBFile.close()
2290
Jon Hall6c44c0b2016-04-20 15:21:00 -07002291 def verifySummary( self, ONOSIp, *deviceCount ):
cameron@onlab.us78b89652015-07-08 15:21:03 -07002292
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002293 self.handle.sendline( "onos " + ONOSIp + " summary" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002294 self.handle.expect( ":~" )
cameron@onlab.us78b89652015-07-08 15:21:03 -07002295
2296 summaryStr = self.handle.before
2297 print "\nSummary\n==============\n" + summaryStr + "\n\n"
2298
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002299 # passed = "SCC(s)=1" in summaryStr
2300 # if deviceCount:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002301 # passed = "devices=" + str(deviceCount) + "," not in summaryStr
cameron@onlab.us78b89652015-07-08 15:21:03 -07002302
GlennRC772363b2015-08-25 13:05:57 -07002303 passed = False
cameron@onlab.us78b89652015-07-08 15:21:03 -07002304 if "SCC(s)=1," in summaryStr:
2305 passed = True
Jon Hall6c44c0b2016-04-20 15:21:00 -07002306 print "Summary is verifed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002307 else:
Jon Hall6c44c0b2016-04-20 15:21:00 -07002308 print "Summary failed"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002309
2310 if deviceCount:
2311 print" ============================="
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002312 checkStr = "devices=" + str( deviceCount[ 0 ] ) + ","
cameron@onlab.us78b89652015-07-08 15:21:03 -07002313 print "Checkstr: " + checkStr
2314 if checkStr not in summaryStr:
2315 passed = False
Jon Hall6c44c0b2016-04-20 15:21:00 -07002316 print "Device count failed"
Jon Hall4ba53f02015-07-29 13:07:41 -07002317 else:
2318 print "device count verified"
cameron@onlab.us78b89652015-07-08 15:21:03 -07002319
2320 return passed
Jon Hall6c44c0b2016-04-20 15:21:00 -07002321
Jon Hall8f6d4622016-05-23 15:27:18 -07002322 def getIpAddr( self, iface=None ):
Jon Hall6c44c0b2016-04-20 15:21:00 -07002323 """
2324 Update self.ip_address with numerical ip address. If multiple IP's are
2325 located on the device, will attempt to use self.nicAddr to choose the
2326 right one. Defaults to 127.0.0.1 if no other address is found or cannot
2327 determine the correct address.
2328
2329 ONLY WORKS WITH IPV4 ADDRESSES
2330 """
2331 try:
Jon Hall8f6d4622016-05-23 15:27:18 -07002332 LOCALHOST = "127.0.0.1"
Jon Hall6c44c0b2016-04-20 15:21:00 -07002333 ipPat = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
2334 pattern = re.compile( ipPat )
2335 match = re.search( pattern, self.ip_address )
2336 if self.nicAddr:
2337 nicPat = self.nicAddr.replace( ".", "\." ).replace( "\*", r"\d{1,3}" )
2338 nicPat = re.compile( nicPat )
2339 else:
2340 nicPat = None
2341 # IF self.ip_address is an ip address and matches
2342 # self.nicAddr: return self.ip_address
2343 if match:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002344 curIp = match.group( 0 )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002345 if nicPat:
2346 nicMatch = re.search( nicPat, curIp )
2347 if nicMatch:
2348 return self.ip_address
Jon Hall8f6d4622016-05-23 15:27:18 -07002349 # ELSE: IF iface, return ip of interface
2350 cmd = "ifconfig"
2351 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2352 if iface:
2353 cmd += " " + str( iface )
2354 raw = subprocess.check_output( cmd.split() )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002355 ifPat = re.compile( "inet addr:({})".format( ipPat ) )
2356 ips = re.findall( ifPat, raw )
Jon Hall8f6d4622016-05-23 15:27:18 -07002357 if iface:
2358 if ips:
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002359 ip = ips[ 0 ]
Jon Hall8f6d4622016-05-23 15:27:18 -07002360 self.ip_address = ip
2361 return ip
2362 else:
2363 main.log.error( "Error finding ip, ifconfig output:".format( raw ) )
2364 # ELSE: attempt to get address matching nicPat.
Jon Hall6c44c0b2016-04-20 15:21:00 -07002365 if nicPat:
2366 for ip in ips:
2367 curMatch = re.search( nicPat, ip )
2368 if curMatch:
2369 self.ip_address = ip
2370 return ip
Jon Hall8f6d4622016-05-23 15:27:18 -07002371 else: # If only one non-localhost ip, return that
2372 tmpList = [ ip for ip in ips if ip is not LOCALHOST ]
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002373 if len( tmpList ) == 1:
2374 curIp = tmpList[ 0 ]
Jon Hall6c44c0b2016-04-20 15:21:00 -07002375 self.ip_address = curIp
2376 return curIp
Jon Hall8f6d4622016-05-23 15:27:18 -07002377 # Either no non-localhost IPs, or more than 1
Jon Hallebccd352016-05-20 15:17:17 -07002378 main.log.warn( "getIpAddr failed to find a public IP address" )
Jon Hall8f6d4622016-05-23 15:27:18 -07002379 return LOCALHOST
Jon Halle1790952016-05-23 15:51:46 -07002380 except subprocess.CalledProcessError:
Jon Hall8f6d4622016-05-23 15:27:18 -07002381 main.log.exception( "Error executing ifconfig" )
2382 except IndexError:
2383 main.log.exception( "Error getting IP Address" )
Jon Hall6c44c0b2016-04-20 15:21:00 -07002384 except Exception:
2385 main.log.exception( "Uncaught exception" )
suibin zhang116647a2016-05-06 16:30:09 -07002386
Devin Lim461f0872017-06-05 16:49:33 -07002387 def startBasicONOS( self, nodeList, opSleep=60, onosStartupSleep=30, onosUser="sdn" ):
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002388 '''
suibin zhang116647a2016-05-06 16:30:09 -07002389 Start onos cluster with defined nodes, but only with drivers app
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002390 '''
suibin zhang116647a2016-05-06 16:30:09 -07002391 import time
2392
2393 self.createCellFile( self.ip_address,
2394 "temp",
2395 self.ip_address,
2396 "drivers",
Devin Lim461f0872017-06-05 16:49:33 -07002397 nodeList, onosUser )
suibin zhang116647a2016-05-06 16:30:09 -07002398
2399 main.log.info( self.name + ": Apply cell to environment" )
2400 cellResult = self.setCell( "temp" )
2401 verifyResult = self.verifyCell()
2402
2403 main.log.info( self.name + ": Creating ONOS package" )
You Wangd1bcaca2016-10-24 15:23:26 -07002404 packageResult = self.buckBuild( timeout=opSleep )
suibin zhang116647a2016-05-06 16:30:09 -07002405
You Wangc669d212017-01-25 11:09:48 -08002406 main.log.info( self.name + ": Uninstalling ONOS" )
2407 for nd in nodeList:
2408 self.onosUninstall( nodeIp=nd )
2409
suibin zhang116647a2016-05-06 16:30:09 -07002410 main.log.info( self.name + ": Installing ONOS package" )
2411 for nd in nodeList:
You Wangc669d212017-01-25 11:09:48 -08002412 self.onosInstall( node=nd )
2413
2414 main.log.info( self.name + ": Set up ONOS secure SSH" )
2415 for nd in nodeList:
2416 self.onosSecureSSH( node=nd )
suibin zhang116647a2016-05-06 16:30:09 -07002417
2418 main.log.info( self.name + ": Starting ONOS service" )
2419 time.sleep( onosStartupSleep )
2420
2421 onosStatus = True
2422 for nd in nodeList:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00002423 onosStatus = onosStatus & self.isup( node = nd )
Jeremy Ronquillo82705492017-10-18 14:19:55 -07002424 # print "onosStatus is: " + str( onosStatus )
suibin zhang116647a2016-05-06 16:30:09 -07002425
2426 return main.TRUE if onosStatus else main.FALSE
2427
Devin Lim02075272017-07-10 15:33:21 -07002428 def onosNetCfg( self, controllerIp, path, fileName ):
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002429 """
2430 Push a specified json file to ONOS through the onos-netcfg service
2431
2432 Required:
Devin Lim02075272017-07-10 15:33:21 -07002433 controllerIp - the Ip of the ONOS node in the cluster
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002434 path - the location of the file to be sent
2435 fileName - name of the json file to be sent
2436
2437 Returns main.TRUE on successfully sending json file, and main.FALSE if
2438 there is an error.
2439 """
2440 try:
Devin Lim02075272017-07-10 15:33:21 -07002441 cmd = "onos-netcfg {0} {1}{2}".format( controllerIp, path, fileName )
2442 main.log.info( "Sending: " + cmd )
2443 main.ONOSbench.handle.sendline( cmd )
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002444 main.ONOSbench.handle.expect( self.prompt )
Devin Lim02075272017-07-10 15:33:21 -07002445 handle = self.handle.before
Jeremy Ronquillo3008aa32017-07-07 15:38:57 -07002446 if "Error" in handle or "No such file or directory" in handle or "curl: " in handle:
2447 main.log.error( self.name + ": " + handle + self.handle.after )
Devin Lim02075272017-07-10 15:33:21 -07002448 return main.FALSE
Devin Lim752dd7b2017-06-27 14:40:03 -07002449 return main.TRUE
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002450 except pexpect.EOF:
2451 main.log.error( self.name + ": EOF exception found" )
2452 main.log.error( self.name + ": " + self.handle.before )
Devin Lim44075962017-08-11 10:56:37 -07002453 main.cleanAndExit()
Jeremy Songster5665f1b2016-06-20 14:38:22 -07002454 except Exception:
2455 main.log.exception( self.name + ": Uncaught exception!" )
Devin Lim44075962017-08-11 10:56:37 -07002456 main.cleanAndExit()
Devin Lim3ebd5e72017-11-14 10:38:00 -08002457
2458 def formCluster( self, onosIPs ):
2459 """
2460 From ONOS cluster for IP addresses in onosIPs list
2461 """
2462 try:
2463 onosIPs = " ".join( onosIPs )
2464 command = "onos-form-cluster {}".format( onosIPs )
2465 main.log.info( "Sending: " + command )
2466 self.handle.sendline( "" )
2467 self.handle.expect( self.prompt )
2468 self.handle.sendline( command )
2469 self.handle.expect( self.prompt )
2470 handle = self.handle.before
2471 main.log.debug( handle )
2472 assert handle is not None, "Error in sendline"
2473 assert "Command not found:" not in handle, handle
2474 assert "Error" not in handle, handle
2475 assert "Exception:" not in handle, handle
2476 assert "curl:" not in handle, handle
2477 return main.TRUE
2478 except AssertionError:
2479 main.log.exception( "{} Error in onos-form-cluster output:".format( self.name ) )
2480 return main.FALSE
2481 except TypeError:
2482 main.log.exception( self.name + ": Object not as expected" )
2483 return main.FALSE
2484 except pexpect.EOF:
2485 main.log.error( self.name + ": EOF exception found" )
2486 main.log.error( self.name + ": " + self.handle.before )
2487 main.cleanAndExit()
2488 except Exception:
2489 main.log.exception( self.name + ": Uncaught exception!" )
2490 main.cleanAndExit()
Jon Hall7ce46ea2018-02-05 12:20:59 -08002491
2492 def backupData( self, location ):
2493 """
2494 Backs up ONOS data and logs to a given location. Returns main.FALSE
2495 if there is an error executing the command, and main.TRUE otherwise.
2496 required arguments:
2497 loaction - The file path to save the backup to
2498 """
2499 try:
2500 cmd = "/opt/onos/bin/onos-backup " + str( location )
2501 self.handle.sendline( cmd )
2502 self.handle.expect( self.prompt )
2503 handle = self.handle.before
2504 main.log.debug( handle )
2505 assert handle is not None, "Error in sendline"
2506 assert "Command not found:" not in handle, handle
2507 assert "Error" not in handle, handle
2508 assert "Exception:" not in handle, handle
2509 return main.TRUE
2510 except AssertionError:
2511 main.log.exception( "{} Error in onos-backup output:".format( self.name ) )
2512 return main.FALSE
2513 except TypeError:
2514 main.log.exception( self.name + ": Object not as expected" )
2515 return main.FALSE
2516 except pexpect.EOF:
2517 main.log.error( self.name + ": EOF exception found" )
2518 main.log.error( self.name + ": " + self.handle.before )
2519 main.cleanAndExit()
2520 except Exception:
2521 main.log.exception( self.name + ": Uncaught exception!" )
2522 main.cleanAndExit()
2523
2524 def restoreData( self, location ):
2525 """
2526 Restores ONOS data and logs from a given location. Returns main.FALSE
2527 if there is an error executing the command, and main.TRUE otherwise.
2528 required arguments:
2529 loaction - The file path of a backup file
2530 """
2531 try:
2532 cmd = "/opt/onos/bin/onos-restore " + str( location )
2533 self.handle.sendline( cmd )
2534 self.handle.expect( self.prompt )
2535 handle = self.handle.before
2536 main.log.debug( handle )
2537 assert handle is not None, "Error in sendline"
2538 assert "Command not found:" not in handle, handle
2539 assert "Error" not in handle, handle
2540 assert "Exception:" not in handle, handle
2541 return main.TRUE
2542 except AssertionError:
2543 main.log.exception( "{} Error in onos-restore output:".format( self.name ) )
2544 return main.FALSE
2545 except TypeError:
2546 main.log.exception( self.name + ": Object not as expected" )
2547 return main.FALSE
2548 except pexpect.EOF:
2549 main.log.error( self.name + ": EOF exception found" )
2550 main.log.error( self.name + ": " + self.handle.before )
2551 main.cleanAndExit()
2552 except Exception:
2553 main.log.exception( self.name + ": Uncaught exception!" )
2554 main.cleanAndExit()
You Wang5df1c6d2018-04-06 18:02:02 -07002555
2556 def onosDiagnostics( self, onosIPs, dstDir, suffix ):
2557 """
2558 Run onos-diagnostics with given ONOS instance IPs and save output to dstDir
2559 with suffix specified E.g. onos-diags-suffix.tar.gz
2560 required argDuments:
2561 onosIPs - list of ONOS IPs for collecting diags
2562 dstDir - diags file will be saved under the directory specified
2563 suffix - diags file will be named with the suffix specified
2564 returns:
2565 main.FALSE if there's an error executing the command, and main.TRUE otherwise
2566 """
2567 try:
2568 cmd = "onos-diagnostics"
2569 assert isinstance( onosIPs, list )
2570 for ip in onosIPs:
2571 cmd += " " + str( ip )
2572 self.handle.sendline( cmd )
2573 self.handle.expect( self.prompt )
2574 handle = self.handle.before
2575 main.log.debug( handle )
2576 assert handle is not None, "Error in sendline"
2577 assert "Command not found:" not in handle, handle
2578 assert "Exception:" not in handle, handle
2579 # Rename and move diags file to dstDir from /tmp
2580 if dstDir[ -1: ] != "/":
2581 dstDir += "/"
2582 self.handle.sendline( "mv /tmp/onos-diags.tar.gz " + str( dstDir ) + "onos-diags" + str( suffix ) + ".tar.gz" )
2583 self.handle.expect( self.prompt )
2584 handle = self.handle.before
2585 main.log.debug( handle )
2586 assert handle is not None, "Error in sendline"
2587 assert "No such file or directory" not in handle, handle
2588 return main.TRUE
2589 except AssertionError:
2590 main.log.exception( "{} Error in onos-diagnostics output:".format( self.name ) )
2591 return main.FALSE
2592 except TypeError:
2593 main.log.exception( self.name + ": Object not as expected" )
2594 return main.FALSE
2595 except pexpect.EOF:
2596 main.log.error( self.name + ": EOF exception found" )
2597 main.log.error( self.name + ": " + self.handle.before )
2598 main.cleanAndExit()
2599 except Exception:
2600 main.log.exception( self.name + ": Uncaught exception!" )
2601 main.cleanAndExit()