blob: baff818eca9c2510d5ae39ed0ff4bdc92dfc5a9e [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' ]
Devin Lim142b5342017-07-20 15:22:39 -070085 stepResult = main.testSetUp.envSetup()
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 )
89 main.HA.generateGraph( "HAsanity" )
Jon Halle1a3b752015-07-22 13:02:46 -070090
Jon Hallca319892017-06-15 15:25:22 -070091 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070092 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070093
Devin Lim58046fa2017-07-05 16:55:00 -070094 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -070095
Jon Hall5cf14d52015-07-16 12:15:19 -070096 def CASE2( self, main ):
97 """
98 Assign devices to controllers
99 """
Devin Lim58046fa2017-07-05 16:55:00 -0700100 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700101
102 def CASE21( self, main ):
103 """
104 Assign mastership to controllers
105 """
Devin Lim58046fa2017-07-05 16:55:00 -0700106 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700107
108 def CASE3( self, main ):
109 """
110 Assign intents
111 """
Devin Lim58046fa2017-07-05 16:55:00 -0700112 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700113
114 def CASE4( self, main ):
115 """
116 Ping across added host intents
117 """
Jon Hallca319892017-06-15 15:25:22 -0700118 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700119
120 def CASE5( self, main ):
121 """
122 Reading state of ONOS
123 """
Devin Lim58046fa2017-07-05 16:55:00 -0700124 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700125
126 def CASE6( self, main ):
127 """
128 The Failure case. Since this is the Sanity test, we do nothing.
129 """
130 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700131 assert main, "main not defined"
132 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700133 main.case( "Wait 60 seconds instead of inducing a failure" )
134 time.sleep( 60 )
135 utilities.assert_equals(
136 expect=main.TRUE,
137 actual=main.TRUE,
138 onpass="Sleeping 60 seconds",
139 onfail="Something is terribly wrong with my math" )
140
141 def CASE7( self, main ):
142 """
143 Check state after ONOS failure
144 """
Devin Lim142b5342017-07-20 15:22:39 -0700145 main.HA.checkStateAfterEvent( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700146
Jon Hall5cf14d52015-07-16 12:15:19 -0700147 main.step( "Leadership Election is still functional" )
148 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700149 leaderList = []
150
Jon Hall5cf14d52015-07-16 12:15:19 -0700151 # NOTE: this only works for the sanity test. In case of failures,
152 # leader will likely change
Jon Hallca319892017-06-15 15:25:22 -0700153 leader = main.Cluster.testLeader
Jon Hall5cf14d52015-07-16 12:15:19 -0700154 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700155
Jon Hallca319892017-06-15 15:25:22 -0700156 for ctrl in main.Cluster.active():
157 leaderN = ctrl.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700158 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700159 # verify leader is ONOS1
160 if leaderN == leader:
161 # all is well
162 # NOTE: In failure scenario, this could be a new node, maybe
163 # check != ONOS1
164 pass
165 elif leaderN == main.FALSE:
166 # error in response
167 main.log.error( "Something is wrong with " +
168 "electionTestLeader function, check the" +
169 " error logs" )
170 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700171 elif leaderN is None:
172 main.log.error( cli.name +
173 " shows no leader for the election-app was" +
174 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700175 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700176 if len( set( leaderList ) ) != 1:
177 leaderResult = main.FALSE
178 main.log.error(
179 "Inconsistent view of leader for the election test app" )
Jon Hallca319892017-06-15 15:25:22 -0700180 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700181 utilities.assert_equals(
182 expect=main.TRUE,
183 actual=leaderResult,
184 onpass="Leadership election passed",
185 onfail="Something went wrong with Leadership election" )
186
187 def CASE8( self, main ):
188 """
189 Compare topo
190 """
Devin Lim58046fa2017-07-05 16:55:00 -0700191 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700192
Jon Hall5cf14d52015-07-16 12:15:19 -0700193 def CASE9( self, main ):
194 """
195 Link s3-s28 down
196 """
Devin Lim58046fa2017-07-05 16:55:00 -0700197 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700198
199 def CASE10( self, main ):
200 """
201 Link s3-s28 up
202 """
Devin Lim58046fa2017-07-05 16:55:00 -0700203 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700204
205 def CASE11( self, main ):
206 """
207 Switch Down
208 """
209 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700210 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700211
212 def CASE12( self, main ):
213 """
214 Switch Up
215 """
216 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700217 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700218
219 def CASE13( self, main ):
220 """
221 Clean up
222 """
Devin Lim58046fa2017-07-05 16:55:00 -0700223 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700224
225 def CASE14( self, main ):
226 """
227 start election app on all onos nodes
228 """
Devin Lim58046fa2017-07-05 16:55:00 -0700229 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700230
231 def CASE15( self, main ):
232 """
233 Check that Leadership Election is still functional
acsmars71adceb2015-08-31 15:09:26 -0700234 15.1 Run election on each node
235 15.2 Check that each node has the same leaders and candidates
236 15.3 Find current leader and withdraw
237 15.4 Check that a new node was elected leader
238 15.5 Check that that new leader was the candidate of old leader
239 15.6 Run for election on old leader
240 15.7 Check that oldLeader is a candidate, and leader if only 1 node
241 15.8 Make sure that the old leader was added to the candidate list
242
243 old and new variable prefixes refer to data from before vs after
244 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700245 """
Devin Lim58046fa2017-07-05 16:55:00 -0700246 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700247
248 def CASE16( self, main ):
249 """
250 Install Distributed Primitives app
251 """
Devin Lim58046fa2017-07-05 16:55:00 -0700252 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700253
254 def CASE17( self, main ):
255 """
256 Check for basic functionality with distributed primitives
257 """
Devin Lim58046fa2017-07-05 16:55:00 -0700258 main.HA.checkDistPrimitivesFunc( main )