blob: 8332a2bcc6130358c2dd0936de201b4a7545aeaa [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"""
Jon Hall5cf14d52015-07-16 12:15:19 -070023Description: This test is to determine if the HA test setup is
24 working correctly. There are no failures so this test should
25 have a 100% pass rate
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. Since this is the Sanity test, we do nothing.
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 HAsanity:
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 """
70 main.log.info( "ONOS HA Sanity test - initialization" )
Jon Halla440e872016-03-31 15:15:50 -070071 # These are for csv plotting in jenkins
Devin Lim58046fa2017-07-05 16:55:00 -070072 main.HAlabels = []
73 main.HAdata = []
74 try:
75 from tests.dependencies.ONOSSetup import ONOSSetup
76 main.testSetUp = ONOSSetup()
77 except ImportError:
Jon Hallca319892017-06-15 15:25:22 -070078 main.log.error( "ONOSSetup not found. exiting the test" )
Devin Lim58046fa2017-07-05 16:55:00 -070079 main.exit()
80 main.testSetUp.envSetupDescription()
Jon Halle1a3b752015-07-22 13:02:46 -070081 try:
Jon Hall53c5e662016-04-13 16:06:56 -070082 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070083 main.HA = HA()
Devin Lim58046fa2017-07-05 16:55:00 -070084 cellName = main.params[ 'ENV' ][ 'cellName' ]
85 main.apps = main.params[ 'ENV' ][ 'appString' ]
Devin Lim142b5342017-07-20 15:22:39 -070086 stepResult = main.testSetUp.envSetup()
Jon Halle1a3b752015-07-22 13:02:46 -070087 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070088 main.testSetUp.envSetupException( e )
89 main.testSetUp.evnSetupConclusion( stepResult )
90 main.HA.generateGraph( "HAsanity" )
Jon Halle1a3b752015-07-22 13:02:46 -070091
Jon Hallca319892017-06-15 15:25:22 -070092 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070093 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070094
Devin Lim58046fa2017-07-05 16:55:00 -070095 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -070096
Jon Hall5cf14d52015-07-16 12:15:19 -070097 def CASE2( self, main ):
98 """
99 Assign devices to controllers
100 """
Devin Lim58046fa2017-07-05 16:55:00 -0700101 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700102
103 def CASE21( self, main ):
104 """
105 Assign mastership to controllers
106 """
Devin Lim58046fa2017-07-05 16:55:00 -0700107 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700108
109 def CASE3( self, main ):
110 """
111 Assign intents
112 """
Devin Lim58046fa2017-07-05 16:55:00 -0700113 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700114
115 def CASE4( self, main ):
116 """
117 Ping across added host intents
118 """
Jon Hallca319892017-06-15 15:25:22 -0700119 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700120
121 def CASE5( self, main ):
122 """
123 Reading state of ONOS
124 """
Devin Lim58046fa2017-07-05 16:55:00 -0700125 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700126
127 def CASE6( self, main ):
128 """
129 The Failure case. Since this is the Sanity test, we do nothing.
130 """
131 import time
Jon Hall5cf14d52015-07-16 12:15:19 -0700132 assert main, "main not defined"
133 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700134 main.case( "Wait 60 seconds instead of inducing a failure" )
135 time.sleep( 60 )
136 utilities.assert_equals(
137 expect=main.TRUE,
138 actual=main.TRUE,
139 onpass="Sleeping 60 seconds",
140 onfail="Something is terribly wrong with my math" )
141
142 def CASE7( self, main ):
143 """
144 Check state after ONOS failure
145 """
Devin Lim142b5342017-07-20 15:22:39 -0700146 main.HA.checkStateAfterEvent( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700147
Jon Hall5cf14d52015-07-16 12:15:19 -0700148 main.step( "Leadership Election is still functional" )
149 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700150 leaderList = []
151
Jon Hall5cf14d52015-07-16 12:15:19 -0700152 # NOTE: this only works for the sanity test. In case of failures,
153 # leader will likely change
Jon Hallca319892017-06-15 15:25:22 -0700154 leader = main.Cluster.testLeader
Jon Hall5cf14d52015-07-16 12:15:19 -0700155 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700156
Jon Hallca319892017-06-15 15:25:22 -0700157 for ctrl in main.Cluster.active():
158 leaderN = ctrl.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700159 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700160 # verify leader is ONOS1
161 if leaderN == leader:
162 # all is well
163 # NOTE: In failure scenario, this could be a new node, maybe
164 # check != ONOS1
165 pass
166 elif leaderN == main.FALSE:
167 # error in response
168 main.log.error( "Something is wrong with " +
169 "electionTestLeader function, check the" +
170 " error logs" )
171 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700172 elif leaderN is None:
173 main.log.error( cli.name +
174 " shows no leader for the election-app was" +
175 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700176 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700177 if len( set( leaderList ) ) != 1:
178 leaderResult = main.FALSE
179 main.log.error(
180 "Inconsistent view of leader for the election test app" )
Jon Hallca319892017-06-15 15:25:22 -0700181 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700182 utilities.assert_equals(
183 expect=main.TRUE,
184 actual=leaderResult,
185 onpass="Leadership election passed",
186 onfail="Something went wrong with Leadership election" )
187
188 def CASE8( self, main ):
189 """
190 Compare topo
191 """
Devin Lim58046fa2017-07-05 16:55:00 -0700192 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700193
Jon Hall5cf14d52015-07-16 12:15:19 -0700194 def CASE9( self, main ):
195 """
196 Link s3-s28 down
197 """
Devin Lim58046fa2017-07-05 16:55:00 -0700198 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700199
200 def CASE10( self, main ):
201 """
202 Link s3-s28 up
203 """
Devin Lim58046fa2017-07-05 16:55:00 -0700204 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700205
206 def CASE11( self, main ):
207 """
208 Switch Down
209 """
210 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700211 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700212
213 def CASE12( self, main ):
214 """
215 Switch Up
216 """
217 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700218 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700219
220 def CASE13( self, main ):
221 """
222 Clean up
223 """
Devin Lim58046fa2017-07-05 16:55:00 -0700224 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700225
226 def CASE14( self, main ):
227 """
228 start election app on all onos nodes
229 """
Devin Lim58046fa2017-07-05 16:55:00 -0700230 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700231
232 def CASE15( self, main ):
233 """
234 Check that Leadership Election is still functional
acsmars71adceb2015-08-31 15:09:26 -0700235 15.1 Run election on each node
236 15.2 Check that each node has the same leaders and candidates
237 15.3 Find current leader and withdraw
238 15.4 Check that a new node was elected leader
239 15.5 Check that that new leader was the candidate of old leader
240 15.6 Run for election on old leader
241 15.7 Check that oldLeader is a candidate, and leader if only 1 node
242 15.8 Make sure that the old leader was added to the candidate list
243
244 old and new variable prefixes refer to data from before vs after
245 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700246 """
Devin Lim58046fa2017-07-05 16:55:00 -0700247 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700248
249 def CASE16( self, main ):
250 """
251 Install Distributed Primitives app
252 """
Devin Lim58046fa2017-07-05 16:55:00 -0700253 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700254
255 def CASE17( self, main ):
256 """
257 Check for basic functionality with distributed primitives
258 """
Devin Lim58046fa2017-07-05 16:55:00 -0700259 main.HA.checkDistPrimitivesFunc( main )