blob: d23dcda69fa6fb90e87d7ae97d15f2f2bd496853 [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 Hall8f89dda2015-01-22 16:03:33 -0800153 onos2Isup = main.ONOSbench.isup( ONOS2Ip )
154 if not onos2Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800155 main.log.report( "ONOS2 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800156 onos3Isup = main.ONOSbench.isup( ONOS3Ip )
157 if not onos3Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800158 main.log.report( "ONOS3 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800159 onos4Isup = main.ONOSbench.isup( ONOS4Ip )
160 if not onos4Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800161 main.log.report( "ONOS4 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800162 onos5Isup = main.ONOSbench.isup( ONOS5Ip )
163 if not onos5Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800164 main.log.report( "ONOS5 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800165 onos6Isup = main.ONOSbench.isup( ONOS6Ip )
166 if not onos6Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800167 main.log.report( "ONOS6 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800168 onos7Isup = main.ONOSbench.isup( ONOS7Ip )
169 if not onos7Isup:
Jon Hall6aec96b2015-01-19 14:49:31 -0800170 main.log.report( "ONOS7 didn't start!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800171 onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
172 and onos4Isup and onos5Isup and onos6Isup and onos7Isup
173 if onosIsupResult == main.TRUE:
Jon Hall94fd0472014-12-08 11:52:42 -0800174 break
Jon Hall73cf9cc2014-11-20 22:28:38 -0800175
Jon Hall8f89dda2015-01-22 16:03:33 -0800176 cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
177 cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
178 cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
179 cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
180 cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
181 cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
182 cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
183 cliResults = cliResult1 and cliResult2 and cliResult3 and\
184 cliResult4 and cliResult5 and cliResult6 and cliResult7
Jon Hall73cf9cc2014-11-20 22:28:38 -0800185
Jon Hall6aec96b2015-01-19 14:49:31 -0800186 main.step( "Start Packet Capture MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800187 main.Mininet2.startTcpdump(
Jon Hall6aec96b2015-01-19 14:49:31 -0800188 str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
189 + "-MN.pcap",
190 intf=main.params[ 'MNtcpdump' ][ 'intf' ],
191 port=main.params[ 'MNtcpdump' ][ 'port' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800192
Jon Hall8f89dda2015-01-22 16:03:33 -0800193 case1Result = ( cleanInstallResult and packageResult and
194 cellResult and verifyResult and onosInstallResult
195 and onosIsupResult and cliResults )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800196
Jon Hall8f89dda2015-01-22 16:03:33 -0800197 utilities.assert_equals( expect=main.TRUE, actual=case1Result,
198 onpass="Test startup successful",
199 onfail="Test startup NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800200
Jon Hall8f89dda2015-01-22 16:03:33 -0800201 if case1Result == main.FALSE:
Jon Hall94fd0472014-12-08 11:52:42 -0800202 main.cleanup()
203 main.exit()
Jon Hall73cf9cc2014-11-20 22:28:38 -0800204
Jon Hall6aec96b2015-01-19 14:49:31 -0800205 def CASE2( self, main ):
206 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800207 Assign mastership to controllers
Jon Hall6aec96b2015-01-19 14:49:31 -0800208 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800209 import re
210
Jon Hall6aec96b2015-01-19 14:49:31 -0800211 main.log.report( "Assigning switches to controllers" )
212 main.case( "Assigning Controllers" )
213 main.step( "Assign switches to controllers" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800214
Jon Hall6aec96b2015-01-19 14:49:31 -0800215 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800216 main.Mininet1.assignSwController(
Jon Hall6aec96b2015-01-19 14:49:31 -0800217 sw=str( i ),
Jon Hall8f89dda2015-01-22 16:03:33 -0800218 count=numControllers,
219 ip1=ONOS1Ip, port1=ONOS1Port,
220 ip2=ONOS2Ip, port2=ONOS2Port,
221 ip3=ONOS3Ip, port3=ONOS3Port,
222 ip4=ONOS4Ip, port4=ONOS4Port,
223 ip5=ONOS5Ip, port5=ONOS5Port,
224 ip6=ONOS6Ip, port6=ONOS6Port,
225 ip7=ONOS7Ip, port7=ONOS7Port )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800226
Jon Hall8f89dda2015-01-22 16:03:33 -0800227 mastershipCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800228 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800229 response = main.Mininet1.getSwController( "s" + str( i ) )
Jon Hallffb386d2014-11-21 13:43:38 -0800230 try:
Jon Hall6aec96b2015-01-19 14:49:31 -0800231 main.log.info( str( response ) )
Jon Hallffb386d2014-11-21 13:43:38 -0800232 except:
Jon Hall6aec96b2015-01-19 14:49:31 -0800233 main.log.info( repr( response ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800234 if re.search( "tcp:" + ONOS1Ip, response )\
235 and re.search( "tcp:" + ONOS2Ip, response )\
236 and re.search( "tcp:" + ONOS3Ip, response )\
237 and re.search( "tcp:" + ONOS4Ip, response )\
238 and re.search( "tcp:" + ONOS5Ip, response )\
239 and re.search( "tcp:" + ONOS6Ip, response )\
240 and re.search( "tcp:" + ONOS7Ip, response ):
241 mastershipCheck = mastershipCheck and main.TRUE
Jon Hall73cf9cc2014-11-20 22:28:38 -0800242 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800243 mastershipCheck = main.FALSE
244 if mastershipCheck == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800245 main.log.report( "Switch mastership assigned correctly" )
246 utilities.assert_equals(
247 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800248 actual=mastershipCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800249 onpass="Switch mastership assigned correctly",
250 onfail="Switches not assigned correctly to controllers" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800251
Jon Hall6aec96b2015-01-19 14:49:31 -0800252 # Manually assign mastership to the controller we want
Jon Hall8f89dda2015-01-22 16:03:33 -0800253 roleCall = main.TRUE
254 roleCheck = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800255
Jon Hall6aec96b2015-01-19 14:49:31 -0800256 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800257 deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
258 roleCall = roleCall and main.ONOScli1.deviceRole(
259 deviceId,
260 ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800261 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800262 if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
263 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800264 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800265 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800266
Jon Hall6aec96b2015-01-19 14:49:31 -0800267 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800268 deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
269 roleCall = roleCall and main.ONOScli1.deviceRole(
270 deviceId,
271 ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800272 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800273 if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
274 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800275 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800276 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800277
Jon Hall6aec96b2015-01-19 14:49:31 -0800278 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800279 deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
280 roleCall = roleCall and main.ONOScli1.deviceRole(
281 deviceId,
282 ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800283 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800284 if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
285 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800286 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800287 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800288
Jon Hall6aec96b2015-01-19 14:49:31 -0800289 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800290 deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
291 roleCall = roleCall and main.ONOScli1.deviceRole(
292 deviceId,
293 ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800294 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800295 if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
296 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800297 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800298 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800299
Jon Hall6aec96b2015-01-19 14:49:31 -0800300 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800301 deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
302 roleCall = roleCall and main.ONOScli1.deviceRole(
303 deviceId,
304 ONOS3Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800305 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800306 if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
307 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800308 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800309 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800310
Jon Hall6aec96b2015-01-19 14:49:31 -0800311 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800312 deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
313 roleCall = roleCall and main.ONOScli1.deviceRole(
314 deviceId,
315 ONOS3Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800316 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800317 if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
318 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800319 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800320 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800321
Jon Hall6aec96b2015-01-19 14:49:31 -0800322 # Assign switch
Jon Hall8f89dda2015-01-22 16:03:33 -0800323 deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
324 roleCall = roleCall and main.ONOScli1.deviceRole(
325 deviceId,
326 ONOS4Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800327 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800328 if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
329 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800330 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800331 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800332
Jon Hall6aec96b2015-01-19 14:49:31 -0800333 for i in range( 8, 18 ):
334 dpid = '3' + str( i ).zfill( 3 )
Jon Hall8f89dda2015-01-22 16:03:33 -0800335 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
336 roleCall = roleCall and main.ONOScli1.deviceRole(
337 deviceId,
338 ONOS5Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800339 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800340 if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
341 roleCheck = roleCheck and main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800342 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800343 roleCheck = roleCheck and main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -0800344
Jon Hall8f89dda2015-01-22 16:03:33 -0800345 deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
346 roleCall = roleCall and main.ONOScli1.deviceRole(
347 deviceId,
348 ONOS6Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800349 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800350 if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
351 roleCheck = roleCheck and main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800352 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800353 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800354
Jon Hall6aec96b2015-01-19 14:49:31 -0800355 for i in range( 18, 28 ):
356 dpid = '6' + str( i ).zfill( 3 )
Jon Hall8f89dda2015-01-22 16:03:33 -0800357 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
358 roleCall = roleCall and main.ONOScli1.deviceRole(
359 deviceId,
360 ONOS7Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -0800361 # Check assignment
Jon Hall8f89dda2015-01-22 16:03:33 -0800362 if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
363 roleCheck = roleCheck and main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800364 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800365 roleCheck = roleCheck and main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800366
Jon Hall6aec96b2015-01-19 14:49:31 -0800367 utilities.assert_equals(
368 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800369 actual=roleCall,
Jon Hall6aec96b2015-01-19 14:49:31 -0800370 onpass="Re-assigned switch mastership to designated controller",
Jon Hall8f89dda2015-01-22 16:03:33 -0800371 onfail="Something wrong with deviceRole calls" )
Jon Hall94fd0472014-12-08 11:52:42 -0800372
Jon Hall6aec96b2015-01-19 14:49:31 -0800373 utilities.assert_equals(
374 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800375 actual=roleCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800376 onpass="Switches were successfully reassigned to designated " +
377 "controller",
378 onfail="Switches were not successfully reassigned" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800379 mastershipCheck = mastershipCheck and roleCall and roleCheck
380 utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
381 onpass="Switch mastership correctly assigned",
382 onfail="Error in ( re )assigning switch" +
383 " mastership" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800384
Jon Hall6aec96b2015-01-19 14:49:31 -0800385 def CASE3( self, main ):
Jon Hall73cf9cc2014-11-20 22:28:38 -0800386 """
387 Assign intents
Jon Hall73cf9cc2014-11-20 22:28:38 -0800388 """
389 import time
Jon Hall6aec96b2015-01-19 14:49:31 -0800390 main.log.report( "Adding host intents" )
391 main.case( "Adding host Intents" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800392
Jon Hall8f89dda2015-01-22 16:03:33 -0800393 main.step( "Discovering Hosts( Via pingall for now )" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800394 # FIXME: Once we have a host discovery mechanism, use that instead
Jon Hall73cf9cc2014-11-20 22:28:38 -0800395
Jon Hall6aec96b2015-01-19 14:49:31 -0800396 # install onos-app-fwd
397 main.log.info( "Install reactive forwarding app" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800398 main.ONOScli1.featureInstall( "onos-app-fwd" )
399 main.ONOScli2.featureInstall( "onos-app-fwd" )
400 main.ONOScli3.featureInstall( "onos-app-fwd" )
401 main.ONOScli4.featureInstall( "onos-app-fwd" )
402 main.ONOScli5.featureInstall( "onos-app-fwd" )
403 main.ONOScli6.featureInstall( "onos-app-fwd" )
404 main.ONOScli7.featureInstall( "onos-app-fwd" )
Jon Hall94fd0472014-12-08 11:52:42 -0800405
Jon Hall6aec96b2015-01-19 14:49:31 -0800406 # REACTIVE FWD test
Jon Hall8f89dda2015-01-22 16:03:33 -0800407 pingResult = main.FALSE
Jon Hall73cf9cc2014-11-20 22:28:38 -0800408 time1 = time.time()
Jon Hall8f89dda2015-01-22 16:03:33 -0800409 pingResult = main.Mininet1.pingall()
Jon Hall529a37f2015-01-28 10:02:00 -0800410 utilities.assert_equals(
411 expect=main.TRUE,
412 actual=pingResult,
413 onpass="Reactive Pingall test passed",
414 onfail="Reactive Pingall failed, one or more ping pairs failed" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800415 time2 = time.time()
Jon Hall6aec96b2015-01-19 14:49:31 -0800416 main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800417
Jon Hall6aec96b2015-01-19 14:49:31 -0800418 # uninstall onos-app-fwd
419 main.log.info( "Uninstall reactive forwarding app" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800420 main.ONOScli1.featureUninstall( "onos-app-fwd" )
421 main.ONOScli2.featureUninstall( "onos-app-fwd" )
422 main.ONOScli3.featureUninstall( "onos-app-fwd" )
423 main.ONOScli4.featureUninstall( "onos-app-fwd" )
424 main.ONOScli5.featureUninstall( "onos-app-fwd" )
425 main.ONOScli6.featureUninstall( "onos-app-fwd" )
426 main.ONOScli7.featureUninstall( "onos-app-fwd" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800427 # timeout for fwd flows
428 time.sleep( 10 )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800429
Jon Hall6aec96b2015-01-19 14:49:31 -0800430 main.step( "Add host intents" )
431 # TODO: move the host numbers to params
Jon Hall8f89dda2015-01-22 16:03:33 -0800432 intentAddResult = True
Jon Hall6aec96b2015-01-19 14:49:31 -0800433 for i in range( 8, 18 ):
434 main.log.info( "Adding host intent between h" + str( i ) +
435 " and h" + str( i + 10 ) )
436 host1 = "00:00:00:00:00:" + \
437 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
438 host2 = "00:00:00:00:00:" + \
439 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
Jon Hall8f89dda2015-01-22 16:03:33 -0800440 host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
441 host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
Jon Hall6aec96b2015-01-19 14:49:31 -0800442 # NOTE: get host can return None
Jon Hall8f89dda2015-01-22 16:03:33 -0800443 if host1Id and host2Id:
444 tmpResult = main.ONOScli1.addHostIntent(
445 host1Id,
446 host2Id )
Jon Hall669173b2014-12-17 11:36:30 -0800447 else:
Jon Hall8f89dda2015-01-22 16:03:33 -0800448 main.log.error( "Error, getHost() failed" )
449 tmpResult = main.FALSE
450 intentAddResult = bool( pingResult and intentAddResult
451 and tmpResult )
Jon Hall529a37f2015-01-28 10:02:00 -0800452 # TODO Check that intents were added?
Jon Hall6aec96b2015-01-19 14:49:31 -0800453 utilities.assert_equals(
454 expect=True,
Jon Hall8f89dda2015-01-22 16:03:33 -0800455 actual=intentAddResult,
Jon Hall529a37f2015-01-28 10:02:00 -0800456 onpass="Pushed host intents to ONOS",
457 onfail="Error in pushing host intents to ONOS" )
Jon Hall6aec96b2015-01-19 14:49:31 -0800458 # TODO Check if intents all exist in datastore
Jon Hall73cf9cc2014-11-20 22:28:38 -0800459
Jon Hall6aec96b2015-01-19 14:49:31 -0800460 def CASE4( self, main ):
Jon Hall73cf9cc2014-11-20 22:28:38 -0800461 """
462 Ping across added host intents
463 """
464 description = " Ping across added host intents"
Jon Hall6aec96b2015-01-19 14:49:31 -0800465 main.log.report( description )
466 main.case( description )
Jon Hall8f89dda2015-01-22 16:03:33 -0800467 PingResult = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800468 for i in range( 8, 18 ):
469 ping = main.Mininet1.pingHost(
470 src="h" + str( i ), target="h" + str( i + 10 ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800471 PingResult = PingResult and ping
Jon Hall6aec96b2015-01-19 14:49:31 -0800472 if ping == main.FALSE:
473 main.log.warn( "Ping failed between h" + str( i ) +
474 " and h" + str( i + 10 ) )
475 elif ping == main.TRUE:
476 main.log.info( "Ping test passed!" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800477 PingResult = main.TRUE
478 if PingResult == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800479 main.log.report(
480 "Intents have not been installed correctly, pings failed." )
Jon Hall529a37f2015-01-28 10:02:00 -0800481 #TODO: pretty print
482 main.log.warn( "ONSO1 intents: " )
483 main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
484 sort_keys=True,
485 indent=4,
486 separators=( ',', ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800487 if PingResult == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -0800488 main.log.report(
489 "Intents have been installed correctly and verified by pings" )
490 utilities.assert_equals(
491 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800492 actual=PingResult,
Jon Hall6aec96b2015-01-19 14:49:31 -0800493 onpass="Intents have been installed correctly and pings work",
494 onfail="Intents have not been installed correctly, pings failed." )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800495
Jon Hall6aec96b2015-01-19 14:49:31 -0800496 def CASE5( self, main ):
497 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800498 Reading state of ONOS
Jon Hall6aec96b2015-01-19 14:49:31 -0800499 """
Jon Hall73cf9cc2014-11-20 22:28:38 -0800500 import json
Jon Hall6aec96b2015-01-19 14:49:31 -0800501 # assumes that sts is already in you PYTHONPATH
502 from sts.topology.teston_topology import TestONTopology
Jon Hall73cf9cc2014-11-20 22:28:38 -0800503
Jon Hall6aec96b2015-01-19 14:49:31 -0800504 main.log.report( "Setting up and gathering data for current state" )
505 main.case( "Setting up and gathering data for current state" )
506 # The general idea for this test case is to pull the state of
507 # ( intents,flows, topology,... ) from each ONOS node
508 # We can then compare them with eachother and also with past states
Jon Hall73cf9cc2014-11-20 22:28:38 -0800509
Jon Hall6aec96b2015-01-19 14:49:31 -0800510 main.step( "Get the Mastership of each switch from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800511 global mastershipState
512 mastershipState = []
Jon Hall94fd0472014-12-08 11:52:42 -0800513
Jon Hall6aec96b2015-01-19 14:49:31 -0800514 # Assert that each device has a master
Jon Hall8f89dda2015-01-22 16:03:33 -0800515 ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
516 ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
517 ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
518 ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
519 ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
520 ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
521 ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
522 rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
523 ONOS3MasterNotNull and ONOS4MasterNotNull and\
524 ONOS5MasterNotNull and ONOS6MasterNotNull and\
525 ONOS7MasterNotNull
Jon Hall6aec96b2015-01-19 14:49:31 -0800526 utilities.assert_equals(
527 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800528 actual=rolesNotNull,
Jon Hall6aec96b2015-01-19 14:49:31 -0800529 onpass="Each device has a master",
530 onfail="Some devices don't have a master assigned" )
Jon Hall94fd0472014-12-08 11:52:42 -0800531
Jon Hall8f89dda2015-01-22 16:03:33 -0800532 ONOS1Mastership = main.ONOScli1.roles()
533 ONOS2Mastership = main.ONOScli2.roles()
534 ONOS3Mastership = main.ONOScli3.roles()
535 ONOS4Mastership = main.ONOScli4.roles()
536 ONOS5Mastership = main.ONOScli5.roles()
537 ONOS6Mastership = main.ONOScli6.roles()
538 ONOS7Mastership = main.ONOScli7.roles()
539 if "Error" in ONOS1Mastership or not ONOS1Mastership\
540 or "Error" in ONOS2Mastership or not ONOS2Mastership\
541 or "Error" in ONOS3Mastership or not ONOS3Mastership\
542 or "Error" in ONOS4Mastership or not ONOS4Mastership\
543 or "Error" in ONOS5Mastership or not ONOS5Mastership\
544 or "Error" in ONOS6Mastership or not ONOS6Mastership\
545 or "Error" in ONOS7Mastership or not ONOS7Mastership:
Jon Hall6aec96b2015-01-19 14:49:31 -0800546 main.log.report( "Error in getting ONOS roles" )
547 main.log.warn(
548 "ONOS1 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800549 repr( ONOS1Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800550 main.log.warn(
551 "ONOS2 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800552 repr( ONOS2Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800553 main.log.warn(
554 "ONOS3 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800555 repr( ONOS3Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800556 main.log.warn(
557 "ONOS4 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800558 repr( ONOS4Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800559 main.log.warn(
560 "ONOS5 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800561 repr( ONOS5Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800562 main.log.warn(
563 "ONOS6 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800564 repr( ONOS6Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800565 main.log.warn(
566 "ONOS7 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800567 repr( ONOS7Mastership ) )
568 consistentMastership = main.FALSE
569 elif ONOS1Mastership == ONOS2Mastership\
570 and ONOS1Mastership == ONOS3Mastership\
571 and ONOS1Mastership == ONOS4Mastership\
572 and ONOS1Mastership == ONOS5Mastership\
573 and ONOS1Mastership == ONOS6Mastership\
574 and ONOS1Mastership == ONOS7Mastership:
575 mastershipState = ONOS1Mastership
576 consistentMastership = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800577 main.log.report(
578 "Switch roles are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800579 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800580 main.log.warn(
581 "ONOS1 roles: ",
582 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800583 json.loads( ONOS1Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800584 sort_keys=True,
585 indent=4,
586 separators=(
587 ',',
588 ': ' ) ) )
589 main.log.warn(
590 "ONOS2 roles: ",
591 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800592 json.loads( ONOS2Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800593 sort_keys=True,
594 indent=4,
595 separators=(
596 ',',
597 ': ' ) ) )
598 main.log.warn(
599 "ONOS3 roles: ",
600 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800601 json.loads( ONOS3Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800602 sort_keys=True,
603 indent=4,
604 separators=(
605 ',',
606 ': ' ) ) )
607 main.log.warn(
608 "ONOS4 roles: ",
609 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800610 json.loads( ONOS4Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800611 sort_keys=True,
612 indent=4,
613 separators=(
614 ',',
615 ': ' ) ) )
616 main.log.warn(
617 "ONOS5 roles: ",
618 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800619 json.loads( ONOS5Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800620 sort_keys=True,
621 indent=4,
622 separators=(
623 ',',
624 ': ' ) ) )
625 main.log.warn(
626 "ONOS6 roles: ",
627 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800628 json.loads( ONOS6Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800629 sort_keys=True,
630 indent=4,
631 separators=(
632 ',',
633 ': ' ) ) )
634 main.log.warn(
635 "ONOS7 roles: ",
636 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800637 json.loads( ONOS7Mastership ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800638 sort_keys=True,
639 indent=4,
640 separators=(
641 ',',
642 ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800643 consistentMastership = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -0800644 utilities.assert_equals(
645 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800646 actual=consistentMastership,
Jon Hall6aec96b2015-01-19 14:49:31 -0800647 onpass="Switch roles are consistent across all ONOS nodes",
648 onfail="ONOS nodes have different views of switch roles" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800649
Jon Hall6aec96b2015-01-19 14:49:31 -0800650 main.step( "Get the intents from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800651 global intentState
652 intentState = []
653 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
654 ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
655 ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
656 ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
657 ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
658 ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
659 ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
660 intentCheck = main.FALSE
661 if "Error" in ONOS1Intents or not ONOS1Intents\
662 or "Error" in ONOS2Intents or not ONOS2Intents\
663 or "Error" in ONOS3Intents or not ONOS3Intents\
664 or "Error" in ONOS4Intents or not ONOS4Intents\
665 or "Error" in ONOS5Intents or not ONOS5Intents\
666 or "Error" in ONOS6Intents or not ONOS6Intents\
667 or "Error" in ONOS7Intents or not ONOS7Intents:
Jon Hall6aec96b2015-01-19 14:49:31 -0800668 main.log.report( "Error in getting ONOS intents" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800669 main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
670 main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
671 main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
672 main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
673 main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
674 main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
675 main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
676 elif ONOS1Intents == ONOS2Intents\
677 and ONOS1Intents == ONOS3Intents\
678 and ONOS1Intents == ONOS4Intents\
679 and ONOS1Intents == ONOS5Intents\
680 and ONOS1Intents == ONOS6Intents\
681 and ONOS1Intents == ONOS7Intents:
682 intentState = ONOS1Intents
683 intentCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800684 main.log.report( "Intents are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800685 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800686 main.log.warn(
687 "ONOS1 intents: ",
688 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800689 json.loads( ONOS1Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800690 sort_keys=True,
691 indent=4,
692 separators=(
693 ',',
694 ': ' ) ) )
695 main.log.warn(
696 "ONOS2 intents: ",
697 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800698 json.loads( ONOS2Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800699 sort_keys=True,
700 indent=4,
701 separators=(
702 ',',
703 ': ' ) ) )
704 main.log.warn(
705 "ONOS3 intents: ",
706 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800707 json.loads( ONOS3Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800708 sort_keys=True,
709 indent=4,
710 separators=(
711 ',',
712 ': ' ) ) )
713 main.log.warn(
714 "ONOS4 intents: ",
715 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800716 json.loads( ONOS4Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800717 sort_keys=True,
718 indent=4,
719 separators=(
720 ',',
721 ': ' ) ) )
722 main.log.warn(
723 "ONOS5 intents: ",
724 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800725 json.loads( ONOS5Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800726 sort_keys=True,
727 indent=4,
728 separators=(
729 ',',
730 ': ' ) ) )
731 main.log.warn(
732 "ONOS6 intents: ",
733 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800734 json.loads( ONOS6Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800735 sort_keys=True,
736 indent=4,
737 separators=(
738 ',',
739 ': ' ) ) )
740 main.log.warn(
741 "ONOS7 intents: ",
742 json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -0800743 json.loads( ONOS7Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -0800744 sort_keys=True,
745 indent=4,
746 separators=(
747 ',',
748 ': ' ) ) )
749 utilities.assert_equals(
750 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800751 actual=intentCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800752 onpass="Intents are consistent across all ONOS nodes",
753 onfail="ONOS nodes have different views of intents" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800754
Jon Hall6aec96b2015-01-19 14:49:31 -0800755 main.step( "Get the flows from each controller" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800756 global flowState
757 flowState = []
758 ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
759 ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
760 ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
761 ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
762 ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
763 ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
764 ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
765 ONOS1FlowsJson = json.loads( ONOS1Flows )
766 ONOS2FlowsJson = json.loads( ONOS2Flows )
767 ONOS3FlowsJson = json.loads( ONOS3Flows )
768 ONOS4FlowsJson = json.loads( ONOS4Flows )
769 ONOS5FlowsJson = json.loads( ONOS5Flows )
770 ONOS6FlowsJson = json.loads( ONOS6Flows )
771 ONOS7FlowsJson = json.loads( ONOS7Flows )
772 flowCheck = main.FALSE
773 if "Error" in ONOS1Flows or not ONOS1Flows\
774 or "Error" in ONOS2Flows or not ONOS2Flows\
775 or "Error" in ONOS3Flows or not ONOS3Flows\
776 or "Error" in ONOS4Flows or not ONOS4Flows\
777 or "Error" in ONOS5Flows or not ONOS5Flows\
778 or "Error" in ONOS6Flows or not ONOS6Flows\
779 or "Error" in ONOS7Flows or not ONOS7Flows:
Jon Hall6aec96b2015-01-19 14:49:31 -0800780 main.log.report( "Error in getting ONOS intents" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800781 main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
782 main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
783 main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
784 main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
785 main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
786 main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
787 main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
788 elif len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
789 and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
790 and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
791 and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
792 and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
793 and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
Jon Hall6aec96b2015-01-19 14:49:31 -0800794 # TODO: Do a better check, maybe compare flows on switches?
Jon Hall8f89dda2015-01-22 16:03:33 -0800795 flowState = ONOS1Flows
796 flowCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -0800797 main.log.report( "Flow count is consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800798 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800799 main.log.warn( "ONOS1 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800800 json.dumps( ONOS1FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800801 indent=4, separators=( ',', ': ' ) ) )
802 main.log.warn( "ONOS2 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800803 json.dumps( ONOS2FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800804 indent=4, separators=( ',', ': ' ) ) )
805 main.log.warn( "ONOS3 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800806 json.dumps( ONOS3FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800807 indent=4, separators=( ',', ': ' ) ) )
808 main.log.warn( "ONOS4 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800809 json.dumps( ONOS4FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800810 indent=4, separators=( ',', ': ' ) ) )
811 main.log.warn( "ONOS5 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800812 json.dumps( ONOS5FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800813 indent=4, separators=( ',', ': ' ) ) )
814 main.log.warn( "ONOS6 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800815 json.dumps( ONOS6FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800816 indent=4, separators=( ',', ': ' ) ) )
817 main.log.warn( "ONOS7 flows: " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800818 json.dumps( ONOS7FlowsJson, sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -0800819 indent=4, separators=( ',', ': ' ) ) )
820 utilities.assert_equals(
821 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800822 actual=flowCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -0800823 onpass="The flow count is consistent across all ONOS nodes",
824 onfail="ONOS nodes have different flow counts" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800825
Jon Hall6aec96b2015-01-19 14:49:31 -0800826 main.step( "Get the OF Table entries" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800827 global flows
Jon Hall6aec96b2015-01-19 14:49:31 -0800828 flows = []
829 for i in range( 1, 29 ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800830 flows.append( main.Mininet2.getFlowTable( 1.3, "s" + str( i ) ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800831
Jon Hall6aec96b2015-01-19 14:49:31 -0800832 # TODO: Compare switch flow tables with ONOS flow tables
Jon Hall73cf9cc2014-11-20 22:28:38 -0800833
Jon Hall6aec96b2015-01-19 14:49:31 -0800834 main.step( "Start continuous pings" )
835 main.Mininet2.pingLong(
836 src=main.params[ 'PING' ][ 'source1' ],
837 target=main.params[ 'PING' ][ 'target1' ],
838 pingTime=500 )
839 main.Mininet2.pingLong(
840 src=main.params[ 'PING' ][ 'source2' ],
841 target=main.params[ 'PING' ][ 'target2' ],
842 pingTime=500 )
843 main.Mininet2.pingLong(
844 src=main.params[ 'PING' ][ 'source3' ],
845 target=main.params[ 'PING' ][ 'target3' ],
846 pingTime=500 )
847 main.Mininet2.pingLong(
848 src=main.params[ 'PING' ][ 'source4' ],
849 target=main.params[ 'PING' ][ 'target4' ],
850 pingTime=500 )
851 main.Mininet2.pingLong(
852 src=main.params[ 'PING' ][ 'source5' ],
853 target=main.params[ 'PING' ][ 'target5' ],
854 pingTime=500 )
855 main.Mininet2.pingLong(
856 src=main.params[ 'PING' ][ 'source6' ],
857 target=main.params[ 'PING' ][ 'target6' ],
858 pingTime=500 )
859 main.Mininet2.pingLong(
860 src=main.params[ 'PING' ][ 'source7' ],
861 target=main.params[ 'PING' ][ 'target7' ],
862 pingTime=500 )
863 main.Mininet2.pingLong(
864 src=main.params[ 'PING' ][ 'source8' ],
865 target=main.params[ 'PING' ][ 'target8' ],
866 pingTime=500 )
867 main.Mininet2.pingLong(
868 src=main.params[ 'PING' ][ 'source9' ],
869 target=main.params[ 'PING' ][ 'target9' ],
870 pingTime=500 )
871 main.Mininet2.pingLong(
872 src=main.params[ 'PING' ][ 'source10' ],
873 target=main.params[ 'PING' ][ 'target10' ],
874 pingTime=500 )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800875
Jon Hall6aec96b2015-01-19 14:49:31 -0800876 main.step( "Create TestONTopology object" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800877 ctrls = []
878 count = 1
879 while True:
880 temp = ()
Jon Hall6aec96b2015-01-19 14:49:31 -0800881 if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
882 temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
883 temp = temp + ( "ONOS" + str( count ), )
884 temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
885 temp = temp + \
886 ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
887 ctrls.append( temp )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800888 count = count + 1
889 else:
890 break
Jon Hall6aec96b2015-01-19 14:49:31 -0800891 MNTopo = TestONTopology(
892 main.Mininet1,
893 ctrls ) # can also add Intent API info for intent operations
Jon Hall73cf9cc2014-11-20 22:28:38 -0800894
Jon Hall6aec96b2015-01-19 14:49:31 -0800895 main.step( "Collecting topology information from ONOS" )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800896 devices = []
897 devices.append( main.ONOScli1.devices() )
898 devices.append( main.ONOScli2.devices() )
899 devices.append( main.ONOScli3.devices() )
900 devices.append( main.ONOScli4.devices() )
901 devices.append( main.ONOScli5.devices() )
902 devices.append( main.ONOScli6.devices() )
903 devices.append( main.ONOScli7.devices() )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800904 hosts = []
Jon Hall6aec96b2015-01-19 14:49:31 -0800905 hosts.append( main.ONOScli1.hosts() )
906 hosts.append( main.ONOScli2.hosts() )
907 hosts.append( main.ONOScli3.hosts() )
908 hosts.append( main.ONOScli4.hosts() )
909 hosts.append( main.ONOScli5.hosts() )
910 hosts.append( main.ONOScli6.hosts() )
911 hosts.append( main.ONOScli7.hosts() )
912 for controller in range( 0, len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800913 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -0800914 for host in hosts[ controller ]:
915 if host[ 'ips' ] == []:
916 main.log.error( "DEBUG:Error with host ips on controller" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800917 controllerStr + ": " + str( host ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -0800918 ports = []
919 ports.append( main.ONOScli1.ports() )
920 ports.append( main.ONOScli2.ports() )
921 ports.append( main.ONOScli3.ports() )
922 ports.append( main.ONOScli4.ports() )
923 ports.append( main.ONOScli5.ports() )
924 ports.append( main.ONOScli6.ports() )
925 ports.append( main.ONOScli7.ports() )
926 links = []
927 links.append( main.ONOScli1.links() )
928 links.append( main.ONOScli2.links() )
929 links.append( main.ONOScli3.links() )
930 links.append( main.ONOScli4.links() )
931 links.append( main.ONOScli5.links() )
932 links.append( main.ONOScli6.links() )
933 links.append( main.ONOScli7.links() )
Jon Hall94fd0472014-12-08 11:52:42 -0800934 clusters = []
935 clusters.append( main.ONOScli1.clusters() )
936 clusters.append( main.ONOScli2.clusters() )
937 clusters.append( main.ONOScli3.clusters() )
938 clusters.append( main.ONOScli4.clusters() )
939 clusters.append( main.ONOScli5.clusters() )
940 clusters.append( main.ONOScli6.clusters() )
941 clusters.append( main.ONOScli7.clusters() )
Jon Hall529a37f2015-01-28 10:02:00 -0800942 # Compare json objects for hosts and dataplane clusters
Jon Hall94fd0472014-12-08 11:52:42 -0800943
Jon Hall6aec96b2015-01-19 14:49:31 -0800944 # hosts
Jon Hall8f89dda2015-01-22 16:03:33 -0800945 consistentHostsResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800946 for controller in range( len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -0800947 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -0800948 if "Error" not in hosts[ controller ]:
949 if hosts[ controller ] == hosts[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -0800950 continue
Jon Hall6aec96b2015-01-19 14:49:31 -0800951 else: # hosts not consistent
952 main.log.report( "hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800953 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800954 " is inconsistent with ONOS1" )
955 main.log.warn( repr( hosts[ controller ] ) )
Jon Hall8f89dda2015-01-22 16:03:33 -0800956 consistentHostsResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800957
958 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800959 main.log.report( "Error in getting ONOS hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800960 controllerStr )
961 consistentHostsResult = main.FALSE
962 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800963 " hosts response: " +
964 repr( hosts[ controller ] ) )
965 utilities.assert_equals(
966 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800967 actual=consistentHostsResult,
Jon Hall6aec96b2015-01-19 14:49:31 -0800968 onpass="Hosts view is consistent across all ONOS nodes",
969 onfail="ONOS nodes have different views of hosts" )
Jon Hall94fd0472014-12-08 11:52:42 -0800970
Jon Hall6aec96b2015-01-19 14:49:31 -0800971 # Strongly connected clusters of devices
Jon Hall8f89dda2015-01-22 16:03:33 -0800972 consistentClustersResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -0800973 for controller in range( len( clusters ) ):
Jon Hall6aec96b2015-01-19 14:49:31 -0800974 if "Error" not in clusters[ controller ]:
975 if clusters[ controller ] == clusters[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -0800976 continue
Jon Hall6aec96b2015-01-19 14:49:31 -0800977 else: # clusters not consistent
978 main.log.report( "clusters from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -0800979 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800980 " is inconsistent with ONOS1" )
Jon Hall8f89dda2015-01-22 16:03:33 -0800981 consistentClustersResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -0800982
983 else:
Jon Hall6aec96b2015-01-19 14:49:31 -0800984 main.log.report( "Error in getting dataplane clusters " +
Jon Hall8f89dda2015-01-22 16:03:33 -0800985 "from ONOS" + controllerStr )
986 consistentClustersResult = main.FALSE
987 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -0800988 " clusters response: " +
989 repr( clusters[ controller ] ) )
990 utilities.assert_equals(
991 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -0800992 actual=consistentClustersResult,
Jon Hall6aec96b2015-01-19 14:49:31 -0800993 onpass="Clusters view is consistent across all ONOS nodes",
994 onfail="ONOS nodes have different views of clusters" )
995 # there should always only be one cluster
Jon Hall8f89dda2015-01-22 16:03:33 -0800996 numClusters = len( json.loads( clusters[ 0 ] ) )
Jon Hall6aec96b2015-01-19 14:49:31 -0800997 utilities.assert_equals(
998 expect=1,
Jon Hall8f89dda2015-01-22 16:03:33 -0800999 actual=numClusters,
Jon Hall6aec96b2015-01-19 14:49:31 -08001000 onpass="ONOS shows 1 SCC",
1001 onfail="ONOS shows " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001002 str( numClusters ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001003 " SCCs" )
Jon Hall94fd0472014-12-08 11:52:42 -08001004
Jon Hall6aec96b2015-01-19 14:49:31 -08001005 main.step( "Comparing ONOS topology to MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001006 devicesResults = main.TRUE
1007 portsResults = main.TRUE
1008 linksResults = main.TRUE
1009 for controller in range( numControllers ):
1010 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001011 if devices[ controller ] or "Error" not in devices[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001012 currentDevicesResult = main.Mininet1.compareSwitches(
Jon Hall6aec96b2015-01-19 14:49:31 -08001013 MNTopo,
1014 json.loads(
1015 devices[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001016 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001017 currentDevicesResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001018 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001019 actual=currentDevicesResult,
1020 onpass="ONOS" + controllerStr +
1021 " Switches view is correct",
1022 onfail="ONOS" + controllerStr +
1023 " Switches view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001024
Jon Hall6aec96b2015-01-19 14:49:31 -08001025 if ports[ controller ] or "Error" not in ports[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001026 currentPortsResult = main.Mininet1.comparePorts(
Jon Hall6aec96b2015-01-19 14:49:31 -08001027 MNTopo,
1028 json.loads(
1029 ports[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001030 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001031 currentPortsResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001032 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001033 actual=currentPortsResult,
1034 onpass="ONOS" + controllerStr +
1035 " ports view is correct",
1036 onfail="ONOS" + controllerStr +
1037 " ports view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001038
Jon Hall6aec96b2015-01-19 14:49:31 -08001039 if links[ controller ] or "Error" not in links[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001040 currentLinksResult = main.Mininet1.compareLinks(
Jon Hall6aec96b2015-01-19 14:49:31 -08001041 MNTopo,
1042 json.loads(
1043 links[ controller ] ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001044 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001045 currentLinksResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001046 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001047 actual=currentLinksResult,
1048 onpass="ONOS" + controllerStr +
1049 " links view is correct",
1050 onfail="ONOS" + controllerStr +
1051 " links view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001052
Jon Hall8f89dda2015-01-22 16:03:33 -08001053 devicesResults = devicesResults and currentDevicesResult
1054 portsResults = portsResults and currentPortsResult
1055 linksResults = linksResults and currentLinksResult
Jon Hall73cf9cc2014-11-20 22:28:38 -08001056
Jon Hall8f89dda2015-01-22 16:03:33 -08001057 topoResult = devicesResults and portsResults and linksResults\
Jon Hall529a37f2015-01-28 10:02:00 -08001058 and consistentHostsResult and consistentClustersResult
Jon Hall8f89dda2015-01-22 16:03:33 -08001059 utilities.assert_equals( expect=main.TRUE, actual=topoResult,
1060 onpass="Topology Check Test successful",
1061 onfail="Topology Check Test NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001062
Jon Hall8f89dda2015-01-22 16:03:33 -08001063 finalAssert = main.TRUE
1064 finalAssert = finalAssert and topoResult and flowCheck \
1065 and intentCheck and consistentMastership and rolesNotNull
1066 utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
1067 onpass="State check successful",
1068 onfail="State check NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001069
Jon Hall6aec96b2015-01-19 14:49:31 -08001070 def CASE6( self, main ):
1071 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001072 The Failure case.
Jon Hall6aec96b2015-01-19 14:49:31 -08001073 """
Jon Hall94fd0472014-12-08 11:52:42 -08001074 import time
Jon Hall6aec96b2015-01-19 14:49:31 -08001075 main.log.report( "Killing 3 ONOS nodes" )
1076 main.log.case( "Restart minority of ONOS nodes" )
1077 # TODO: Randomize these nodes
Jon Hall8f89dda2015-01-22 16:03:33 -08001078 main.ONOSbench.onosKill( ONOS1Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001079 time.sleep( 10 )
Jon Hall8f89dda2015-01-22 16:03:33 -08001080 main.ONOSbench.onosKill( ONOS2Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001081 time.sleep( 10 )
Jon Hall8f89dda2015-01-22 16:03:33 -08001082 main.ONOSbench.onosKill( ONOS3Ip )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001083
Jon Hall6aec96b2015-01-19 14:49:31 -08001084 main.step( "Checking if ONOS is up yet" )
Jon Hallffb386d2014-11-21 13:43:38 -08001085 count = 0
Jon Hall8f89dda2015-01-22 16:03:33 -08001086 onosIsupResult = main.FALSE
1087 while onosIsupResult == main.FALSE and count < 10:
1088 onos1Isup = main.ONOSbench.isup( ONOS1Ip )
1089 onos2Isup = main.ONOSbench.isup( ONOS2Ip )
1090 onos3Isup = main.ONOSbench.isup( ONOS3Ip )
1091 onosIsupResult = onos1Isup and onos2Isup and onos3Isup
Jon Hallffb386d2014-11-21 13:43:38 -08001092 count = count + 1
Jon Hall73cf9cc2014-11-20 22:28:38 -08001093 # TODO: if it becomes an issue, we can retry this step a few times
1094
Jon Hall8f89dda2015-01-22 16:03:33 -08001095 cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
1096 cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
1097 cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
1098 cliResults = cliResult1 and cliResult2 and cliResult3
Jon Hall73cf9cc2014-11-20 22:28:38 -08001099
Jon Hall6aec96b2015-01-19 14:49:31 -08001100 main.log.info( "Install leadership election app on restarted node" )
Jon Hall669173b2014-12-17 11:36:30 -08001101
Jon Hall8f89dda2015-01-22 16:03:33 -08001102 caseResults = main.TRUE and onosIsupResult and cliResults
1103 utilities.assert_equals( expect=main.TRUE, actual=caseResults,
1104 onpass="ONOS restart successful",
1105 onfail="ONOS restart NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001106
Jon Hall6aec96b2015-01-19 14:49:31 -08001107 def CASE7( self, main ):
1108 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001109 Check state after ONOS failure
Jon Hall6aec96b2015-01-19 14:49:31 -08001110 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001111 import json
Jon Hall6aec96b2015-01-19 14:49:31 -08001112 main.case( "Running ONOS Constant State Tests" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001113
Jon Hall6aec96b2015-01-19 14:49:31 -08001114 # Assert that each device has a master
Jon Hall8f89dda2015-01-22 16:03:33 -08001115 ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
1116 ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
1117 ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
1118 ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
1119 ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
1120 ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
1121 ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
1122 rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
1123 ONOS3MasterNotNull and ONOS4MasterNotNull and\
1124 ONOS5MasterNotNull and ONOS6MasterNotNull and\
1125 ONOS7MasterNotNull
Jon Hall6aec96b2015-01-19 14:49:31 -08001126 utilities.assert_equals(
1127 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001128 actual=rolesNotNull,
Jon Hall6aec96b2015-01-19 14:49:31 -08001129 onpass="Each device has a master",
1130 onfail="Some devices don't have a master assigned" )
Jon Hall94fd0472014-12-08 11:52:42 -08001131
Jon Hall6aec96b2015-01-19 14:49:31 -08001132 main.step( "Check if switch roles are consistent across all nodes" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001133 ONOS1Mastership = main.ONOScli1.roles()
1134 ONOS2Mastership = main.ONOScli2.roles()
1135 ONOS3Mastership = main.ONOScli3.roles()
1136 ONOS4Mastership = main.ONOScli4.roles()
1137 ONOS5Mastership = main.ONOScli5.roles()
1138 ONOS6Mastership = main.ONOScli6.roles()
1139 ONOS7Mastership = main.ONOScli7.roles()
1140 # print json.dumps( json.loads( ONOS1Mastership ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001141 # indent=4, separators=( ',', ': ' ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001142 if "Error" in ONOS1Mastership or not ONOS1Mastership\
1143 or "Error" in ONOS2Mastership or not ONOS2Mastership\
1144 or "Error" in ONOS3Mastership or not ONOS3Mastership\
1145 or "Error" in ONOS4Mastership or not ONOS4Mastership\
1146 or "Error" in ONOS5Mastership or not ONOS5Mastership\
1147 or "Error" in ONOS6Mastership or not ONOS6Mastership\
1148 or "Error" in ONOS7Mastership or not ONOS7Mastership:
Jon Hall6aec96b2015-01-19 14:49:31 -08001149 main.log.error( "Error in getting ONOS mastership" )
1150 main.log.warn( "ONOS1 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001151 repr( ONOS1Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001152 main.log.warn( "ONOS2 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001153 repr( ONOS2Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001154 main.log.warn( "ONOS3 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001155 repr( ONOS3Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001156 main.log.warn( "ONOS4 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001157 repr( ONOS4Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001158 main.log.warn( "ONOS5 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001159 repr( ONOS5Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001160 main.log.warn( "ONOS6 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001161 repr( ONOS6Mastership ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001162 main.log.warn( "ONOS7 mastership response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001163 repr( ONOS7Mastership ) )
1164 consistentMastership = main.FALSE
1165 elif ONOS1Mastership == ONOS2Mastership\
1166 and ONOS1Mastership == ONOS3Mastership\
1167 and ONOS1Mastership == ONOS4Mastership\
1168 and ONOS1Mastership == ONOS5Mastership\
1169 and ONOS1Mastership == ONOS6Mastership\
1170 and ONOS1Mastership == ONOS7Mastership:
1171 consistentMastership = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001172 main.log.report(
1173 "Switch roles are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001174 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001175 main.log.warn( "ONOS1 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001176 json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001177 separators=( ',', ': ' ) ) )
1178 main.log.warn( "ONOS2 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001179 json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001180 separators=( ',', ': ' ) ) )
1181 main.log.warn( "ONOS3 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001182 json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001183 separators=( ',', ': ' ) ) )
1184 main.log.warn( "ONOS4 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001185 json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001186 separators=( ',', ': ' ) ) )
1187 main.log.warn( "ONOS5 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001188 json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001189 separators=( ',', ': ' ) ) )
1190 main.log.warn( "ONOS6 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001191 json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001192 separators=( ',', ': ' ) ) )
1193 main.log.warn( "ONOS7 roles: ", json.dumps(
Jon Hall8f89dda2015-01-22 16:03:33 -08001194 json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
Jon Hall6aec96b2015-01-19 14:49:31 -08001195 separators=( ',', ': ' ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001196 consistentMastership = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001197 utilities.assert_equals(
1198 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001199 actual=consistentMastership,
Jon Hall6aec96b2015-01-19 14:49:31 -08001200 onpass="Switch roles are consistent across all ONOS nodes",
1201 onfail="ONOS nodes have different views of switch roles" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001202
1203 description2 = "Compare switch roles from before failure"
Jon Hall6aec96b2015-01-19 14:49:31 -08001204 main.step( description2 )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001205
Jon Hall8f89dda2015-01-22 16:03:33 -08001206 currentJson = json.loads( ONOS1Mastership )
1207 oldJson = json.loads( mastershipState )
1208 mastershipCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001209 for i in range( 1, 29 ):
1210 switchDPID = str(
1211 main.Mininet1.getSwitchDPID(
1212 switch="s" +
1213 str( i ) ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001214
Jon Hall8f89dda2015-01-22 16:03:33 -08001215 current = [ switch[ 'master' ] for switch in currentJson
Jon Hall6aec96b2015-01-19 14:49:31 -08001216 if switchDPID in switch[ 'id' ] ]
Jon Hall8f89dda2015-01-22 16:03:33 -08001217 old = [ switch[ 'master' ] for switch in oldJson
Jon Hall6aec96b2015-01-19 14:49:31 -08001218 if switchDPID in switch[ 'id' ] ]
Jon Hall73cf9cc2014-11-20 22:28:38 -08001219 if current == old:
Jon Hall8f89dda2015-01-22 16:03:33 -08001220 mastershipCheck = mastershipCheck and main.TRUE
Jon Hall73cf9cc2014-11-20 22:28:38 -08001221 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001222 main.log.warn( "Mastership of switch %s changed" % switchDPID )
Jon Hall8f89dda2015-01-22 16:03:33 -08001223 mastershipCheck = main.FALSE
1224 if mastershipCheck == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001225 main.log.report( "Mastership of Switches was not changed" )
1226 utilities.assert_equals(
1227 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001228 actual=mastershipCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -08001229 onpass="Mastership of Switches was not changed",
1230 onfail="Mastership of some switches changed" )
1231 # NOTE: we expect mastership to change on controller failure
Jon Hall8f89dda2015-01-22 16:03:33 -08001232 mastershipCheck = consistentMastership
Jon Hall73cf9cc2014-11-20 22:28:38 -08001233
Jon Hall6aec96b2015-01-19 14:49:31 -08001234 main.step( "Get the intents and compare across all nodes" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001235 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
1236 ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
1237 ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
1238 ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
1239 ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
1240 ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
1241 ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
1242 intentCheck = main.FALSE
1243 if "Error" in ONOS1Intents or not ONOS1Intents\
1244 or "Error" in ONOS2Intents or not ONOS2Intents\
1245 or "Error" in ONOS3Intents or not ONOS3Intents\
1246 or "Error" in ONOS4Intents or not ONOS4Intents\
1247 or "Error" in ONOS5Intents or not ONOS5Intents\
1248 or "Error" in ONOS6Intents or not ONOS6Intents\
1249 or "Error" in ONOS7Intents or not ONOS7Intents:
Jon Hall6aec96b2015-01-19 14:49:31 -08001250 main.log.report( "Error in getting ONOS intents" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001251 main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
1252 main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
1253 main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
1254 main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
1255 main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
1256 main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
1257 main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
1258 elif ONOS1Intents == ONOS2Intents\
1259 and ONOS1Intents == ONOS3Intents\
1260 and ONOS1Intents == ONOS4Intents\
1261 and ONOS1Intents == ONOS5Intents\
1262 and ONOS1Intents == ONOS6Intents\
1263 and ONOS1Intents == ONOS7Intents:
1264 intentCheck = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001265 main.log.report( "Intents are consistent across all ONOS nodes" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001266 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001267 main.log.warn( "ONOS1 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001268 print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001269 indent=4, separators=( ',', ': ' ) )
1270 main.log.warn( "ONOS2 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001271 print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001272 indent=4, separators=( ',', ': ' ) )
1273 main.log.warn( "ONOS3 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001274 print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001275 indent=4, separators=( ',', ': ' ) )
1276 main.log.warn( "ONOS4 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001277 print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001278 indent=4, separators=( ',', ': ' ) )
1279 main.log.warn( "ONOS5 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001280 print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001281 indent=4, separators=( ',', ': ' ) )
1282 main.log.warn( "ONOS6 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001283 print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001284 indent=4, separators=( ',', ': ' ) )
1285 main.log.warn( "ONOS7 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001286 print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
Jon Hall6aec96b2015-01-19 14:49:31 -08001287 indent=4, separators=( ',', ': ' ) )
1288 utilities.assert_equals(
1289 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001290 actual=intentCheck,
Jon Hall6aec96b2015-01-19 14:49:31 -08001291 onpass="Intents are consistent across all ONOS nodes",
1292 onfail="ONOS nodes have different views of intents" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001293
Jon Hall6aec96b2015-01-19 14:49:31 -08001294 # NOTE: Hazelcast has no durability, so intents are lost across system
1295 # restarts
1296 main.step( "Compare current intents with intents before the failure" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001297 # NOTE: this requires case 5 to pass for intentState to be set.
Jon Hall94fd0472014-12-08 11:52:42 -08001298 # maybe we should stop the test if that fails?
Jon Hall8f89dda2015-01-22 16:03:33 -08001299 if intentState == ONOS1Intents:
1300 sameIntents = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001301 main.log.report( "Intents are consistent with before failure" )
1302 # TODO: possibly the states have changed? we may need to figure out
1303 # what the aceptable states are
Jon Hall73cf9cc2014-11-20 22:28:38 -08001304 else:
Jon Hall669173b2014-12-17 11:36:30 -08001305 try:
Jon Hall6aec96b2015-01-19 14:49:31 -08001306 main.log.warn( "ONOS1 intents: " )
Jon Hall8f89dda2015-01-22 16:03:33 -08001307 print json.dumps( json.loads( ONOS1Intents ),
Jon Hall6aec96b2015-01-19 14:49:31 -08001308 sort_keys=True, indent=4,
1309 separators=( ',', ': ' ) )
Jon Hall669173b2014-12-17 11:36:30 -08001310 except:
1311 pass
Jon Hall8f89dda2015-01-22 16:03:33 -08001312 sameIntents = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001313 utilities.assert_equals(
1314 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001315 actual=sameIntents,
Jon Hall6aec96b2015-01-19 14:49:31 -08001316 onpass="Intents are consistent with before failure",
1317 onfail="The Intents changed during failure" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001318 intentCheck = intentCheck and sameIntents
Jon Hall73cf9cc2014-11-20 22:28:38 -08001319
Jon Hall6aec96b2015-01-19 14:49:31 -08001320 main.step( "Get the OF Table entries and compare to before " +
1321 "component failure" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001322 FlowTables = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001323 flows2 = []
1324 for i in range( 28 ):
1325 main.log.info( "Checking flow table on s" + str( i + 1 ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001326 tmpFlows = main.Mininet2.getFlowTable( 1.3, "s" + str( i + 1 ) )
1327 flows2.append( tmpFlows )
1328 tempResult = main.Mininet2.flowComp(
Jon Hall6aec96b2015-01-19 14:49:31 -08001329 flow1=flows[ i ],
Jon Hall8f89dda2015-01-22 16:03:33 -08001330 flow2=tmpFlows )
1331 FlowTables = FlowTables and tempResult
1332 if FlowTables == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001333 main.log.info( "Differences in flow table for switch: s" +
1334 str( i + 1 ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001335 if FlowTables == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001336 main.log.report( "No changes were found in the flow tables" )
1337 utilities.assert_equals(
1338 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001339 actual=FlowTables,
Jon Hall6aec96b2015-01-19 14:49:31 -08001340 onpass="No changes were found in the flow tables",
1341 onfail="Changes were found in the flow tables" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001342
Jon Hall6aec96b2015-01-19 14:49:31 -08001343 main.step( "Check the continuous pings to ensure that no packets " +
1344 "were dropped during component failure" )
1345 # FIXME: This check is always failing. Investigate cause
1346 # NOTE: this may be something to do with file permsissions
Jon Hall73cf9cc2014-11-20 22:28:38 -08001347 # or slight change in format
Jon Hall6aec96b2015-01-19 14:49:31 -08001348 main.Mininet2.pingKill(
1349 main.params[ 'TESTONUSER' ],
1350 main.params[ 'TESTONIP' ] )
Jon Hall8f89dda2015-01-22 16:03:33 -08001351 LossInPings = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001352 # NOTE: checkForLoss returns main.FALSE with 0% packet loss
1353 for i in range( 8, 18 ):
1354 main.log.info(
1355 "Checking for a loss in pings along flow from s" +
1356 str( i ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001357 LossInPings = main.Mininet2.checkForLoss(
Jon Hall6aec96b2015-01-19 14:49:31 -08001358 "/tmp/ping.h" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001359 str( i ) ) or LossInPings
1360 if LossInPings == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001361 main.log.info( "Loss in ping detected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001362 elif LossInPings == main.ERROR:
Jon Hall6aec96b2015-01-19 14:49:31 -08001363 main.log.info( "There are multiple mininet process running" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001364 elif LossInPings == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001365 main.log.info( "No Loss in the pings" )
1366 main.log.report( "No loss of dataplane connectivity" )
1367 utilities.assert_equals(
1368 expect=main.FALSE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001369 actual=LossInPings,
Jon Hall6aec96b2015-01-19 14:49:31 -08001370 onpass="No Loss of connectivity",
1371 onfail="Loss of dataplane connectivity detected" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001372
Jon Hall6aec96b2015-01-19 14:49:31 -08001373 # Test of LeadershipElection
Jon Hall8f89dda2015-01-22 16:03:33 -08001374 leaderList = []
1375 leaderResult = main.TRUE
1376 for controller in range( 1, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001377 # loop through ONOScli handlers
1378 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001379 leaderN = node.electionTestLeader()
1380 leaderList.append( leaderN )
Jon Hall669173b2014-12-17 11:36:30 -08001381 if leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001382 # error in response
1383 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001384 "electionTestLeader function, check the" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001385 " error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001386 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001387 elif leaderN is None:
1388 main.log.report( "ONOS" + str( controller ) +
1389 " shows no leader for the election-app was" +
1390 " elected after the old one died" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001391 leaderResult = main.FALSE
1392 elif leaderN == ONOS1Ip or leaderN == ONOS2Ip or\
1393 leaderN == ONOS3Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001394 main.log.report( "ONOS" + str( controller ) +
1395 " shows " + str( leaderN ) +
1396 " as leader for the election-app, but it " +
1397 "was restarted" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001398 leaderResult = main.FALSE
1399 if len( set( leaderList ) ) != 1:
1400 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001401 main.log.error(
1402 "Inconsistent view of leader for the election test app" )
1403 # TODO: print the list
Jon Hall8f89dda2015-01-22 16:03:33 -08001404 if leaderResult:
1405 main.log.report( "Leadership election tests passed( consistent " +
Jon Hall6aec96b2015-01-19 14:49:31 -08001406 "view of leader across listeners and a new " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001407 "leader was re-elected if applicable )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001408 utilities.assert_equals(
1409 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001410 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001411 onpass="Leadership election passed",
1412 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08001413
Jon Hall8f89dda2015-01-22 16:03:33 -08001414 result = mastershipCheck and intentCheck and FlowTables and\
1415 ( not LossInPings ) and rolesNotNull and leaderResult
Jon Hall6aec96b2015-01-19 14:49:31 -08001416 result = int( result )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001417 if result == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001418 main.log.report( "Constant State Tests Passed" )
1419 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001420 onpass="Constant State Tests Passed",
1421 onfail="Constant state tests failed" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001422
Jon Hall6aec96b2015-01-19 14:49:31 -08001423 def CASE8( self, main ):
1424 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001425 Compare topo
Jon Hall6aec96b2015-01-19 14:49:31 -08001426 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001427 import sys
Jon Hall6aec96b2015-01-19 14:49:31 -08001428 # FIXME add this path to params
1429 sys.path.append( "/home/admin/sts" )
1430 # assumes that sts is already in you PYTHONPATH
1431 from sts.topology.teston_topology import TestONTopology
Jon Hall73cf9cc2014-11-20 22:28:38 -08001432 import json
1433 import time
1434
Jon Hall6aec96b2015-01-19 14:49:31 -08001435 description = "Compare ONOS Topology view to Mininet topology"
1436 main.case( description )
1437 main.log.report( description )
1438 main.step( "Create TestONTopology object" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001439 ctrls = []
1440 count = 1
1441 while True:
1442 temp = ()
Jon Hall6aec96b2015-01-19 14:49:31 -08001443 if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
1444 temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
1445 temp = temp + ( "ONOS" + str( count ), )
1446 temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
1447 temp = temp + \
1448 ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
1449 ctrls.append( temp )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001450 count = count + 1
1451 else:
1452 break
Jon Hall6aec96b2015-01-19 14:49:31 -08001453 MNTopo = TestONTopology(
1454 main.Mininet1,
1455 ctrls ) # can also add Intent API info for intent operations
Jon Hall73cf9cc2014-11-20 22:28:38 -08001456
Jon Hall6aec96b2015-01-19 14:49:31 -08001457 main.step( "Comparing ONOS topology to MN" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001458 devicesResults = main.TRUE
1459 portsResults = main.TRUE
1460 linksResults = main.TRUE
1461 topoResult = main.FALSE
Jon Hall73cf9cc2014-11-20 22:28:38 -08001462 elapsed = 0
Jon Hallffb386d2014-11-21 13:43:38 -08001463 count = 0
Jon Hall6aec96b2015-01-19 14:49:31 -08001464 main.step( "Collecting topology information from ONOS" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001465 startTime = time.time()
1466 while topoResult == main.FALSE and elapsed < 60:
Jon Hallffb386d2014-11-21 13:43:38 -08001467 count = count + 1
Jon Hall94fd0472014-12-08 11:52:42 -08001468 if count > 1:
Jon Hall6aec96b2015-01-19 14:49:31 -08001469 # TODO: Depricate STS usage
1470 MNTopo = TestONTopology(
1471 main.Mininet1,
1472 ctrls )
Jon Hall8f89dda2015-01-22 16:03:33 -08001473 cliStart = time.time()
Jon Hall94fd0472014-12-08 11:52:42 -08001474 devices = []
1475 devices.append( main.ONOScli1.devices() )
1476 devices.append( main.ONOScli2.devices() )
1477 devices.append( main.ONOScli3.devices() )
1478 devices.append( main.ONOScli4.devices() )
1479 devices.append( main.ONOScli5.devices() )
1480 devices.append( main.ONOScli6.devices() )
1481 devices.append( main.ONOScli7.devices() )
1482 hosts = []
Jon Hall669173b2014-12-17 11:36:30 -08001483 hosts.append( json.loads( main.ONOScli1.hosts() ) )
1484 hosts.append( json.loads( main.ONOScli2.hosts() ) )
1485 hosts.append( json.loads( main.ONOScli3.hosts() ) )
1486 hosts.append( json.loads( main.ONOScli4.hosts() ) )
1487 hosts.append( json.loads( main.ONOScli5.hosts() ) )
1488 hosts.append( json.loads( main.ONOScli6.hosts() ) )
1489 hosts.append( json.loads( main.ONOScli7.hosts() ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001490 for controller in range( 0, len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001491 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001492 for host in hosts[ controller ]:
Jon Hall669173b2014-12-17 11:36:30 -08001493 host
Jon Hall6aec96b2015-01-19 14:49:31 -08001494 if host[ 'ips' ] == []:
1495 main.log.error(
1496 "DEBUG:Error with host ips on controller" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001497 controllerStr + ": " + str( host ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001498 ports = []
1499 ports.append( main.ONOScli1.ports() )
1500 ports.append( main.ONOScli2.ports() )
1501 ports.append( main.ONOScli3.ports() )
1502 ports.append( main.ONOScli4.ports() )
1503 ports.append( main.ONOScli5.ports() )
1504 ports.append( main.ONOScli6.ports() )
1505 ports.append( main.ONOScli7.ports() )
1506 links = []
1507 links.append( main.ONOScli1.links() )
1508 links.append( main.ONOScli2.links() )
1509 links.append( main.ONOScli3.links() )
1510 links.append( main.ONOScli4.links() )
1511 links.append( main.ONOScli5.links() )
1512 links.append( main.ONOScli6.links() )
1513 links.append( main.ONOScli7.links() )
1514 clusters = []
1515 clusters.append( main.ONOScli1.clusters() )
1516 clusters.append( main.ONOScli2.clusters() )
1517 clusters.append( main.ONOScli3.clusters() )
1518 clusters.append( main.ONOScli4.clusters() )
1519 clusters.append( main.ONOScli5.clusters() )
1520 clusters.append( main.ONOScli6.clusters() )
1521 clusters.append( main.ONOScli7.clusters() )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001522
Jon Hall8f89dda2015-01-22 16:03:33 -08001523 elapsed = time.time() - startTime
1524 cliTime = time.time() - cliStart
1525 print "CLI time: " + str( cliTime )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001526
Jon Hall8f89dda2015-01-22 16:03:33 -08001527 for controller in range( numControllers ):
1528 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001529 if devices[ controller ] or "Error" not in devices[
1530 controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001531 currentDevicesResult = main.Mininet1.compareSwitches(
Jon Hall6aec96b2015-01-19 14:49:31 -08001532 MNTopo,
1533 json.loads(
1534 devices[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001535 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001536 currentDevicesResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001537 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001538 actual=currentDevicesResult,
1539 onpass="ONOS" + controllerStr +
1540 " Switches view is correct",
1541 onfail="ONOS" + controllerStr +
1542 " Switches view is incorrect" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001543
Jon Hall6aec96b2015-01-19 14:49:31 -08001544 if ports[ controller ] or "Error" not in ports[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001545 currentPortsResult = main.Mininet1.comparePorts(
Jon Hall6aec96b2015-01-19 14:49:31 -08001546 MNTopo,
1547 json.loads(
1548 ports[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001549 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001550 currentPortsResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001551 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001552 actual=currentPortsResult,
1553 onpass="ONOS" + controllerStr +
1554 " ports view is correct",
1555 onfail="ONOS" + controllerStr +
1556 " ports view is incorrect" )
Jon Hall94fd0472014-12-08 11:52:42 -08001557
Jon Hall6aec96b2015-01-19 14:49:31 -08001558 if links[ controller ] or "Error" not in links[ controller ]:
Jon Hall8f89dda2015-01-22 16:03:33 -08001559 currentLinksResult = main.Mininet1.compareLinks(
Jon Hall6aec96b2015-01-19 14:49:31 -08001560 MNTopo,
1561 json.loads(
1562 links[ controller ] ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001563 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08001564 currentLinksResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001565 utilities.assert_equals( expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001566 actual=currentLinksResult,
1567 onpass="ONOS" + controllerStr +
1568 " links view is correct",
1569 onfail="ONOS" + controllerStr +
1570 " links view is incorrect" )
1571 devicesResults = devicesResults and currentDevicesResult
1572 portsResults = portsResults and currentPortsResult
1573 linksResults = linksResults and currentLinksResult
Jon Hall94fd0472014-12-08 11:52:42 -08001574
Jon Hall529a37f2015-01-28 10:02:00 -08001575 # Compare json objects for hosts and dataplane clusters
Jon Hall94fd0472014-12-08 11:52:42 -08001576
Jon Hall6aec96b2015-01-19 14:49:31 -08001577 # hosts
Jon Hall8f89dda2015-01-22 16:03:33 -08001578 consistentHostsResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -08001579 for controller in range( len( hosts ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001580 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001581 if "Error" not in hosts[ controller ]:
1582 if hosts[ controller ] == hosts[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001583 continue
Jon Hall6aec96b2015-01-19 14:49:31 -08001584 else: # hosts not consistent
Jon Hall8f89dda2015-01-22 16:03:33 -08001585 main.log.report( "hosts from ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001586 " is inconsistent with ONOS1" )
1587 main.log.warn( repr( hosts[ controller ] ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001588 consistentHostsResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -08001589
1590 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001591 main.log.report( "Error in getting ONOS hosts from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001592 controllerStr )
1593 consistentHostsResult = main.FALSE
1594 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001595 " hosts response: " +
1596 repr( hosts[ controller ] ) )
1597 utilities.assert_equals(
1598 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001599 actual=consistentHostsResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001600 onpass="Hosts view is consistent across all ONOS nodes",
1601 onfail="ONOS nodes have different views of hosts" )
Jon Hall94fd0472014-12-08 11:52:42 -08001602
Jon Hall6aec96b2015-01-19 14:49:31 -08001603 # Strongly connected clusters of devices
Jon Hall8f89dda2015-01-22 16:03:33 -08001604 consistentClustersResult = main.TRUE
Jon Hall94fd0472014-12-08 11:52:42 -08001605 for controller in range( len( clusters ) ):
Jon Hall8f89dda2015-01-22 16:03:33 -08001606 controllerStr = str( controller + 1 )
Jon Hall6aec96b2015-01-19 14:49:31 -08001607 if "Error" not in clusters[ controller ]:
1608 if clusters[ controller ] == clusters[ 0 ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001609 continue
Jon Hall6aec96b2015-01-19 14:49:31 -08001610 else: # clusters not consistent
1611 main.log.report( "clusters from ONOS" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001612 controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001613 " is inconsistent with ONOS1" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001614 consistentClustersResult = main.FALSE
Jon Hall94fd0472014-12-08 11:52:42 -08001615
1616 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001617 main.log.report( "Error in getting dataplane clusters " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001618 "from ONOS" + controllerStr )
1619 consistentClustersResult = main.FALSE
1620 main.log.warn( "ONOS" + controllerStr +
Jon Hall6aec96b2015-01-19 14:49:31 -08001621 " clusters response: " +
1622 repr( clusters[ controller ] ) )
1623 utilities.assert_equals(
1624 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001625 actual=consistentClustersResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001626 onpass="Clusters view is consistent across all ONOS nodes",
1627 onfail="ONOS nodes have different views of clusters" )
1628 # there should always only be one cluster
Jon Hall8f89dda2015-01-22 16:03:33 -08001629 numClusters = len( json.loads( clusters[ 0 ] ) )
Jon Hall6aec96b2015-01-19 14:49:31 -08001630 utilities.assert_equals(
1631 expect=1,
Jon Hall8f89dda2015-01-22 16:03:33 -08001632 actual=numClusters,
Jon Hall6aec96b2015-01-19 14:49:31 -08001633 onpass="ONOS shows 1 SCC",
1634 onfail="ONOS shows " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001635 str( numClusters ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001636 " SCCs" )
Jon Hall94fd0472014-12-08 11:52:42 -08001637
Jon Hall8f89dda2015-01-22 16:03:33 -08001638 topoResult = ( devicesResults and portsResults and linksResults
1639 and consistentHostsResult
Jon Hall529a37f2015-01-28 10:02:00 -08001640 and consistentClustersResult )
Jon Hall94fd0472014-12-08 11:52:42 -08001641
Jon Hall8f89dda2015-01-22 16:03:33 -08001642 topoResult = topoResult and int( count <= 2 )
1643 note = "note it takes about " + str( int( cliTime ) ) + \
1644 " seconds for the test to make all the cli calls to fetch " +\
1645 "the topology from each ONOS instance"
Jon Hall6aec96b2015-01-19 14:49:31 -08001646 main.log.report(
Jon Hall8f89dda2015-01-22 16:03:33 -08001647 "Very crass estimate for topology discovery/convergence( " +
1648 str( note ) + " ): " + str( elapsed ) + " seconds, " +
Jon Hall6aec96b2015-01-19 14:49:31 -08001649 str( count ) + " tries" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001650 utilities.assert_equals( expect=main.TRUE, actual=topoResult,
1651 onpass="Topology Check Test successful",
1652 onfail="Topology Check Test NOT successful" )
1653 if topoResult == main.TRUE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001654 main.log.report( "ONOS topology view matches Mininet topology" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001655
Jon Hall6aec96b2015-01-19 14:49:31 -08001656 def CASE9( self, main ):
1657 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001658 Link s3-s28 down
Jon Hall6aec96b2015-01-19 14:49:31 -08001659 """
1660 import time
1661 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001662
Jon Hall8f89dda2015-01-22 16:03:33 -08001663 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001664
Jon Hall6aec96b2015-01-19 14:49:31 -08001665 description = "Turn off a link to ensure that Link Discovery " +\
Jon Hall8f89dda2015-01-22 16:03:33 -08001666 "is working properly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001667 main.log.report( description )
1668 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001669
Jon Hall6aec96b2015-01-19 14:49:31 -08001670 main.step( "Kill Link between s3 and s28" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001671 LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001672 main.log.info(
1673 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001674 str( linkSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001675 " seconds for link down to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001676 time.sleep( linkSleep )
1677 utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
1678 onpass="Link down succesful",
1679 onfail="Failed to bring link down" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001680 # TODO do some sort of check here
Jon Hall73cf9cc2014-11-20 22:28:38 -08001681
Jon Hall6aec96b2015-01-19 14:49:31 -08001682 def CASE10( self, main ):
1683 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001684 Link s3-s28 up
Jon Hall6aec96b2015-01-19 14:49:31 -08001685 """
1686 import time
1687 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001688
Jon Hall8f89dda2015-01-22 16:03:33 -08001689 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001690
Jon Hall6aec96b2015-01-19 14:49:31 -08001691 description = "Restore a link to ensure that Link Discovery is " + \
Jon Hall8f89dda2015-01-22 16:03:33 -08001692 "working properly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001693 main.log.report( description )
1694 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001695
Jon Hall6aec96b2015-01-19 14:49:31 -08001696 main.step( "Bring link between s3 and s28 back up" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001697 LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001698 main.log.info(
1699 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001700 str( linkSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001701 " seconds for link up to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001702 time.sleep( linkSleep )
1703 utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
1704 onpass="Link up succesful",
1705 onfail="Failed to bring link up" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001706 # TODO do some sort of check here
Jon Hall73cf9cc2014-11-20 22:28:38 -08001707
Jon Hall6aec96b2015-01-19 14:49:31 -08001708 def CASE11( self, main ):
1709 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001710 Switch Down
Jon Hall6aec96b2015-01-19 14:49:31 -08001711 """
1712 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001713 import time
1714
Jon Hall8f89dda2015-01-22 16:03:33 -08001715 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001716
1717 description = "Killing a switch to ensure it is discovered correctly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001718 main.log.report( description )
1719 main.case( description )
1720 switch = main.params[ 'kill' ][ 'switch' ]
1721 switchDPID = main.params[ 'kill' ][ 'dpid' ]
Jon Hall73cf9cc2014-11-20 22:28:38 -08001722
Jon Hall6aec96b2015-01-19 14:49:31 -08001723 # TODO: Make this switch parameterizable
1724 main.step( "Kill " + switch )
1725 main.log.report( "Deleting " + switch )
Jon Hall8f89dda2015-01-22 16:03:33 -08001726 main.Mininet1.delSwitch( switch )
1727 main.log.info( "Waiting " + str( switchSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001728 " seconds for switch down to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001729 time.sleep( switchSleep )
1730 device = main.ONOScli1.getDevice( dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001731 # Peek at the deleted switch
1732 main.log.warn( str( device ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001733 result = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001734 if device and device[ 'available' ] is False:
Jon Hall94fd0472014-12-08 11:52:42 -08001735 result = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001736 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001737 onpass="Kill switch succesful",
1738 onfail="Failed to kill switch?" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001739
Jon Hall6aec96b2015-01-19 14:49:31 -08001740 def CASE12( self, main ):
1741 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001742 Switch Up
Jon Hall6aec96b2015-01-19 14:49:31 -08001743 """
1744 # NOTE: You should probably run a topology check after this
Jon Hall73cf9cc2014-11-20 22:28:38 -08001745 import time
Jon Hall669173b2014-12-17 11:36:30 -08001746
Jon Hall8f89dda2015-01-22 16:03:33 -08001747 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
Jon Hall6aec96b2015-01-19 14:49:31 -08001748 switch = main.params[ 'kill' ][ 'switch' ]
1749 switchDPID = main.params[ 'kill' ][ 'dpid' ]
1750 links = main.params[ 'kill' ][ 'links' ].split()
Jon Hall73cf9cc2014-11-20 22:28:38 -08001751 description = "Adding a switch to ensure it is discovered correctly"
Jon Hall6aec96b2015-01-19 14:49:31 -08001752 main.log.report( description )
1753 main.case( description )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001754
Jon Hall6aec96b2015-01-19 14:49:31 -08001755 main.step( "Add back " + switch )
1756 main.log.report( "Adding back " + switch )
Jon Hall8f89dda2015-01-22 16:03:33 -08001757 main.Mininet1.addSwitch( switch, dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001758 # TODO: New dpid or same? Ask Thomas?
1759 for peer in links:
Jon Hall8f89dda2015-01-22 16:03:33 -08001760 main.Mininet1.addLink( switch, peer )
1761 main.Mininet1.assignSwController(
Jon Hall6aec96b2015-01-19 14:49:31 -08001762 sw=switch.split( 's' )[ 1 ],
Jon Hall8f89dda2015-01-22 16:03:33 -08001763 count=numControllers,
1764 ip1=ONOS1Ip,
1765 port1=ONOS1Port,
1766 ip2=ONOS2Ip,
1767 port2=ONOS2Port,
1768 ip3=ONOS3Ip,
1769 port3=ONOS3Port,
1770 ip4=ONOS4Ip,
1771 port4=ONOS4Port,
1772 ip5=ONOS5Ip,
1773 port5=ONOS5Port,
1774 ip6=ONOS6Ip,
1775 port6=ONOS6Port,
1776 ip7=ONOS7Ip,
1777 port7=ONOS7Port )
Jon Hall6aec96b2015-01-19 14:49:31 -08001778 main.log.info(
1779 "Waiting " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001780 str( switchSleep ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001781 " seconds for switch up to be discovered" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001782 time.sleep( switchSleep )
1783 device = main.ONOScli1.getDevice( dpid=switchDPID )
Jon Hall6aec96b2015-01-19 14:49:31 -08001784 # Peek at the deleted switch
1785 main.log.warn( str( device ) )
Jon Hall94fd0472014-12-08 11:52:42 -08001786 result = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001787 if device and device[ 'available' ]:
Jon Hall94fd0472014-12-08 11:52:42 -08001788 result = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001789 utilities.assert_equals( expect=main.TRUE, actual=result,
Jon Hall8f89dda2015-01-22 16:03:33 -08001790 onpass="add switch succesful",
1791 onfail="Failed to add switch?" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001792
Jon Hall6aec96b2015-01-19 14:49:31 -08001793 def CASE13( self, main ):
1794 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001795 Clean up
Jon Hall6aec96b2015-01-19 14:49:31 -08001796 """
Jon Hall73cf9cc2014-11-20 22:28:38 -08001797 import os
1798 import time
Jon Hall6aec96b2015-01-19 14:49:31 -08001799 # TODO: make use of this elsewhere
1800 ips = []
Jon Hall8f89dda2015-01-22 16:03:33 -08001801 ips.append( ONOS1Ip )
1802 ips.append( ONOS2Ip )
1803 ips.append( ONOS3Ip )
1804 ips.append( ONOS4Ip )
1805 ips.append( ONOS5Ip )
1806 ips.append( ONOS6Ip )
1807 ips.append( ONOS7Ip )
Jon Hall6aec96b2015-01-19 14:49:31 -08001808
1809 # printing colors to terminal
Jon Hall669173b2014-12-17 11:36:30 -08001810 colors = {}
Jon Hall6aec96b2015-01-19 14:49:31 -08001811 colors[ 'cyan' ] = '\033[96m'
1812 colors[ 'purple' ] = '\033[95m'
1813 colors[ 'blue' ] = '\033[94m'
1814 colors[ 'green' ] = '\033[92m'
1815 colors[ 'yellow' ] = '\033[93m'
1816 colors[ 'red' ] = '\033[91m'
1817 colors[ 'end' ] = '\033[0m'
Jon Hall73cf9cc2014-11-20 22:28:38 -08001818 description = "Test Cleanup"
Jon Hall6aec96b2015-01-19 14:49:31 -08001819 main.log.report( description )
1820 main.case( description )
1821 main.step( "Killing tcpdumps" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001822 main.Mininet2.stopTcpdump()
Jon Hall73cf9cc2014-11-20 22:28:38 -08001823
Jon Hall6aec96b2015-01-19 14:49:31 -08001824 main.step( "Checking ONOS Logs for errors" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001825 for i in range( 7 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001826 print colors[ 'purple' ] + "Checking logs for errors on " + \
Jon Hall8f89dda2015-01-22 16:03:33 -08001827 "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
1828 print main.ONOSbench.checkLogs( ips[ i ] )
Jon Hall94fd0472014-12-08 11:52:42 -08001829
Jon Hall6aec96b2015-01-19 14:49:31 -08001830 main.step( "Copying MN pcap and ONOS log files to test station" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001831 testname = main.TEST
Jon Hall8f89dda2015-01-22 16:03:33 -08001832 teststationUser = main.params[ 'TESTONUSER' ]
1833 teststationIP = main.params[ 'TESTONIP' ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001834 # NOTE: MN Pcap file is being saved to ~/packet_captures
Jon Hall73cf9cc2014-11-20 22:28:38 -08001835 # scp this file as MN and TestON aren't necessarily the same vm
Jon Hall6aec96b2015-01-19 14:49:31 -08001836 # FIXME: scp
1837 # mn files
1838 # TODO: Load these from params
1839 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001840 logFolder = "/opt/onos/log/"
1841 logFiles = [ "karaf.log", "karaf.log.1" ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001842 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001843 dstDir = "~/packet_captures/"
1844 for f in logFiles:
1845 for i in range( 7 ):
1846 main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
1847 logFolder + f + " " +
1848 teststationUser + "@" +
1849 teststationIP + ":" +
1850 dstDir + str( testname ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001851 "-ONOS" + str( i + 1 ) + "-" +
1852 f )
1853 # std*.log's
1854 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001855 logFolder = "/opt/onos/var/"
1856 logFiles = [ "stderr.log", "stdout.log" ]
Jon Hall6aec96b2015-01-19 14:49:31 -08001857 # NOTE: must end in /
Jon Hall8f89dda2015-01-22 16:03:33 -08001858 dstDir = "~/packet_captures/"
1859 for f in logFiles:
1860 for i in range( 7 ):
1861 main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
1862 logFolder + f + " " +
1863 teststationUser + "@" +
1864 teststationIP + ":" +
1865 dstDir + str( testname ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001866 "-ONOS" + str( i + 1 ) + "-" +
1867 f )
1868 # sleep so scp can finish
1869 time.sleep( 10 )
1870 main.step( "Packing and rotating pcap archives" )
1871 os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001872
Jon Hall6aec96b2015-01-19 14:49:31 -08001873 # TODO: actually check something here
1874 utilities.assert_equals( expect=main.TRUE, actual=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001875 onpass="Test cleanup successful",
1876 onfail="Test cleanup NOT successful" )
Jon Hall73cf9cc2014-11-20 22:28:38 -08001877
Jon Hall6aec96b2015-01-19 14:49:31 -08001878 def CASE14( self, main ):
1879 """
Jon Hall669173b2014-12-17 11:36:30 -08001880 start election app on all onos nodes
Jon Hall6aec96b2015-01-19 14:49:31 -08001881 """
Jon Hall8f89dda2015-01-22 16:03:33 -08001882 leaderResult = main.TRUE
Jon Hall6aec96b2015-01-19 14:49:31 -08001883 # install app on onos 1
1884 main.log.info( "Install leadership election app" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001885 main.ONOScli1.featureInstall( "onos-app-election" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001886 # wait for election
1887 # check for leader
Jon Hall8f89dda2015-01-22 16:03:33 -08001888 leader = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08001889 # verify leader is ONOS1
Jon Hall8f89dda2015-01-22 16:03:33 -08001890 if leader == ONOS1Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001891 # all is well
Jon Hall669173b2014-12-17 11:36:30 -08001892 pass
Jon Hall6aec96b2015-01-19 14:49:31 -08001893 elif leader is None:
1894 # No leader elected
1895 main.log.report( "No leader was elected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001896 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001897 elif leader == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001898 # error in response
1899 # TODO: add check for "Command not found:" in the driver, this
1900 # means the app isn't loaded
Jon Hall8f89dda2015-01-22 16:03:33 -08001901 main.log.report( "Something is wrong with electionTestLeader" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001902 " function, check the error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001903 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001904 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08001905 # error in response
1906 main.log.report(
Jon Hall8f89dda2015-01-22 16:03:33 -08001907 "Unexpected response from electionTestLeader function:'" +
1908 str( leader ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001909 "'" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001910 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001911
Jon Hall6aec96b2015-01-19 14:49:31 -08001912 # install on other nodes and check for leader.
1913 # Should be onos1 and each app should show the same leader
Jon Hall8f89dda2015-01-22 16:03:33 -08001914 for controller in range( 2, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001915 # loop through ONOScli handlers
1916 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001917 node.featureInstall( "onos-app-election" )
1918 leaderN = node.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08001919 # verify leader is ONOS1
Jon Hall8f89dda2015-01-22 16:03:33 -08001920 if leaderN == ONOS1Ip:
Jon Hall6aec96b2015-01-19 14:49:31 -08001921 # all is well
Jon Hall669173b2014-12-17 11:36:30 -08001922 pass
1923 elif leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08001924 # error in response
1925 # TODO: add check for "Command not found:" in the driver, this
1926 # means the app isn't loaded
1927 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001928 "electionTestLeader function, check the" +
Jon Hall6aec96b2015-01-19 14:49:31 -08001929 " error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001930 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08001931 elif leader != leaderN:
Jon Hall8f89dda2015-01-22 16:03:33 -08001932 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08001933 main.log.report( "ONOS" + str( controller ) + " sees " +
1934 str( leaderN ) +
1935 " as the leader of the election app. Leader" +
1936 " should be " +
1937 str( leader ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001938 if leaderResult:
Jon Hall6aec96b2015-01-19 14:49:31 -08001939 main.log.report( "Leadership election tests passed( consistent " +
1940 "view of leader across listeners and a leader " +
Jon Hall8f89dda2015-01-22 16:03:33 -08001941 "was elected )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001942 utilities.assert_equals(
1943 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001944 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001945 onpass="Leadership election passed",
1946 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08001947
Jon Hall6aec96b2015-01-19 14:49:31 -08001948 def CASE15( self, main ):
1949 """
Jon Hall669173b2014-12-17 11:36:30 -08001950 Check that Leadership Election is still functional
Jon Hall6aec96b2015-01-19 14:49:31 -08001951 """
Jon Hall8f89dda2015-01-22 16:03:33 -08001952 leaderResult = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08001953 description = "Check that Leadership Election is still functional"
Jon Hall6aec96b2015-01-19 14:49:31 -08001954 main.log.report( description )
1955 main.case( description )
1956 main.step( "Find current leader and withdraw" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001957 leader = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08001958 # TODO: do some sanity checking on leader before using it
Jon Hall8f89dda2015-01-22 16:03:33 -08001959 withdrawResult = main.FALSE
1960 if leader == ONOS1Ip:
1961 oldLeader = getattr( main, "ONOScli1" )
1962 elif leader == ONOS2Ip:
1963 oldLeader = getattr( main, "ONOScli2" )
1964 elif leader == ONOS3Ip:
1965 oldLeader = getattr( main, "ONOScli3" )
1966 elif leader == ONOS4Ip:
1967 oldLeader = getattr( main, "ONOScli4" )
1968 elif leader == ONOS5Ip:
1969 oldLeader = getattr( main, "ONOScli5" )
1970 elif leader == ONOS6Ip:
1971 oldLeader = getattr( main, "ONOScli6" )
1972 elif leader == ONOS7Ip:
1973 oldLeader = getattr( main, "ONOScli7" )
Jon Hall6aec96b2015-01-19 14:49:31 -08001974 elif leader is None or leader == main.FALSE:
1975 main.log.report(
1976 "Leader for the election app should be an ONOS node," +
1977 "instead got '" +
Jon Hall8f89dda2015-01-22 16:03:33 -08001978 str( leader ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08001979 "'" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001980 leaderResult = main.FALSE
1981 withdrawResult = oldLeader.electionTestWithdraw()
Jon Hall6aec96b2015-01-19 14:49:31 -08001982 utilities.assert_equals(
1983 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08001984 actual=withdrawResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08001985 onpass="App was withdrawn from election",
1986 onfail="App was not withdrawn from election" )
Jon Hall669173b2014-12-17 11:36:30 -08001987
Jon Hall6aec96b2015-01-19 14:49:31 -08001988 main.step( "Make sure new leader is elected" )
Jon Hall8f89dda2015-01-22 16:03:33 -08001989 leaderList = []
1990 for controller in range( 1, numControllers + 1 ):
Jon Hall6aec96b2015-01-19 14:49:31 -08001991 # loop through ONOScli handlers
1992 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
Jon Hall8f89dda2015-01-22 16:03:33 -08001993 leaderList.append( node.electionTestLeader() )
1994 for leaderN in leaderList:
Jon Hall669173b2014-12-17 11:36:30 -08001995 if leaderN == leader:
Jon Hall6aec96b2015-01-19 14:49:31 -08001996 main.log.report(
1997 "ONOS" +
1998 str( controller ) +
1999 " still sees " +
2000 str( leader ) +
2001 " as leader after they withdrew" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002002 leaderResult = main.FALSE
Jon Hall669173b2014-12-17 11:36:30 -08002003 elif leaderN == main.FALSE:
Jon Hall6aec96b2015-01-19 14:49:31 -08002004 # error in response
2005 # TODO: add check for "Command not found:" in the driver, this
2006 # means the app isn't loaded
2007 main.log.report( "Something is wrong with " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002008 "electionTestLeader function, " +
Jon Hall6aec96b2015-01-19 14:49:31 -08002009 "check the error logs" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002010 leaderResult = main.FALSE
2011 consistentLeader = main.FALSE
2012 if len( set( leaderList ) ) == 1:
Jon Hall6aec96b2015-01-19 14:49:31 -08002013 main.log.info( "Each Election-app sees '" +
Jon Hall8f89dda2015-01-22 16:03:33 -08002014 str( leaderList[ 0 ] ) +
Jon Hall6aec96b2015-01-19 14:49:31 -08002015 "' as the leader" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002016 consistentLeader = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08002017 else:
Jon Hall6aec96b2015-01-19 14:49:31 -08002018 main.log.report(
2019 "Inconsistent responses for leader of Election-app:" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002020 for n in range( len( leaderList ) ):
Jon Hall6aec96b2015-01-19 14:49:31 -08002021 main.log.report( "ONOS" + str( n + 1 ) + " response: " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002022 str( leaderList[ n ] ) )
2023 if leaderResult:
2024 main.log.report( "Leadership election tests passed( consistent " +
Jon Hall6aec96b2015-01-19 14:49:31 -08002025 "view of leader across listeners and a new " +
2026 "leader was elected when the old leader " +
Jon Hall8f89dda2015-01-22 16:03:33 -08002027 "resigned )" )
Jon Hall6aec96b2015-01-19 14:49:31 -08002028 utilities.assert_equals(
2029 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002030 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002031 onpass="Leadership election passed",
2032 onfail="Something went wrong with Leadership election" )
Jon Hall669173b2014-12-17 11:36:30 -08002033
Jon Hall6aec96b2015-01-19 14:49:31 -08002034 main.step(
Jon Hall8f89dda2015-01-22 16:03:33 -08002035 "Run for election on old leader( just so everyone is in the hat )" )
2036 runResult = oldLeader.electionTestRun()
Jon Hall6aec96b2015-01-19 14:49:31 -08002037 utilities.assert_equals(
2038 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002039 actual=runResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002040 onpass="App re-ran for election",
2041 onfail="App failed to run for election" )
Jon Hall8f89dda2015-01-22 16:03:33 -08002042 if consistentLeader == main.TRUE:
2043 afterRun = main.ONOScli1.electionTestLeader()
Jon Hall6aec96b2015-01-19 14:49:31 -08002044 # verify leader didn't just change
Jon Hall8f89dda2015-01-22 16:03:33 -08002045 if afterRun == leaderList[ 0 ]:
2046 leaderResult = main.TRUE
Jon Hall669173b2014-12-17 11:36:30 -08002047 else:
Jon Hall8f89dda2015-01-22 16:03:33 -08002048 leaderResult = main.FALSE
Jon Hall6aec96b2015-01-19 14:49:31 -08002049 # TODO: assert on run and withdraw results?
Jon Hall669173b2014-12-17 11:36:30 -08002050
Jon Hall6aec96b2015-01-19 14:49:31 -08002051 utilities.assert_equals(
2052 expect=main.TRUE,
Jon Hall8f89dda2015-01-22 16:03:33 -08002053 actual=leaderResult,
Jon Hall6aec96b2015-01-19 14:49:31 -08002054 onpass="Leadership election passed",
2055 onfail="Something went wrong with Leadership election after " +
2056 "the old leader re-ran for election" )