blob: c70d921f549c2d6c2302db3394a4742de30b8adf [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 Hallca319892017-06-15 15:25:22 -070082 from dependencies.Cluster import Cluster
Jon Hall53c5e662016-04-13 16:06:56 -070083 from tests.HA.dependencies.HA import HA
Jon Hall41d39f12016-04-11 22:54:35 -070084 main.HA = HA()
Jon Hallca319892017-06-15 15:25:22 -070085 main.Cluster = Cluster( main.ONOScell.nodes )
Devin Lim58046fa2017-07-05 16:55:00 -070086 cellName = main.params[ 'ENV' ][ 'cellName' ]
87 main.apps = main.params[ 'ENV' ][ 'appString' ]
Jon Hallca319892017-06-15 15:25:22 -070088 stepResult = main.testSetUp.envSetup( main.Cluster, hasNode=True )
Jon Halle1a3b752015-07-22 13:02:46 -070089 except Exception as e:
Devin Lim58046fa2017-07-05 16:55:00 -070090 main.testSetUp.envSetupException( e )
91 main.testSetUp.evnSetupConclusion( stepResult )
92 main.HA.generateGraph( "HAsanity" )
Jon Halle1a3b752015-07-22 13:02:46 -070093
Jon Hallca319892017-06-15 15:25:22 -070094 main.testSetUp.ONOSSetUp( main.Mininet1, main.Cluster, cellName=cellName, removeLog=True,
Devin Lim58046fa2017-07-05 16:55:00 -070095 extraApply=main.HA.startingMininet )
Jon Hall5cf14d52015-07-16 12:15:19 -070096
Devin Lim58046fa2017-07-05 16:55:00 -070097 main.HA.initialSetUp()
Jon Hall9d2dcad2016-04-08 10:15:20 -070098
Jon Hall5cf14d52015-07-16 12:15:19 -070099 def CASE2( self, main ):
100 """
101 Assign devices to controllers
102 """
Devin Lim58046fa2017-07-05 16:55:00 -0700103 main.HA.assignDevices( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700104
105 def CASE21( self, main ):
106 """
107 Assign mastership to controllers
108 """
Devin Lim58046fa2017-07-05 16:55:00 -0700109 main.HA.assignMastership( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700110
111 def CASE3( self, main ):
112 """
113 Assign intents
114 """
Devin Lim58046fa2017-07-05 16:55:00 -0700115 main.HA.assignIntents( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700116
117 def CASE4( self, main ):
118 """
119 Ping across added host intents
120 """
Jon Hallca319892017-06-15 15:25:22 -0700121 main.HA.pingAcrossHostIntent( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700122
123 def CASE5( self, main ):
124 """
125 Reading state of ONOS
126 """
Devin Lim58046fa2017-07-05 16:55:00 -0700127 main.HA.readingState( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700128
129 def CASE6( self, main ):
130 """
131 The Failure case. Since this is the Sanity test, we do nothing.
132 """
133 import time
Jon Halle1a3b752015-07-22 13:02:46 -0700134 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700135 assert main, "main not defined"
136 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Hall5cf14d52015-07-16 12:15:19 -0700137 main.case( "Wait 60 seconds instead of inducing a failure" )
138 time.sleep( 60 )
139 utilities.assert_equals(
140 expect=main.TRUE,
141 actual=main.TRUE,
142 onpass="Sleeping 60 seconds",
143 onfail="Something is terribly wrong with my math" )
144
145 def CASE7( self, main ):
146 """
147 Check state after ONOS failure
148 """
Devin Lim58046fa2017-07-05 16:55:00 -0700149 main.HA.checkStateAfterONOS( main, afterWhich=0, compareSwitch=True )
Jon Hall5cf14d52015-07-16 12:15:19 -0700150
Jon Hall5cf14d52015-07-16 12:15:19 -0700151 main.step( "Leadership Election is still functional" )
152 # Test of LeadershipElection
Jon Halla440e872016-03-31 15:15:50 -0700153 leaderList = []
154
Jon Hall5cf14d52015-07-16 12:15:19 -0700155 # NOTE: this only works for the sanity test. In case of failures,
156 # leader will likely change
Jon Hallca319892017-06-15 15:25:22 -0700157 leader = main.Cluster.testLeader
Jon Hall5cf14d52015-07-16 12:15:19 -0700158 leaderResult = main.TRUE
Jon Halla440e872016-03-31 15:15:50 -0700159
Jon Hallca319892017-06-15 15:25:22 -0700160 for ctrl in main.Cluster.active():
161 leaderN = ctrl.electionTestLeader()
Jon Halla440e872016-03-31 15:15:50 -0700162 leaderList.append( leaderN )
Jon Hall5cf14d52015-07-16 12:15:19 -0700163 # verify leader is ONOS1
164 if leaderN == leader:
165 # all is well
166 # NOTE: In failure scenario, this could be a new node, maybe
167 # check != ONOS1
168 pass
169 elif leaderN == main.FALSE:
170 # error in response
171 main.log.error( "Something is wrong with " +
172 "electionTestLeader function, check the" +
173 " error logs" )
174 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700175 elif leaderN is None:
176 main.log.error( cli.name +
177 " shows no leader for the election-app was" +
178 " elected after the old one died" )
Jon Hall5cf14d52015-07-16 12:15:19 -0700179 leaderResult = main.FALSE
Jon Halla440e872016-03-31 15:15:50 -0700180 if len( set( leaderList ) ) != 1:
181 leaderResult = main.FALSE
182 main.log.error(
183 "Inconsistent view of leader for the election test app" )
Jon Hallca319892017-06-15 15:25:22 -0700184 main.log.debug( leaderList )
Jon Hall5cf14d52015-07-16 12:15:19 -0700185 utilities.assert_equals(
186 expect=main.TRUE,
187 actual=leaderResult,
188 onpass="Leadership election passed",
189 onfail="Something went wrong with Leadership election" )
190
191 def CASE8( self, main ):
192 """
193 Compare topo
194 """
Devin Lim58046fa2017-07-05 16:55:00 -0700195 main.HA.compareTopo( main )
Jon Halld2871c22016-07-26 11:01:14 -0700196
Jon Hall5cf14d52015-07-16 12:15:19 -0700197 def CASE9( self, main ):
198 """
199 Link s3-s28 down
200 """
Devin Lim58046fa2017-07-05 16:55:00 -0700201 main.HA.linkDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700202
203 def CASE10( self, main ):
204 """
205 Link s3-s28 up
206 """
Devin Lim58046fa2017-07-05 16:55:00 -0700207 main.HA.linkUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700208
209 def CASE11( self, main ):
210 """
211 Switch Down
212 """
213 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700214 main.HA.switchDown( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700215
216 def CASE12( self, main ):
217 """
218 Switch Up
219 """
220 # NOTE: You should probably run a topology check after this
Devin Lim58046fa2017-07-05 16:55:00 -0700221 main.HA.switchUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700222
223 def CASE13( self, main ):
224 """
225 Clean up
226 """
Devin Lim58046fa2017-07-05 16:55:00 -0700227 main.HA.cleanUp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700228
229 def CASE14( self, main ):
230 """
231 start election app on all onos nodes
232 """
Devin Lim58046fa2017-07-05 16:55:00 -0700233 main.HA.startElectionApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700234
235 def CASE15( self, main ):
236 """
237 Check that Leadership Election is still functional
acsmars71adceb2015-08-31 15:09:26 -0700238 15.1 Run election on each node
239 15.2 Check that each node has the same leaders and candidates
240 15.3 Find current leader and withdraw
241 15.4 Check that a new node was elected leader
242 15.5 Check that that new leader was the candidate of old leader
243 15.6 Run for election on old leader
244 15.7 Check that oldLeader is a candidate, and leader if only 1 node
245 15.8 Make sure that the old leader was added to the candidate list
246
247 old and new variable prefixes refer to data from before vs after
248 withdrawl and later before withdrawl vs after re-election
Jon Hall5cf14d52015-07-16 12:15:19 -0700249 """
Devin Lim58046fa2017-07-05 16:55:00 -0700250 main.HA.isElectionFunctional( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700251
252 def CASE16( self, main ):
253 """
254 Install Distributed Primitives app
255 """
Devin Lim58046fa2017-07-05 16:55:00 -0700256 main.HA.installDistributedPrimitiveApp( main )
Jon Hall5cf14d52015-07-16 12:15:19 -0700257
258 def CASE17( self, main ):
259 """
260 Check for basic functionality with distributed primitives
261 """
Devin Lim58046fa2017-07-05 16:55:00 -0700262 main.HA.checkDistPrimitivesFunc( main )