blob: 9be3fc0fdfdb3ce6c4e1e5c2fedd5d6175fd6078 [file] [log] [blame]
Jon Hall5cf14d52015-07-16 12:15:19 -07001"""
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -07002Copyright 2015 Open Networking Foundation ( ONF )
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07003
4Please 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
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070011 ( at your option ) any later version.
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -070012
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"""
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -070021"""
Jon Hall5cf14d52015-07-16 12:15:19 -070022Description: This test is to determine if ONOS can handle
23 all of it's nodes restarting
24
25List of test cases:
26CASE1: Compile ONOS and push it to the test machines
27CASE2: Assign devices to controllers
28CASE21: Assign mastership to controllers
29CASE3: Assign intents
30CASE4: Ping across added host intents
31CASE5: Reading state of ONOS
32CASE6: The Failure case.
33CASE7: Check state after control plane failure
34CASE8: Compare topo
35CASE9: Link s3-s28 down
36CASE10: Link s3-s28 up
37CASE11: Switch down
38CASE12: Switch up
39CASE13: Clean up
40CASE14: start election app on all onos nodes
41CASE15: Check that Leadership Election is still functional
42CASE16: Install Distributed Primitives app
43CASE17: Check for basic functionality with distributed primitives
44"""
Jon Hall5cf14d52015-07-16 12:15:19 -070045class HAclusterRestart:
46
47 def __init__( self ):
48 self.default = ''
49
50 def CASE1( self, main ):
51 """
52 CASE1 is to compile ONOS and push it to the test machines
53
54 Startup sequence:
55 cell <name>
56 onos-verify-cell
57 NOTE: temporary - onos-remove-raft-logs
58 onos-uninstall
59 start mininet
60 git pull
61 mvn clean install
62 onos-package
63 onos-install -f
64 onos-wait-for-start
65 start cli sessions
66 start tcpdump
67 """
68 main.log.info( "ONOS HA test: Restart all ONOS nodes - " +
69 "initialization" )
Jon Hall5cf14d52015-07-16 12:15:19 -070070 # These are for csv plotting in jenkins
Devin Lim58046fa2017-07-05 16:55:00 -070071 main.HAlabels = []
72 main.HAdata = []
73 try:
74 from tests.dependencies.ONOSSetup import ONOSSetup
75 main.testSetUp = ONOSSetup()
76 except ImportError:
Jon Hallab611372018-02-21 15:26:05 -080077 main.log.error( "ONOSSetup not found. exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -070078 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070079 main.testSetUp.envSetupDescription()
Jon Halle1a3b752015-07-22 13:02:46 -070080 try:
Jon Hall53c5e662016-04-13 16:06:56 -070081 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070082 main.HA = HA()
Devin Lim58046fa2017-07-05 16:55:00 -070083 # load some variables from the params file
84 cellName = main.params[ 'ENV' ][ 'cellName' ]
85 main.apps = main.params[ 'ENV' ][ 'appString' ]
Jon Hallab611372018-02-21 15:26:05 -080086 stepResult = main.testSetUp.envSetup( includeCaseDesc=False )
Jon Halle1a3b752015-07-22 13:02:46 -070087 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070088 main.testSetUp.envSetupException( e )
Jon Hallaa1d9b82020-07-30 13:49:42 -070089 main.testSetUp.envSetupConclusion( stepResult )
Jon Halle1a3b752015-07-22 13:02:46 -070090
Jon Hall5a5c8432018-11-28 11:39:57 -080091 applyFuncs = [ main.HA.removeKarafConsoleLogging ]
92
Jon Hallab611372018-02-21 15:26:05 -080093 try:
94 if main.params[ 'topology' ][ 'topoFile' ]:
95 main.log.info( 'Skipping start of Mininet in this case, make sure you start it elsewhere' )
Jon Hallab611372018-02-21 15:26:05 -080096 else:
Jon Hall5a5c8432018-11-28 11:39:57 -080097 applyFuncs.append( main.HA.startingMininet )
Jon Hallab611372018-02-21 15:26:05 -080098 except (KeyError, IndexError):
Jon Hall5a5c8432018-11-28 11:39:57 -080099 applyFuncs.append( main.HA.startingMininet )
Jon Hallab611372018-02-21 15:26:05 -0800100
Jon Hall3e6edb32018-08-21 16:20:30 -0700101 main.testSetUp.ONOSSetUp( main.Cluster, cellName=cellName, extraApply=applyFuncs )
Jon Hall5cf14d52015-07-16 12:15:19 -0700102
Devin Lim58046fa2017-07-05 16:55:00 -0700103 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -0700104
Jon Hallab611372018-02-21 15:26:05 -0800105 main.step( 'Set logging levels' )
106 logging = True
107 try:
108 logs = main.params.get( 'ONOS_Logging', False )
109 if logs:
110 for namespace, level in logs.items():
111 for ctrl in main.Cluster.active():
112 ctrl.CLI.logSet( level, namespace )
113 except AttributeError:
114 logging = False
115 utilities.assert_equals( expect=True, actual=logging,
116 onpass="Set log levels",
117 onfail="Failed to set log levels" )
118
Jon Hall5cf14d52015-07-16 12:15:19 -0700119 def CASE2( self, main ):
120 """
121 Assign devices to controllers
122 """
Devin Lim58046fa2017-07-05 16:55:00 -0700123 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700124
Jon Hallab611372018-02-21 15:26:05 -0800125 def CASE102( self, main ):
126 """
127 Set up Spine-Leaf fabric topology in Mininet
128 """
129 main.HA.startTopology( main )
130
Jon Hall5cf14d52015-07-16 12:15:19 -0700131 def CASE21( self, main ):
132 """
133 Assign mastership to controllers
134 """
Devin Lim58046fa2017-07-05 16:55:00 -0700135 main.HA.assignMastership( main )
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700136
Jon Hall5cf14d52015-07-16 12:15:19 -0700137 def CASE3( self, main ):
138 """
139 Assign intents
140 """
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700141 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700142
143 def CASE4( self, main ):
144 """
145 Ping across added host intents
146 """
Jon Hallca319892017-06-15 15:25:22 -0700147 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700148
Jon Hallab611372018-02-21 15:26:05 -0800149 def CASE104( self, main ):
150 """
151 Ping Hosts
152 """
153 main.case( "Check connectivity" )
154 main.step( "Ping between all hosts" )
155 pingResult = main.Mininet1.pingall()
156 utilities.assert_equals( expect=main.TRUE, actual=pingResult,
157 onpass="All Pings Passed",
158 onfail="Failed to ping between all hosts" )
159
Jon Hall5cf14d52015-07-16 12:15:19 -0700160 def CASE5( self, main ):
161 """
162 Reading state of ONOS
163 """
Devin Lim58046fa2017-07-05 16:55:00 -0700164 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700165
166 def CASE6( self, main ):
167 """
168 The Failure case.
169 """
170 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700171 assert main, "main not defined"
172 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700173 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700174 main.HAlabels
175 except ( NameError, AttributeError ):
176 main.log.error( "main.HAlabels not defined, setting to []" )
177 main.HAlabels = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700178 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700179 main.HAdata
180 except ( NameError, AttributeError ):
181 main.log.error( "main.HAdata not defined, setting to []" )
182 main.HAdata = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700183
184 main.case( "Restart entire ONOS cluster" )
185
Jon Hall5ec6b1b2015-09-17 18:20:14 -0700186 main.step( "Checking ONOS Logs for errors" )
Devin Lim142b5342017-07-20 15:22:39 -0700187 for ctrl in main.Cluster.active():
188 main.log.debug( "Checking logs for errors on " + ctrl.name + ":" )
189 main.log.warn( main.ONOSbench.checkLogs( ctrl.ipAddress ) )
Devin Lim6301b742017-08-07 11:00:21 -0700190 killTime = time.time()
Devin Lim142b5342017-07-20 15:22:39 -0700191 main.testSetUp.killingAllOnos( main.Cluster, True, False )
Jon Hall5cf14d52015-07-16 12:15:19 -0700192
Devin Lim142b5342017-07-20 15:22:39 -0700193 main.testSetUp.checkOnosService( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700194
Devin Lim142b5342017-07-20 15:22:39 -0700195 main.testSetUp.startOnosClis( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700196
Devin Lim142b5342017-07-20 15:22:39 -0700197 ready = utilities.retry( main.Cluster.command,
198 False,
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700199 kwargs={ "function": "summary", "contentCheck": True },
Devin Lim142b5342017-07-20 15:22:39 -0700200 sleep=30,
201 attempts=10 )
Jon Hall6e709752016-02-01 13:38:46 -0800202 utilities.assert_equals( expect=True, actual=ready,
203 onpass="ONOS summary command succeded",
204 onfail="ONOS summary command failed" )
205 if not ready:
Devin Lim44075962017-08-11 10:56:37 -0700206 main.cleanAndExit()
Jon Hall6e709752016-02-01 13:38:46 -0800207
Jon Hall5cf14d52015-07-16 12:15:19 -0700208 # Grab the time of restart so we chan check how long the gossip
209 # protocol has had time to work
210 main.restartTime = time.time() - killTime
211 main.log.debug( "Restart time: " + str( main.restartTime ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700212 main.HAlabels.append( "Restart" )
213 main.HAdata.append( str( main.restartTime ) )
Jon Hall5cf14d52015-07-16 12:15:19 -0700214
Jon Hall5cf14d52015-07-16 12:15:19 -0700215 # Rerun for election on restarted nodes
Devin Lim142b5342017-07-20 15:22:39 -0700216 runResults = main.Cluster.command( "electionTestRun", returnBool=True )
217 utilities.assert_equals( expect=True, actual=runResults,
Jon Hall5cf14d52015-07-16 12:15:19 -0700218 onpass="Reran for election",
219 onfail="Failed to rerun for election" )
220
221 # TODO: Make this configurable
222 time.sleep( 60 )
Devin Lim142b5342017-07-20 15:22:39 -0700223
224 main.HA.commonChecks()
Jon Hall5cf14d52015-07-16 12:15:19 -0700225
226 def CASE7( self, main ):
227 """
228 Check state after ONOS failure
229 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700230 # NOTE: Store has no durability, so intents are lost across system
231 # restarts
Devin Lim142b5342017-07-20 15:22:39 -0700232 main.HA.checkStateAfterEvent( main, afterWhich=0, isRestart=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700233
Jon Hall5cf14d52015-07-16 12:15:19 -0700234 main.step( "Leadership Election is still functional" )
235 # Test of LeadershipElection
236 leaderList = []
237 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700238
Devin Lim142b5342017-07-20 15:22:39 -0700239 for ctrl in main.Cluster.active():
Devin Lim142b5342017-07-20 15:22:39 -0700240 leaderN = ctrl.CLI.electionTestLeader()
Jon Hall5cf14d52015-07-16 12:15:19 -0700241 leaderList.append( leaderN )
242 if leaderN == main.FALSE:
243 # error in response
244 main.log.error( "Something is wrong with " +
245 "electionTestLeader function, check the" +
246 " error logs" )
247 leaderResult = main.FALSE
248 elif leaderN is None:
Jon Halla478b852017-12-04 15:00:15 -0800249 main.log.error( ctrl.name +
Jon Hall5cf14d52015-07-16 12:15:19 -0700250 " shows no leader for the election-app." )
251 leaderResult = main.FALSE
252 if len( set( leaderList ) ) != 1:
253 leaderResult = main.FALSE
254 main.log.error(
255 "Inconsistent view of leader for the election test app" )
Jon Hallab611372018-02-21 15:26:05 -0800256 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700257 utilities.assert_equals(
258 expect=main.TRUE,
259 actual=leaderResult,
260 onpass="Leadership election passed",
261 onfail="Something went wrong with Leadership election" )
262
263 def CASE8( self, main ):
264 """
265 Compare topo
266 """
Devin Lim58046fa2017-07-05 16:55:00 -0700267 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700268
Jon Hall5cf14d52015-07-16 12:15:19 -0700269 def CASE9( self, main ):
270 """
Jon Hallab611372018-02-21 15:26:05 -0800271 Link down
Jon Hall5cf14d52015-07-16 12:15:19 -0700272 """
Jon Hallab611372018-02-21 15:26:05 -0800273 src = main.params['kill']['linkSrc']
274 dst = main.params['kill']['linkDst']
275 main.HA.linkDown( main, src, dst )
Jon Hall5cf14d52015-07-16 12:15:19 -0700276
277 def CASE10( self, main ):
278 """
Jon Hallab611372018-02-21 15:26:05 -0800279 Link up
Jon Hall5cf14d52015-07-16 12:15:19 -0700280 """
Jon Hallab611372018-02-21 15:26:05 -0800281 src = main.params['kill']['linkSrc']
282 dst = main.params['kill']['linkDst']
283 main.HA.linkUp( main, src, dst )
Jon Hall5cf14d52015-07-16 12:15:19 -0700284
285 def CASE11( self, main ):
286 """
287 Switch Down
288 """
289 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700290 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700291
292 def CASE12( self, main ):
293 """
294 Switch Up
295 """
296 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700297 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700298
299 def CASE13( self, main ):
300 """
301 Clean up
302 """
Devin Lim58046fa2017-07-05 16:55:00 -0700303 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700304
305 def CASE14( self, main ):
306 """
Jon Hallab611372018-02-21 15:26:05 -0800307 Start election app on all onos nodes
Jon Hall5cf14d52015-07-16 12:15:19 -0700308 """
Devin Lim58046fa2017-07-05 16:55:00 -0700309 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700310
311 def CASE15( self, main ):
312 """
313 Check that Leadership Election is still functional
acsmars9475b1c2015-08-28 18:02:08 -0700314 15.1 Run election on each node
315 15.2 Check that each node has the same leaders and candidates
316 15.3 Find current leader and withdraw
317 15.4 Check that a new node was elected leader
318 15.5 Check that that new leader was the candidate of old leader
319 15.6 Run for election on old leader
320 15.7 Check that oldLeader is a candidate, and leader if only 1 node
321 15.8 Make sure that the old leader was added to the candidate list
322
323 old and new variable prefixes refer to data from before vs after
324 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700325 """
Devin Lim58046fa2017-07-05 16:55:00 -0700326 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700327
328 def CASE16( self, main ):
329 """
330 Install Distributed Primitives app
331 """
Devin Lim58046fa2017-07-05 16:55:00 -0700332 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700333
334 def CASE17( self, main ):
335 """
336 Check for basic functionality with distributed primitives
337 """
Devin Lim58046fa2017-07-05 16:55:00 -0700338 main.HA.checkDistPrimitivesFunc( main )