blob: 981bac4b4b5c46bf60240a1cfc6bb430d9c3196d [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 """
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 Sanity test - initialization" )
Jon Halla440e872016-03-31 15:15:50 -070074 # These are for csv plotting in jenkins
Devin Lim58046fa2017-07-05 16:55:00 -070075 main.HAlabels = []
76 main.HAdata = []
77 try:
78 from tests.dependencies.ONOSSetup import ONOSSetup
79 main.testSetUp = ONOSSetup()
80 except ImportError:
81 main.log.error( "ONOSSetup not found exiting the test" )
82 main.exit()
83 main.testSetUp.envSetupDescription()
Jon Halle1a3b752015-07-22 13:02:46 -070084 try:
Jon Hall53c5e662016-04-13 16:06:56 -070085 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070086 main.HA = HA()
Devin Lim58046fa2017-07-05 16:55:00 -070087 # load some variables from the params file
88 cellName = main.params[ 'ENV' ][ 'cellName' ]
89 main.apps = main.params[ 'ENV' ][ 'appString' ]
90 main.numCtrls = int( main.params[ 'num_controllers' ] )
91 if main.ONOSbench.maxNodes and \
92 main.ONOSbench.maxNodes < main.numCtrls:
93 main.numCtrls = int( main.ONOSbench.maxNodes )
94 main.maxNodes = main.numCtrls
95 stepResult = main.testSetUp.envSetup( hasNode=True )
Jon Halle1a3b752015-07-22 13:02:46 -070096 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070097 main.testSetUp.envSetupException( e )
98 main.testSetUp.evnSetupConclusion( stepResult )
99 main.HA.generateGraph( "HAsanity" )
Jon Halle1a3b752015-07-22 13:02:46 -0700100
Devin Lim58046fa2017-07-05 16:55:00 -0700101 main.testSetUp.ONOSSetUp( main.Mininet1, cellName=cellName, removeLog=True,
102 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -0700103
Devin Lim58046fa2017-07-05 16:55:00 -0700104 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -0700105
Jon Hall5cf14d52015-07-16 12:15:19 -0700106 def CASE2( self, main ):
107 """
108 Assign devices to controllers
109 """
Devin Lim58046fa2017-07-05 16:55:00 -0700110 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700111
112 def CASE21( self, main ):
113 """
114 Assign mastership to controllers
115 """
Devin Lim58046fa2017-07-05 16:55:00 -0700116 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700117
118 def CASE3( self, main ):
119 """
120 Assign intents
121 """
Devin Lim58046fa2017-07-05 16:55:00 -0700122 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700123
124 def CASE4( self, main ):
125 """
126 Ping across added host intents
127 """
Jon Hall5cf14d52015-07-16 12:15:19 -0700128
Devin Lim58046fa2017-07-05 16:55:00 -0700129 main.HA.pingAcrossHostIntent( main, True, True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700130
131 def CASE5( self, main ):
132 """
133 Reading state of ONOS
134 """
Devin Lim58046fa2017-07-05 16:55:00 -0700135 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700136
137 def CASE6( self, main ):
138 """
139 The Failure case. Since this is the Sanity test, we do nothing.
140 """
141 import time
Jon Halle1a3b752015-07-22 13:02:46 -0700142 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700143 assert main, "main not defined"
144 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -0700145 assert main.CLIs, "main.CLIs not defined"
146 assert main.nodes, "main.nodes not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700147 main.case( "Wait 60 seconds instead of inducing a failure" )
148 time.sleep( 60 )
149 utilities.assert_equals(
150 expect=main.TRUE,
151 actual=main.TRUE,
152 onpass="Sleeping 60 seconds",
153 onfail="Something is terribly wrong with my math" )
154
155 def CASE7( self, main ):
156 """
157 Check state after ONOS failure
158 """
Devin Lim58046fa2017-07-05 16:55:00 -0700159 main.HA.checkStateAfterONOS( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700160
Jon Hall5cf14d52015-07-16 12:15:19 -0700161 main.step( "Leadership Election is still functional" )
162 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700163 leaderList = []
164
Jon Hall5cf14d52015-07-16 12:15:19 -0700165 # NOTE: this only works for the sanity test. In case of failures,
166 # leader will likely change
Jon Halla440e872016-03-31 15:15:50 -0700167 leader = main.nodes[ main.activeNodes[ 0 ] ].ip_address
Jon Hall5cf14d52015-07-16 12:15:19 -0700168 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700169
170 for i in main.activeNodes:
Jon Hallf37d44d2017-05-24 10:37:30 -0700171 cli = main.CLIs[ i ]
Jon Hall5cf14d52015-07-16 12:15:19 -0700172 leaderN = cli.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700173 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700174 # verify leader is ONOS1
175 if leaderN == leader:
176 # all is well
177 # NOTE: In failure scenario, this could be a new node, maybe
178 # check != ONOS1
179 pass
180 elif leaderN == main.FALSE:
181 # error in response
182 main.log.error( "Something is wrong with " +
183 "electionTestLeader function, check the" +
184 " error logs" )
185 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700186 elif leaderN is None:
187 main.log.error( cli.name +
188 " shows no leader for the election-app was" +
189 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700190 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700191 if len( set( leaderList ) ) != 1:
192 leaderResult = main.FALSE
193 main.log.error(
194 "Inconsistent view of leader for the election test app" )
195 # TODO: print the list
Jon Hall5cf14d52015-07-16 12:15:19 -0700196 utilities.assert_equals(
197 expect=main.TRUE,
198 actual=leaderResult,
199 onpass="Leadership election passed",
200 onfail="Something went wrong with Leadership election" )
201
202 def CASE8( self, main ):
203 """
204 Compare topo
205 """
Devin Lim58046fa2017-07-05 16:55:00 -0700206 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700207
Jon Hall5cf14d52015-07-16 12:15:19 -0700208 def CASE9( self, main ):
209 """
210 Link s3-s28 down
211 """
Devin Lim58046fa2017-07-05 16:55:00 -0700212 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700213
214 def CASE10( self, main ):
215 """
216 Link s3-s28 up
217 """
Devin Lim58046fa2017-07-05 16:55:00 -0700218 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700219
220 def CASE11( self, main ):
221 """
222 Switch Down
223 """
224 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700225 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700226
227 def CASE12( self, main ):
228 """
229 Switch Up
230 """
231 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700232 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700233
234 def CASE13( self, main ):
235 """
236 Clean up
237 """
Devin Lim58046fa2017-07-05 16:55:00 -0700238 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700239
240 def CASE14( self, main ):
241 """
242 start election app on all onos nodes
243 """
Devin Lim58046fa2017-07-05 16:55:00 -0700244 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700245
246 def CASE15( self, main ):
247 """
248 Check that Leadership Election is still functional
acsmars71adceb2015-08-31 15:09:26 -0700249 15.1 Run election on each node
250 15.2 Check that each node has the same leaders and candidates
251 15.3 Find current leader and withdraw
252 15.4 Check that a new node was elected leader
253 15.5 Check that that new leader was the candidate of old leader
254 15.6 Run for election on old leader
255 15.7 Check that oldLeader is a candidate, and leader if only 1 node
256 15.8 Make sure that the old leader was added to the candidate list
257
258 old and new variable prefixes refer to data from before vs after
259 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700260 """
Devin Lim58046fa2017-07-05 16:55:00 -0700261 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700262
263 def CASE16( self, main ):
264 """
265 Install Distributed Primitives app
266 """
Devin Lim58046fa2017-07-05 16:55:00 -0700267 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700268
269 def CASE17( self, main ):
270 """
271 Check for basic functionality with distributed primitives
272 """
Devin Lim58046fa2017-07-05 16:55:00 -0700273 main.HA.checkDistPrimitivesFunc( main )