blob: 2712c3fe98b64b4f93005f3d231721630a054423 [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 )
93 main.HA.generateGraph( "HAclusterRestart" )
Jon Halle1a3b752015-07-22 13:02:46 -070094
Devin Lim142b5342017-07-20 15:22:39 -070095 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070096 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070097
Devin Lim58046fa2017-07-05 16:55:00 -070098 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -070099
Jon Hall5cf14d52015-07-16 12:15:19 -0700100 def CASE2( self, main ):
101 """
102 Assign devices to controllers
103 """
Devin Lim58046fa2017-07-05 16:55:00 -0700104 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700105
106 def CASE21( self, main ):
107 """
108 Assign mastership to controllers
109 """
Devin Lim58046fa2017-07-05 16:55:00 -0700110 main.HA.assignMastership( main )
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700111
Jon Hall5cf14d52015-07-16 12:15:19 -0700112 def CASE3( self, main ):
113 """
114 Assign intents
115 """
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700116 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700117
118 def CASE4( self, main ):
119 """
120 Ping across added host intents
121 """
Jon Hallca319892017-06-15 15:25:22 -0700122 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700123
124 def CASE5( self, main ):
125 """
126 Reading state of ONOS
127 """
Devin Lim58046fa2017-07-05 16:55:00 -0700128 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700129
130 def CASE6( self, main ):
131 """
132 The Failure case.
133 """
134 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700135 assert main, "main not defined"
136 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700137 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700138 main.HAlabels
139 except ( NameError, AttributeError ):
140 main.log.error( "main.HAlabels not defined, setting to []" )
141 main.HAlabels = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700142 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700143 main.HAdata
144 except ( NameError, AttributeError ):
145 main.log.error( "main.HAdata not defined, setting to []" )
146 main.HAdata = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700147 # Reset non-persistent variables
148 try:
149 iCounterValue = 0
150 except NameError:
151 main.log.error( "iCounterValue not defined, setting to 0" )
152 iCounterValue = 0
153
154 main.case( "Restart entire ONOS cluster" )
155
Jon Hall5ec6b1b2015-09-17 18:20:14 -0700156 main.step( "Checking ONOS Logs for errors" )
Devin Lim142b5342017-07-20 15:22:39 -0700157 for ctrl in main.Cluster.active():
158 main.log.debug( "Checking logs for errors on " + ctrl.name + ":" )
159 main.log.warn( main.ONOSbench.checkLogs( ctrl.ipAddress ) )
Devin Lim6301b742017-08-07 11:00:21 -0700160 killTime = time.time()
Devin Lim142b5342017-07-20 15:22:39 -0700161 main.testSetUp.killingAllOnos( main.Cluster, True, False )
Jon Hall5cf14d52015-07-16 12:15:19 -0700162
Devin Lim142b5342017-07-20 15:22:39 -0700163 main.testSetUp.checkOnosService( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700164
Devin Lim142b5342017-07-20 15:22:39 -0700165 main.testSetUp.startOnosClis( main.Cluster )
Jon Hall5cf14d52015-07-16 12:15:19 -0700166
Devin Lim142b5342017-07-20 15:22:39 -0700167 ready = utilities.retry( main.Cluster.command,
168 False,
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700169 kwargs={ "function": "summary", "contentCheck": True },
Devin Lim142b5342017-07-20 15:22:39 -0700170 sleep=30,
171 attempts=10 )
Jon Hall6e709752016-02-01 13:38:46 -0800172 utilities.assert_equals( expect=True, actual=ready,
173 onpass="ONOS summary command succeded",
174 onfail="ONOS summary command failed" )
175 if not ready:
Devin Lim44075962017-08-11 10:56:37 -0700176 main.cleanAndExit()
Jon Hall6e709752016-02-01 13:38:46 -0800177
Jon Hall5cf14d52015-07-16 12:15:19 -0700178 # Grab the time of restart so we chan check how long the gossip
179 # protocol has had time to work
180 main.restartTime = time.time() - killTime
181 main.log.debug( "Restart time: " + str( main.restartTime ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700182 main.HAlabels.append( "Restart" )
183 main.HAdata.append( str( main.restartTime ) )
Jon Hall5cf14d52015-07-16 12:15:19 -0700184
Jon Hall5cf14d52015-07-16 12:15:19 -0700185 # Rerun for election on restarted nodes
Devin Lim142b5342017-07-20 15:22:39 -0700186 runResults = main.Cluster.command( "electionTestRun", returnBool=True )
187 utilities.assert_equals( expect=True, actual=runResults,
Jon Hall5cf14d52015-07-16 12:15:19 -0700188 onpass="Reran for election",
189 onfail="Failed to rerun for election" )
190
191 # TODO: Make this configurable
192 time.sleep( 60 )
Devin Lim142b5342017-07-20 15:22:39 -0700193
194 main.HA.commonChecks()
Jon Hall5cf14d52015-07-16 12:15:19 -0700195
196 def CASE7( self, main ):
197 """
198 Check state after ONOS failure
199 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700200 # NOTE: Store has no durability, so intents are lost across system
201 # restarts
Devin Lim142b5342017-07-20 15:22:39 -0700202 main.HA.checkStateAfterEvent( main, afterWhich=0, isRestart=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700203
Jon Hall5cf14d52015-07-16 12:15:19 -0700204 main.step( "Leadership Election is still functional" )
205 # Test of LeadershipElection
206 leaderList = []
207 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700208
Devin Lim142b5342017-07-20 15:22:39 -0700209 for ctrl in main.Cluster.active():
210 ctrl.CLI.electionTestLeader()
211 leaderN = ctrl.CLI.electionTestLeader()
Jon Hall5cf14d52015-07-16 12:15:19 -0700212 leaderList.append( leaderN )
213 if leaderN == main.FALSE:
214 # error in response
215 main.log.error( "Something is wrong with " +
216 "electionTestLeader function, check the" +
217 " error logs" )
218 leaderResult = main.FALSE
219 elif leaderN is None:
220 main.log.error( cli.name +
221 " shows no leader for the election-app." )
222 leaderResult = main.FALSE
223 if len( set( leaderList ) ) != 1:
224 leaderResult = main.FALSE
225 main.log.error(
226 "Inconsistent view of leader for the election test app" )
227 # TODO: print the list
228 utilities.assert_equals(
229 expect=main.TRUE,
230 actual=leaderResult,
231 onpass="Leadership election passed",
232 onfail="Something went wrong with Leadership election" )
233
234 def CASE8( self, main ):
235 """
236 Compare topo
237 """
Devin Lim58046fa2017-07-05 16:55:00 -0700238 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700239
Jon Hall5cf14d52015-07-16 12:15:19 -0700240 def CASE9( self, main ):
241 """
242 Link s3-s28 down
243 """
Devin Lim58046fa2017-07-05 16:55:00 -0700244 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700245
246 def CASE10( self, main ):
247 """
248 Link s3-s28 up
249 """
Devin Lim58046fa2017-07-05 16:55:00 -0700250 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700251
252 def CASE11( self, main ):
253 """
254 Switch Down
255 """
256 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700257 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700258
259 def CASE12( self, main ):
260 """
261 Switch Up
262 """
263 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700264 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700265
266 def CASE13( self, main ):
267 """
268 Clean up
269 """
Devin Lim58046fa2017-07-05 16:55:00 -0700270 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700271
272 def CASE14( self, main ):
273 """
274 start election app on all onos nodes
275 """
Devin Lim58046fa2017-07-05 16:55:00 -0700276 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700277
278 def CASE15( self, main ):
279 """
280 Check that Leadership Election is still functional
acsmars9475b1c2015-08-28 18:02:08 -0700281 15.1 Run election on each node
282 15.2 Check that each node has the same leaders and candidates
283 15.3 Find current leader and withdraw
284 15.4 Check that a new node was elected leader
285 15.5 Check that that new leader was the candidate of old leader
286 15.6 Run for election on old leader
287 15.7 Check that oldLeader is a candidate, and leader if only 1 node
288 15.8 Make sure that the old leader was added to the candidate list
289
290 old and new variable prefixes refer to data from before vs after
291 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700292 """
Devin Lim58046fa2017-07-05 16:55:00 -0700293 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700294
295 def CASE16( self, main ):
296 """
297 Install Distributed Primitives app
298 """
Devin Lim58046fa2017-07-05 16:55:00 -0700299 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700300
301 def CASE17( self, main ):
302 """
303 Check for basic functionality with distributed primitives
304 """
Devin Lim58046fa2017-07-05 16:55:00 -0700305 main.HA.checkDistPrimitivesFunc( main )