blob: de26e674731a0b37e0f390627f0c902faa8385a6 [file] [log] [blame]
Jon Hall6aec96b2015-01-19 14:49:31 -08001"""
Jon Hall73cf9cc2014-11-20 22:28:38 -08002Description: This test is to determine if ONOS can handle
3 a minority of it's nodes restarting
4
5List of test cases:
6CASE1: Compile ONOS and push it to the test machines
7CASE2: Assign mastership to controllers
8CASE3: Assign intents
9CASE4: Ping across added host intents
10CASE5: Reading state of ONOS
11CASE6: The Failure case.
12CASE7: Check state after control plane failure
13CASE8: Compare topo
14CASE9: Link s3-s28 down
15CASE10: Link s3-s28 up
16CASE11: Switch down
17CASE12: Switch up
18CASE13: Clean up
Jon Hall669173b2014-12-17 11:36:30 -080019CASE14: start election app on all onos nodes
20CASE15: Check that Leadership Election is still functional
Jon Hall6aec96b2015-01-19 14:49:31 -080021"""
Jon Hall8f89dda2015-01-22 16:03:33 -080022
23
Jon Hall73cf9cc2014-11-20 22:28:38 -080024class HATestMinorityRestart:
25
Jon Hall6aec96b2015-01-19 14:49:31 -080026 def __init__( self ):
Jon Hall73cf9cc2014-11-20 22:28:38 -080027 self.default = ''
28
Jon Hall6aec96b2015-01-19 14:49:31 -080029 def CASE1( self, main ):
30 """
Jon Hall73cf9cc2014-11-20 22:28:38 -080031 CASE1 is to compile ONOS and push it to the test machines
32
33 Startup sequence:
34 git pull
35 mvn clean install
36 onos-package
37 cell <name>
38 onos-verify-cell
39 NOTE: temporary - onos-remove-raft-logs
40 onos-install -f
41 onos-wait-for-start
Jon Hall6aec96b2015-01-19 14:49:31 -080042 """
43 main.log.report(
44 "ONOS HA test: Restart minority of ONOS nodes - initialization" )
45 main.case( "Setting up test environment" )
46 # TODO: save all the timers and output them for plotting
Jon Hall73cf9cc2014-11-20 22:28:38 -080047
48 # load some vairables from the params file
Jon Hall8f89dda2015-01-22 16:03:33 -080049 PULLCODE = False
Jon Hall6aec96b2015-01-19 14:49:31 -080050 if main.params[ 'Git' ] == 'True':
Jon Hall8f89dda2015-01-22 16:03:33 -080051 PULLCODE = True
Jon Hall529a37f2015-01-28 10:02:00 -080052 gitBranch = main.params[ 'branch' ]
Jon Hall8f89dda2015-01-22 16:03:33 -080053 cellName = main.params[ 'ENV' ][ 'cellName' ]
Jon Hall6aec96b2015-01-19 14:49:31 -080054
55 # set global variables
Jon Hall8f89dda2015-01-22 16:03:33 -080056 global ONOS1Ip
57 global ONOS1Port
58 global ONOS2Ip
59 global ONOS2Port
60 global ONOS3Ip
61 global ONOS3Port
62 global ONOS4Ip
63 global ONOS4Port
64 global ONOS5Ip
65 global ONOS5Port
66 global ONOS6Ip
67 global ONOS6Port
68 global ONOS7Ip
69 global ONOS7Port
70 global numControllers
Jon Hall73cf9cc2014-11-20 22:28:38 -080071
Jon Hall8f89dda2015-01-22 16:03:33 -080072 ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
73 ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
74 ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
75 ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
76 ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
77 ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
78 ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
79 ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
80 ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
81 ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
82 ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
83 ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
84 ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
85 ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
86 numControllers = int( main.params[ 'num_controllers' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -080087
Jon Hall6aec96b2015-01-19 14:49:31 -080088 main.step( "Applying cell variable to environment" )
Jon Hall8f89dda2015-01-22 16:03:33 -080089 cellResult = main.ONOSbench.setCell( cellName )
90 verifyResult = main.ONOSbench.verifyCell()
Jon Hall73cf9cc2014-11-20 22:28:38 -080091
Jon Hall6aec96b2015-01-19 14:49:31 -080092 # FIXME:this is short term fix
93 main.log.report( "Removing raft logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -080094 main.ONOSbench.onosRemoveRaftLogs()
Jon Hall6aec96b2015-01-19 14:49:31 -080095 main.log.report( "Uninstalling ONOS" )
Jon Hall8f89dda2015-01-22 16:03:33 -080096 main.ONOSbench.onosUninstall( ONOS1Ip )
97 main.ONOSbench.onosUninstall( ONOS2Ip )
98 main.ONOSbench.onosUninstall( ONOS3Ip )
99 main.ONOSbench.onosUninstall( ONOS4Ip )
100 main.ONOSbench.onosUninstall( ONOS5Ip )
101 main.ONOSbench.onosUninstall( ONOS6Ip )
102 main.ONOSbench.onosUninstall( ONOS7Ip )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800103
Jon Hall8f89dda2015-01-22 16:03:33 -0800104 cleanInstallResult = main.TRUE
105 gitPullResult = main.TRUE
Jon Hall73cf9cc2014-11-20 22:28:38 -0800106
Jon Hall97f31752015-02-04 12:01:04 -0800107 main.step( "Starting Mininet" )
108 main.Mininet1.startNet( )
109
Jon Hall6aec96b2015-01-19 14:49:31 -0800110 main.step( "Compiling the latest version of ONOS" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800111 if PULLCODE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800112 # TODO Configure branch in params
113 main.step( "Git checkout and pull master" )
Jon Hall529a37f2015-01-28 10:02:00 -0800114 main.ONOSbench.gitCheckout( gitBranch )
Jon Hall8f89dda2015-01-22 16:03:33 -0800115 gitPullResult = main.ONOSbench.gitPull()
Jon Hall73cf9cc2014-11-20 22:28:38 -0800116
Jon Hall6aec96b2015-01-19 14:49:31 -0800117 main.step( "Using mvn clean & install" )
Jon Hall529a37f2015-01-28 10:02:00 -0800118 cleanInstallResult = main.ONOSbench.cleanInstall()
119 else:
120 main.log.warn( "Did not pull new code so skipping mvn " +
121 "clean install" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800122 main.ONOSbench.getVersion( report=True )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800123
Jon Hall6aec96b2015-01-19 14:49:31 -0800124 main.step( "Creating ONOS package" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800125 packageResult = main.ONOSbench.onosPackage()
Jon Hall73cf9cc2014-11-20 22:28:38 -0800126
Jon Hall6aec96b2015-01-19 14:49:31 -0800127 main.step( "Installing ONOS package" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800128 onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
129 node=ONOS1Ip )
130 onos2InstallResult = main.ONOSbench.onosInstall( options="-f",
131 node=ONOS2Ip )
132 onos3InstallResult = main.ONOSbench.onosInstall( options="-f",
133 node=ONOS3Ip )
134 onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
135 node=ONOS4Ip )
136 onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
137 node=ONOS5Ip )
138 onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
139 node=ONOS6Ip )
140 onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
141 node=ONOS7Ip )
142 onosInstallResult = onos1InstallResult and onos2InstallResult\
143 and onos3InstallResult and onos4InstallResult\
144 and onos5InstallResult and onos6InstallResult\
145 and onos7InstallResult
Jon Hall73cf9cc2014-11-20 22:28:38 -0800146
Jon Hall6aec96b2015-01-19 14:49:31 -0800147 main.step( "Checking if ONOS is up yet" )
148 # TODO check bundle:list?
149 for i in range( 2 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800150 onos1Isup = main.ONOSbench.isup( ONOS1Ip )
151 if not onos1Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800152 main.log.report( "ONOS1 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800153 main.ONOSbench.onosStop( ONOS1Ip )
154 main.ONOSbench.onosStart( ONOS1Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800155 onos2Isup = main.ONOSbench.isup( ONOS2Ip )
156 if not onos2Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800157 main.log.report( "ONOS2 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800158 main.ONOSbench.onosStop( ONOS2Ip )
159 main.ONOSbench.onosStart( ONOS2Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800160 onos3Isup = main.ONOSbench.isup( ONOS3Ip )
161 if not onos3Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800162 main.log.report( "ONOS3 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800163 main.ONOSbench.onosStop( ONOS3Ip )
164 main.ONOSbench.onosStart( ONOS3Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800165 onos4Isup = main.ONOSbench.isup( ONOS4Ip )
166 if not onos4Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800167 main.log.report( "ONOS4 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800168 main.ONOSbench.onosStop( ONOS4Ip )
169 main.ONOSbench.onosStart( ONOS4Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800170 onos5Isup = main.ONOSbench.isup( ONOS5Ip )
171 if not onos5Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800172 main.log.report( "ONOS5 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800173 main.ONOSbench.onosStop( ONOS5Ip )
174 main.ONOSbench.onosStart( ONOS5Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800175 onos6Isup = main.ONOSbench.isup( ONOS6Ip )
176 if not onos6Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800177 main.log.report( "ONOS6 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800178 main.ONOSbench.onosStop( ONOS6Ip )
179 main.ONOSbench.onosStart( ONOS6Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800180 onos7Isup = main.ONOSbench.isup( ONOS7Ip )
181 if not onos7Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800182 main.log.report( "ONOS7 didn't start!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800183 main.ONOSbench.onosStop( ONOS7Ip )
184 main.ONOSbench.onosStart( ONOS7Ip )
Jon Hall8f89dda2015-01-22 16:03:33 -0800185 onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
186 and onos4Isup and onos5Isup and onos6Isup and onos7Isup
187 if onosIsupResult == main.TRUE:
Jon Hall94fd0472014-12-08 11:52:42 -0800188 break
Jon Hall73cf9cc2014-11-20 22:28:38 -0800189
Jon Hall8f89dda2015-01-22 16:03:33 -0800190 cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
191 cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
192 cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
193 cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
194 cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
195 cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
196 cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
197 cliResults = cliResult1 and cliResult2 and cliResult3 and\
198 cliResult4 and cliResult5 and cliResult6 and cliResult7
Jon Hall73cf9cc2014-11-20 22:28:38 -0800199
Jon Hall6aec96b2015-01-19 14:49:31 -0800200 main.step( "Start Packet Capture MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800201 main.Mininet2.startTcpdump(
Jon Hall6aec96b2015-01-19 14:49:31 -0800202 str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
203 + "-MN.pcap",
204 intf=main.params[ 'MNtcpdump' ][ 'intf' ],
205 port=main.params[ 'MNtcpdump' ][ 'port' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800206
Jon Hall8f89dda2015-01-22 16:03:33 -0800207 case1Result = ( cleanInstallResult and packageResult and
208 cellResult and verifyResult and onosInstallResult
209 and onosIsupResult and cliResults )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800210
Jon Hall8f89dda2015-01-22 16:03:33 -0800211 utilities.assert_equals( expect=main.TRUE, actual=case1Result,
212 onpass="Test startup successful",
213 onfail="Test startup NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800214
Jon Hall8f89dda2015-01-22 16:03:33 -0800215 if case1Result == main.FALSE:
Jon Hall94fd0472014-12-08 11:52:42 -0800216 main.cleanup()
217 main.exit()
Jon Hall73cf9cc2014-11-20 22:28:38 -0800218
Jon Hall6aec96b2015-01-19 14:49:31 -0800219 def CASE2( self, main ):
220 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800221 Assign mastership to controllers
Jon Hall6aec96b2015-01-19 14:49:31 -0800222 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800223 import re
224
Jon Hall6aec96b2015-01-19 14:49:31 -0800225 main.log.report( "Assigning switches to controllers" )
226 main.case( "Assigning Controllers" )
227 main.step( "Assign switches to controllers" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800228
Jon Hall6aec96b2015-01-19 14:49:31 -0800229 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800230 main.Mininet1.assignSwController(
Jon Hall6aec96b2015-01-19 14:49:31 -0800231 sw=str( i ),
Jon Hall8f89dda2015-01-22 16:03:33 -0800232 count=numControllers,
233 ip1=ONOS1Ip, port1=ONOS1Port,
234 ip2=ONOS2Ip, port2=ONOS2Port,
235 ip3=ONOS3Ip, port3=ONOS3Port,
236 ip4=ONOS4Ip, port4=ONOS4Port,
237 ip5=ONOS5Ip, port5=ONOS5Port,
238 ip6=ONOS6Ip, port6=ONOS6Port,
239 ip7=ONOS7Ip, port7=ONOS7Port )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800240
Jon Hall8f89dda2015-01-22 16:03:33 -0800241 mastershipCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800242 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800243 response = main.Mininet1.getSwController( "s" + str( i ) )
Jon Hallffb386d2014-11-21 13:43:38 -0800244 try:
Jon Hall6aec96b2015-01-19 14:49:31 -0800245 main.log.info( str( response ) )
Jon Hallffb386d2014-11-21 13:43:38 -0800246 except:
Jon Hall6aec96b2015-01-19 14:49:31 -0800247 main.log.info( repr( response ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800248 if re.search( "tcp:" + ONOS1Ip, response )\
249 and re.search( "tcp:" + ONOS2Ip, response )\
250 and re.search( "tcp:" + ONOS3Ip, response )\
251 and re.search( "tcp:" + ONOS4Ip, response )\
252 and re.search( "tcp:" + ONOS5Ip, response )\
253 and re.search( "tcp:" + ONOS6Ip, response )\
254 and re.search( "tcp:" + ONOS7Ip, response ):
255 mastershipCheck = mastershipCheck and main.TRUE
Jon Hall73cf9cc2014-11-20 22:28:38 -0800256 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800257 mastershipCheck = main.FALSE
258 if mastershipCheck == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800259 main.log.report( "Switch mastership assigned correctly" )
260 utilities.assert_equals(
261 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800262 actual=mastershipCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800263 onpass="Switch mastership assigned correctly",
264 onfail="Switches not assigned correctly to controllers" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800265
Jon Hall6aec96b2015-01-19 14:49:31 -0800266 # Manually assign mastership to the controller we want
Jon Hall8f89dda2015-01-22 16:03:33 -0800267 roleCall = main.TRUE
268 roleCheck = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800269
Jon Hall6aec96b2015-01-19 14:49:31 -0800270 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800271 deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
272 roleCall = roleCall and main.ONOScli1.deviceRole(
273 deviceId,
274 ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800275 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800276 if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
277 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800278 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800279 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800280
Jon Hall6aec96b2015-01-19 14:49:31 -0800281 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800282 deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
283 roleCall = roleCall and main.ONOScli1.deviceRole(
284 deviceId,
285 ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800286 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800287 if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
288 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800289 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800290 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800291
Jon Hall6aec96b2015-01-19 14:49:31 -0800292 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800293 deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
294 roleCall = roleCall and main.ONOScli1.deviceRole(
295 deviceId,
296 ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800297 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800298 if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
299 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800300 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800301 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800302
Jon Hall6aec96b2015-01-19 14:49:31 -0800303 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800304 deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
305 roleCall = roleCall and main.ONOScli1.deviceRole(
306 deviceId,
307 ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800308 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800309 if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
310 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800311 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800312 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800313
Jon Hall6aec96b2015-01-19 14:49:31 -0800314 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800315 deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
316 roleCall = roleCall and main.ONOScli1.deviceRole(
317 deviceId,
318 ONOS3Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800319 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800320 if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
321 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800322 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800323 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800324
Jon Hall6aec96b2015-01-19 14:49:31 -0800325 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800326 deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
327 roleCall = roleCall and main.ONOScli1.deviceRole(
328 deviceId,
329 ONOS3Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800330 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800331 if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
332 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800333 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800334 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800335
Jon Hall6aec96b2015-01-19 14:49:31 -0800336 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800337 deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
338 roleCall = roleCall and main.ONOScli1.deviceRole(
339 deviceId,
340 ONOS4Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800341 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800342 if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
343 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800344 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800345 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800346
Jon Hall6aec96b2015-01-19 14:49:31 -0800347 for i in range( 8, 18 ):
348 dpid = '3' + str( i ).zfill( 3 )
Jon Hall8f89dda2015-01-22 16:03:33 -0800349 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
350 roleCall = roleCall and main.ONOScli1.deviceRole(
351 deviceId,
352 ONOS5Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800353 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800354 if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
355 roleCheck = roleCheck and main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800356 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800357 roleCheck = roleCheck and main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -0800358
Jon Hall8f89dda2015-01-22 16:03:33 -0800359 deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
360 roleCall = roleCall and main.ONOScli1.deviceRole(
361 deviceId,
362 ONOS6Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800363 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800364 if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
365 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800366 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800367 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800368
Jon Hall6aec96b2015-01-19 14:49:31 -0800369 for i in range( 18, 28 ):
370 dpid = '6' + str( i ).zfill( 3 )
Jon Hall8f89dda2015-01-22 16:03:33 -0800371 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
372 roleCall = roleCall and main.ONOScli1.deviceRole(
373 deviceId,
374 ONOS7Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800375 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800376 if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
377 roleCheck = roleCheck and main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800378 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800379 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800380
Jon Hall6aec96b2015-01-19 14:49:31 -0800381 utilities.assert_equals(
382 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800383 actual=roleCall,
Jon Hall6aec96b2015-01-19 14:49:31 -0800384 onpass="Re-assigned switch mastership to designated controller",
Jon Hall8f89dda2015-01-22 16:03:33 -0800385 onfail="Something wrong with deviceRole calls" )
Jon Hall94fd0472014-12-08 11:52:42 -0800386
Jon Hall6aec96b2015-01-19 14:49:31 -0800387 utilities.assert_equals(
388 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800389 actual=roleCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800390 onpass="Switches were successfully reassigned to designated " +
391 "controller",
392 onfail="Switches were not successfully reassigned" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800393 mastershipCheck = mastershipCheck and roleCall and roleCheck
394 utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
Jon Hall21270ac2015-02-16 17:59:55 -0800395 onpass="Switch mastership correctly assigned",
396 onfail="Error in (re)assigning switch" +
397 " mastership" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800398
Jon Hall6aec96b2015-01-19 14:49:31 -0800399 def CASE3( self, main ):
Jon Hall73cf9cc2014-11-20 22:28:38 -0800400 """
401 Assign intents
Jon Hall73cf9cc2014-11-20 22:28:38 -0800402 """
403 import time
Jon Hall6aec96b2015-01-19 14:49:31 -0800404 main.log.report( "Adding host intents" )
405 main.case( "Adding host Intents" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800406
Jon Hall8f89dda2015-01-22 16:03:33 -0800407 main.step( "Discovering Hosts( Via pingall for now )" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800408 # FIXME: Once we have a host discovery mechanism, use that instead
Jon Hall73cf9cc2014-11-20 22:28:38 -0800409
Jon Hall6aec96b2015-01-19 14:49:31 -0800410 # install onos-app-fwd
411 main.log.info( "Install reactive forwarding app" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800412 main.ONOScli1.featureInstall( "onos-app-fwd" )
413 main.ONOScli2.featureInstall( "onos-app-fwd" )
414 main.ONOScli3.featureInstall( "onos-app-fwd" )
415 main.ONOScli4.featureInstall( "onos-app-fwd" )
416 main.ONOScli5.featureInstall( "onos-app-fwd" )
417 main.ONOScli6.featureInstall( "onos-app-fwd" )
418 main.ONOScli7.featureInstall( "onos-app-fwd" )
Jon Hall94fd0472014-12-08 11:52:42 -0800419
Jon Hall6aec96b2015-01-19 14:49:31 -0800420 # REACTIVE FWD test
Jon Hall8f89dda2015-01-22 16:03:33 -0800421 pingResult = main.FALSE
Jon Hall73cf9cc2014-11-20 22:28:38 -0800422 time1 = time.time()
Jon Hall8f89dda2015-01-22 16:03:33 -0800423 pingResult = main.Mininet1.pingall()
Jon Hall529a37f2015-01-28 10:02:00 -0800424 utilities.assert_equals(
425 expect=main.TRUE,
426 actual=pingResult,
427 onpass="Reactive Pingall test passed",
428 onfail="Reactive Pingall failed, one or more ping pairs failed" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800429 time2 = time.time()
Jon Hall6aec96b2015-01-19 14:49:31 -0800430 main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800431
Jon Hall6aec96b2015-01-19 14:49:31 -0800432 # uninstall onos-app-fwd
433 main.log.info( "Uninstall reactive forwarding app" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800434 main.ONOScli1.featureUninstall( "onos-app-fwd" )
435 main.ONOScli2.featureUninstall( "onos-app-fwd" )
436 main.ONOScli3.featureUninstall( "onos-app-fwd" )
437 main.ONOScli4.featureUninstall( "onos-app-fwd" )
438 main.ONOScli5.featureUninstall( "onos-app-fwd" )
439 main.ONOScli6.featureUninstall( "onos-app-fwd" )
440 main.ONOScli7.featureUninstall( "onos-app-fwd" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800441 # timeout for fwd flows
442 time.sleep( 10 )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800443
Jon Hall6aec96b2015-01-19 14:49:31 -0800444 main.step( "Add host intents" )
445 # TODO: move the host numbers to params
Jon Hall8f89dda2015-01-22 16:03:33 -0800446 intentAddResult = True
Jon Hall6aec96b2015-01-19 14:49:31 -0800447 for i in range( 8, 18 ):
448 main.log.info( "Adding host intent between h" + str( i ) +
449 " and h" + str( i + 10 ) )
450 host1 = "00:00:00:00:00:" + \
451 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
452 host2 = "00:00:00:00:00:" + \
453 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
Jon Hall1b8f54a2015-02-04 13:24:20 -0800454 # NOTE: getHost can return None
455 host1Dict = main.ONOScli1.getHost( host1 )
456 host2Dict = main.ONOScli1.getHost( host2 )
457 host1Id = None
458 host2Id = None
459 if host1Dict and host2Dict:
460 host1Id = host1Dict.get( 'id', None )
461 host2Id = host2Dict.get( 'id', None )
Jon Hall8f89dda2015-01-22 16:03:33 -0800462 if host1Id and host2Id:
Jon Hall1b8f54a2015-02-04 13:24:20 -0800463 #Changed onos node to test something
464 tmpResult = main.ONOScli4.addHostIntent(
Jon Hall8f89dda2015-01-22 16:03:33 -0800465 host1Id,
466 host2Id )
Jon Hall669173b2014-12-17 11:36:30 -0800467 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800468 main.log.error( "Error, getHost() failed" )
Jon Hall1b8f54a2015-02-04 13:24:20 -0800469 main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
470 sort_keys=True,
471 indent=4,
472 separators=( ',', ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800473 tmpResult = main.FALSE
474 intentAddResult = bool( pingResult and intentAddResult
475 and tmpResult )
Jon Hall529a37f2015-01-28 10:02:00 -0800476 # TODO Check that intents were added?
Jon Hall1b8f54a2015-02-04 13:24:20 -0800477 # Print the intent states
478 intents = main.ONOScli1.intents( )
479 intentStates = []
480 for intent in json.loads( intents ): # Iter through intents of a node
481 intentStates.append( intent.get( 'state', None ) )
482 out = [ (i, intentStates.count( i ) ) for i in set( intentStates ) ]
483 main.log.info( dict( out ) )
484
Jon Hall6aec96b2015-01-19 14:49:31 -0800485 utilities.assert_equals(
486 expect=True,
Jon Hall8f89dda2015-01-22 16:03:33 -0800487 actual=intentAddResult,
Jon Hall529a37f2015-01-28 10:02:00 -0800488 onpass="Pushed host intents to ONOS",
489 onfail="Error in pushing host intents to ONOS" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800490 # TODO Check if intents all exist in datastore
Jon Hall73cf9cc2014-11-20 22:28:38 -0800491
Jon Hall6aec96b2015-01-19 14:49:31 -0800492 def CASE4( self, main ):
Jon Hall73cf9cc2014-11-20 22:28:38 -0800493 """
494 Ping across added host intents
495 """
496 description = " Ping across added host intents"
Jon Hall6aec96b2015-01-19 14:49:31 -0800497 main.log.report( description )
498 main.case( description )
Jon Hall8f89dda2015-01-22 16:03:33 -0800499 PingResult = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800500 for i in range( 8, 18 ):
Jon Hall21270ac2015-02-16 17:59:55 -0800501 ping = main.Mininet1.pingHost( src="h" + str( i ),
502 target="h" + str( i + 10 ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800503 PingResult = PingResult and ping
Jon Hall6aec96b2015-01-19 14:49:31 -0800504 if ping == main.FALSE:
505 main.log.warn( "Ping failed between h" + str( i ) +
506 " and h" + str( i + 10 ) )
507 elif ping == main.TRUE:
508 main.log.info( "Ping test passed!" )
Jon Hall21270ac2015-02-16 17:59:55 -0800509 # Don't set PingResult or you'd override failures
Jon Hall8f89dda2015-01-22 16:03:33 -0800510 if PingResult == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800511 main.log.report(
512 "Intents have not been installed correctly, pings failed." )
Jon Hall529a37f2015-01-28 10:02:00 -0800513 #TODO: pretty print
514 main.log.warn( "ONSO1 intents: " )
515 main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
516 sort_keys=True,
517 indent=4,
518 separators=( ',', ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800519 if PingResult == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800520 main.log.report(
521 "Intents have been installed correctly and verified by pings" )
522 utilities.assert_equals(
523 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800524 actual=PingResult,
Jon Hall6aec96b2015-01-19 14:49:31 -0800525 onpass="Intents have been installed correctly and pings work",
526 onfail="Intents have not been installed correctly, pings failed." )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800527
Jon Hall6aec96b2015-01-19 14:49:31 -0800528 def CASE5( self, main ):
529 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800530 Reading state of ONOS
Jon Hall6aec96b2015-01-19 14:49:31 -0800531 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800532 import json
Jon Hall6aec96b2015-01-19 14:49:31 -0800533 # assumes that sts is already in you PYTHONPATH
534 from sts.topology.teston_topology import TestONTopology
Jon Hall73cf9cc2014-11-20 22:28:38 -0800535
Jon Hall6aec96b2015-01-19 14:49:31 -0800536 main.log.report( "Setting up and gathering data for current state" )
537 main.case( "Setting up and gathering data for current state" )
538 # The general idea for this test case is to pull the state of
539 # ( intents,flows, topology,... ) from each ONOS node
540 # We can then compare them with eachother and also with past states
Jon Hall73cf9cc2014-11-20 22:28:38 -0800541
Jon Hall6aec96b2015-01-19 14:49:31 -0800542 main.step( "Get the Mastership of each switch from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800543 global mastershipState
544 mastershipState = []
Jon Hall94fd0472014-12-08 11:52:42 -0800545
Jon Hall6aec96b2015-01-19 14:49:31 -0800546 # Assert that each device has a master
Jon Hall8f89dda2015-01-22 16:03:33 -0800547 ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
548 ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
549 ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
550 ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
551 ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
552 ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
553 ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
554 rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
555 ONOS3MasterNotNull and ONOS4MasterNotNull and\
556 ONOS5MasterNotNull and ONOS6MasterNotNull and\
557 ONOS7MasterNotNull
Jon Hall6aec96b2015-01-19 14:49:31 -0800558 utilities.assert_equals(
559 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800560 actual=rolesNotNull,
Jon Hall6aec96b2015-01-19 14:49:31 -0800561 onpass="Each device has a master",
562 onfail="Some devices don't have a master assigned" )
Jon Hall94fd0472014-12-08 11:52:42 -0800563
Jon Hall8f89dda2015-01-22 16:03:33 -0800564 ONOS1Mastership = main.ONOScli1.roles()
565 ONOS2Mastership = main.ONOScli2.roles()
566 ONOS3Mastership = main.ONOScli3.roles()
567 ONOS4Mastership = main.ONOScli4.roles()
568 ONOS5Mastership = main.ONOScli5.roles()
569 ONOS6Mastership = main.ONOScli6.roles()
570 ONOS7Mastership = main.ONOScli7.roles()
571 if "Error" in ONOS1Mastership or not ONOS1Mastership\
572 or "Error" in ONOS2Mastership or not ONOS2Mastership\
573 or "Error" in ONOS3Mastership or not ONOS3Mastership\
574 or "Error" in ONOS4Mastership or not ONOS4Mastership\
575 or "Error" in ONOS5Mastership or not ONOS5Mastership\
576 or "Error" in ONOS6Mastership or not ONOS6Mastership\
577 or "Error" in ONOS7Mastership or not ONOS7Mastership:
Jon Hall6aec96b2015-01-19 14:49:31 -0800578 main.log.report( "Error in getting ONOS roles" )
579 main.log.warn(
580 "ONOS1 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800581 repr( ONOS1Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800582 main.log.warn(
583 "ONOS2 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800584 repr( ONOS2Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800585 main.log.warn(
586 "ONOS3 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800587 repr( ONOS3Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800588 main.log.warn(
589 "ONOS4 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800590 repr( ONOS4Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800591 main.log.warn(
592 "ONOS5 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800593 repr( ONOS5Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800594 main.log.warn(
595 "ONOS6 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800596 repr( ONOS6Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800597 main.log.warn(
598 "ONOS7 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800599 repr( ONOS7Mastership ) )
600 consistentMastership = main.FALSE
601 elif ONOS1Mastership == ONOS2Mastership\
602 and ONOS1Mastership == ONOS3Mastership\
603 and ONOS1Mastership == ONOS4Mastership\
604 and ONOS1Mastership == ONOS5Mastership\
605 and ONOS1Mastership == ONOS6Mastership\
606 and ONOS1Mastership == ONOS7Mastership:
607 mastershipState = ONOS1Mastership
608 consistentMastership = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800609 main.log.report(
610 "Switch roles are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800611 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800612 main.log.warn(
613 "ONOS1 roles: ",
614 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800615 json.loads( ONOS1Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800616 sort_keys=True,
617 indent=4,
618 separators=(
619 ',',
620 ': ' ) ) )
621 main.log.warn(
622 "ONOS2 roles: ",
623 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800624 json.loads( ONOS2Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800625 sort_keys=True,
626 indent=4,
627 separators=(
628 ',',
629 ': ' ) ) )
630 main.log.warn(
631 "ONOS3 roles: ",
632 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800633 json.loads( ONOS3Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800634 sort_keys=True,
635 indent=4,
636 separators=(
637 ',',
638 ': ' ) ) )
639 main.log.warn(
640 "ONOS4 roles: ",
641 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800642 json.loads( ONOS4Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800643 sort_keys=True,
644 indent=4,
645 separators=(
646 ',',
647 ': ' ) ) )
648 main.log.warn(
649 "ONOS5 roles: ",
650 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800651 json.loads( ONOS5Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800652 sort_keys=True,
653 indent=4,
654 separators=(
655 ',',
656 ': ' ) ) )
657 main.log.warn(
658 "ONOS6 roles: ",
659 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800660 json.loads( ONOS6Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800661 sort_keys=True,
662 indent=4,
663 separators=(
664 ',',
665 ': ' ) ) )
666 main.log.warn(
667 "ONOS7 roles: ",
668 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800669 json.loads( ONOS7Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800670 sort_keys=True,
671 indent=4,
672 separators=(
673 ',',
674 ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800675 consistentMastership = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -0800676 utilities.assert_equals(
677 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800678 actual=consistentMastership,
Jon Hall6aec96b2015-01-19 14:49:31 -0800679 onpass="Switch roles are consistent across all ONOS nodes",
680 onfail="ONOS nodes have different views of switch roles" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800681
Jon Hall6aec96b2015-01-19 14:49:31 -0800682 main.step( "Get the intents from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800683 global intentState
684 intentState = []
685 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
686 ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
687 ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
688 ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
689 ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
690 ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
691 ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
692 intentCheck = main.FALSE
693 if "Error" in ONOS1Intents or not ONOS1Intents\
694 or "Error" in ONOS2Intents or not ONOS2Intents\
695 or "Error" in ONOS3Intents or not ONOS3Intents\
696 or "Error" in ONOS4Intents or not ONOS4Intents\
697 or "Error" in ONOS5Intents or not ONOS5Intents\
698 or "Error" in ONOS6Intents or not ONOS6Intents\
699 or "Error" in ONOS7Intents or not ONOS7Intents:
Jon Hall6aec96b2015-01-19 14:49:31 -0800700 main.log.report( "Error in getting ONOS intents" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800701 main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
702 main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
703 main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
704 main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
705 main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
706 main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
707 main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
708 elif ONOS1Intents == ONOS2Intents\
709 and ONOS1Intents == ONOS3Intents\
710 and ONOS1Intents == ONOS4Intents\
711 and ONOS1Intents == ONOS5Intents\
712 and ONOS1Intents == ONOS6Intents\
713 and ONOS1Intents == ONOS7Intents:
714 intentState = ONOS1Intents
715 intentCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800716 main.log.report( "Intents are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800717 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800718 main.log.warn(
719 "ONOS1 intents: ",
720 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800721 json.loads( ONOS1Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800722 sort_keys=True,
723 indent=4,
724 separators=(
725 ',',
726 ': ' ) ) )
727 main.log.warn(
728 "ONOS2 intents: ",
729 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800730 json.loads( ONOS2Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800731 sort_keys=True,
732 indent=4,
733 separators=(
734 ',',
735 ': ' ) ) )
736 main.log.warn(
737 "ONOS3 intents: ",
738 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800739 json.loads( ONOS3Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800740 sort_keys=True,
741 indent=4,
742 separators=(
743 ',',
744 ': ' ) ) )
745 main.log.warn(
746 "ONOS4 intents: ",
747 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800748 json.loads( ONOS4Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800749 sort_keys=True,
750 indent=4,
751 separators=(
752 ',',
753 ': ' ) ) )
754 main.log.warn(
755 "ONOS5 intents: ",
756 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800757 json.loads( ONOS5Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800758 sort_keys=True,
759 indent=4,
760 separators=(
761 ',',
762 ': ' ) ) )
763 main.log.warn(
764 "ONOS6 intents: ",
765 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800766 json.loads( ONOS6Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800767 sort_keys=True,
768 indent=4,
769 separators=(
770 ',',
771 ': ' ) ) )
772 main.log.warn(
773 "ONOS7 intents: ",
774 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800775 json.loads( ONOS7Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800776 sort_keys=True,
777 indent=4,
778 separators=(
779 ',',
780 ': ' ) ) )
781 utilities.assert_equals(
782 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800783 actual=intentCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800784 onpass="Intents are consistent across all ONOS nodes",
785 onfail="ONOS nodes have different views of intents" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800786
Jon Hall6aec96b2015-01-19 14:49:31 -0800787 main.step( "Get the flows from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800788 global flowState
789 flowState = []
790 ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
791 ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
792 ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
793 ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
794 ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
795 ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
796 ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
797 ONOS1FlowsJson = json.loads( ONOS1Flows )
798 ONOS2FlowsJson = json.loads( ONOS2Flows )
799 ONOS3FlowsJson = json.loads( ONOS3Flows )
800 ONOS4FlowsJson = json.loads( ONOS4Flows )
801 ONOS5FlowsJson = json.loads( ONOS5Flows )
802 ONOS6FlowsJson = json.loads( ONOS6Flows )
803 ONOS7FlowsJson = json.loads( ONOS7Flows )
804 flowCheck = main.FALSE
805 if "Error" in ONOS1Flows or not ONOS1Flows\
806 or "Error" in ONOS2Flows or not ONOS2Flows\
807 or "Error" in ONOS3Flows or not ONOS3Flows\
808 or "Error" in ONOS4Flows or not ONOS4Flows\
809 or "Error" in ONOS5Flows or not ONOS5Flows\
810 or "Error" in ONOS6Flows or not ONOS6Flows\
811 or "Error" in ONOS7Flows or not ONOS7Flows:
Jon Hall6aec96b2015-01-19 14:49:31 -0800812 main.log.report( "Error in getting ONOS intents" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800813 main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
814 main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
815 main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
816 main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
817 main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
818 main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
819 main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
820 elif len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
821 and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
822 and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
823 and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
824 and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
825 and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
Jon Hall6aec96b2015-01-19 14:49:31 -0800826 # TODO: Do a better check, maybe compare flows on switches?
Jon Hall8f89dda2015-01-22 16:03:33 -0800827 flowState = ONOS1Flows
828 flowCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800829 main.log.report( "Flow count is consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800830 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800831 main.log.warn( "ONOS1 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800832 json.dumps( ONOS1FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800833 indent=4, separators=( ',', ': ' ) ) )
834 main.log.warn( "ONOS2 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800835 json.dumps( ONOS2FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800836 indent=4, separators=( ',', ': ' ) ) )
837 main.log.warn( "ONOS3 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800838 json.dumps( ONOS3FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800839 indent=4, separators=( ',', ': ' ) ) )
840 main.log.warn( "ONOS4 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800841 json.dumps( ONOS4FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800842 indent=4, separators=( ',', ': ' ) ) )
843 main.log.warn( "ONOS5 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800844 json.dumps( ONOS5FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800845 indent=4, separators=( ',', ': ' ) ) )
846 main.log.warn( "ONOS6 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800847 json.dumps( ONOS6FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800848 indent=4, separators=( ',', ': ' ) ) )
849 main.log.warn( "ONOS7 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800850 json.dumps( ONOS7FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800851 indent=4, separators=( ',', ': ' ) ) )
852 utilities.assert_equals(
853 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800854 actual=flowCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800855 onpass="The flow count is consistent across all ONOS nodes",
856 onfail="ONOS nodes have different flow counts" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800857
Jon Hall6aec96b2015-01-19 14:49:31 -0800858 main.step( "Get the OF Table entries" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800859 global flows
Jon Hall6aec96b2015-01-19 14:49:31 -0800860 flows = []
861 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800862 flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800863
Jon Hall6aec96b2015-01-19 14:49:31 -0800864 # TODO: Compare switch flow tables with ONOS flow tables
Jon Hall73cf9cc2014-11-20 22:28:38 -0800865
Jon Hall6aec96b2015-01-19 14:49:31 -0800866 main.step( "Start continuous pings" )
867 main.Mininet2.pingLong(
868 src=main.params[ 'PING' ][ 'source1' ],
869 target=main.params[ 'PING' ][ 'target1' ],
870 pingTime=500 )
871 main.Mininet2.pingLong(
872 src=main.params[ 'PING' ][ 'source2' ],
873 target=main.params[ 'PING' ][ 'target2' ],
874 pingTime=500 )
875 main.Mininet2.pingLong(
876 src=main.params[ 'PING' ][ 'source3' ],
877 target=main.params[ 'PING' ][ 'target3' ],
878 pingTime=500 )
879 main.Mininet2.pingLong(
880 src=main.params[ 'PING' ][ 'source4' ],
881 target=main.params[ 'PING' ][ 'target4' ],
882 pingTime=500 )
883 main.Mininet2.pingLong(
884 src=main.params[ 'PING' ][ 'source5' ],
885 target=main.params[ 'PING' ][ 'target5' ],
886 pingTime=500 )
887 main.Mininet2.pingLong(
888 src=main.params[ 'PING' ][ 'source6' ],
889 target=main.params[ 'PING' ][ 'target6' ],
890 pingTime=500 )
891 main.Mininet2.pingLong(
892 src=main.params[ 'PING' ][ 'source7' ],
893 target=main.params[ 'PING' ][ 'target7' ],
894 pingTime=500 )
895 main.Mininet2.pingLong(
896 src=main.params[ 'PING' ][ 'source8' ],
897 target=main.params[ 'PING' ][ 'target8' ],
898 pingTime=500 )
899 main.Mininet2.pingLong(
900 src=main.params[ 'PING' ][ 'source9' ],
901 target=main.params[ 'PING' ][ 'target9' ],
902 pingTime=500 )
903 main.Mininet2.pingLong(
904 src=main.params[ 'PING' ][ 'source10' ],
905 target=main.params[ 'PING' ][ 'target10' ],
906 pingTime=500 )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800907
Jon Hall6aec96b2015-01-19 14:49:31 -0800908 main.step( "Create TestONTopology object" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800909 ctrls = []
910 count = 1
911 while True:
912 temp = ()
Jon Hall6aec96b2015-01-19 14:49:31 -0800913 if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
914 temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
915 temp = temp + ( "ONOS" + str( count ), )
916 temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
917 temp = temp + \
918 ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
919 ctrls.append( temp )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800920 count = count + 1
921 else:
922 break
Jon Hall6aec96b2015-01-19 14:49:31 -0800923 MNTopo = TestONTopology(
924 main.Mininet1,
925 ctrls ) # can also add Intent API info for intent operations
Jon Hall73cf9cc2014-11-20 22:28:38 -0800926
Jon Hall6aec96b2015-01-19 14:49:31 -0800927 main.step( "Collecting topology information from ONOS" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800928 devices = []
929 devices.append( main.ONOScli1.devices() )
930 devices.append( main.ONOScli2.devices() )
931 devices.append( main.ONOScli3.devices() )
932 devices.append( main.ONOScli4.devices() )
933 devices.append( main.ONOScli5.devices() )
934 devices.append( main.ONOScli6.devices() )
935 devices.append( main.ONOScli7.devices() )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800936 hosts = []
Jon Hall6aec96b2015-01-19 14:49:31 -0800937 hosts.append( main.ONOScli1.hosts() )
938 hosts.append( main.ONOScli2.hosts() )
939 hosts.append( main.ONOScli3.hosts() )
940 hosts.append( main.ONOScli4.hosts() )
941 hosts.append( main.ONOScli5.hosts() )
942 hosts.append( main.ONOScli6.hosts() )
943 hosts.append( main.ONOScli7.hosts() )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800944 ports = []
945 ports.append( main.ONOScli1.ports() )
946 ports.append( main.ONOScli2.ports() )
947 ports.append( main.ONOScli3.ports() )
948 ports.append( main.ONOScli4.ports() )
949 ports.append( main.ONOScli5.ports() )
950 ports.append( main.ONOScli6.ports() )
951 ports.append( main.ONOScli7.ports() )
952 links = []
953 links.append( main.ONOScli1.links() )
954 links.append( main.ONOScli2.links() )
955 links.append( main.ONOScli3.links() )
956 links.append( main.ONOScli4.links() )
957 links.append( main.ONOScli5.links() )
958 links.append( main.ONOScli6.links() )
959 links.append( main.ONOScli7.links() )
Jon Hall94fd0472014-12-08 11:52:42 -0800960 clusters = []
961 clusters.append( main.ONOScli1.clusters() )
962 clusters.append( main.ONOScli2.clusters() )
963 clusters.append( main.ONOScli3.clusters() )
964 clusters.append( main.ONOScli4.clusters() )
965 clusters.append( main.ONOScli5.clusters() )
966 clusters.append( main.ONOScli6.clusters() )
967 clusters.append( main.ONOScli7.clusters() )
Jon Hall529a37f2015-01-28 10:02:00 -0800968 # Compare json objects for hosts and dataplane clusters
Jon Hall94fd0472014-12-08 11:52:42 -0800969
Jon Hall6aec96b2015-01-19 14:49:31 -0800970 # hosts
Jon Hall8f89dda2015-01-22 16:03:33 -0800971 consistentHostsResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800972 for controller in range( len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800973 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -0800974 if "Error" not in hosts[ controller ]:
975 if hosts[ controller ] == hosts[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -0800976 continue
Jon Hall6aec96b2015-01-19 14:49:31 -0800977 else: # hosts not consistent
978 main.log.report( "hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800979 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800980 " is inconsistent with ONOS1" )
981 main.log.warn( repr( hosts[ controller ] ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800982 consistentHostsResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800983
984 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800985 main.log.report( "Error in getting ONOS hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800986 controllerStr )
987 consistentHostsResult = main.FALSE
988 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800989 " hosts response: " +
990 repr( hosts[ controller ] ) )
991 utilities.assert_equals(
992 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800993 actual=consistentHostsResult,
Jon Hall6aec96b2015-01-19 14:49:31 -0800994 onpass="Hosts view is consistent across all ONOS nodes",
995 onfail="ONOS nodes have different views of hosts" )
Jon Hall94fd0472014-12-08 11:52:42 -0800996
Jon Hall6aec96b2015-01-19 14:49:31 -0800997 # Strongly connected clusters of devices
Jon Hall8f89dda2015-01-22 16:03:33 -0800998 consistentClustersResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800999 for controller in range( len( clusters ) ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001000 if "Error" not in clusters[ controller ]:
1001 if clusters[ controller ] == clusters[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001002 continue
Jon Hall6aec96b2015-01-19 14:49:31 -08001003 else: # clusters not consistent
1004 main.log.report( "clusters from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001005 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001006 " is inconsistent with ONOS1" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001007 consistentClustersResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -08001008
1009 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001010 main.log.report( "Error in getting dataplane clusters " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001011 "from ONOS" + controllerStr )
1012 consistentClustersResult = main.FALSE
1013 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001014 " clusters response: " +
1015 repr( clusters[ controller ] ) )
1016 utilities.assert_equals(
1017 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001018 actual=consistentClustersResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001019 onpass="Clusters view is consistent across all ONOS nodes",
1020 onfail="ONOS nodes have different views of clusters" )
1021 # there should always only be one cluster
Jon Hall8f89dda2015-01-22 16:03:33 -08001022 numClusters = len( json.loads( clusters[ 0 ] ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001023 utilities.assert_equals(
1024 expect=1,
Jon Hall8f89dda2015-01-22 16:03:33 -08001025 actual=numClusters,
Jon Hall6aec96b2015-01-19 14:49:31 -08001026 onpass="ONOS shows 1 SCC",
1027 onfail="ONOS shows " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001028 str( numClusters ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001029 " SCCs" )
Jon Hall94fd0472014-12-08 11:52:42 -08001030
Jon Hall6aec96b2015-01-19 14:49:31 -08001031 main.step( "Comparing ONOS topology to MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001032 devicesResults = main.TRUE
1033 portsResults = main.TRUE
1034 linksResults = main.TRUE
1035 for controller in range( numControllers ):
1036 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001037 if devices[ controller ] or "Error" not in devices[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001038 currentDevicesResult = main.Mininet1.compareSwitches(
Jon Hall6aec96b2015-01-19 14:49:31 -08001039 MNTopo,
1040 json.loads(
1041 devices[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001042 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001043 currentDevicesResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001044 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001045 actual=currentDevicesResult,
1046 onpass="ONOS" + controllerStr +
1047 " Switches view is correct",
1048 onfail="ONOS" + controllerStr +
1049 " Switches view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001050
Jon Hall6aec96b2015-01-19 14:49:31 -08001051 if ports[ controller ] or "Error" not in ports[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001052 currentPortsResult = main.Mininet1.comparePorts(
Jon Hall6aec96b2015-01-19 14:49:31 -08001053 MNTopo,
1054 json.loads(
1055 ports[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001056 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001057 currentPortsResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001058 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001059 actual=currentPortsResult,
1060 onpass="ONOS" + controllerStr +
1061 " ports view is correct",
1062 onfail="ONOS" + controllerStr +
1063 " ports view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001064
Jon Hall6aec96b2015-01-19 14:49:31 -08001065 if links[ controller ] or "Error" not in links[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001066 currentLinksResult = main.Mininet1.compareLinks(
Jon Hall6aec96b2015-01-19 14:49:31 -08001067 MNTopo,
1068 json.loads(
1069 links[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001070 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001071 currentLinksResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001072 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001073 actual=currentLinksResult,
1074 onpass="ONOS" + controllerStr +
1075 " links view is correct",
1076 onfail="ONOS" + controllerStr +
1077 " links view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001078
Jon Hall8f89dda2015-01-22 16:03:33 -08001079 devicesResults = devicesResults and currentDevicesResult
1080 portsResults = portsResults and currentPortsResult
1081 linksResults = linksResults and currentLinksResult
Jon Hall73cf9cc2014-11-20 22:28:38 -08001082
Jon Hall8f89dda2015-01-22 16:03:33 -08001083 topoResult = devicesResults and portsResults and linksResults\
Jon Hall529a37f2015-01-28 10:02:00 -08001084 and consistentHostsResult and consistentClustersResult
Jon Hall8f89dda2015-01-22 16:03:33 -08001085 utilities.assert_equals( expect=main.TRUE, actual=topoResult,
1086 onpass="Topology Check Test successful",
1087 onfail="Topology Check Test NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001088
Jon Hall8f89dda2015-01-22 16:03:33 -08001089 finalAssert = main.TRUE
1090 finalAssert = finalAssert and topoResult and flowCheck \
1091 and intentCheck and consistentMastership and rolesNotNull
1092 utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
1093 onpass="State check successful",
1094 onfail="State check NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001095
Jon Hall6aec96b2015-01-19 14:49:31 -08001096 def CASE6( self, main ):
1097 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001098 The Failure case.
Jon Hall6aec96b2015-01-19 14:49:31 -08001099 """
Jon Hall94fd0472014-12-08 11:52:42 -08001100 import time
Jon Hall6aec96b2015-01-19 14:49:31 -08001101 main.log.report( "Killing 3 ONOS nodes" )
1102 main.log.case( "Restart minority of ONOS nodes" )
1103 # TODO: Randomize these nodes
Jon Hall8f89dda2015-01-22 16:03:33 -08001104 main.ONOSbench.onosKill( ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001105 time.sleep( 10 )
Jon Hall8f89dda2015-01-22 16:03:33 -08001106 main.ONOSbench.onosKill( ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001107 time.sleep( 10 )
Jon Hall8f89dda2015-01-22 16:03:33 -08001108 main.ONOSbench.onosKill( ONOS3Ip )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001109
Jon Hall6aec96b2015-01-19 14:49:31 -08001110 main.step( "Checking if ONOS is up yet" )
Jon Hallffb386d2014-11-21 13:43:38 -08001111 count = 0
Jon Hall8f89dda2015-01-22 16:03:33 -08001112 onosIsupResult = main.FALSE
1113 while onosIsupResult == main.FALSE and count < 10:
1114 onos1Isup = main.ONOSbench.isup( ONOS1Ip )
1115 onos2Isup = main.ONOSbench.isup( ONOS2Ip )
1116 onos3Isup = main.ONOSbench.isup( ONOS3Ip )
1117 onosIsupResult = onos1Isup and onos2Isup and onos3Isup
Jon Hallffb386d2014-11-21 13:43:38 -08001118 count = count + 1
Jon Hall73cf9cc2014-11-20 22:28:38 -08001119 # TODO: if it becomes an issue, we can retry this step a few times
1120
Jon Hall8f89dda2015-01-22 16:03:33 -08001121 cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
1122 cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
1123 cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
1124 cliResults = cliResult1 and cliResult2 and cliResult3
Jon Hall73cf9cc2014-11-20 22:28:38 -08001125
Jon Hall21270ac2015-02-16 17:59:55 -08001126 # Grab the time of restart so we chan check how long the gossip
1127 # protocol has had time to work
1128 main.restartTime = time.time()
Jon Hall8f89dda2015-01-22 16:03:33 -08001129 caseResults = main.TRUE and onosIsupResult and cliResults
1130 utilities.assert_equals( expect=main.TRUE, actual=caseResults,
1131 onpass="ONOS restart successful",
1132 onfail="ONOS restart NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001133
Jon Hall6aec96b2015-01-19 14:49:31 -08001134 def CASE7( self, main ):
1135 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001136 Check state after ONOS failure
Jon Hall6aec96b2015-01-19 14:49:31 -08001137 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001138 import json
Jon Hall6aec96b2015-01-19 14:49:31 -08001139 main.case( "Running ONOS Constant State Tests" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001140
Jon Hall6aec96b2015-01-19 14:49:31 -08001141 # Assert that each device has a master
Jon Hall8f89dda2015-01-22 16:03:33 -08001142 ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
1143 ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
1144 ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
1145 ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
1146 ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
1147 ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
1148 ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
1149 rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
1150 ONOS3MasterNotNull and ONOS4MasterNotNull and\
1151 ONOS5MasterNotNull and ONOS6MasterNotNull and\
1152 ONOS7MasterNotNull
Jon Hall6aec96b2015-01-19 14:49:31 -08001153 utilities.assert_equals(
1154 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001155 actual=rolesNotNull,
Jon Hall6aec96b2015-01-19 14:49:31 -08001156 onpass="Each device has a master",
1157 onfail="Some devices don't have a master assigned" )
Jon Hall94fd0472014-12-08 11:52:42 -08001158
Jon Hall6aec96b2015-01-19 14:49:31 -08001159 main.step( "Check if switch roles are consistent across all nodes" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001160 ONOS1Mastership = main.ONOScli1.roles()
1161 ONOS2Mastership = main.ONOScli2.roles()
1162 ONOS3Mastership = main.ONOScli3.roles()
1163 ONOS4Mastership = main.ONOScli4.roles()
1164 ONOS5Mastership = main.ONOScli5.roles()
1165 ONOS6Mastership = main.ONOScli6.roles()
1166 ONOS7Mastership = main.ONOScli7.roles()
Jon Hall8f89dda2015-01-22 16:03:33 -08001167 if "Error" in ONOS1Mastership or not ONOS1Mastership\
1168 or "Error" in ONOS2Mastership or not ONOS2Mastership\
1169 or "Error" in ONOS3Mastership or not ONOS3Mastership\
1170 or "Error" in ONOS4Mastership or not ONOS4Mastership\
1171 or "Error" in ONOS5Mastership or not ONOS5Mastership\
1172 or "Error" in ONOS6Mastership or not ONOS6Mastership\
1173 or "Error" in ONOS7Mastership or not ONOS7Mastership:
Jon Hall6aec96b2015-01-19 14:49:31 -08001174 main.log.error( "Error in getting ONOS mastership" )
1175 main.log.warn( "ONOS1 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001176 repr( ONOS1Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001177 main.log.warn( "ONOS2 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001178 repr( ONOS2Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001179 main.log.warn( "ONOS3 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001180 repr( ONOS3Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001181 main.log.warn( "ONOS4 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001182 repr( ONOS4Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001183 main.log.warn( "ONOS5 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001184 repr( ONOS5Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001185 main.log.warn( "ONOS6 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001186 repr( ONOS6Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001187 main.log.warn( "ONOS7 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001188 repr( ONOS7Mastership ) )
1189 consistentMastership = main.FALSE
1190 elif ONOS1Mastership == ONOS2Mastership\
1191 and ONOS1Mastership == ONOS3Mastership\
1192 and ONOS1Mastership == ONOS4Mastership\
1193 and ONOS1Mastership == ONOS5Mastership\
1194 and ONOS1Mastership == ONOS6Mastership\
1195 and ONOS1Mastership == ONOS7Mastership:
1196 consistentMastership = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001197 main.log.report(
1198 "Switch roles are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001199 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001200 main.log.warn( "ONOS1 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001201 json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001202 separators=( ',', ': ' ) ) )
1203 main.log.warn( "ONOS2 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001204 json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001205 separators=( ',', ': ' ) ) )
1206 main.log.warn( "ONOS3 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001207 json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001208 separators=( ',', ': ' ) ) )
1209 main.log.warn( "ONOS4 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001210 json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001211 separators=( ',', ': ' ) ) )
1212 main.log.warn( "ONOS5 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001213 json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001214 separators=( ',', ': ' ) ) )
1215 main.log.warn( "ONOS6 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001216 json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001217 separators=( ',', ': ' ) ) )
1218 main.log.warn( "ONOS7 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001219 json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001220 separators=( ',', ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001221 consistentMastership = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001222 utilities.assert_equals(
1223 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001224 actual=consistentMastership,
Jon Hall6aec96b2015-01-19 14:49:31 -08001225 onpass="Switch roles are consistent across all ONOS nodes",
1226 onfail="ONOS nodes have different views of switch roles" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001227
1228 description2 = "Compare switch roles from before failure"
Jon Hall6aec96b2015-01-19 14:49:31 -08001229 main.step( description2 )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001230
Jon Hall8f89dda2015-01-22 16:03:33 -08001231 currentJson = json.loads( ONOS1Mastership )
1232 oldJson = json.loads( mastershipState )
1233 mastershipCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001234 for i in range( 1, 29 ):
1235 switchDPID = str(
1236 main.Mininet1.getSwitchDPID(
1237 switch="s" +
1238 str( i ) ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001239
Jon Hall8f89dda2015-01-22 16:03:33 -08001240 current = [ switch[ 'master' ] for switch in currentJson
Jon Hall6aec96b2015-01-19 14:49:31 -08001241 if switchDPID in switch[ 'id' ] ]
Jon Hall8f89dda2015-01-22 16:03:33 -08001242 old = [ switch[ 'master' ] for switch in oldJson
Jon Hall6aec96b2015-01-19 14:49:31 -08001243 if switchDPID in switch[ 'id' ] ]
Jon Hall73cf9cc2014-11-20 22:28:38 -08001244 if current == old:
Jon Hall8f89dda2015-01-22 16:03:33 -08001245 mastershipCheck = mastershipCheck and main.TRUE
Jon Hall73cf9cc2014-11-20 22:28:38 -08001246 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001247 main.log.warn( "Mastership of switch %s changed" % switchDPID )
Jon Hall8f89dda2015-01-22 16:03:33 -08001248 mastershipCheck = main.FALSE
1249 if mastershipCheck == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001250 main.log.report( "Mastership of Switches was not changed" )
1251 utilities.assert_equals(
1252 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001253 actual=mastershipCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -08001254 onpass="Mastership of Switches was not changed",
1255 onfail="Mastership of some switches changed" )
1256 # NOTE: we expect mastership to change on controller failure
Jon Hall8f89dda2015-01-22 16:03:33 -08001257 mastershipCheck = consistentMastership
Jon Hall73cf9cc2014-11-20 22:28:38 -08001258
Jon Hall21270ac2015-02-16 17:59:55 -08001259 while True:
1260 whileTime = time.time() - main.restartTime
1261 # Gossip store
1262 main.step( "Get the intents and compare across all nodes" )
1263 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
1264 ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
1265 ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
1266 ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
1267 ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
1268 ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
1269 ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
1270 intentCheck = main.FALSE
1271 if "Error" in ONOS1Intents or not ONOS1Intents\
1272 or "Error" in ONOS2Intents or not ONOS2Intents\
1273 or "Error" in ONOS3Intents or not ONOS3Intents\
1274 or "Error" in ONOS4Intents or not ONOS4Intents\
1275 or "Error" in ONOS5Intents or not ONOS5Intents\
1276 or "Error" in ONOS6Intents or not ONOS6Intents\
1277 or "Error" in ONOS7Intents or not ONOS7Intents:
1278 main.log.report( "Error in getting ONOS intents" )
1279 main.log.warn( "ONOS1 intents response: " +
1280 repr( ONOS1Intents ) )
1281 main.log.warn( "ONOS2 intents response: " +
1282 repr( ONOS2Intents ) )
1283 main.log.warn( "ONOS3 intents response: " +
1284 repr( ONOS3Intents ) )
1285 main.log.warn( "ONOS4 intents response: " +
1286 repr( ONOS4Intents ) )
1287 main.log.warn( "ONOS5 intents response: " +
1288 repr( ONOS5Intents ) )
1289 main.log.warn( "ONOS6 intents response: " +
1290 repr( ONOS6Intents ) )
1291 main.log.warn( "ONOS7 intents response: " +
1292 repr( ONOS7Intents ) )
1293 elif ONOS1Intents == ONOS2Intents\
1294 and ONOS1Intents == ONOS3Intents\
1295 and ONOS1Intents == ONOS4Intents\
1296 and ONOS1Intents == ONOS5Intents\
1297 and ONOS1Intents == ONOS6Intents\
1298 and ONOS1Intents == ONOS7Intents:
1299 intentCheck = main.TRUE
1300 main.log.report( "Intents are consistent across all" +
1301 " ONOS nodes" )
1302 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001303 main.log.warn( "ONOS1 intents: " )
Jon Hall21270ac2015-02-16 17:59:55 -08001304 print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
1305 indent=4, separators=( ',', ': ' ) )
1306 main.log.warn( "ONOS2 intents: " )
1307 print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
1308 indent=4, separators=( ',', ': ' ) )
1309 main.log.warn( "ONOS3 intents: " )
1310 print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
1311 indent=4, separators=( ',', ': ' ) )
1312 main.log.warn( "ONOS4 intents: " )
1313 print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
1314 indent=4, separators=( ',', ': ' ) )
1315 main.log.warn( "ONOS5 intents: " )
1316 print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
1317 indent=4, separators=( ',', ': ' ) )
1318 main.log.warn( "ONOS6 intents: " )
1319 print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
1320 indent=4, separators=( ',', ': ' ) )
1321 main.log.warn( "ONOS7 intents: " )
1322 print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
1323 indent=4, separators=( ',', ': ' ) )
1324 utilities.assert_equals(
1325 expect=main.TRUE,
1326 actual=intentCheck,
1327 onpass="Intents are consistent across all ONOS nodes",
1328 onfail="ONOS nodes have different views of intents" )
1329 # Print the intent states
1330 intents = []
1331 intents.append( ONOS1Intents )
1332 intents.append( ONOS2Intents )
1333 intents.append( ONOS3Intents )
1334 intents.append( ONOS4Intents )
1335 intents.append( ONOS5Intents )
1336 intents.append( ONOS6Intents )
1337 intents.append( ONOS7Intents )
1338 intentStates = []
1339 for node in intents: # Iter through ONOS nodes
1340 nodeStates = []
1341 # Iter through intents of a node
1342 for intent in json.loads( node ):
1343 nodeStates.append( intent[ 'state' ] )
1344 intentStates.append( nodeStates )
1345 out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
1346 main.log.info( dict( out ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001347
Jon Hall21270ac2015-02-16 17:59:55 -08001348
1349 # NOTE: Store has no durability, so intents are lost across system
1350 # restarts
1351 main.step( "Compare current intents with intents before the failure" )
1352 # NOTE: this requires case 5 to pass for intentState to be set.
1353 # maybe we should stop the test if that fails?
1354 sameIntents = main.TRUE
1355 if intentState and intentState == ONOS1Intents:
1356 sameIntents = main.TRUE
1357 main.log.report( "Intents are consistent with before failure" )
1358 # TODO: possibly the states have changed? we may need to figure out
1359 # what the aceptable states are
1360 else:
1361 try:
1362 main.log.warn( "ONOS1 intents: " )
1363 print json.dumps( json.loads( ONOS1Intents ),
1364 sort_keys=True, indent=4,
1365 separators=( ',', ': ' ) )
1366 except:
1367 pass
1368 sameIntents = main.FALSE
1369 utilities.assert_equals(
1370 expect=main.TRUE,
1371 actual=sameIntents,
1372 onpass="Intents are consistent with before failure",
1373 onfail="The Intents changed during failure" )
1374 intentCheck = intentCheck and sameIntents
1375
1376 main.step( "Get the OF Table entries and compare to before " +
1377 "component failure" )
1378 FlowTables = main.TRUE
1379 flows2 = []
1380 for i in range( 28 ):
1381 main.log.info( "Checking flow table on s" + str( i + 1 ) )
1382 tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
1383 flows2.append( tmpFlows )
1384 tempResult = main.Mininet2.flowComp(
1385 flow1=flows[ i ],
1386 flow2=tmpFlows )
1387 FlowTables = FlowTables and tempResult
1388 if FlowTables == main.FALSE:
1389 main.log.info( "Differences in flow table for switch: s" +
1390 str( i + 1 ) )
1391 if FlowTables == main.TRUE:
1392 main.log.report( "No changes were found in the flow tables" )
1393 utilities.assert_equals(
1394 expect=main.TRUE,
1395 actual=FlowTables,
1396 onpass="No changes were found in the flow tables",
1397 onfail="Changes were found in the flow tables" )
1398 if topoResult == main.TRUE or ( whileTime > 10 ) :
1399 break
Jon Hall73cf9cc2014-11-20 22:28:38 -08001400
Jon Hall6aec96b2015-01-19 14:49:31 -08001401 main.step( "Check the continuous pings to ensure that no packets " +
1402 "were dropped during component failure" )
1403 # FIXME: This check is always failing. Investigate cause
1404 # NOTE: this may be something to do with file permsissions
Jon Hall73cf9cc2014-11-20 22:28:38 -08001405 # or slight change in format
Jon Hall6aec96b2015-01-19 14:49:31 -08001406 main.Mininet2.pingKill(
1407 main.params[ 'TESTONUSER' ],
1408 main.params[ 'TESTONIP' ] )
Jon Hall8f89dda2015-01-22 16:03:33 -08001409 LossInPings = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001410 # NOTE: checkForLoss returns main.FALSE with 0% packet loss
1411 for i in range( 8, 18 ):
1412 main.log.info(
1413 "Checking for a loss in pings along flow from s" +
1414 str( i ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001415 LossInPings = main.Mininet2.checkForLoss(
Jon Hall6aec96b2015-01-19 14:49:31 -08001416 "/tmp/ping.h" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001417 str( i ) ) or LossInPings
1418 if LossInPings == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001419 main.log.info( "Loss in ping detected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001420 elif LossInPings == main.ERROR:
Jon Hall6aec96b2015-01-19 14:49:31 -08001421 main.log.info( "There are multiple mininet process running" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001422 elif LossInPings == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001423 main.log.info( "No Loss in the pings" )
1424 main.log.report( "No loss of dataplane connectivity" )
1425 utilities.assert_equals(
1426 expect=main.FALSE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001427 actual=LossInPings,
Jon Hall6aec96b2015-01-19 14:49:31 -08001428 onpass="No Loss of connectivity",
1429 onfail="Loss of dataplane connectivity detected" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001430
Jon Hall6aec96b2015-01-19 14:49:31 -08001431 # Test of LeadershipElection
Jon Hall8f89dda2015-01-22 16:03:33 -08001432 leaderList = []
1433 leaderResult = main.TRUE
1434 for controller in range( 1, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001435 # loop through ONOScli handlers
1436 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001437 leaderN = node.electionTestLeader()
1438 leaderList.append( leaderN )
Jon Hall669173b2014-12-17 11:36:30 -08001439 if leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001440 # error in response
1441 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001442 "electionTestLeader function, check the" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001443 " error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001444 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001445 elif leaderN is None:
1446 main.log.report( "ONOS" + str( controller ) +
1447 " shows no leader for the election-app was" +
1448 " elected after the old one died" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001449 leaderResult = main.FALSE
1450 elif leaderN == ONOS1Ip or leaderN == ONOS2Ip or\
1451 leaderN == ONOS3Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001452 main.log.report( "ONOS" + str( controller ) +
1453 " shows " + str( leaderN ) +
1454 " as leader for the election-app, but it " +
1455 "was restarted" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001456 leaderResult = main.FALSE
1457 if len( set( leaderList ) ) != 1:
1458 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001459 main.log.error(
1460 "Inconsistent view of leader for the election test app" )
1461 # TODO: print the list
Jon Hall8f89dda2015-01-22 16:03:33 -08001462 if leaderResult:
1463 main.log.report( "Leadership election tests passed( consistent " +
Jon Hall6aec96b2015-01-19 14:49:31 -08001464 "view of leader across listeners and a new " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001465 "leader was re-elected if applicable )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001466 utilities.assert_equals(
1467 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001468 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001469 onpass="Leadership election passed",
1470 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08001471
Jon Hall8f89dda2015-01-22 16:03:33 -08001472 result = mastershipCheck and intentCheck and FlowTables and\
1473 ( not LossInPings ) and rolesNotNull and leaderResult
Jon Hall6aec96b2015-01-19 14:49:31 -08001474 result = int( result )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001475 if result == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001476 main.log.report( "Constant State Tests Passed" )
1477 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001478 onpass="Constant State Tests Passed",
1479 onfail="Constant state tests failed" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001480
Jon Hall6aec96b2015-01-19 14:49:31 -08001481 def CASE8( self, main ):
1482 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001483 Compare topo
Jon Hall6aec96b2015-01-19 14:49:31 -08001484 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001485 import sys
Jon Hall6aec96b2015-01-19 14:49:31 -08001486 # FIXME add this path to params
1487 sys.path.append( "/home/admin/sts" )
1488 # assumes that sts is already in you PYTHONPATH
1489 from sts.topology.teston_topology import TestONTopology
Jon Hall73cf9cc2014-11-20 22:28:38 -08001490 import json
1491 import time
1492
Jon Hall6aec96b2015-01-19 14:49:31 -08001493 description = "Compare ONOS Topology view to Mininet topology"
1494 main.case( description )
1495 main.log.report( description )
1496 main.step( "Create TestONTopology object" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001497 ctrls = []
1498 count = 1
1499 while True:
1500 temp = ()
Jon Hall6aec96b2015-01-19 14:49:31 -08001501 if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
1502 temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
1503 temp = temp + ( "ONOS" + str( count ), )
1504 temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
1505 temp = temp + \
1506 ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
1507 ctrls.append( temp )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001508 count = count + 1
1509 else:
1510 break
Jon Hall6aec96b2015-01-19 14:49:31 -08001511 MNTopo = TestONTopology(
1512 main.Mininet1,
1513 ctrls ) # can also add Intent API info for intent operations
Jon Hall73cf9cc2014-11-20 22:28:38 -08001514
Jon Hall6aec96b2015-01-19 14:49:31 -08001515 main.step( "Comparing ONOS topology to MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001516 devicesResults = main.TRUE
1517 portsResults = main.TRUE
1518 linksResults = main.TRUE
1519 topoResult = main.FALSE
Jon Hall73cf9cc2014-11-20 22:28:38 -08001520 elapsed = 0
Jon Hallffb386d2014-11-21 13:43:38 -08001521 count = 0
Jon Hall6aec96b2015-01-19 14:49:31 -08001522 main.step( "Collecting topology information from ONOS" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001523 startTime = time.time()
Jon Hall21270ac2015-02-16 17:59:55 -08001524 # Give time for Gossip to work
Jon Hall8f89dda2015-01-22 16:03:33 -08001525 while topoResult == main.FALSE and elapsed < 60:
Jon Hallffb386d2014-11-21 13:43:38 -08001526 count = count + 1
Jon Hall94fd0472014-12-08 11:52:42 -08001527 if count > 1:
Jon Hall6aec96b2015-01-19 14:49:31 -08001528 # TODO: Depricate STS usage
1529 MNTopo = TestONTopology(
1530 main.Mininet1,
1531 ctrls )
Jon Hall8f89dda2015-01-22 16:03:33 -08001532 cliStart = time.time()
Jon Hall94fd0472014-12-08 11:52:42 -08001533 devices = []
1534 devices.append( main.ONOScli1.devices() )
1535 devices.append( main.ONOScli2.devices() )
1536 devices.append( main.ONOScli3.devices() )
1537 devices.append( main.ONOScli4.devices() )
1538 devices.append( main.ONOScli5.devices() )
1539 devices.append( main.ONOScli6.devices() )
1540 devices.append( main.ONOScli7.devices() )
1541 hosts = []
Jon Hall669173b2014-12-17 11:36:30 -08001542 hosts.append( json.loads( main.ONOScli1.hosts() ) )
1543 hosts.append( json.loads( main.ONOScli2.hosts() ) )
1544 hosts.append( json.loads( main.ONOScli3.hosts() ) )
1545 hosts.append( json.loads( main.ONOScli4.hosts() ) )
1546 hosts.append( json.loads( main.ONOScli5.hosts() ) )
1547 hosts.append( json.loads( main.ONOScli6.hosts() ) )
1548 hosts.append( json.loads( main.ONOScli7.hosts() ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001549 for controller in range( 0, len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001550 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001551 for host in hosts[ controller ]:
Jon Hall6aec96b2015-01-19 14:49:31 -08001552 if host[ 'ips' ] == []:
1553 main.log.error(
1554 "DEBUG:Error with host ips on controller" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001555 controllerStr + ": " + str( host ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001556 ports = []
1557 ports.append( main.ONOScli1.ports() )
1558 ports.append( main.ONOScli2.ports() )
1559 ports.append( main.ONOScli3.ports() )
1560 ports.append( main.ONOScli4.ports() )
1561 ports.append( main.ONOScli5.ports() )
1562 ports.append( main.ONOScli6.ports() )
1563 ports.append( main.ONOScli7.ports() )
1564 links = []
1565 links.append( main.ONOScli1.links() )
1566 links.append( main.ONOScli2.links() )
1567 links.append( main.ONOScli3.links() )
1568 links.append( main.ONOScli4.links() )
1569 links.append( main.ONOScli5.links() )
1570 links.append( main.ONOScli6.links() )
1571 links.append( main.ONOScli7.links() )
1572 clusters = []
1573 clusters.append( main.ONOScli1.clusters() )
1574 clusters.append( main.ONOScli2.clusters() )
1575 clusters.append( main.ONOScli3.clusters() )
1576 clusters.append( main.ONOScli4.clusters() )
1577 clusters.append( main.ONOScli5.clusters() )
1578 clusters.append( main.ONOScli6.clusters() )
1579 clusters.append( main.ONOScli7.clusters() )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001580
Jon Hall8f89dda2015-01-22 16:03:33 -08001581 elapsed = time.time() - startTime
1582 cliTime = time.time() - cliStart
1583 print "CLI time: " + str( cliTime )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001584
Jon Hall8f89dda2015-01-22 16:03:33 -08001585 for controller in range( numControllers ):
1586 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001587 if devices[ controller ] or "Error" not in devices[
1588 controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001589 currentDevicesResult = main.Mininet1.compareSwitches(
Jon Hall6aec96b2015-01-19 14:49:31 -08001590 MNTopo,
1591 json.loads(
1592 devices[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001593 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001594 currentDevicesResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001595 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001596 actual=currentDevicesResult,
1597 onpass="ONOS" + controllerStr +
1598 " Switches view is correct",
1599 onfail="ONOS" + controllerStr +
1600 " Switches view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001601
Jon Hall6aec96b2015-01-19 14:49:31 -08001602 if ports[ controller ] or "Error" not in ports[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001603 currentPortsResult = main.Mininet1.comparePorts(
Jon Hall6aec96b2015-01-19 14:49:31 -08001604 MNTopo,
1605 json.loads(
1606 ports[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001607 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001608 currentPortsResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001609 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001610 actual=currentPortsResult,
1611 onpass="ONOS" + controllerStr +
1612 " ports view is correct",
1613 onfail="ONOS" + controllerStr +
1614 " ports view is incorrect" )
Jon Hall94fd0472014-12-08 11:52:42 -08001615
Jon Hall6aec96b2015-01-19 14:49:31 -08001616 if links[ controller ] or "Error" not in links[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001617 currentLinksResult = main.Mininet1.compareLinks(
Jon Hall6aec96b2015-01-19 14:49:31 -08001618 MNTopo,
1619 json.loads(
1620 links[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001621 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001622 currentLinksResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001623 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001624 actual=currentLinksResult,
1625 onpass="ONOS" + controllerStr +
1626 " links view is correct",
1627 onfail="ONOS" + controllerStr +
1628 " links view is incorrect" )
1629 devicesResults = devicesResults and currentDevicesResult
1630 portsResults = portsResults and currentPortsResult
1631 linksResults = linksResults and currentLinksResult
Jon Hall94fd0472014-12-08 11:52:42 -08001632
Jon Hall529a37f2015-01-28 10:02:00 -08001633 # Compare json objects for hosts and dataplane clusters
Jon Hall94fd0472014-12-08 11:52:42 -08001634
Jon Hall6aec96b2015-01-19 14:49:31 -08001635 # hosts
Jon Hall8f89dda2015-01-22 16:03:33 -08001636 consistentHostsResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -08001637 for controller in range( len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001638 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001639 if "Error" not in hosts[ controller ]:
1640 if hosts[ controller ] == hosts[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001641 continue
Jon Hall6aec96b2015-01-19 14:49:31 -08001642 else: # hosts not consistent
Jon Hall8f89dda2015-01-22 16:03:33 -08001643 main.log.report( "hosts from ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001644 " is inconsistent with ONOS1" )
1645 main.log.warn( repr( hosts[ controller ] ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001646 consistentHostsResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -08001647
1648 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001649 main.log.report( "Error in getting ONOS hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001650 controllerStr )
1651 consistentHostsResult = main.FALSE
1652 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001653 " hosts response: " +
1654 repr( hosts[ controller ] ) )
1655 utilities.assert_equals(
1656 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001657 actual=consistentHostsResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001658 onpass="Hosts view is consistent across all ONOS nodes",
1659 onfail="ONOS nodes have different views of hosts" )
Jon Hall94fd0472014-12-08 11:52:42 -08001660
Jon Hall6aec96b2015-01-19 14:49:31 -08001661 # Strongly connected clusters of devices
Jon Hall8f89dda2015-01-22 16:03:33 -08001662 consistentClustersResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -08001663 for controller in range( len( clusters ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001664 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001665 if "Error" not in clusters[ controller ]:
1666 if clusters[ controller ] == clusters[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001667 continue
Jon Hall6aec96b2015-01-19 14:49:31 -08001668 else: # clusters not consistent
1669 main.log.report( "clusters from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001670 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001671 " is inconsistent with ONOS1" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001672 consistentClustersResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -08001673
1674 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001675 main.log.report( "Error in getting dataplane clusters " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001676 "from ONOS" + controllerStr )
1677 consistentClustersResult = main.FALSE
1678 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001679 " clusters response: " +
1680 repr( clusters[ controller ] ) )
1681 utilities.assert_equals(
1682 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001683 actual=consistentClustersResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001684 onpass="Clusters view is consistent across all ONOS nodes",
1685 onfail="ONOS nodes have different views of clusters" )
1686 # there should always only be one cluster
Jon Hall8f89dda2015-01-22 16:03:33 -08001687 numClusters = len( json.loads( clusters[ 0 ] ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001688 utilities.assert_equals(
1689 expect=1,
Jon Hall8f89dda2015-01-22 16:03:33 -08001690 actual=numClusters,
Jon Hall6aec96b2015-01-19 14:49:31 -08001691 onpass="ONOS shows 1 SCC",
1692 onfail="ONOS shows " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001693 str( numClusters ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001694 " SCCs" )
Jon Hall94fd0472014-12-08 11:52:42 -08001695
Jon Hall8f89dda2015-01-22 16:03:33 -08001696 topoResult = ( devicesResults and portsResults and linksResults
1697 and consistentHostsResult
Jon Hall529a37f2015-01-28 10:02:00 -08001698 and consistentClustersResult )
Jon Hall94fd0472014-12-08 11:52:42 -08001699
Jon Hall8f89dda2015-01-22 16:03:33 -08001700 topoResult = topoResult and int( count <= 2 )
1701 note = "note it takes about " + str( int( cliTime ) ) + \
1702 " seconds for the test to make all the cli calls to fetch " +\
1703 "the topology from each ONOS instance"
Jon Hall1b8f54a2015-02-04 13:24:20 -08001704 main.log.info(
Jon Hall8f89dda2015-01-22 16:03:33 -08001705 "Very crass estimate for topology discovery/convergence( " +
1706 str( note ) + " ): " + str( elapsed ) + " seconds, " +
Jon Hall6aec96b2015-01-19 14:49:31 -08001707 str( count ) + " tries" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001708 utilities.assert_equals( expect=main.TRUE, actual=topoResult,
1709 onpass="Topology Check Test successful",
1710 onfail="Topology Check Test NOT successful" )
1711 if topoResult == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001712 main.log.report( "ONOS topology view matches Mininet topology" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001713
Jon Hall6aec96b2015-01-19 14:49:31 -08001714 def CASE9( self, main ):
1715 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001716 Link s3-s28 down
Jon Hall6aec96b2015-01-19 14:49:31 -08001717 """
1718 import time
1719 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001720
Jon Hall8f89dda2015-01-22 16:03:33 -08001721 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001722
Jon Hall6aec96b2015-01-19 14:49:31 -08001723 description = "Turn off a link to ensure that Link Discovery " +\
Jon Hall8f89dda2015-01-22 16:03:33 -08001724 "is working properly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001725 main.log.report( description )
1726 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001727
Jon Hall6aec96b2015-01-19 14:49:31 -08001728 main.step( "Kill Link between s3 and s28" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001729 LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001730 main.log.info(
1731 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001732 str( linkSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001733 " seconds for link down to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001734 time.sleep( linkSleep )
1735 utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
1736 onpass="Link down succesful",
1737 onfail="Failed to bring link down" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001738 # TODO do some sort of check here
Jon Hall73cf9cc2014-11-20 22:28:38 -08001739
Jon Hall6aec96b2015-01-19 14:49:31 -08001740 def CASE10( self, main ):
1741 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001742 Link s3-s28 up
Jon Hall6aec96b2015-01-19 14:49:31 -08001743 """
1744 import time
1745 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001746
Jon Hall8f89dda2015-01-22 16:03:33 -08001747 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001748
Jon Hall6aec96b2015-01-19 14:49:31 -08001749 description = "Restore a link to ensure that Link Discovery is " + \
Jon Hall8f89dda2015-01-22 16:03:33 -08001750 "working properly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001751 main.log.report( description )
1752 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001753
Jon Hall6aec96b2015-01-19 14:49:31 -08001754 main.step( "Bring link between s3 and s28 back up" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001755 LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001756 main.log.info(
1757 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001758 str( linkSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001759 " seconds for link up to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001760 time.sleep( linkSleep )
1761 utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
1762 onpass="Link up succesful",
1763 onfail="Failed to bring link up" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001764 # TODO do some sort of check here
Jon Hall73cf9cc2014-11-20 22:28:38 -08001765
Jon Hall6aec96b2015-01-19 14:49:31 -08001766 def CASE11( self, main ):
1767 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001768 Switch Down
Jon Hall6aec96b2015-01-19 14:49:31 -08001769 """
1770 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001771 import time
1772
Jon Hall8f89dda2015-01-22 16:03:33 -08001773 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001774
1775 description = "Killing a switch to ensure it is discovered correctly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001776 main.log.report( description )
1777 main.case( description )
1778 switch = main.params[ 'kill' ][ 'switch' ]
1779 switchDPID = main.params[ 'kill' ][ 'dpid' ]
Jon Hall73cf9cc2014-11-20 22:28:38 -08001780
Jon Hall6aec96b2015-01-19 14:49:31 -08001781 # TODO: Make this switch parameterizable
1782 main.step( "Kill " + switch )
1783 main.log.report( "Deleting " + switch )
Jon Hall8f89dda2015-01-22 16:03:33 -08001784 main.Mininet1.delSwitch( switch )
1785 main.log.info( "Waiting " + str( switchSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001786 " seconds for switch down to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001787 time.sleep( switchSleep )
1788 device = main.ONOScli1.getDevice( dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001789 # Peek at the deleted switch
1790 main.log.warn( str( device ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001791 result = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001792 if device and device[ 'available' ] is False:
Jon Hall94fd0472014-12-08 11:52:42 -08001793 result = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001794 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001795 onpass="Kill switch succesful",
1796 onfail="Failed to kill switch?" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001797
Jon Hall6aec96b2015-01-19 14:49:31 -08001798 def CASE12( self, main ):
1799 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001800 Switch Up
Jon Hall6aec96b2015-01-19 14:49:31 -08001801 """
1802 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001803 import time
Jon Hall669173b2014-12-17 11:36:30 -08001804
Jon Hall8f89dda2015-01-22 16:03:33 -08001805 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
Jon Hall6aec96b2015-01-19 14:49:31 -08001806 switch = main.params[ 'kill' ][ 'switch' ]
1807 switchDPID = main.params[ 'kill' ][ 'dpid' ]
1808 links = main.params[ 'kill' ][ 'links' ].split()
Jon Hall73cf9cc2014-11-20 22:28:38 -08001809 description = "Adding a switch to ensure it is discovered correctly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001810 main.log.report( description )
1811 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001812
Jon Hall6aec96b2015-01-19 14:49:31 -08001813 main.step( "Add back " + switch )
1814 main.log.report( "Adding back " + switch )
Jon Hall8f89dda2015-01-22 16:03:33 -08001815 main.Mininet1.addSwitch( switch, dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001816 # TODO: New dpid or same? Ask Thomas?
1817 for peer in links:
Jon Hall8f89dda2015-01-22 16:03:33 -08001818 main.Mininet1.addLink( switch, peer )
1819 main.Mininet1.assignSwController(
Jon Hall6aec96b2015-01-19 14:49:31 -08001820 sw=switch.split( 's' )[ 1 ],
Jon Hall8f89dda2015-01-22 16:03:33 -08001821 count=numControllers,
1822 ip1=ONOS1Ip,
1823 port1=ONOS1Port,
1824 ip2=ONOS2Ip,
1825 port2=ONOS2Port,
1826 ip3=ONOS3Ip,
1827 port3=ONOS3Port,
1828 ip4=ONOS4Ip,
1829 port4=ONOS4Port,
1830 ip5=ONOS5Ip,
1831 port5=ONOS5Port,
1832 ip6=ONOS6Ip,
1833 port6=ONOS6Port,
1834 ip7=ONOS7Ip,
1835 port7=ONOS7Port )
Jon Hall6aec96b2015-01-19 14:49:31 -08001836 main.log.info(
1837 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001838 str( switchSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001839 " seconds for switch up to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001840 time.sleep( switchSleep )
1841 device = main.ONOScli1.getDevice( dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001842 # Peek at the deleted switch
1843 main.log.warn( str( device ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001844 result = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001845 if device and device[ 'available' ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001846 result = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001847 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001848 onpass="add switch succesful",
1849 onfail="Failed to add switch?" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001850
Jon Hall6aec96b2015-01-19 14:49:31 -08001851 def CASE13( self, main ):
1852 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001853 Clean up
Jon Hall6aec96b2015-01-19 14:49:31 -08001854 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001855 import os
1856 import time
Jon Hall6aec96b2015-01-19 14:49:31 -08001857 # TODO: make use of this elsewhere
1858 ips = []
Jon Hall8f89dda2015-01-22 16:03:33 -08001859 ips.append( ONOS1Ip )
1860 ips.append( ONOS2Ip )
1861 ips.append( ONOS3Ip )
1862 ips.append( ONOS4Ip )
1863 ips.append( ONOS5Ip )
1864 ips.append( ONOS6Ip )
1865 ips.append( ONOS7Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001866
1867 # printing colors to terminal
Jon Hall669173b2014-12-17 11:36:30 -08001868 colors = {}
Jon Hall6aec96b2015-01-19 14:49:31 -08001869 colors[ 'cyan' ] = '\033[96m'
1870 colors[ 'purple' ] = '\033[95m'
1871 colors[ 'blue' ] = '\033[94m'
1872 colors[ 'green' ] = '\033[92m'
1873 colors[ 'yellow' ] = '\033[93m'
1874 colors[ 'red' ] = '\033[91m'
1875 colors[ 'end' ] = '\033[0m'
Jon Hall73cf9cc2014-11-20 22:28:38 -08001876 description = "Test Cleanup"
Jon Hall6aec96b2015-01-19 14:49:31 -08001877 main.log.report( description )
1878 main.case( description )
1879 main.step( "Killing tcpdumps" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001880 main.Mininet2.stopTcpdump()
Jon Hall73cf9cc2014-11-20 22:28:38 -08001881
Jon Hall6aec96b2015-01-19 14:49:31 -08001882 main.step( "Checking ONOS Logs for errors" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001883 for i in range( 7 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001884 print colors[ 'purple' ] + "Checking logs for errors on " + \
Jon Hall8f89dda2015-01-22 16:03:33 -08001885 "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
1886 print main.ONOSbench.checkLogs( ips[ i ] )
Jon Hall94fd0472014-12-08 11:52:42 -08001887
Jon Hall6aec96b2015-01-19 14:49:31 -08001888 main.step( "Copying MN pcap and ONOS log files to test station" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001889 testname = main.TEST
Jon Hall8f89dda2015-01-22 16:03:33 -08001890 teststationUser = main.params[ 'TESTONUSER' ]
1891 teststationIP = main.params[ 'TESTONIP' ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001892 # NOTE: MN Pcap file is being saved to ~/packet_captures
Jon Hall73cf9cc2014-11-20 22:28:38 -08001893 # scp this file as MN and TestON aren't necessarily the same vm
Jon Hall6aec96b2015-01-19 14:49:31 -08001894 # FIXME: scp
1895 # mn files
1896 # TODO: Load these from params
1897 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001898 logFolder = "/opt/onos/log/"
1899 logFiles = [ "karaf.log", "karaf.log.1" ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001900 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001901 dstDir = "~/packet_captures/"
1902 for f in logFiles:
1903 for i in range( 7 ):
1904 main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
1905 logFolder + f + " " +
1906 teststationUser + "@" +
1907 teststationIP + ":" +
1908 dstDir + str( testname ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001909 "-ONOS" + str( i + 1 ) + "-" +
1910 f )
1911 # std*.log's
1912 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001913 logFolder = "/opt/onos/var/"
1914 logFiles = [ "stderr.log", "stdout.log" ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001915 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001916 dstDir = "~/packet_captures/"
1917 for f in logFiles:
1918 for i in range( 7 ):
1919 main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
1920 logFolder + f + " " +
1921 teststationUser + "@" +
1922 teststationIP + ":" +
1923 dstDir + str( testname ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001924 "-ONOS" + str( i + 1 ) + "-" +
1925 f )
1926 # sleep so scp can finish
1927 time.sleep( 10 )
1928 main.step( "Packing and rotating pcap archives" )
1929 os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001930
Jon Hall6aec96b2015-01-19 14:49:31 -08001931 # TODO: actually check something here
1932 utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001933 onpass="Test cleanup successful",
1934 onfail="Test cleanup NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001935
Jon Hall6aec96b2015-01-19 14:49:31 -08001936 def CASE14( self, main ):
1937 """
Jon Hall669173b2014-12-17 11:36:30 -08001938 start election app on all onos nodes
Jon Hall6aec96b2015-01-19 14:49:31 -08001939 """
Jon Hall8f89dda2015-01-22 16:03:33 -08001940 leaderResult = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001941 # install app on onos 1
1942 main.log.info( "Install leadership election app" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001943 main.ONOScli1.featureInstall( "onos-app-election" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001944 # wait for election
1945 # check for leader
Jon Hall8f89dda2015-01-22 16:03:33 -08001946 leader = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08001947 # verify leader is ONOS1
Jon Hall8f89dda2015-01-22 16:03:33 -08001948 if leader == ONOS1Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001949 # all is well
Jon Hall669173b2014-12-17 11:36:30 -08001950 pass
Jon Hall6aec96b2015-01-19 14:49:31 -08001951 elif leader is None:
1952 # No leader elected
1953 main.log.report( "No leader was elected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001954 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001955 elif leader == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001956 # error in response
1957 # TODO: add check for "Command not found:" in the driver, this
1958 # means the app isn't loaded
Jon Hall8f89dda2015-01-22 16:03:33 -08001959 main.log.report( "Something is wrong with electionTestLeader" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001960 " function, check the error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001961 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001962 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001963 # error in response
1964 main.log.report(
Jon Hall8f89dda2015-01-22 16:03:33 -08001965 "Unexpected response from electionTestLeader function:'" +
1966 str( leader ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001967 "'" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001968 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001969
Jon Hall6aec96b2015-01-19 14:49:31 -08001970 # install on other nodes and check for leader.
1971 # Should be onos1 and each app should show the same leader
Jon Hall8f89dda2015-01-22 16:03:33 -08001972 for controller in range( 2, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001973 # loop through ONOScli handlers
1974 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001975 node.featureInstall( "onos-app-election" )
1976 leaderN = node.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08001977 # verify leader is ONOS1
Jon Hall8f89dda2015-01-22 16:03:33 -08001978 if leaderN == ONOS1Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001979 # all is well
Jon Hall669173b2014-12-17 11:36:30 -08001980 pass
1981 elif leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001982 # error in response
1983 # TODO: add check for "Command not found:" in the driver, this
1984 # means the app isn't loaded
1985 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001986 "electionTestLeader function, check the" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001987 " error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001988 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001989 elif leader != leaderN:
Jon Hall8f89dda2015-01-22 16:03:33 -08001990 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001991 main.log.report( "ONOS" + str( controller ) + " sees " +
1992 str( leaderN ) +
1993 " as the leader of the election app. Leader" +
1994 " should be " +
1995 str( leader ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001996 if leaderResult:
Jon Hall6aec96b2015-01-19 14:49:31 -08001997 main.log.report( "Leadership election tests passed( consistent " +
1998 "view of leader across listeners and a leader " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001999 "was elected )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08002000 utilities.assert_equals(
2001 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002002 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002003 onpass="Leadership election passed",
2004 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08002005
Jon Hall6aec96b2015-01-19 14:49:31 -08002006 def CASE15( self, main ):
2007 """
Jon Hall669173b2014-12-17 11:36:30 -08002008 Check that Leadership Election is still functional
Jon Hall6aec96b2015-01-19 14:49:31 -08002009 """
Jon Hall8f89dda2015-01-22 16:03:33 -08002010 leaderResult = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08002011 description = "Check that Leadership Election is still functional"
Jon Hall6aec96b2015-01-19 14:49:31 -08002012 main.log.report( description )
2013 main.case( description )
2014 main.step( "Find current leader and withdraw" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002015 leader = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08002016 # TODO: do some sanity checking on leader before using it
Jon Hall8f89dda2015-01-22 16:03:33 -08002017 withdrawResult = main.FALSE
2018 if leader == ONOS1Ip:
2019 oldLeader = getattr( main, "ONOScli1" )
2020 elif leader == ONOS2Ip:
2021 oldLeader = getattr( main, "ONOScli2" )
2022 elif leader == ONOS3Ip:
2023 oldLeader = getattr( main, "ONOScli3" )
2024 elif leader == ONOS4Ip:
2025 oldLeader = getattr( main, "ONOScli4" )
2026 elif leader == ONOS5Ip:
2027 oldLeader = getattr( main, "ONOScli5" )
2028 elif leader == ONOS6Ip:
2029 oldLeader = getattr( main, "ONOScli6" )
2030 elif leader == ONOS7Ip:
2031 oldLeader = getattr( main, "ONOScli7" )
Jon Hall6aec96b2015-01-19 14:49:31 -08002032 elif leader is None or leader == main.FALSE:
2033 main.log.report(
2034 "Leader for the election app should be an ONOS node," +
2035 "instead got '" +
Jon Hall8f89dda2015-01-22 16:03:33 -08002036 str( leader ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08002037 "'" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002038 leaderResult = main.FALSE
2039 withdrawResult = oldLeader.electionTestWithdraw()
Jon Hall6aec96b2015-01-19 14:49:31 -08002040 utilities.assert_equals(
2041 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002042 actual=withdrawResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002043 onpass="App was withdrawn from election",
2044 onfail="App was not withdrawn from election" )
Jon Hall669173b2014-12-17 11:36:30 -08002045
Jon Hall6aec96b2015-01-19 14:49:31 -08002046 main.step( "Make sure new leader is elected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002047 leaderList = []
2048 for controller in range( 1, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08002049 # loop through ONOScli handlers
2050 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08002051 leaderList.append( node.electionTestLeader() )
2052 for leaderN in leaderList:
Jon Hall669173b2014-12-17 11:36:30 -08002053 if leaderN == leader:
Jon Hall6aec96b2015-01-19 14:49:31 -08002054 main.log.report(
2055 "ONOS" +
2056 str( controller ) +
2057 " still sees " +
2058 str( leader ) +
2059 " as leader after they withdrew" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002060 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08002061 elif leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08002062 # error in response
2063 # TODO: add check for "Command not found:" in the driver, this
2064 # means the app isn't loaded
2065 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002066 "electionTestLeader function, " +
Jon Hall6aec96b2015-01-19 14:49:31 -08002067 "check the error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002068 leaderResult = main.FALSE
2069 consistentLeader = main.FALSE
2070 if len( set( leaderList ) ) == 1:
Jon Hall6aec96b2015-01-19 14:49:31 -08002071 main.log.info( "Each Election-app sees '" +
Jon Hall8f89dda2015-01-22 16:03:33 -08002072 str( leaderList[ 0 ] ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08002073 "' as the leader" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002074 consistentLeader = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08002075 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08002076 main.log.report(
2077 "Inconsistent responses for leader of Election-app:" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002078 for n in range( len( leaderList ) ):
Jon Hall6aec96b2015-01-19 14:49:31 -08002079 main.log.report( "ONOS" + str( n + 1 ) + " response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002080 str( leaderList[ n ] ) )
2081 if leaderResult:
2082 main.log.report( "Leadership election tests passed( consistent " +
Jon Hall6aec96b2015-01-19 14:49:31 -08002083 "view of leader across listeners and a new " +
2084 "leader was elected when the old leader " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002085 "resigned )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08002086 utilities.assert_equals(
2087 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002088 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002089 onpass="Leadership election passed",
2090 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08002091
Jon Hall6aec96b2015-01-19 14:49:31 -08002092 main.step(
Jon Hall8f89dda2015-01-22 16:03:33 -08002093 "Run for election on old leader( just so everyone is in the hat )" )
2094 runResult = oldLeader.electionTestRun()
Jon Hall6aec96b2015-01-19 14:49:31 -08002095 utilities.assert_equals(
2096 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002097 actual=runResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002098 onpass="App re-ran for election",
2099 onfail="App failed to run for election" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002100 if consistentLeader == main.TRUE:
2101 afterRun = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08002102 # verify leader didn't just change
Jon Hall8f89dda2015-01-22 16:03:33 -08002103 if afterRun == leaderList[ 0 ]:
2104 leaderResult = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08002105 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08002106 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08002107 # TODO: assert on run and withdraw results?
Jon Hall669173b2014-12-17 11:36:30 -08002108
Jon Hall6aec96b2015-01-19 14:49:31 -08002109 utilities.assert_equals(
2110 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002111 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002112 onpass="Leadership election passed",
2113 onfail="Something went wrong with Leadership election after " +
2114 "the old leader re-ran for election" )