blob: 08e437b61fbfc9c3d1e324be8b76342d3d10be8b [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" )
Devin Lim44075962017-08-11 10:56:37 -070083 main.cleanAndExit()
Devin Lim58046fa2017-07-05 16:55:00 -070084 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 ) )
Devin Lim6301b742017-08-07 11:00:21 -0700161 killTime = time.time()
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:
Devin Lim44075962017-08-11 10:56:37 -0700177 main.cleanAndExit()
Jon Hall6e709752016-02-01 13:38:46 -0800178
Jon Hall5cf14d52015-07-16 12:15:19 -0700179 # Grab the time of restart so we chan check how long the gossip
180 # protocol has had time to work
181 main.restartTime = time.time() - killTime
182 main.log.debug( "Restart time: " + str( main.restartTime ) )
Devin Lim58046fa2017-07-05 16:55:00 -0700183 main.HAlabels.append( "Restart" )
184 main.HAdata.append( str( main.restartTime ) )
Jon Hall5cf14d52015-07-16 12:15:19 -0700185
Jon Hall5cf14d52015-07-16 12:15:19 -0700186 # Rerun for election on restarted nodes
Devin Lim142b5342017-07-20 15:22:39 -0700187 runResults = main.Cluster.command( "electionTestRun", returnBool=True )
188 utilities.assert_equals( expect=True, actual=runResults,
Jon Hall5cf14d52015-07-16 12:15:19 -0700189 onpass="Reran for election",
190 onfail="Failed to rerun for election" )
191
192 # TODO: Make this configurable
193 time.sleep( 60 )
Devin Lim142b5342017-07-20 15:22:39 -0700194
195 main.HA.commonChecks()
Jon Hall5cf14d52015-07-16 12:15:19 -0700196
197 def CASE7( self, main ):
198 """
199 Check state after ONOS failure
200 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700201 # NOTE: Store has no durability, so intents are lost across system
202 # restarts
Devin Lim142b5342017-07-20 15:22:39 -0700203 main.HA.checkStateAfterEvent( main, afterWhich=0, isRestart=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700204
Jon Hall5cf14d52015-07-16 12:15:19 -0700205 main.step( "Leadership Election is still functional" )
206 # Test of LeadershipElection
207 leaderList = []
208 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700209
Devin Lim142b5342017-07-20 15:22:39 -0700210 for ctrl in main.Cluster.active():
211 ctrl.CLI.electionTestLeader()
212 leaderN = ctrl.CLI.electionTestLeader()
Jon Hall5cf14d52015-07-16 12:15:19 -0700213 leaderList.append( leaderN )
214 if leaderN == main.FALSE:
215 # error in response
216 main.log.error( "Something is wrong with " +
217 "electionTestLeader function, check the" +
218 " error logs" )
219 leaderResult = main.FALSE
220 elif leaderN is None:
221 main.log.error( cli.name +
222 " shows no leader for the election-app." )
223 leaderResult = main.FALSE
224 if len( set( leaderList ) ) != 1:
225 leaderResult = main.FALSE
226 main.log.error(
227 "Inconsistent view of leader for the election test app" )
228 # TODO: print the list
229 utilities.assert_equals(
230 expect=main.TRUE,
231 actual=leaderResult,
232 onpass="Leadership election passed",
233 onfail="Something went wrong with Leadership election" )
234
235 def CASE8( self, main ):
236 """
237 Compare topo
238 """
Devin Lim58046fa2017-07-05 16:55:00 -0700239 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700240
Jon Hall5cf14d52015-07-16 12:15:19 -0700241 def CASE9( self, main ):
242 """
243 Link s3-s28 down
244 """
Devin Lim58046fa2017-07-05 16:55:00 -0700245 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700246
247 def CASE10( self, main ):
248 """
249 Link s3-s28 up
250 """
Devin Lim58046fa2017-07-05 16:55:00 -0700251 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700252
253 def CASE11( self, main ):
254 """
255 Switch Down
256 """
257 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700258 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700259
260 def CASE12( self, main ):
261 """
262 Switch Up
263 """
264 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700265 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700266
267 def CASE13( self, main ):
268 """
269 Clean up
270 """
Devin Lim58046fa2017-07-05 16:55:00 -0700271 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700272
273 def CASE14( self, main ):
274 """
275 start election app on all onos nodes
276 """
Devin Lim58046fa2017-07-05 16:55:00 -0700277 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700278
279 def CASE15( self, main ):
280 """
281 Check that Leadership Election is still functional
acsmars9475b1c2015-08-28 18:02:08 -0700282 15.1 Run election on each node
283 15.2 Check that each node has the same leaders and candidates
284 15.3 Find current leader and withdraw
285 15.4 Check that a new node was elected leader
286 15.5 Check that that new leader was the candidate of old leader
287 15.6 Run for election on old leader
288 15.7 Check that oldLeader is a candidate, and leader if only 1 node
289 15.8 Make sure that the old leader was added to the candidate list
290
291 old and new variable prefixes refer to data from before vs after
292 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700293 """
Devin Lim58046fa2017-07-05 16:55:00 -0700294 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700295
296 def CASE16( self, main ):
297 """
298 Install Distributed Primitives app
299 """
Devin Lim58046fa2017-07-05 16:55:00 -0700300 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700301
302 def CASE17( self, main ):
303 """
304 Check for basic functionality with distributed primitives
305 """
Devin Lim58046fa2017-07-05 16:55:00 -0700306 main.HA.checkDistPrimitivesFunc( main )