blob: 3521c2e77e914eb12de155a86a9b5a5876531011 [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 )
Jon Hallaa1d9b82020-07-30 13:49:42 -070088 main.testSetUp.envSetupConclusion( stepResult )
Jon Halle1a3b752015-07-22 13:02:46 -070089
Jon Hall5a5c8432018-11-28 11:39:57 -080090 applyFuncs = [ main.HA.removeKarafConsoleLogging ]
91
Jon Hallab611372018-02-21 15:26:05 -080092 try:
93 if main.params[ 'topology' ][ 'topoFile' ]:
94 main.log.info( 'Skipping start of Mininet in this case, make sure you start it elsewhere' )
Jon Hallab611372018-02-21 15:26:05 -080095 else:
Jon Hall5a5c8432018-11-28 11:39:57 -080096 applyFuncs.append( main.HA.startingMininet )
Jon Hallab611372018-02-21 15:26:05 -080097 except (KeyError, IndexError):
Jon Hall5a5c8432018-11-28 11:39:57 -080098 applyFuncs.append( main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070099
Jon Hall3e6edb32018-08-21 16:20:30 -0700100 main.testSetUp.ONOSSetUp( main.Cluster, cellName=cellName,
Jon Halld81e0162018-08-13 12:06:13 -0700101 extraApply=applyFuncs, stopAtomix=True,
Jon Hallab611372018-02-21 15:26:05 -0800102 includeCaseDesc=False )
Devin Lim58046fa2017-07-05 16:55:00 -0700103 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -0700104
Jon Hallab611372018-02-21 15:26:05 -0800105 main.step( 'Set logging levels' )
106 logging = True
107 try:
108 logs = main.params.get( 'ONOS_Logging', False )
109 if logs:
110 for namespace, level in logs.items():
111 for ctrl in main.Cluster.active():
112 ctrl.CLI.logSet( level, namespace )
113 except AttributeError:
114 logging = False
115 utilities.assert_equals( expect=True, actual=logging,
116 onpass="Set log levels",
117 onfail="Failed to set log levels" )
118
Jon Hall5cf14d52015-07-16 12:15:19 -0700119 def CASE2( self, main ):
120 """
121 Assign devices to controllers
122 """
Devin Lim58046fa2017-07-05 16:55:00 -0700123 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700124
Jon Hallab611372018-02-21 15:26:05 -0800125 def CASE102( self, main ):
126 """
127 Set up Spine-Leaf fabric topology in Mininet
128 """
129 main.HA.startTopology( main )
130
Jon Hall5cf14d52015-07-16 12:15:19 -0700131 def CASE21( self, main ):
132 """
133 Assign mastership to controllers
134 """
Devin Lim58046fa2017-07-05 16:55:00 -0700135 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700136
137 def CASE3( self, main ):
138 """
139 Assign intents
140 """
Devin Lim58046fa2017-07-05 16:55:00 -0700141 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700142
143 def CASE4( self, main ):
144 """
145 Ping across added host intents
146 """
Jon Hallca319892017-06-15 15:25:22 -0700147 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700148
Jon Hallab611372018-02-21 15:26:05 -0800149 def CASE104( self, main ):
150 """
151 Ping Hosts
152 """
153 main.case( "Check connectivity" )
154 main.step( "Ping between all hosts" )
155 pingResult = main.Mininet1.pingall()
156 utilities.assert_equals( expect=main.TRUE, actual=pingResult,
157 onpass="All Pings Passed",
158 onfail="Failed to ping between all hosts" )
159 main.step( "Ping between all hosts" )
160 pingResult = main.Mininet1.pingall()
161 utilities.assert_equals( expect=main.TRUE, actual=pingResult,
162 onpass="All Pings Passed",
163 onfail="Failed to ping between all hosts" )
164
Jon Hall5cf14d52015-07-16 12:15:19 -0700165 def CASE5( self, main ):
166 """
167 Reading state of ONOS
168 """
Devin Lim58046fa2017-07-05 16:55:00 -0700169 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700170
171 def CASE6( self, main ):
172 """
173 The Failure case. Since this is the Sanity test, we do nothing.
174 """
175 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700176 assert main, "main not defined"
177 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700178 main.case( "Wait 60 seconds instead of inducing a failure" )
179 time.sleep( 60 )
180 utilities.assert_equals(
181 expect=main.TRUE,
182 actual=main.TRUE,
183 onpass="Sleeping 60 seconds",
184 onfail="Something is terribly wrong with my math" )
185
186 def CASE7( self, main ):
187 """
188 Check state after ONOS failure
189 """
Devin Lim142b5342017-07-20 15:22:39 -0700190 main.HA.checkStateAfterEvent( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700191
Jon Hall5cf14d52015-07-16 12:15:19 -0700192 main.step( "Leadership Election is still functional" )
193 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700194 leaderList = []
195
Jon Hall5cf14d52015-07-16 12:15:19 -0700196 # NOTE: this only works for the sanity test. In case of failures,
197 # leader will likely change
Jon Hallca319892017-06-15 15:25:22 -0700198 leader = main.Cluster.testLeader
Jon Hall5cf14d52015-07-16 12:15:19 -0700199 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700200
Jon Hallca319892017-06-15 15:25:22 -0700201 for ctrl in main.Cluster.active():
202 leaderN = ctrl.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700203 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700204 # verify leader is ONOS1
205 if leaderN == leader:
206 # all is well
207 # NOTE: In failure scenario, this could be a new node, maybe
208 # check != ONOS1
209 pass
210 elif leaderN == main.FALSE:
211 # error in response
212 main.log.error( "Something is wrong with " +
213 "electionTestLeader function, check the" +
214 " error logs" )
215 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700216 elif leaderN is None:
Jon Halla478b852017-12-04 15:00:15 -0800217 main.log.error( ctrl.name +
Jon Halla440e872016-03-31 15:15:50 -0700218 " shows no leader for the election-app was" +
219 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700220 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700221 if len( set( leaderList ) ) != 1:
222 leaderResult = main.FALSE
223 main.log.error(
224 "Inconsistent view of leader for the election test app" )
Jon Hallca319892017-06-15 15:25:22 -0700225 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700226 utilities.assert_equals(
227 expect=main.TRUE,
228 actual=leaderResult,
229 onpass="Leadership election passed",
230 onfail="Something went wrong with Leadership election" )
231
232 def CASE8( self, main ):
233 """
234 Compare topo
235 """
Devin Lim58046fa2017-07-05 16:55:00 -0700236 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700237
Jon Hall5cf14d52015-07-16 12:15:19 -0700238 def CASE9( self, main ):
239 """
Jon Hallab611372018-02-21 15:26:05 -0800240 Link down
Jon Hall5cf14d52015-07-16 12:15:19 -0700241 """
Jon Hallab611372018-02-21 15:26:05 -0800242 src = main.params['kill']['linkSrc']
243 dst = main.params['kill']['linkDst']
244 main.HA.linkDown( main, src, dst )
Jon Hall5cf14d52015-07-16 12:15:19 -0700245
246 def CASE10( self, main ):
247 """
Jon Hallab611372018-02-21 15:26:05 -0800248 Link up
Jon Hall5cf14d52015-07-16 12:15:19 -0700249 """
Jon Hallab611372018-02-21 15:26:05 -0800250 src = main.params['kill']['linkSrc']
251 dst = main.params['kill']['linkDst']
252 main.HA.linkUp( main, src, dst )
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 """
Jon Hallab611372018-02-21 15:26:05 -0800276 Start election app on all onos nodes
Jon Hall5cf14d52015-07-16 12:15:19 -0700277 """
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
acsmars71adceb2015-08-31 15:09:26 -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 )