blob: 96ba015df12023b0b30dfc66aa9223ed96bccd8d [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 """
Jon Halle1a3b752015-07-22 13:02:46 -070068 import imp
Jon Hallf3d16e72015-12-16 17:45:08 -080069 import time
Jon Halla440e872016-03-31 15:15:50 -070070 import json
Jon Hall5cf14d52015-07-16 12:15:19 -070071 main.log.info( "ONOS HA test: Restart all ONOS nodes - " +
72 "initialization" )
Jon Hall5cf14d52015-07-16 12:15:19 -070073 # These are for csv plotting in jenkins
Devin Lim58046fa2017-07-05 16:55:00 -070074 main.HAlabels = []
75 main.HAdata = []
76 try:
77 from tests.dependencies.ONOSSetup import ONOSSetup
78 main.testSetUp = ONOSSetup()
79 except ImportError:
80 main.log.error( "ONOSSetup not found exiting the test" )
Devin Lim44075962017-08-11 10:56:37 -070081 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070082 main.testSetUp.envSetupDescription()
Jon Halle1a3b752015-07-22 13:02:46 -070083 try:
Jon Hall53c5e662016-04-13 16:06:56 -070084 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070085 main.HA = HA()
Devin Lim58046fa2017-07-05 16:55:00 -070086 # load some variables from the params file
87 cellName = main.params[ 'ENV' ][ 'cellName' ]
88 main.apps = main.params[ 'ENV' ][ 'appString' ]
Devin Lim142b5342017-07-20 15:22:39 -070089 stepResult = main.testSetUp.envSetup()
Jon Halle1a3b752015-07-22 13:02:46 -070090 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070091 main.testSetUp.envSetupException( e )
92 main.testSetUp.evnSetupConclusion( stepResult )
Jon Halle1a3b752015-07-22 13:02:46 -070093
Devin Lim142b5342017-07-20 15:22:39 -070094 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070095 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070096
Devin Lim58046fa2017-07-05 16:55:00 -070097 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -070098
Jon Hall5cf14d52015-07-16 12:15:19 -070099 def CASE2( self, main ):
100 """
101 Assign devices to controllers
102 """
Devin Lim58046fa2017-07-05 16:55:00 -0700103 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700104
105 def CASE21( self, main ):
106 """
107 Assign mastership to controllers
108 """
Devin Lim58046fa2017-07-05 16:55:00 -0700109 main.HA.assignMastership( main )
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700110
Jon Hall5cf14d52015-07-16 12:15:19 -0700111 def CASE3( self, main ):
112 """
113 Assign intents
114 """
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700115 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700116
117 def CASE4( self, main ):
118 """
119 Ping across added host intents
120 """
Jon Hallca319892017-06-15 15:25:22 -0700121 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700122
123 def CASE5( self, main ):
124 """
125 Reading state of ONOS
126 """
Devin Lim58046fa2017-07-05 16:55:00 -0700127 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700128
129 def CASE6( self, main ):
130 """
131 The Failure case.
132 """
133 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700134 assert main, "main not defined"
135 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700136 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700137 main.HAlabels
138 except ( NameError, AttributeError ):
139 main.log.error( "main.HAlabels not defined, setting to []" )
140 main.HAlabels = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700141 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700142 main.HAdata
143 except ( NameError, AttributeError ):
144 main.log.error( "main.HAdata not defined, setting to []" )
145 main.HAdata = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700146 # Reset non-persistent variables
147 try:
148 iCounterValue = 0
149 except NameError:
150 main.log.error( "iCounterValue not defined, setting to 0" )
151 iCounterValue = 0
152
153 main.case( "Restart entire ONOS cluster" )
154
Jon Hall5ec6b1b2015-09-17 18:20:14 -0700155 main.step( "Checking ONOS Logs for errors" )
Devin Lim142b5342017-07-20 15:22:39 -0700156 for ctrl in main.Cluster.active():
157 main.log.debug( "Checking logs for errors on " + ctrl.name + ":" )
158 main.log.warn( main.ONOSbench.checkLogs( ctrl.ipAddress ) )
Devin Lim6301b742017-08-07 11:00:21 -0700159 killTime = time.time()
Devin Lim142b5342017-07-20 15:22:39 -0700160 main.testSetUp.killingAllOnos( main.Cluster, True, False )
Jon Hall5cf14d52015-07-16 12:15:19 -0700161
Devin Lim142b5342017-07-20 15:22:39 -0700162 main.testSetUp.checkOnosService( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700163
Devin Lim142b5342017-07-20 15:22:39 -0700164 main.testSetUp.startOnosClis( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700165
Devin Lim142b5342017-07-20 15:22:39 -0700166 ready = utilities.retry( main.Cluster.command,
167 False,
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700168 kwargs={ "function": "summary", "contentCheck": True },
Devin Lim142b5342017-07-20 15:22:39 -0700169 sleep=30,
170 attempts=10 )
Jon Hall6e709752016-02-01 13:38:46 -0800171 utilities.assert_equals( expect=True, actual=ready,
172 onpass="ONOS summary command succeded",
173 onfail="ONOS summary command failed" )
174 if not ready:
Devin Lim44075962017-08-11 10:56:37 -0700175 main.cleanAndExit()
Jon Hall6e709752016-02-01 13:38:46 -0800176
Jon Hall5cf14d52015-07-16 12:15:19 -0700177 # Grab the time of restart so we chan check how long the gossip
178 # protocol has had time to work
179 main.restartTime = time.time() - killTime
180 main.log.debug( "Restart time: " + str( main.restartTime ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700181 main.HAlabels.append( "Restart" )
182 main.HAdata.append( str( main.restartTime ) )
Jon Hall5cf14d52015-07-16 12:15:19 -0700183
Jon Hall5cf14d52015-07-16 12:15:19 -0700184 # Rerun for election on restarted nodes
Devin Lim142b5342017-07-20 15:22:39 -0700185 runResults = main.Cluster.command( "electionTestRun", returnBool=True )
186 utilities.assert_equals( expect=True, actual=runResults,
Jon Hall5cf14d52015-07-16 12:15:19 -0700187 onpass="Reran for election",
188 onfail="Failed to rerun for election" )
189
190 # TODO: Make this configurable
191 time.sleep( 60 )
Devin Lim142b5342017-07-20 15:22:39 -0700192
193 main.HA.commonChecks()
Jon Hall5cf14d52015-07-16 12:15:19 -0700194
195 def CASE7( self, main ):
196 """
197 Check state after ONOS failure
198 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700199 # NOTE: Store has no durability, so intents are lost across system
200 # restarts
Devin Lim142b5342017-07-20 15:22:39 -0700201 main.HA.checkStateAfterEvent( main, afterWhich=0, isRestart=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700202
Jon Hall5cf14d52015-07-16 12:15:19 -0700203 main.step( "Leadership Election is still functional" )
204 # Test of LeadershipElection
205 leaderList = []
206 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700207
Devin Lim142b5342017-07-20 15:22:39 -0700208 for ctrl in main.Cluster.active():
209 ctrl.CLI.electionTestLeader()
210 leaderN = ctrl.CLI.electionTestLeader()
Jon Hall5cf14d52015-07-16 12:15:19 -0700211 leaderList.append( leaderN )
212 if leaderN == main.FALSE:
213 # error in response
214 main.log.error( "Something is wrong with " +
215 "electionTestLeader function, check the" +
216 " error logs" )
217 leaderResult = main.FALSE
218 elif leaderN is None:
219 main.log.error( cli.name +
220 " shows no leader for the election-app." )
221 leaderResult = main.FALSE
222 if len( set( leaderList ) ) != 1:
223 leaderResult = main.FALSE
224 main.log.error(
225 "Inconsistent view of leader for the election test app" )
226 # TODO: print the list
227 utilities.assert_equals(
228 expect=main.TRUE,
229 actual=leaderResult,
230 onpass="Leadership election passed",
231 onfail="Something went wrong with Leadership election" )
232
233 def CASE8( self, main ):
234 """
235 Compare topo
236 """
Devin Lim58046fa2017-07-05 16:55:00 -0700237 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700238
Jon Hall5cf14d52015-07-16 12:15:19 -0700239 def CASE9( self, main ):
240 """
241 Link s3-s28 down
242 """
Devin Lim58046fa2017-07-05 16:55:00 -0700243 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700244
245 def CASE10( self, main ):
246 """
247 Link s3-s28 up
248 """
Devin Lim58046fa2017-07-05 16:55:00 -0700249 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700250
251 def CASE11( self, main ):
252 """
253 Switch Down
254 """
255 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700256 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700257
258 def CASE12( self, main ):
259 """
260 Switch Up
261 """
262 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700263 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700264
265 def CASE13( self, main ):
266 """
267 Clean up
268 """
Devin Lim58046fa2017-07-05 16:55:00 -0700269 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700270
271 def CASE14( self, main ):
272 """
273 start election app on all onos nodes
274 """
Devin Lim58046fa2017-07-05 16:55:00 -0700275 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700276
277 def CASE15( self, main ):
278 """
279 Check that Leadership Election is still functional
acsmars9475b1c2015-08-28 18:02:08 -0700280 15.1 Run election on each node
281 15.2 Check that each node has the same leaders and candidates
282 15.3 Find current leader and withdraw
283 15.4 Check that a new node was elected leader
284 15.5 Check that that new leader was the candidate of old leader
285 15.6 Run for election on old leader
286 15.7 Check that oldLeader is a candidate, and leader if only 1 node
287 15.8 Make sure that the old leader was added to the candidate list
288
289 old and new variable prefixes refer to data from before vs after
290 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700291 """
Devin Lim58046fa2017-07-05 16:55:00 -0700292 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700293
294 def CASE16( self, main ):
295 """
296 Install Distributed Primitives app
297 """
Devin Lim58046fa2017-07-05 16:55:00 -0700298 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700299
300 def CASE17( self, main ):
301 """
302 Check for basic functionality with distributed primitives
303 """
Devin Lim58046fa2017-07-05 16:55:00 -0700304 main.HA.checkDistPrimitivesFunc( main )