blob: 4cfd694ac292042f64f8b5da30d93a347482d87f [file] [log] [blame]
Devin Lim142b5342017-07-20 15:22:39 -07001"""
2Copyright 2016 Open Networking Foundation (ONF)
Devin Lim58046fa2017-07-05 16:55:00 -07003
Devin Lim142b5342017-07-20 15:22:39 -07004Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20"""
Devin Lim58046fa2017-07-05 16:55:00 -070021import time
22import re
23import imp
24
25class ONOSSetup:
26 main = None
27 def __init__( self ):
28 self.default = ''
29 def envSetupDescription ( self ):
Devin Lim142b5342017-07-20 15:22:39 -070030 """
31 Introduction part of the test. It will initialize some basic vairables.
32 """
Devin Lim58046fa2017-07-05 16:55:00 -070033 main.case( "Constructing test variables and building ONOS package" )
34 main.step( "Constructing test variables" )
35 main.caseExplanation = "For loading from params file, and pull" + \
36 " and build the latest ONOS package"
Devin Lim142b5342017-07-20 15:22:39 -070037 try:
38 from tests.dependencies.Cluster import Cluster
39 except ImportError:
40 main.log.error( "Cluster not found. exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -070041 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -070042 try:
43 main.Cluster
44 except ( NameError, AttributeError ):
45 main.Cluster = Cluster( main.ONOScell.nodes )
46 main.ONOSbench = main.Cluster.controllers[ 0 ].Bench
Devin Lim58046fa2017-07-05 16:55:00 -070047 main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
48
49 def gitPulling( self ):
Devin Lim142b5342017-07-20 15:22:39 -070050 """
51 it will do git checkout or pull if they are enabled from the params file.
52 """
Devin Lim58046fa2017-07-05 16:55:00 -070053 main.case( "Pull onos branch and build onos on Teststation." )
54 gitPull = main.params[ 'GIT' ][ 'pull' ]
55 gitBranch = main.params[ 'GIT' ][ 'branch' ]
56 if gitPull == 'True':
57 main.step( "Git Checkout ONOS branch: " + gitBranch )
58 stepResult = main.ONOSbench.gitCheckout( branch=gitBranch )
59 utilities.assert_equals( expect=main.TRUE,
60 actual=stepResult,
61 onpass="Successfully checkout onos branch.",
62 onfail="Failed to checkout onos branch. Exiting test..." )
Devin Lim44075962017-08-11 10:56:37 -070063 if not stepResult: main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070064
65 main.step( "Git Pull on ONOS branch:" + gitBranch )
66 stepResult = main.ONOSbench.gitPull()
67 utilities.assert_equals( expect=main.TRUE,
68 actual=stepResult,
69 onpass="Successfully pull onos. ",
70 onfail="Failed to pull onos. Exiting test ..." )
Devin Lim44075962017-08-11 10:56:37 -070071 if not stepResult: main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070072
73 else:
74 main.log.info( "Skipped git checkout and pull as they are disabled in params file" )
75
Devin Lim142b5342017-07-20 15:22:39 -070076 def envSetup( self, includeGitPull=True ):
77 """
78 Description:
79 some environment setup for the test.
80 Required:
81 * includeGitPull - if wish to git pulling function to be executed.
82 Returns:
83 Returns main.TRUE
84 """
Devin Lim58046fa2017-07-05 16:55:00 -070085 if includeGitPull :
86 self.gitPulling()
Jon Hallca319892017-06-15 15:25:22 -070087
Devin Lim142b5342017-07-20 15:22:39 -070088 try:
89 from tests.dependencies.Cluster import Cluster
90 except ImportError:
91 main.log.error( "Cluster not found. exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -070092 main.cleanAndExit()
Devin Lim142b5342017-07-20 15:22:39 -070093 try:
94 main.Cluster
95 except ( NameError, AttributeError ):
96 main.Cluster = Cluster( main.ONOScell.nodes )
97
Devin Lim58046fa2017-07-05 16:55:00 -070098 main.cellData = {} # For creating cell file
Devin Lim58046fa2017-07-05 16:55:00 -070099
Jon Hallca319892017-06-15 15:25:22 -0700100 return main.TRUE
Devin Lim58046fa2017-07-05 16:55:00 -0700101
Jon Hallca319892017-06-15 15:25:22 -0700102 def envSetupException( self, e ):
Devin Lim142b5342017-07-20 15:22:39 -0700103 """
104 Description:
105 handles the exception that might occur from the environment setup.
106 Required:
107 * includeGitPull - exceeption code e.
108 """
Devin Lim58046fa2017-07-05 16:55:00 -0700109 main.log.exception( e )
Devin Lim44075962017-08-11 10:56:37 -0700110 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -0700111
Jon Hallca319892017-06-15 15:25:22 -0700112 def evnSetupConclusion( self, stepResult ):
Devin Lim142b5342017-07-20 15:22:39 -0700113 """
114 Description:
115 compare the result of the envSetup of the test.
116 Required:
117 * stepResult - Result of the envSetup.
118 """
Devin Lim58046fa2017-07-05 16:55:00 -0700119 utilities.assert_equals( expect=main.TRUE,
120 actual=stepResult,
121 onpass="Successfully construct " +
122 "test variables ",
123 onfail="Failed to construct test variables" )
124
125 main.commit = main.ONOSbench.getVersion( report=True )
126
Devin Lim142b5342017-07-20 15:22:39 -0700127 def setNumCtrls( self, hasMultiNodeRounds ):
128 """
129 Description:
130 Set new number of controls if it uses different number of nodes.
131 different number of nodes should be pre-defined in main.scale.
132 Required:
133 * hasMultiNodeRouds - if the test is testing different number of nodes.
134 """
Devin Lim58046fa2017-07-05 16:55:00 -0700135 if hasMultiNodeRounds:
136 try:
137 main.cycle
138 except Exception:
139 main.cycle = 0
140 main.cycle += 1
141 # main.scale[ 0 ] determines the current number of ONOS controller
Devin Lim142b5342017-07-20 15:22:39 -0700142 main.Cluster.setRunningNode( int( main.scale.pop( 0 ) ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700143
Devin Lim142b5342017-07-20 15:22:39 -0700144 def killingAllOnos( self, cluster, killRemoveMax, stopOnos ):
145 """
146 Description:
147 killing the onos. It will either kill the current runningnodes or
148 max number of the nodes.
149 Required:
150 * cluster - the cluster driver that will be used.
151 * killRemoveMax - The boolean that will decide either to kill
152 only running nodes (False) or max number of nodes (True).
153 * stopOnos - If wish to stop onos before killing it. True for
154 enable stop , False for disable stop.
155 Returns:
156 Returns main.TRUE if successfully killing it.
157 """
158 main.log.info( "Safety check, killing all ONOS processes" )
Devin Lim58046fa2017-07-05 16:55:00 -0700159
Devin Lim142b5342017-07-20 15:22:39 -0700160 return cluster.kill( killRemoveMax, stopOnos )
Devin Lim58046fa2017-07-05 16:55:00 -0700161
Devin Lime9f0ccf2017-08-11 17:25:12 -0700162 def createApplyCell( self, cluster, newCell, cellName,
163 Mininet, useSSH, ips, installMax=False ):
Devin Lim142b5342017-07-20 15:22:39 -0700164 """
165 Description:
166 create new cell ( optional ) and apply it. It will also verify the
167 cell.
168 Required:
169 * cluster - the cluster driver that will be used.
170 * newCell - True for making a new cell and False for not making it.
171 * cellName - The name of the cell.
172 * Mininet - a mininet driver that will be used.
173 * useSSH - True for using ssh when creating a cell
174 * ips - ip(s) of the node(s).
175 Returns:
176 Returns main.TRUE if it successfully executed.
177 """
Devin Lim58046fa2017-07-05 16:55:00 -0700178 if newCell:
Devin Lim142b5342017-07-20 15:22:39 -0700179 cluster.createCell( cellName, Mininet, useSSH, ips )
Devin Lim58046fa2017-07-05 16:55:00 -0700180 main.step( "Apply cell to environment" )
Devin Lim142b5342017-07-20 15:22:39 -0700181 stepResult = cluster.applyCell( cellName )
Devin Lim58046fa2017-07-05 16:55:00 -0700182 utilities.assert_equals( expect=main.TRUE,
183 actual=stepResult,
184 onpass="Successfully applied cell to " +
185 "environment",
Devin Lim142b5342017-07-20 15:22:39 -0700186 onfail="Failed to apply cell to environment" )
Devin Lim58046fa2017-07-05 16:55:00 -0700187 return stepResult
188
Devin Lim142b5342017-07-20 15:22:39 -0700189 def uninstallOnos( self, cluster, uninstallMax ):
190 """
191 Description:
192 uninstalling onos and verify the result.
193 Required:
194 * cluster - a cluster driver that will be used.
195 * uninstallMax - True for uninstalling max number of nodes
196 False for uninstalling the current running nodes.
197 Returns:
198 Returns main.TRUE if it successfully uninstalled.
199 """
Devin Lim58046fa2017-07-05 16:55:00 -0700200 main.step( "Uninstalling ONOS package" )
Devin Lim142b5342017-07-20 15:22:39 -0700201 onosUninstallResult = cluster.uninstall( uninstallMax )
Devin Lim58046fa2017-07-05 16:55:00 -0700202 utilities.assert_equals( expect=main.TRUE,
203 actual=onosUninstallResult,
204 onpass="Successfully uninstalled ONOS package",
205 onfail="Failed to uninstall ONOS package" )
206 return onosUninstallResult
207
Devin Lim142b5342017-07-20 15:22:39 -0700208 def buildOnos( self, cluster ):
209 """
210 Description:
211 build the onos using buck build onos and verify the result
212 Required:
213 * cluster - the cluster driver that will be used.
214 Returns:
215 Returns main.TRUE if it successfully built.
216 """
Devin Lim58046fa2017-07-05 16:55:00 -0700217 main.step( "Creating ONOS package" )
218 packageResult = main.ONOSbench.buckBuild()
219 utilities.assert_equals( expect=main.TRUE,
220 actual=packageResult,
221 onpass="Successfully created ONOS package",
222 onfail="Failed to create ONOS package" )
223 return packageResult
224
Devin Lime9f0ccf2017-08-11 17:25:12 -0700225 def installOnos( self, cluster, installMax, parallel=True ):
Devin Lim142b5342017-07-20 15:22:39 -0700226 """
227 Description:
228 Installing onos and verify the result
229 Required:
230 * cluster - the cluster driver that will be used.
231 * installMax - True for installing max number of nodes
232 False for installing current running nodes only.
233 Returns:
234 Returns main.TRUE if it successfully installed
235 """
Devin Lim58046fa2017-07-05 16:55:00 -0700236 main.step( "Installing ONOS package" )
237 onosInstallResult = main.TRUE
238
Devin Lime9f0ccf2017-08-11 17:25:12 -0700239 cluster.install( installMax, parallel )
Devin Lim58046fa2017-07-05 16:55:00 -0700240 utilities.assert_equals( expect=main.TRUE,
241 actual=onosInstallResult,
242 onpass="Successfully installed ONOS package",
243 onfail="Failed to install ONOS package" )
244 if not onosInstallResult:
Devin Lim44075962017-08-11 10:56:37 -0700245 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -0700246 return onosInstallResult
247
Devin Lim142b5342017-07-20 15:22:39 -0700248 def setupSsh( self, cluster ):
249 """
250 Description:
251 set up ssh to the onos and verify the result
252 Required:
253 * cluster - the cluster driver that will be used.
254 Returns:
255 Returns main.TRUE if it successfully setup the ssh to
256 the onos.
257 """
Devin Lim58046fa2017-07-05 16:55:00 -0700258 main.step( "Set up ONOS secure SSH" )
Devin Lim142b5342017-07-20 15:22:39 -0700259 secureSshResult = cluster.ssh()
Devin Lim58046fa2017-07-05 16:55:00 -0700260 utilities.assert_equals( expect=main.TRUE,
261 actual=secureSshResult,
262 onpass="Test step PASS",
263 onfail="Test step FAIL" )
264 return secureSshResult
265
Devin Lim142b5342017-07-20 15:22:39 -0700266 def checkOnosService( self, cluster ):
267 """
268 Description:
269 Checking if the onos service is up and verify the result
270 Required:
271 * cluster - the cluster driver that will be used.
272 Returns:
273 Returns main.TRUE if it successfully checked
274 """
275 main.step( "Checking ONOS service" )
276 stepResult = cluster.checkService()
Devin Lim58046fa2017-07-05 16:55:00 -0700277 utilities.assert_equals( expect=main.TRUE,
278 actual=stepResult,
279 onpass="ONOS service is ready on all nodes",
280 onfail="ONOS service did not start properly on all nodes" )
281 return stepResult
282
Jon Hallca319892017-06-15 15:25:22 -0700283 def startOnosClis( self, cluster ):
Devin Lim142b5342017-07-20 15:22:39 -0700284 """
285 Description:
286 starting Onos using onosCli driver and verify the result
287 Required:
288 * cluster - the cluster driver that will be used.
289 Returns:
290 Returns main.TRUE if it successfully started. It will exit
291 the test if not started properly.
292 """
Devin Lim58046fa2017-07-05 16:55:00 -0700293 main.step( "Starting ONOS CLI sessions" )
Jon Hallca319892017-06-15 15:25:22 -0700294 startCliResult = cluster.startCLIs()
Devin Lim58046fa2017-07-05 16:55:00 -0700295 if not startCliResult:
296 main.log.info( "ONOS CLI did not start up properly" )
Devin Lim44075962017-08-11 10:56:37 -0700297 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -0700298 else:
299 main.log.info( "Successful CLI startup" )
300 utilities.assert_equals( expect=main.TRUE,
301 actual=startCliResult,
302 onpass="Successfully start ONOS cli",
303 onfail="Failed to start ONOS cli" )
304 return startCliResult
305
Devin Lim142b5342017-07-20 15:22:39 -0700306 def ONOSSetUp( self, Mininet, cluster, hasMultiNodeRounds=False, startOnos=True, newCell=True,
Devin Lim58046fa2017-07-05 16:55:00 -0700307 cellName="temp", removeLog=False, extraApply=None, arg=None, extraClean=None,
308 skipPack=False, installMax=False, useSSH=True, killRemoveMax=True,
Devin Lime9f0ccf2017-08-11 17:25:12 -0700309 stopOnos=False, installParallel=True ):
Devin Lim142b5342017-07-20 15:22:39 -0700310 """
311 Description:
312 Initial ONOS setting up of the tests. It will also verify the result of each steps.
313 The procedures will be:
314 killing onos
315 creating (optional) /applying cell
316 removing raft logs (optional)
317 uninstalling onos
318 extra procedure to be applied( optional )
319 building onos
320 installing onos
321 extra cleanup to be applied ( optional )
322 setting up ssh to the onos
323 checking the onos service
324 starting onos
325 Required:
326 * Mininet - the mininet driver that will be used
327 * cluster - the cluster driver that will be used.
328 * hasMultiNodeRouds - True if the test is testing different set of nodes
329 * startOnos - True if wish to start onos.
330 * newCell - True for making a new cell and False for not making it.
331 * cellName - Name of the cell that will be used.
332 * removeLog - True if wish to remove raft logs
333 * extraApply - Function(s) that will be applied. Default to None.
334 * arg - argument of the functon(s) of the extraApply. Should be in list.
335 * extraClean - extra Clean up process. Function(s) will be passed.
336 * skipPack - True if wish to skip some packing.
337 * installMax - True if wish to install onos max number of nodes
338 False if wish to install onos of running nodes only
339 * useSSH - True for using ssh when creating a cell
340 * killRemoveMax - True for removing/killing max number of nodes. False for
341 removing/killing running nodes only.
342 * stopOnos - True if wish to stop onos before killing it.
343 Returns:
344 Returns main.TRUE if it everything successfully proceeded.
345 """
346 self.setNumCtrls( hasMultiNodeRounds )
Devin Lim58046fa2017-07-05 16:55:00 -0700347
Devin Lim142b5342017-07-20 15:22:39 -0700348 main.case( "Starting up " + str( cluster.numCtrls ) +
Devin Lim58046fa2017-07-05 16:55:00 -0700349 " node(s) ONOS cluster" )
Devin Lim142b5342017-07-20 15:22:39 -0700350 main.caseExplanation = "Set up ONOS with " + str( cluster.numCtrls ) + \
Devin Lim58046fa2017-07-05 16:55:00 -0700351 " node(s) ONOS cluster"
Devin Lim142b5342017-07-20 15:22:39 -0700352 killResult = self.killingAllOnos( cluster, killRemoveMax, stopOnos )
Devin Lim58046fa2017-07-05 16:55:00 -0700353
Devin Lim142b5342017-07-20 15:22:39 -0700354 main.log.info( "NODE COUNT = " + str( cluster.numCtrls ) )
355 cellResult = main.TRUE
356 packageResult = main.TRUE
357 onosUninstallResult = main.TRUE
358 onosCliResult = main.TRUE
Devin Lim58046fa2017-07-05 16:55:00 -0700359 if not skipPack:
Devin Lim142b5342017-07-20 15:22:39 -0700360 tempOnosIp = []
361 for ctrl in cluster.runningNodes:
362 tempOnosIp.append( ctrl.ipAddress )
363 cellResult = self.createApplyCell( cluster, newCell,
364 cellName, Mininet,
Devin Lime9f0ccf2017-08-11 17:25:12 -0700365 useSSH, tempOnosIp,
366 installMax )
Devin Lim58046fa2017-07-05 16:55:00 -0700367 if removeLog:
368 main.log.info("Removing raft logs")
369 main.ONOSbench.onosRemoveRaftLogs()
370
Devin Lim142b5342017-07-20 15:22:39 -0700371 onosUninstallResult = self.uninstallOnos( cluster, killRemoveMax )
Devin Lim58046fa2017-07-05 16:55:00 -0700372
373 if extraApply is not None:
Devin Lim142b5342017-07-20 15:22:39 -0700374 if isinstance( extraApply, list ):
375 i = 0
376 for apply in extraApply:
377 apply( *(arg[ i ]) ) if arg is not None \
378 and arg[ i ] is not None else apply()
379 i += 1
380 else:
381 extraApply( *arg ) if arg is not None else extraApply()
Devin Lim58046fa2017-07-05 16:55:00 -0700382
Devin Lim58046fa2017-07-05 16:55:00 -0700383
Devin Lim142b5342017-07-20 15:22:39 -0700384 packageResult = self.buildOnos( cluster )
385
Devin Lime9f0ccf2017-08-11 17:25:12 -0700386 onosInstallResult = self.installOnos( cluster, installMax, installParallel )
Devin Lim58046fa2017-07-05 16:55:00 -0700387
388 if extraClean is not None:
389 extraClean()
Devin Lim142b5342017-07-20 15:22:39 -0700390 secureSshResult = self.setupSsh( cluster )
Devin Lim58046fa2017-07-05 16:55:00 -0700391
Devin Lim142b5342017-07-20 15:22:39 -0700392 onosServiceResult = self.checkOnosService( cluster )
Devin Lim58046fa2017-07-05 16:55:00 -0700393
Devin Lim142b5342017-07-20 15:22:39 -0700394 if startOnos:
Jon Hallca319892017-06-15 15:25:22 -0700395 onosCliResult = self.startOnosClis( cluster )
Devin Lim58046fa2017-07-05 16:55:00 -0700396
Devin Lim142b5342017-07-20 15:22:39 -0700397 return killResult and cellResult and packageResult and onosUninstallResult and \
Devin Lime9f0ccf2017-08-11 17:25:12 -0700398 onosInstallResult and secureSshResult and onosServiceResult and onosCliResult