blob: eb7cf8a91796a7718fbaef77ba00c908324fcd7f [file] [log] [blame]
Jon Hall5cf14d52015-07-16 12:15:19 -07001"""
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07002Copyright 2015 Open Networking Foundation (ONF)
3
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
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"""
21
22"""
23
Jon Hall5cf14d52015-07-16 12:15:19 -070024Description: This test is to determine if ONOS can handle
25 all of it's nodes restarting
26
27List of test cases:
28CASE1: Compile ONOS and push it to the test machines
29CASE2: Assign devices to controllers
30CASE21: Assign mastership to controllers
31CASE3: Assign intents
32CASE4: Ping across added host intents
33CASE5: Reading state of ONOS
34CASE6: The Failure case.
35CASE7: Check state after control plane failure
36CASE8: Compare topo
37CASE9: Link s3-s28 down
38CASE10: Link s3-s28 up
39CASE11: Switch down
40CASE12: Switch up
41CASE13: Clean up
42CASE14: start election app on all onos nodes
43CASE15: Check that Leadership Election is still functional
44CASE16: Install Distributed Primitives app
45CASE17: Check for basic functionality with distributed primitives
46"""
Jon Hall5cf14d52015-07-16 12:15:19 -070047class HAclusterRestart:
48
49 def __init__( self ):
50 self.default = ''
51
52 def CASE1( self, main ):
53 """
54 CASE1 is to compile ONOS and push it to the test machines
55
56 Startup sequence:
57 cell <name>
58 onos-verify-cell
59 NOTE: temporary - onos-remove-raft-logs
60 onos-uninstall
61 start mininet
62 git pull
63 mvn clean install
64 onos-package
65 onos-install -f
66 onos-wait-for-start
67 start cli sessions
68 start tcpdump
69 """
Jon Halle1a3b752015-07-22 13:02:46 -070070 import imp
Jon Hallf3d16e72015-12-16 17:45:08 -080071 import time
Jon Halla440e872016-03-31 15:15:50 -070072 import json
Jon Hall5cf14d52015-07-16 12:15:19 -070073 main.log.info( "ONOS HA test: Restart all ONOS nodes - " +
74 "initialization" )
Jon Hall5cf14d52015-07-16 12:15:19 -070075 # These are for csv plotting in jenkins
Devin Lim58046fa2017-07-05 16:55:00 -070076 main.HAlabels = []
77 main.HAdata = []
78 try:
79 from tests.dependencies.ONOSSetup import ONOSSetup
80 main.testSetUp = ONOSSetup()
81 except ImportError:
82 main.log.error( "ONOSSetup not found exiting the test" )
83 main.exit()
84 main.testSetUp.envSetupDescription()
Jon Halle1a3b752015-07-22 13:02:46 -070085 try:
Jon Hall53c5e662016-04-13 16:06:56 -070086 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070087 main.HA = HA()
Devin Lim58046fa2017-07-05 16:55:00 -070088 # load some variables from the params file
89 cellName = main.params[ 'ENV' ][ 'cellName' ]
90 main.apps = main.params[ 'ENV' ][ 'appString' ]
Devin Lim142b5342017-07-20 15:22:39 -070091 stepResult = main.testSetUp.envSetup()
Jon Halle1a3b752015-07-22 13:02:46 -070092 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070093 main.testSetUp.envSetupException( e )
94 main.testSetUp.evnSetupConclusion( stepResult )
95 main.HA.generateGraph( "HAclusterRestart" )
Jon Halle1a3b752015-07-22 13:02:46 -070096
Devin Lim142b5342017-07-20 15:22:39 -070097 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070098 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070099
Devin Lim58046fa2017-07-05 16:55:00 -0700100 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -0700101
Jon Hall5cf14d52015-07-16 12:15:19 -0700102 def CASE2( self, main ):
103 """
104 Assign devices to controllers
105 """
Devin Lim58046fa2017-07-05 16:55:00 -0700106 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700107
108 def CASE21( self, main ):
109 """
110 Assign mastership to controllers
111 """
Devin Lim58046fa2017-07-05 16:55:00 -0700112 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700113 def CASE3( self, main ):
114 """
115 Assign intents
116 """
Devin Lim58046fa2017-07-05 16:55:00 -0700117 main.HA.assignIntents(main)
Jon Hall5cf14d52015-07-16 12:15:19 -0700118
119 def CASE4( self, main ):
120 """
121 Ping across added host intents
122 """
Jon Hallca319892017-06-15 15:25:22 -0700123 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700124
125 def CASE5( self, main ):
126 """
127 Reading state of ONOS
128 """
Devin Lim58046fa2017-07-05 16:55:00 -0700129 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700130
131 def CASE6( self, main ):
132 """
133 The Failure case.
134 """
135 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700136 assert main, "main not defined"
137 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700138 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700139 main.HAlabels
140 except ( NameError, AttributeError ):
141 main.log.error( "main.HAlabels not defined, setting to []" )
142 main.HAlabels = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700143 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700144 main.HAdata
145 except ( NameError, AttributeError ):
146 main.log.error( "main.HAdata not defined, setting to []" )
147 main.HAdata = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700148 # Reset non-persistent variables
149 try:
150 iCounterValue = 0
151 except NameError:
152 main.log.error( "iCounterValue not defined, setting to 0" )
153 iCounterValue = 0
154
155 main.case( "Restart entire ONOS cluster" )
156
Jon Hall5ec6b1b2015-09-17 18:20:14 -0700157 main.step( "Checking ONOS Logs for errors" )
Devin Lim142b5342017-07-20 15:22:39 -0700158 for ctrl in main.Cluster.active():
159 main.log.debug( "Checking logs for errors on " + ctrl.name + ":" )
160 main.log.warn( main.ONOSbench.checkLogs( ctrl.ipAddress ) )
Jon Hall5ec6b1b2015-09-17 18:20:14 -0700161
Devin Lim142b5342017-07-20 15:22:39 -0700162 main.testSetUp.killingAllOnos( main.Cluster, True, False )
Jon Hall5cf14d52015-07-16 12:15:19 -0700163
Devin Lim142b5342017-07-20 15:22:39 -0700164 main.testSetUp.checkOnosService( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700165
Devin Lim142b5342017-07-20 15:22:39 -0700166 main.testSetUp.startOnosClis( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700167
Devin Lim142b5342017-07-20 15:22:39 -0700168 ready = utilities.retry( main.Cluster.command,
169 False,
170 kwargs={ "function":"summary", "contentCheck":True },
171 sleep=30,
172 attempts=10 )
Jon Hall6e709752016-02-01 13:38:46 -0800173 utilities.assert_equals( expect=True, actual=ready,
174 onpass="ONOS summary command succeded",
175 onfail="ONOS summary command failed" )
176 if not ready:
177 main.cleanup()
178 main.exit()
179
Jon Hall5cf14d52015-07-16 12:15:19 -0700180 # Grab the time of restart so we chan check how long the gossip
181 # protocol has had time to work
182 main.restartTime = time.time() - killTime
183 main.log.debug( "Restart time: " + str( main.restartTime ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700184 main.HAlabels.append( "Restart" )
185 main.HAdata.append( str( main.restartTime ) )
Jon Hall5cf14d52015-07-16 12:15:19 -0700186
Jon Hall5cf14d52015-07-16 12:15:19 -0700187 # Rerun for election on restarted nodes
Devin Lim142b5342017-07-20 15:22:39 -0700188 runResults = main.Cluster.command( "electionTestRun", returnBool=True )
189 utilities.assert_equals( expect=True, actual=runResults,
Jon Hall5cf14d52015-07-16 12:15:19 -0700190 onpass="Reran for election",
191 onfail="Failed to rerun for election" )
192
193 # TODO: Make this configurable
194 time.sleep( 60 )
Devin Lim142b5342017-07-20 15:22:39 -0700195
196 main.HA.commonChecks()
Jon Hall5cf14d52015-07-16 12:15:19 -0700197
198 def CASE7( self, main ):
199 """
200 Check state after ONOS failure
201 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700202 # NOTE: Store has no durability, so intents are lost across system
203 # restarts
Devin Lim142b5342017-07-20 15:22:39 -0700204 main.HA.checkStateAfterEvent( main, afterWhich=0, isRestart=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700205
Jon Hall5cf14d52015-07-16 12:15:19 -0700206 main.step( "Leadership Election is still functional" )
207 # Test of LeadershipElection
208 leaderList = []
209 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700210
Devin Lim142b5342017-07-20 15:22:39 -0700211 for ctrl in main.Cluster.active():
212 ctrl.CLI.electionTestLeader()
213 leaderN = ctrl.CLI.electionTestLeader()
Jon Hall5cf14d52015-07-16 12:15:19 -0700214 leaderList.append( leaderN )
215 if leaderN == main.FALSE:
216 # error in response
217 main.log.error( "Something is wrong with " +
218 "electionTestLeader function, check the" +
219 " error logs" )
220 leaderResult = main.FALSE
221 elif leaderN is None:
222 main.log.error( cli.name +
223 " shows no leader for the election-app." )
224 leaderResult = main.FALSE
225 if len( set( leaderList ) ) != 1:
226 leaderResult = main.FALSE
227 main.log.error(
228 "Inconsistent view of leader for the election test app" )
229 # TODO: print the list
230 utilities.assert_equals(
231 expect=main.TRUE,
232 actual=leaderResult,
233 onpass="Leadership election passed",
234 onfail="Something went wrong with Leadership election" )
235
236 def CASE8( self, main ):
237 """
238 Compare topo
239 """
Devin Lim58046fa2017-07-05 16:55:00 -0700240 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700241
Jon Hall5cf14d52015-07-16 12:15:19 -0700242 def CASE9( self, main ):
243 """
244 Link s3-s28 down
245 """
Devin Lim58046fa2017-07-05 16:55:00 -0700246 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700247
248 def CASE10( self, main ):
249 """
250 Link s3-s28 up
251 """
Devin Lim58046fa2017-07-05 16:55:00 -0700252 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700253
254 def CASE11( self, main ):
255 """
256 Switch Down
257 """
258 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700259 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700260
261 def CASE12( self, main ):
262 """
263 Switch Up
264 """
265 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700266 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700267
268 def CASE13( self, main ):
269 """
270 Clean up
271 """
Devin Lim58046fa2017-07-05 16:55:00 -0700272 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700273
274 def CASE14( self, main ):
275 """
276 start election app on all onos nodes
277 """
Devin Lim58046fa2017-07-05 16:55:00 -0700278 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700279
280 def CASE15( self, main ):
281 """
282 Check that Leadership Election is still functional
acsmars9475b1c2015-08-28 18:02:08 -0700283 15.1 Run election on each node
284 15.2 Check that each node has the same leaders and candidates
285 15.3 Find current leader and withdraw
286 15.4 Check that a new node was elected leader
287 15.5 Check that that new leader was the candidate of old leader
288 15.6 Run for election on old leader
289 15.7 Check that oldLeader is a candidate, and leader if only 1 node
290 15.8 Make sure that the old leader was added to the candidate list
291
292 old and new variable prefixes refer to data from before vs after
293 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700294 """
Devin Lim58046fa2017-07-05 16:55:00 -0700295 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700296
297 def CASE16( self, main ):
298 """
299 Install Distributed Primitives app
300 """
Devin Lim58046fa2017-07-05 16:55:00 -0700301 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700302
303 def CASE17( self, main ):
304 """
305 Check for basic functionality with distributed primitives
306 """
Devin Lim58046fa2017-07-05 16:55:00 -0700307 main.HA.checkDistPrimitivesFunc( main )