blob: b6d00c0f571c7b195e1a8e05eef0690fbe72d77d [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 the HA test setup is
23 working correctly. There are no failures so this test should
24 have a 100% pass rate
25
26List of test cases:
27CASE1: Compile ONOS and push it to the test machines
28CASE2: Assign devices to controllers
29CASE21: Assign mastership to controllers
30CASE3: Assign intents
31CASE4: Ping across added host intents
32CASE5: Reading state of ONOS
33CASE6: The Failure case. Since this is the Sanity test, we do nothing.
34CASE7: Check state after control plane failure
35CASE8: Compare topo
36CASE9: Link s3-s28 down
37CASE10: Link s3-s28 up
38CASE11: Switch down
39CASE12: Switch up
40CASE13: Clean up
41CASE14: start election app on all onos nodes
42CASE15: Check that Leadership Election is still functional
43CASE16: Install Distributed Primitives app
44CASE17: Check for basic functionality with distributed primitives
45"""
Jon Hall5cf14d52015-07-16 12:15:19 -070046class HAsanity:
47
48 def __init__( self ):
49 self.default = ''
50
51 def CASE1( self, main ):
52 """
53 CASE1 is to compile ONOS and push it to the test machines
54
55 Startup sequence:
56 cell <name>
57 onos-verify-cell
58 NOTE: temporary - onos-remove-raft-logs
59 onos-uninstall
60 start mininet
61 git pull
62 mvn clean install
63 onos-package
64 onos-install -f
65 onos-wait-for-start
66 start cli sessions
67 start tcpdump
68 """
69 main.log.info( "ONOS HA Sanity test - initialization" )
Jon Halla440e872016-03-31 15:15:50 -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 Hallca319892017-06-15 15:25:22 -070077 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 cellName = main.params[ 'ENV' ][ 'cellName' ]
84 main.apps = main.params[ 'ENV' ][ 'appString' ]
Jon Hallab611372018-02-21 15:26:05 -080085 stepResult = main.testSetUp.envSetup( includeCaseDesc=False )
Jon Halle1a3b752015-07-22 13:02:46 -070086 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070087 main.testSetUp.envSetupException( e )
88 main.testSetUp.evnSetupConclusion( stepResult )
Jon Halle1a3b752015-07-22 13:02:46 -070089
Jon Hallab611372018-02-21 15:26:05 -080090 try:
91 if main.params[ 'topology' ][ 'topoFile' ]:
92 main.log.info( 'Skipping start of Mininet in this case, make sure you start it elsewhere' )
93 applyFuncs = None
94 else:
95 applyFuncs = main.HA.startingMininet
96 except (KeyError, IndexError):
97 applyFuncs = main.HA.startingMininet
Jon Hall5cf14d52015-07-16 12:15:19 -070098
Jon Hall3e6edb32018-08-21 16:20:30 -070099 main.testSetUp.ONOSSetUp( main.Cluster, cellName=cellName,
Jon Halld81e0162018-08-13 12:06:13 -0700100 extraApply=applyFuncs, stopAtomix=True,
Jon Hallab611372018-02-21 15:26:05 -0800101 includeCaseDesc=False )
Devin Lim58046fa2017-07-05 16:55:00 -0700102 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -0700103
Jon Hallab611372018-02-21 15:26:05 -0800104 main.step( 'Set logging levels' )
105 logging = True
106 try:
107 logs = main.params.get( 'ONOS_Logging', False )
108 if logs:
109 for namespace, level in logs.items():
110 for ctrl in main.Cluster.active():
111 ctrl.CLI.logSet( level, namespace )
112 except AttributeError:
113 logging = False
114 utilities.assert_equals( expect=True, actual=logging,
115 onpass="Set log levels",
116 onfail="Failed to set log levels" )
117
Jon Hall5cf14d52015-07-16 12:15:19 -0700118 def CASE2( self, main ):
119 """
120 Assign devices to controllers
121 """
Devin Lim58046fa2017-07-05 16:55:00 -0700122 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700123
Jon Hallab611372018-02-21 15:26:05 -0800124 def CASE102( self, main ):
125 """
126 Set up Spine-Leaf fabric topology in Mininet
127 """
128 main.HA.startTopology( main )
129
Jon Hall5cf14d52015-07-16 12:15:19 -0700130 def CASE21( self, main ):
131 """
132 Assign mastership to controllers
133 """
Devin Lim58046fa2017-07-05 16:55:00 -0700134 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700135
136 def CASE3( self, main ):
137 """
138 Assign intents
139 """
Devin Lim58046fa2017-07-05 16:55:00 -0700140 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700141
142 def CASE4( self, main ):
143 """
144 Ping across added host intents
145 """
Jon Hallca319892017-06-15 15:25:22 -0700146 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700147
Jon Hallab611372018-02-21 15:26:05 -0800148 def CASE104( self, main ):
149 """
150 Ping Hosts
151 """
152 main.case( "Check connectivity" )
153 main.step( "Ping between all hosts" )
154 pingResult = main.Mininet1.pingall()
155 utilities.assert_equals( expect=main.TRUE, actual=pingResult,
156 onpass="All Pings Passed",
157 onfail="Failed to ping between all hosts" )
158 main.step( "Ping between all hosts" )
159 pingResult = main.Mininet1.pingall()
160 utilities.assert_equals( expect=main.TRUE, actual=pingResult,
161 onpass="All Pings Passed",
162 onfail="Failed to ping between all hosts" )
163
Jon Hall5cf14d52015-07-16 12:15:19 -0700164 def CASE5( self, main ):
165 """
166 Reading state of ONOS
167 """
Devin Lim58046fa2017-07-05 16:55:00 -0700168 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700169
170 def CASE6( self, main ):
171 """
172 The Failure case. Since this is the Sanity test, we do nothing.
173 """
174 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700175 assert main, "main not defined"
176 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700177 main.case( "Wait 60 seconds instead of inducing a failure" )
178 time.sleep( 60 )
179 utilities.assert_equals(
180 expect=main.TRUE,
181 actual=main.TRUE,
182 onpass="Sleeping 60 seconds",
183 onfail="Something is terribly wrong with my math" )
184
185 def CASE7( self, main ):
186 """
187 Check state after ONOS failure
188 """
Devin Lim142b5342017-07-20 15:22:39 -0700189 main.HA.checkStateAfterEvent( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700190
Jon Hall5cf14d52015-07-16 12:15:19 -0700191 main.step( "Leadership Election is still functional" )
192 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700193 leaderList = []
194
Jon Hall5cf14d52015-07-16 12:15:19 -0700195 # NOTE: this only works for the sanity test. In case of failures,
196 # leader will likely change
Jon Hallca319892017-06-15 15:25:22 -0700197 leader = main.Cluster.testLeader
Jon Hall5cf14d52015-07-16 12:15:19 -0700198 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700199
Jon Hallca319892017-06-15 15:25:22 -0700200 for ctrl in main.Cluster.active():
201 leaderN = ctrl.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700202 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700203 # verify leader is ONOS1
204 if leaderN == leader:
205 # all is well
206 # NOTE: In failure scenario, this could be a new node, maybe
207 # check != ONOS1
208 pass
209 elif leaderN == main.FALSE:
210 # error in response
211 main.log.error( "Something is wrong with " +
212 "electionTestLeader function, check the" +
213 " error logs" )
214 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700215 elif leaderN is None:
Jon Halla478b852017-12-04 15:00:15 -0800216 main.log.error( ctrl.name +
Jon Halla440e872016-03-31 15:15:50 -0700217 " shows no leader for the election-app was" +
218 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700219 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700220 if len( set( leaderList ) ) != 1:
221 leaderResult = main.FALSE
222 main.log.error(
223 "Inconsistent view of leader for the election test app" )
Jon Hallca319892017-06-15 15:25:22 -0700224 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700225 utilities.assert_equals(
226 expect=main.TRUE,
227 actual=leaderResult,
228 onpass="Leadership election passed",
229 onfail="Something went wrong with Leadership election" )
230
231 def CASE8( self, main ):
232 """
233 Compare topo
234 """
Devin Lim58046fa2017-07-05 16:55:00 -0700235 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700236
Jon Hall5cf14d52015-07-16 12:15:19 -0700237 def CASE9( self, main ):
238 """
Jon Hallab611372018-02-21 15:26:05 -0800239 Link down
Jon Hall5cf14d52015-07-16 12:15:19 -0700240 """
Jon Hallab611372018-02-21 15:26:05 -0800241 src = main.params['kill']['linkSrc']
242 dst = main.params['kill']['linkDst']
243 main.HA.linkDown( main, src, dst )
Jon Hall5cf14d52015-07-16 12:15:19 -0700244
245 def CASE10( self, main ):
246 """
Jon Hallab611372018-02-21 15:26:05 -0800247 Link up
Jon Hall5cf14d52015-07-16 12:15:19 -0700248 """
Jon Hallab611372018-02-21 15:26:05 -0800249 src = main.params['kill']['linkSrc']
250 dst = main.params['kill']['linkDst']
251 main.HA.linkUp( main, src, dst )
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 """
Jon Hallab611372018-02-21 15:26:05 -0800275 Start election app on all onos nodes
Jon Hall5cf14d52015-07-16 12:15:19 -0700276 """
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
acsmars71adceb2015-08-31 15:09:26 -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 )