blob: 2b811757f6a356a66b5bb9b15ba5f0592620a905 [file] [log] [blame]
Jon Hall85794ff2015-07-08 14:12:30 -07001"""
2Description: This test is to determine if a single
3 instance ONOS 'cluster' can handle a restart
4
5List of test cases:
6CASE1: Compile ONOS and push it to the test machines
7CASE2: Assign devices to controllers
8CASE21: Assign mastership to controllers
9CASE3: Assign intents
10CASE4: Ping across added host intents
11CASE5: Reading state of ONOS
12CASE6: The Failure case.
13CASE7: Check state after control plane failure
14CASE8: Compare topo
15CASE9: Link s3-s28 down
16CASE10: Link s3-s28 up
17CASE11: Switch down
18CASE12: Switch up
19CASE13: Clean up
20CASE14: start election app on all onos nodes
21CASE15: Check that Leadership Election is still functional
22CASE16: Install Distributed Primitives app
23CASE17: Check for basic functionality with distributed primitives
24"""
25
26
27class HAsingleInstanceRestart:
28
29 def __init__( self ):
30 self.default = ''
31
32 def CASE1( self, main ):
33 """
34 CASE1 is to compile ONOS and push it to the test machines
35
36 Startup sequence:
37 cell <name>
38 onos-verify-cell
39 NOTE: temporary - onos-remove-raft-logs
40 onos-uninstall
41 start mininet
42 git pull
43 mvn clean install
44 onos-package
45 onos-install -f
46 onos-wait-for-start
47 start cli sessions
48 start tcpdump
49 """
Jon Halle1a3b752015-07-22 13:02:46 -070050 import imp
Jon Hall85794ff2015-07-08 14:12:30 -070051 main.log.info( "ONOS Single node cluster restart " +
52 "HA test - initialization" )
53 main.case( "Setting up test environment" )
Jon Hall783bbf92015-07-23 14:33:19 -070054 main.caseExplanation = "Setup the test environment including " +\
Jon Hall85794ff2015-07-08 14:12:30 -070055 "installing ONOS, starting Mininet and ONOS" +\
56 "cli sessions."
57 # TODO: save all the timers and output them for plotting
58
59 # load some variables from the params file
60 PULLCODE = False
61 if main.params[ 'Git' ] == 'True':
62 PULLCODE = True
63 gitBranch = main.params[ 'branch' ]
64 cellName = main.params[ 'ENV' ][ 'cellName' ]
65
Jon Halle1a3b752015-07-22 13:02:46 -070066 main.numCtrls = int( main.params[ 'num_controllers' ] )
Jon Hall5cf14d52015-07-16 12:15:19 -070067 if main.ONOSbench.maxNodes:
Jon Halle1a3b752015-07-22 13:02:46 -070068 if main.ONOSbench.maxNodes < main.numCtrls:
69 main.numCtrls = int( main.ONOSbench.maxNodes )
Jon Hall85794ff2015-07-08 14:12:30 -070070
Jon Halle1a3b752015-07-22 13:02:46 -070071 try:
72 fileName = "Counters"
73 path = main.params[ 'imports' ][ 'path' ]
74 main.Counters = imp.load_source( fileName,
75 path + fileName + ".py" )
76 except Exception as e:
77 main.log.exception( e )
78 main.cleanup()
79 main.exit()
80
81 main.CLIs = []
82 main.nodes = []
Jon Hall5cf14d52015-07-16 12:15:19 -070083 ipList = []
84 for i in range( 1, int( main.ONOSbench.maxNodes ) + 1 ):
85 try:
Jon Halle1a3b752015-07-22 13:02:46 -070086 main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
87 main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
88 ipList.append( main.nodes[ -1 ].ip_address )
Jon Hall5cf14d52015-07-16 12:15:19 -070089 except AttributeError:
90 break
Jon Hall85794ff2015-07-08 14:12:30 -070091
Jon Hall5cf14d52015-07-16 12:15:19 -070092 main.step( "Create cell file" )
93 cellAppString = main.params[ 'ENV' ][ 'appString' ]
94 main.ONOSbench.createCellFile( main.ONOSbench.ip_address, cellName,
95 main.Mininet1.ip_address,
96 cellAppString, ipList )
Jon Hall85794ff2015-07-08 14:12:30 -070097 main.step( "Applying cell variable to environment" )
98 cellResult = main.ONOSbench.setCell( cellName )
99 verifyResult = main.ONOSbench.verifyCell()
100
101 # FIXME:this is short term fix
102 main.log.info( "Removing raft logs" )
103 main.ONOSbench.onosRemoveRaftLogs()
104
105 main.log.info( "Uninstalling ONOS" )
Jon Halle1a3b752015-07-22 13:02:46 -0700106 for node in main.nodes:
Jon Hall85794ff2015-07-08 14:12:30 -0700107 main.ONOSbench.onosUninstall( node.ip_address )
108
109 # Make sure ONOS is DEAD
110 main.log.info( "Killing any ONOS processes" )
111 killResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -0700112 for node in main.nodes:
Jon Hall85794ff2015-07-08 14:12:30 -0700113 killed = main.ONOSbench.onosKill( node.ip_address )
114 killResults = killResults and killed
115
116 cleanInstallResult = main.TRUE
117 gitPullResult = main.TRUE
118
119 main.step( "Starting Mininet" )
120 # scp topo file to mininet
121 # TODO: move to params?
122 topoName = "obelisk.py"
123 filePath = main.ONOSbench.home + "/tools/test/topos/"
kelvin-onlabd9e23de2015-08-06 10:34:44 -0700124 main.ONOSbench.scp( main.Mininet1,
125 filePath + topoName,
126 main.Mininet1.home,
127 direction="to" )
Jon Hall85794ff2015-07-08 14:12:30 -0700128 mnResult = main.Mininet1.startNet( )
129 utilities.assert_equals( expect=main.TRUE, actual=mnResult,
130 onpass="Mininet Started",
131 onfail="Error starting Mininet" )
132
133 main.step( "Git checkout and pull " + gitBranch )
134 if PULLCODE:
135 main.ONOSbench.gitCheckout( gitBranch )
136 gitPullResult = main.ONOSbench.gitPull()
137 # values of 1 or 3 are good
138 utilities.assert_lesser( expect=0, actual=gitPullResult,
139 onpass="Git pull successful",
140 onfail="Git pull failed" )
141 main.ONOSbench.getVersion( report=True )
142
143 main.step( "Using mvn clean install" )
144 cleanInstallResult = main.TRUE
145 if PULLCODE and gitPullResult == main.TRUE:
146 cleanInstallResult = main.ONOSbench.cleanInstall()
147 else:
148 main.log.warn( "Did not pull new code so skipping mvn " +
149 "clean install" )
150 utilities.assert_equals( expect=main.TRUE,
151 actual=cleanInstallResult,
152 onpass="MCI successful",
153 onfail="MCI failed" )
154 # GRAPHS
155 # NOTE: important params here:
156 # job = name of Jenkins job
157 # Plot Name = Plot-HA, only can be used if multiple plots
158 # index = The number of the graph under plot name
Jon Hall5cf14d52015-07-16 12:15:19 -0700159 job = "HAsingleInstanceRestart"
Jon Hall85794ff2015-07-08 14:12:30 -0700160 plotName = "Plot-HA"
161 graphs = '<ac:structured-macro ac:name="html">\n'
162 graphs += '<ac:plain-text-body><![CDATA[\n'
163 graphs += '<iframe src="https://onos-jenkins.onlab.us/job/' + job +\
164 '/plot/' + plotName + '/getPlot?index=0' +\
165 '&width=500&height=300"' +\
166 'noborder="0" width="500" height="300" scrolling="yes" ' +\
167 'seamless="seamless"></iframe>\n'
168 graphs += ']]></ac:plain-text-body>\n'
169 graphs += '</ac:structured-macro>\n'
170 main.log.wiki(graphs)
171
Jon Halle1a3b752015-07-22 13:02:46 -0700172 main.CLIs = []
173 main.nodes = []
Jon Hall5cf14d52015-07-16 12:15:19 -0700174 ipList = []
Jon Halle1a3b752015-07-22 13:02:46 -0700175 for i in range( 1, main.numCtrls + 1 ):
176 main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
177 main.nodes.append( getattr( main, 'ONOS' + str( i ) ) )
178 ipList.append( main.nodes[ -1 ].ip_address )
Jon Hall5cf14d52015-07-16 12:15:19 -0700179
180 main.ONOSbench.createCellFile( main.ONOSbench.ip_address, "SingleHA",
181 main.Mininet1.ip_address,
182 cellAppString, ipList[ 0 ] )
Jon Hall85794ff2015-07-08 14:12:30 -0700183 cellResult = main.ONOSbench.setCell( "SingleHA" )
184 verifyResult = main.ONOSbench.verifyCell()
185 main.step( "Creating ONOS package" )
186 packageResult = main.ONOSbench.onosPackage()
187 utilities.assert_equals( expect=main.TRUE, actual=packageResult,
188 onpass="ONOS package successful",
189 onfail="ONOS package failed" )
190
191 main.step( "Installing ONOS package" )
192 onosInstallResult = main.ONOSbench.onosInstall(
Jon Halle1a3b752015-07-22 13:02:46 -0700193 options="-f", node=main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -0700194 utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
195 onpass="ONOS install successful",
196 onfail="ONOS install failed" )
197
198 main.step( "Checking if ONOS is up yet" )
199 for i in range( 2 ):
Jon Halle1a3b752015-07-22 13:02:46 -0700200 onos1Isup = main.ONOSbench.isup( main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -0700201 if onos1Isup:
202 break
203 utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
204 onpass="ONOS startup successful",
205 onfail="ONOS startup failed" )
206
207 main.log.step( "Starting ONOS CLI sessions" )
Jon Halle1a3b752015-07-22 13:02:46 -0700208 cliResults = main.ONOScli1.startOnosCli( main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -0700209 utilities.assert_equals( expect=main.TRUE, actual=cliResults,
210 onpass="ONOS cli startup successful",
211 onfail="ONOS cli startup failed" )
212
213 if main.params[ 'tcpdump' ].lower() == "true":
214 main.step( "Start Packet Capture MN" )
215 main.Mininet2.startTcpdump(
216 str( main.params[ 'MNtcpdump' ][ 'folder' ] ) + str( main.TEST )
217 + "-MN.pcap",
218 intf=main.params[ 'MNtcpdump' ][ 'intf' ],
219 port=main.params[ 'MNtcpdump' ][ 'port' ] )
220
221 main.step( "App Ids check" )
222 appCheck = main.ONOScli1.appToIDCheck()
223 if appCheck != main.TRUE:
Jon Halle1a3b752015-07-22 13:02:46 -0700224 main.log.warn( main.CLIs[0].apps() )
225 main.log.warn( main.CLIs[0].appIDs() )
Jon Hall85794ff2015-07-08 14:12:30 -0700226 utilities.assert_equals( expect=main.TRUE, actual=appCheck,
227 onpass="App Ids seem to be correct",
228 onfail="Something is wrong with app Ids" )
229
230 if cliResults == main.FALSE:
231 main.log.error( "Failed to start ONOS, stopping test" )
232 main.cleanup()
233 main.exit()
234
235 def CASE2( self, main ):
236 """
237 Assign devices to controllers
238 """
239 import re
Jon Halle1a3b752015-07-22 13:02:46 -0700240 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700241 assert main, "main not defined"
242 assert utilities.assert_equals, "utilities.assert_equals not defined"
243
244 main.case( "Assigning devices to controllers" )
Jon Hall783bbf92015-07-23 14:33:19 -0700245 main.caseExplanation = "Assign switches to ONOS using 'ovs-vsctl' " +\
Jon Hall85794ff2015-07-08 14:12:30 -0700246 "and check that an ONOS node becomes the " +\
247 "master of the device."
248 main.step( "Assign switches to controllers" )
249
250 ipList = []
Jon Halle1a3b752015-07-22 13:02:46 -0700251 for i in range( main.numCtrls ):
252 ipList.append( main.nodes[ i ].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -0700253 swList = []
254 for i in range( 1, 29 ):
255 swList.append( "s" + str( i ) )
256 main.Mininet1.assignSwController( sw=swList, ip=ipList )
257
258 mastershipCheck = main.TRUE
259 for i in range( 1, 29 ):
260 response = main.Mininet1.getSwController( "s" + str( i ) )
261 try:
262 main.log.info( str( response ) )
263 except Exception:
264 main.log.info( repr( response ) )
Jon Halle1a3b752015-07-22 13:02:46 -0700265 if re.search( "tcp:" + main.nodes[0].ip_address, response ):
Jon Hall85794ff2015-07-08 14:12:30 -0700266 mastershipCheck = mastershipCheck and main.TRUE
267 else:
268 mastershipCheck = main.FALSE
269 if mastershipCheck == main.TRUE:
270 main.log.info( "Switch mastership assigned correctly" )
271 utilities.assert_equals(
272 expect=main.TRUE,
273 actual=mastershipCheck,
274 onpass="Switch mastership assigned correctly",
275 onfail="Switches not assigned correctly to controllers" )
276
277 def CASE21( self, main ):
278 """
279 Assign mastership to controllers
280 """
Jon Halle1a3b752015-07-22 13:02:46 -0700281 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700282 assert main, "main not defined"
283 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -0700284 assert main.CLIs, "main.CLIs not defined"
285 assert main.nodes, "main.nodes not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700286
287 main.case( "Assigning Controller roles for switches" )
Jon Hall783bbf92015-07-23 14:33:19 -0700288 main.caseExplanation = "Check that ONOS is connected to each " +\
Jon Hall85794ff2015-07-08 14:12:30 -0700289 "device. Then manually assign" +\
290 " mastership to specific ONOS nodes using" +\
291 " 'device-role'"
292 main.step( "Assign mastership of switches to specific controllers" )
293 roleCall = main.TRUE
294 roleCheck = main.TRUE
295 try:
296 for i in range( 1, 29 ): # switches 1 through 28
Jon Halle1a3b752015-07-22 13:02:46 -0700297 ip = main.nodes[ 0 ].ip_address # ONOS1
Jon Hall85794ff2015-07-08 14:12:30 -0700298 # set up correct variables:
299 if i == 1:
300 deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
301 elif i == 2:
302 deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
303 elif i == 3:
304 deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
305 elif i == 4:
306 deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
307 elif i == 5:
308 deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
309 elif i == 6:
310 deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
311 elif i == 7:
312 deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
313 elif i >= 8 and i <= 17:
314 dpid = '3' + str( i ).zfill( 3 )
315 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
316 elif i >= 18 and i <= 27:
317 dpid = '6' + str( i ).zfill( 3 )
318 deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
319 elif i == 28:
320 deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
321 else:
322 main.log.error( "You didn't write an else statement for " +
323 "switch s" + str( i ) )
324 # Assign switch
325 assert deviceId, "No device id for s" + str( i ) + " in ONOS"
326 # TODO: make this controller dynamic
327 roleCall = roleCall and main.ONOScli1.deviceRole( deviceId,
328 ip )
329 # Check assignment
330 master = main.ONOScli1.getRole( deviceId ).get( 'master' )
331 if ip in master:
332 roleCheck = roleCheck and main.TRUE
333 else:
334 roleCheck = roleCheck and main.FALSE
335 main.log.error( "Error, controller " + ip + " is not" +
336 " master " + "of device " +
337 str( deviceId ) + ". Master is " +
338 repr( master ) + "." )
339 except ( AttributeError, AssertionError ):
340 main.log.exception( "Something is wrong with ONOS device view" )
341 main.log.info( main.ONOScli1.devices() )
342 utilities.assert_equals(
343 expect=main.TRUE,
344 actual=roleCall,
345 onpass="Re-assigned switch mastership to designated controller",
346 onfail="Something wrong with deviceRole calls" )
347
348 main.step( "Check mastership was correctly assigned" )
349 utilities.assert_equals(
350 expect=main.TRUE,
351 actual=roleCheck,
352 onpass="Switches were successfully reassigned to designated " +
353 "controller",
354 onfail="Switches were not successfully reassigned" )
355
356 def CASE3( self, main ):
357 """
358 Assign intents
359 """
360 import time
361 import json
Jon Halle1a3b752015-07-22 13:02:46 -0700362 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700363 assert main, "main not defined"
364 assert utilities.assert_equals, "utilities.assert_equals not defined"
365 # NOTE: we must reinstall intents until we have a persistant intent
366 # datastore!
367 main.case( "Adding host Intents" )
Jon Hall783bbf92015-07-23 14:33:19 -0700368 main.caseExplanation = "Discover hosts by using pingall then " +\
Jon Hall85794ff2015-07-08 14:12:30 -0700369 "assign predetermined host-to-host intents." +\
370 " After installation, check that the intent" +\
371 " is distributed to all nodes and the state" +\
372 " is INSTALLED"
373
374 # install onos-app-fwd
375 main.step( "Install reactive forwarding app" )
Jon Halle1a3b752015-07-22 13:02:46 -0700376 installResults = main.CLIs[0].activateApp( "org.onosproject.fwd" )
Jon Hall85794ff2015-07-08 14:12:30 -0700377 utilities.assert_equals( expect=main.TRUE, actual=installResults,
378 onpass="Install fwd successful",
379 onfail="Install fwd failed" )
380
381 main.step( "Check app ids" )
382 appCheck = main.ONOScli1.appToIDCheck()
383 if appCheck != main.TRUE:
Jon Halle1a3b752015-07-22 13:02:46 -0700384 main.log.warn( main.CLIs[0].apps() )
385 main.log.warn( main.CLIs[0].appIDs() )
Jon Hall85794ff2015-07-08 14:12:30 -0700386 utilities.assert_equals( expect=main.TRUE, actual=appCheck,
387 onpass="App Ids seem to be correct",
388 onfail="Something is wrong with app Ids" )
389
390 main.step( "Discovering Hosts( Via pingall for now )" )
391 # FIXME: Once we have a host discovery mechanism, use that instead
392 # REACTIVE FWD test
393 pingResult = main.FALSE
394 for i in range(2): # Retry if pingall fails first time
395 time1 = time.time()
396 pingResult = main.Mininet1.pingall()
397 if i == 0:
398 utilities.assert_equals(
399 expect=main.TRUE,
400 actual=pingResult,
401 onpass="Reactive Pingall test passed",
402 onfail="Reactive Pingall failed, " +
403 "one or more ping pairs failed" )
404 time2 = time.time()
405 main.log.info( "Time for pingall: %2f seconds" %
406 ( time2 - time1 ) )
407 # timeout for fwd flows
408 time.sleep( 11 )
409 # uninstall onos-app-fwd
410 main.step( "Uninstall reactive forwarding app" )
Jon Halle1a3b752015-07-22 13:02:46 -0700411 uninstallResult = main.CLIs[0].deactivateApp( "org.onosproject.fwd" )
Jon Hall85794ff2015-07-08 14:12:30 -0700412 utilities.assert_equals( expect=main.TRUE, actual=uninstallResult,
413 onpass="Uninstall fwd successful",
414 onfail="Uninstall fwd failed" )
415
416 main.step( "Check app ids" )
417 appCheck2 = main.ONOScli1.appToIDCheck()
418 if appCheck2 != main.TRUE:
Jon Halle1a3b752015-07-22 13:02:46 -0700419 main.log.warn( main.CLIs[0].apps() )
420 main.log.warn( main.CLIs[0].appIDs() )
Jon Hall85794ff2015-07-08 14:12:30 -0700421 utilities.assert_equals( expect=main.TRUE, actual=appCheck2,
422 onpass="App Ids seem to be correct",
423 onfail="Something is wrong with app Ids" )
424
425 main.step( "Add host intents via cli" )
426 intentIds = []
427 # TODO: move the host numbers to params
428 # Maybe look at all the paths we ping?
429 intentAddResult = True
430 hostResult = main.TRUE
431 for i in range( 8, 18 ):
432 main.log.info( "Adding host intent between h" + str( i ) +
433 " and h" + str( i + 10 ) )
434 host1 = "00:00:00:00:00:" + \
435 str( hex( i )[ 2: ] ).zfill( 2 ).upper()
436 host2 = "00:00:00:00:00:" + \
437 str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
438 # NOTE: getHost can return None
439 host1Dict = main.ONOScli1.getHost( host1 )
440 host2Dict = main.ONOScli1.getHost( host2 )
441 host1Id = None
442 host2Id = None
443 if host1Dict and host2Dict:
444 host1Id = host1Dict.get( 'id', None )
445 host2Id = host2Dict.get( 'id', None )
446 if host1Id and host2Id:
447 tmpId = main.ONOScli1.addHostIntent( host1Id, host2Id )
448 if tmpId:
449 main.log.info( "Added intent with id: " + tmpId )
450 intentIds.append( tmpId )
451 else:
452 main.log.error( "addHostIntent returned: " +
453 repr( tmpId ) )
454 else:
455 main.log.error( "Error, getHost() failed for h" + str( i ) +
456 " and/or h" + str( i + 10 ) )
457 hosts = main.ONOScli1.hosts()
458 main.log.warn( "Hosts output: " )
459 try:
460 main.log.warn( json.dumps( json.loads( hosts ),
461 sort_keys=True,
462 indent=4,
463 separators=( ',', ': ' ) ) )
464 except ( ValueError, TypeError ):
465 main.log.warn( repr( hosts ) )
466 hostResult = main.FALSE
467 utilities.assert_equals( expect=main.TRUE, actual=hostResult,
468 onpass="Found a host id for each host",
469 onfail="Error looking up host ids" )
470
471 intentStart = time.time()
472 onosIds = main.ONOScli1.getAllIntentsId()
473 main.log.info( "Submitted intents: " + str( intentIds ) )
474 main.log.info( "Intents in ONOS: " + str( onosIds ) )
475 for intent in intentIds:
476 if intent in onosIds:
477 pass # intent submitted is in onos
478 else:
479 intentAddResult = False
480 if intentAddResult:
481 intentStop = time.time()
482 else:
483 intentStop = None
484 # Print the intent states
485 intents = main.ONOScli1.intents()
486 intentStates = []
487 installedCheck = True
488 main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
489 count = 0
490 try:
491 for intent in json.loads( intents ):
492 state = intent.get( 'state', None )
493 if "INSTALLED" not in state:
494 installedCheck = False
495 intentId = intent.get( 'id', None )
496 intentStates.append( ( intentId, state ) )
497 except ( ValueError, TypeError ):
498 main.log.exception( "Error parsing intents" )
499 # add submitted intents not in the store
500 tmplist = [ i for i, s in intentStates ]
501 missingIntents = False
502 for i in intentIds:
503 if i not in tmplist:
504 intentStates.append( ( i, " - " ) )
505 missingIntents = True
506 intentStates.sort()
507 for i, s in intentStates:
508 count += 1
509 main.log.info( "%-6s%-15s%-15s" %
510 ( str( count ), str( i ), str( s ) ) )
511 leaders = main.ONOScli1.leaders()
512 try:
513 missing = False
514 if leaders:
515 parsedLeaders = json.loads( leaders )
516 main.log.warn( json.dumps( parsedLeaders,
517 sort_keys=True,
518 indent=4,
519 separators=( ',', ': ' ) ) )
520 # check for all intent partitions
521 topics = []
522 for i in range( 14 ):
523 topics.append( "intent-partition-" + str( i ) )
524 main.log.debug( topics )
525 ONOStopics = [ j['topic'] for j in parsedLeaders ]
526 for topic in topics:
527 if topic not in ONOStopics:
528 main.log.error( "Error: " + topic +
529 " not in leaders" )
530 missing = True
531 else:
532 main.log.error( "leaders() returned None" )
533 except ( ValueError, TypeError ):
534 main.log.exception( "Error parsing leaders" )
535 main.log.error( repr( leaders ) )
536 # Check all nodes
537 if missing:
538 response = main.ONOScli1.leaders( jsonFormat=False)
539 main.log.warn( "ONOS1 leaders output: \n" +
540 str( response ) )
541
542 partitions = main.ONOScli1.partitions()
543 try:
544 if partitions :
545 parsedPartitions = json.loads( partitions )
546 main.log.warn( json.dumps( parsedPartitions,
547 sort_keys=True,
548 indent=4,
549 separators=( ',', ': ' ) ) )
550 # TODO check for a leader in all paritions
551 # TODO check for consistency among nodes
552 else:
553 main.log.error( "partitions() returned None" )
554 except ( ValueError, TypeError ):
555 main.log.exception( "Error parsing partitions" )
556 main.log.error( repr( partitions ) )
557 pendingMap = main.ONOScli1.pendingMap()
558 try:
559 if pendingMap :
560 parsedPending = json.loads( pendingMap )
561 main.log.warn( json.dumps( parsedPending,
562 sort_keys=True,
563 indent=4,
564 separators=( ',', ': ' ) ) )
565 # TODO check something here?
566 else:
567 main.log.error( "pendingMap() returned None" )
568 except ( ValueError, TypeError ):
569 main.log.exception( "Error parsing pending map" )
570 main.log.error( repr( pendingMap ) )
571
572 intentAddResult = bool( intentAddResult and not missingIntents and
573 installedCheck )
574 if not intentAddResult:
575 main.log.error( "Error in pushing host intents to ONOS" )
576
577 main.step( "Intent Anti-Entropy dispersion" )
578 for i in range(100):
579 correct = True
580 main.log.info( "Submitted intents: " + str( sorted( intentIds ) ) )
Jon Halle1a3b752015-07-22 13:02:46 -0700581 for cli in main.CLIs:
Jon Hall85794ff2015-07-08 14:12:30 -0700582 onosIds = []
583 ids = cli.getAllIntentsId()
584 onosIds.append( ids )
585 main.log.debug( "Intents in " + cli.name + ": " +
586 str( sorted( onosIds ) ) )
587 if sorted( ids ) != sorted( intentIds ):
588 main.log.warn( "Set of intent IDs doesn't match" )
589 correct = False
590 break
591 else:
592 intents = json.loads( cli.intents() )
593 for intent in intents:
594 if intent[ 'state' ] != "INSTALLED":
595 main.log.warn( "Intent " + intent[ 'id' ] +
596 " is " + intent[ 'state' ] )
597 correct = False
598 break
599 if correct:
600 break
601 else:
602 time.sleep(1)
603 if not intentStop:
604 intentStop = time.time()
605 global gossipTime
606 gossipTime = intentStop - intentStart
607 main.log.info( "It took about " + str( gossipTime ) +
608 " seconds for all intents to appear in each node" )
609 # FIXME: make this time configurable/calculate based off of number of
610 # nodes and gossip rounds
611 utilities.assert_greater_equals(
612 expect=40, actual=gossipTime,
613 onpass="ECM anti-entropy for intents worked within " +
614 "expected time",
615 onfail="Intent ECM anti-entropy took too long" )
616 if gossipTime <= 40:
617 intentAddResult = True
618
619 if not intentAddResult or "key" in pendingMap:
620 import time
621 installedCheck = True
622 main.log.info( "Sleeping 60 seconds to see if intents are found" )
623 time.sleep( 60 )
624 onosIds = main.ONOScli1.getAllIntentsId()
625 main.log.info( "Submitted intents: " + str( intentIds ) )
626 main.log.info( "Intents in ONOS: " + str( onosIds ) )
627 # Print the intent states
628 intents = main.ONOScli1.intents()
629 intentStates = []
630 main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
631 count = 0
632 try:
633 for intent in json.loads( intents ):
634 # Iter through intents of a node
635 state = intent.get( 'state', None )
636 if "INSTALLED" not in state:
637 installedCheck = False
638 intentId = intent.get( 'id', None )
639 intentStates.append( ( intentId, state ) )
640 except ( ValueError, TypeError ):
641 main.log.exception( "Error parsing intents" )
642 # add submitted intents not in the store
643 tmplist = [ i for i, s in intentStates ]
644 for i in intentIds:
645 if i not in tmplist:
646 intentStates.append( ( i, " - " ) )
647 intentStates.sort()
648 for i, s in intentStates:
649 count += 1
650 main.log.info( "%-6s%-15s%-15s" %
651 ( str( count ), str( i ), str( s ) ) )
652 leaders = main.ONOScli1.leaders()
653 try:
654 missing = False
655 if leaders:
656 parsedLeaders = json.loads( leaders )
657 main.log.warn( json.dumps( parsedLeaders,
658 sort_keys=True,
659 indent=4,
660 separators=( ',', ': ' ) ) )
661 # check for all intent partitions
662 # check for election
663 topics = []
664 for i in range( 14 ):
665 topics.append( "intent-partition-" + str( i ) )
666 # FIXME: this should only be after we start the app
667 topics.append( "org.onosproject.election" )
668 main.log.debug( topics )
669 ONOStopics = [ j['topic'] for j in parsedLeaders ]
670 for topic in topics:
671 if topic not in ONOStopics:
672 main.log.error( "Error: " + topic +
673 " not in leaders" )
674 missing = True
675 else:
676 main.log.error( "leaders() returned None" )
677 except ( ValueError, TypeError ):
678 main.log.exception( "Error parsing leaders" )
679 main.log.error( repr( leaders ) )
680 # Check all nodes
681 if missing:
682 response = main.ONOScli1.leaders( jsonFormat=False)
683 main.log.warn( "ONOS1 leaders output: \n" +
684 str( response ) )
685 partitions = main.ONOScli1.partitions()
686 try:
687 if partitions :
688 parsedPartitions = json.loads( partitions )
689 main.log.warn( json.dumps( parsedPartitions,
690 sort_keys=True,
691 indent=4,
692 separators=( ',', ': ' ) ) )
693 # TODO check for a leader in all paritions
694 # TODO check for consistency among nodes
695 else:
696 main.log.error( "partitions() returned None" )
697 except ( ValueError, TypeError ):
698 main.log.exception( "Error parsing partitions" )
699 main.log.error( repr( partitions ) )
700 pendingMap = main.ONOScli1.pendingMap()
701 try:
702 if pendingMap :
703 parsedPending = json.loads( pendingMap )
704 main.log.warn( json.dumps( parsedPending,
705 sort_keys=True,
706 indent=4,
707 separators=( ',', ': ' ) ) )
708 # TODO check something here?
709 else:
710 main.log.error( "pendingMap() returned None" )
711 except ( ValueError, TypeError ):
712 main.log.exception( "Error parsing pending map" )
713 main.log.error( repr( pendingMap ) )
714
715 def CASE4( self, main ):
716 """
717 Ping across added host intents
718 """
719 import json
720 import time
Jon Halle1a3b752015-07-22 13:02:46 -0700721 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700722 assert main, "main not defined"
723 assert utilities.assert_equals, "utilities.assert_equals not defined"
724 main.case( "Verify connectivity by sendind traffic across Intents" )
Jon Hall783bbf92015-07-23 14:33:19 -0700725 main.caseExplanation = "Ping across added host intents to check " +\
Jon Hall85794ff2015-07-08 14:12:30 -0700726 "functionality and check the state of " +\
727 "the intent"
728 main.step( "Ping across added host intents" )
729 PingResult = main.TRUE
730 for i in range( 8, 18 ):
731 ping = main.Mininet1.pingHost( src="h" + str( i ),
732 target="h" + str( i + 10 ) )
733 PingResult = PingResult and ping
734 if ping == main.FALSE:
735 main.log.warn( "Ping failed between h" + str( i ) +
736 " and h" + str( i + 10 ) )
737 elif ping == main.TRUE:
738 main.log.info( "Ping test passed!" )
739 # Don't set PingResult or you'd override failures
740 if PingResult == main.FALSE:
741 main.log.error(
742 "Intents have not been installed correctly, pings failed." )
743 # TODO: pretty print
744 main.log.warn( "ONOS1 intents: " )
745 try:
746 tmpIntents = main.ONOScli1.intents()
747 main.log.warn( json.dumps( json.loads( tmpIntents ),
748 sort_keys=True,
749 indent=4,
750 separators=( ',', ': ' ) ) )
751 except ( ValueError, TypeError ):
752 main.log.warn( repr( tmpIntents ) )
753 utilities.assert_equals(
754 expect=main.TRUE,
755 actual=PingResult,
756 onpass="Intents have been installed correctly and pings work",
757 onfail="Intents have not been installed correctly, pings failed." )
758
759 main.step( "Check Intent state" )
760 installedCheck = True
761 # Print the intent states
762 intents = main.ONOScli1.intents()
763 intentStates = []
764 main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
765 count = 0
766 # Iter through intents of a node
767 try:
768 for intent in json.loads( intents ):
769 state = intent.get( 'state', None )
770 if "INSTALLED" not in state:
771 installedCheck = False
772 intentId = intent.get( 'id', None )
773 intentStates.append( ( intentId, state ) )
774 except ( ValueError, TypeError ):
775 main.log.exception( "Error parsing intents." )
776 # Print states
777 intentStates.sort()
778 for i, s in intentStates:
779 count += 1
780 main.log.info( "%-6s%-15s%-15s" %
781 ( str( count ), str( i ), str( s ) ) )
782 utilities.assert_equals( expect=True, actual=installedCheck,
783 onpass="Intents are all INSTALLED",
784 onfail="Intents are not all in " +
785 "INSTALLED state" )
786
787 main.step( "Check leadership of topics" )
788 leaders = main.ONOScli1.leaders()
789 topicCheck = main.TRUE
790 try:
791 if leaders:
792 parsedLeaders = json.loads( leaders )
793 main.log.warn( json.dumps( parsedLeaders,
794 sort_keys=True,
795 indent=4,
796 separators=( ',', ': ' ) ) )
797 # check for all intent partitions
798 # check for election
799 # TODO: Look at Devices as topics now that it uses this system
800 topics = []
801 for i in range( 14 ):
802 topics.append( "intent-partition-" + str( i ) )
803 # FIXME: this should only be after we start the app
804 # FIXME: topics.append( "org.onosproject.election" )
805 # Print leaders output
806 main.log.debug( topics )
807 ONOStopics = [ j['topic'] for j in parsedLeaders ]
808 for topic in topics:
809 if topic not in ONOStopics:
810 main.log.error( "Error: " + topic +
811 " not in leaders" )
812 topicCheck = main.FALSE
813 else:
814 main.log.error( "leaders() returned None" )
815 topicCheck = main.FALSE
816 except ( ValueError, TypeError ):
817 topicCheck = main.FALSE
818 main.log.exception( "Error parsing leaders" )
819 main.log.error( repr( leaders ) )
820 # TODO: Check for a leader of these topics
821 utilities.assert_equals( expect=main.TRUE, actual=topicCheck,
822 onpass="intent Partitions is in leaders",
823 onfail="Some topics were lost " )
824 # Print partitions
825 partitions = main.ONOScli1.partitions()
826 try:
827 if partitions :
828 parsedPartitions = json.loads( partitions )
829 main.log.warn( json.dumps( parsedPartitions,
830 sort_keys=True,
831 indent=4,
832 separators=( ',', ': ' ) ) )
833 # TODO check for a leader in all paritions
834 # TODO check for consistency among nodes
835 else:
836 main.log.error( "partitions() returned None" )
837 except ( ValueError, TypeError ):
838 main.log.exception( "Error parsing partitions" )
839 main.log.error( repr( partitions ) )
840 # Print Pending Map
841 pendingMap = main.ONOScli1.pendingMap()
842 try:
843 if pendingMap :
844 parsedPending = json.loads( pendingMap )
845 main.log.warn( json.dumps( parsedPending,
846 sort_keys=True,
847 indent=4,
848 separators=( ',', ': ' ) ) )
849 # TODO check something here?
850 else:
851 main.log.error( "pendingMap() returned None" )
852 except ( ValueError, TypeError ):
853 main.log.exception( "Error parsing pending map" )
854 main.log.error( repr( pendingMap ) )
855
856 if not installedCheck:
857 main.log.info( "Waiting 60 seconds to see if the state of " +
858 "intents change" )
859 time.sleep( 60 )
860 # Print the intent states
861 intents = main.ONOScli1.intents()
862 intentStates = []
863 main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
864 count = 0
865 # Iter through intents of a node
866 try:
867 for intent in json.loads( intents ):
868 state = intent.get( 'state', None )
869 if "INSTALLED" not in state:
870 installedCheck = False
871 intentId = intent.get( 'id', None )
872 intentStates.append( ( intentId, state ) )
873 except ( ValueError, TypeError ):
874 main.log.exception( "Error parsing intents." )
875 intentStates.sort()
876 for i, s in intentStates:
877 count += 1
878 main.log.info( "%-6s%-15s%-15s" %
879 ( str( count ), str( i ), str( s ) ) )
880 leaders = main.ONOScli1.leaders()
881 try:
882 missing = False
883 if leaders:
884 parsedLeaders = json.loads( leaders )
885 main.log.warn( json.dumps( parsedLeaders,
886 sort_keys=True,
887 indent=4,
888 separators=( ',', ': ' ) ) )
889 # check for all intent partitions
890 # check for election
891 topics = []
892 for i in range( 14 ):
893 topics.append( "intent-partition-" + str( i ) )
894 # FIXME: this should only be after we start the app
895 topics.append( "org.onosproject.election" )
896 main.log.debug( topics )
897 ONOStopics = [ j['topic'] for j in parsedLeaders ]
898 for topic in topics:
899 if topic not in ONOStopics:
900 main.log.error( "Error: " + topic +
901 " not in leaders" )
902 missing = True
903 else:
904 main.log.error( "leaders() returned None" )
905 except ( ValueError, TypeError ):
906 main.log.exception( "Error parsing leaders" )
907 main.log.error( repr( leaders ) )
908 if missing:
909 response = main.ONOScli1.leaders( jsonFormat=False)
910 main.log.warn( "ONOS1 leaders output: \n" +
911 str( response ) )
912 partitions = main.ONOScli1.partitions()
913 try:
914 if partitions :
915 parsedPartitions = json.loads( partitions )
916 main.log.warn( json.dumps( parsedPartitions,
917 sort_keys=True,
918 indent=4,
919 separators=( ',', ': ' ) ) )
920 # TODO check for a leader in all paritions
921 # TODO check for consistency among nodes
922 else:
923 main.log.error( "partitions() returned None" )
924 except ( ValueError, TypeError ):
925 main.log.exception( "Error parsing partitions" )
926 main.log.error( repr( partitions ) )
927 pendingMap = main.ONOScli1.pendingMap()
928 try:
929 if pendingMap :
930 parsedPending = json.loads( pendingMap )
931 main.log.warn( json.dumps( parsedPending,
932 sort_keys=True,
933 indent=4,
934 separators=( ',', ': ' ) ) )
935 # TODO check something here?
936 else:
937 main.log.error( "pendingMap() returned None" )
938 except ( ValueError, TypeError ):
939 main.log.exception( "Error parsing pending map" )
940 main.log.error( repr( pendingMap ) )
941 # Print flowrules
Jon Halle1a3b752015-07-22 13:02:46 -0700942 main.log.debug( main.CLIs[0].flows( jsonFormat=False ) )
Jon Hall85794ff2015-07-08 14:12:30 -0700943 main.step( "Wait a minute then ping again" )
944 # the wait is above
945 PingResult = main.TRUE
946 for i in range( 8, 18 ):
947 ping = main.Mininet1.pingHost( src="h" + str( i ),
948 target="h" + str( i + 10 ) )
949 PingResult = PingResult and ping
950 if ping == main.FALSE:
951 main.log.warn( "Ping failed between h" + str( i ) +
952 " and h" + str( i + 10 ) )
953 elif ping == main.TRUE:
954 main.log.info( "Ping test passed!" )
955 # Don't set PingResult or you'd override failures
956 if PingResult == main.FALSE:
957 main.log.error(
958 "Intents have not been installed correctly, pings failed." )
959 # TODO: pretty print
960 main.log.warn( "ONOS1 intents: " )
961 try:
962 tmpIntents = main.ONOScli1.intents()
963 main.log.warn( json.dumps( json.loads( tmpIntents ),
964 sort_keys=True,
965 indent=4,
966 separators=( ',', ': ' ) ) )
967 except ( ValueError, TypeError ):
968 main.log.warn( repr( tmpIntents ) )
969 utilities.assert_equals(
970 expect=main.TRUE,
971 actual=PingResult,
972 onpass="Intents have been installed correctly and pings work",
973 onfail="Intents have not been installed correctly, pings failed." )
974
975 def CASE5( self, main ):
976 """
977 Reading state of ONOS
978 """
979 import json
Jon Halle1a3b752015-07-22 13:02:46 -0700980 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -0700981 assert main, "main not defined"
982 assert utilities.assert_equals, "utilities.assert_equals not defined"
983
984 main.case( "Setting up and gathering data for current state" )
985 # The general idea for this test case is to pull the state of
986 # ( intents,flows, topology,... ) from each ONOS node
987 # We can then compare them with each other and also with past states
988
989 main.step( "Check that each switch has a master" )
990 global mastershipState
991 mastershipState = '[]'
992
993 # Assert that each device has a master
994 rolesNotNull = main.ONOScli1.rolesNotNull()
995 utilities.assert_equals(
996 expect=main.TRUE,
997 actual=rolesNotNull,
998 onpass="Each device has a master",
999 onfail="Some devices don't have a master assigned" )
1000
1001 main.step( "Get the Mastership of each switch" )
1002 ONOS1Mastership = main.ONOScli1.roles()
1003 # TODO: Make this a meaningful check
1004 if "Error" in ONOS1Mastership or not ONOS1Mastership:
1005 main.log.error( "Error in getting ONOS roles" )
1006 main.log.warn(
1007 "ONOS1 mastership response: " +
1008 repr( ONOS1Mastership ) )
1009 consistentMastership = main.FALSE
1010 else:
1011 mastershipState = ONOS1Mastership
1012 consistentMastership = main.TRUE
1013
1014 main.step( "Get the intents from each controller" )
1015 global intentState
1016 intentState = []
1017 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
1018 intentCheck = main.FALSE
1019 if "Error" in ONOS1Intents or not ONOS1Intents:
1020 main.log.error( "Error in getting ONOS intents" )
1021 main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
1022 else:
1023 intentCheck = main.TRUE
1024
1025 main.step( "Get the flows from each controller" )
1026 global flowState
1027 flowState = []
1028 flowCheck = main.FALSE
1029 ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
1030 if "Error" in ONOS1Flows or not ONOS1Flows:
1031 main.log.error( "Error in getting ONOS flows" )
1032 main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
1033 else:
1034 # TODO: Do a better check, maybe compare flows on switches?
1035 flowState = ONOS1Flows
1036 flowCheck = main.TRUE
1037
1038 main.step( "Get the OF Table entries" )
1039 global flows
1040 flows = []
1041 for i in range( 1, 29 ):
Jon Hall9043c902015-07-30 14:23:44 -07001042 flows.append( main.Mininet1.getFlowTable( 1.3, "s" + str( i ) ) )
Jon Hall85794ff2015-07-08 14:12:30 -07001043 if flowCheck == main.FALSE:
1044 for table in flows:
1045 main.log.warn( table )
1046 # TODO: Compare switch flow tables with ONOS flow tables
1047
1048 main.step( "Collecting topology information from ONOS" )
1049 devices = []
1050 devices.append( main.ONOScli1.devices() )
1051 hosts = []
1052 hosts.append( json.loads( main.ONOScli1.hosts() ) )
1053 ports = []
1054 ports.append( main.ONOScli1.ports() )
1055 links = []
1056 links.append( main.ONOScli1.links() )
1057 clusters = []
1058 clusters.append( main.ONOScli1.clusters() )
1059
1060 main.step( "Each host has an IP address" )
1061 ipResult = main.TRUE
1062 for controller in range( 0, len( hosts ) ):
1063 controllerStr = str( controller + 1 )
1064 for host in hosts[ controller ]:
1065 if host is None or host.get( 'ipAddresses', [] ) == []:
1066 main.log.error(
1067 "DEBUG:Error with host ips on controller" +
1068 controllerStr + ": " + str( host ) )
1069 ipResult = main.FALSE
1070 utilities.assert_equals(
1071 expect=main.TRUE,
1072 actual=ipResult,
1073 onpass="The ips of the hosts aren't empty",
1074 onfail="The ip of at least one host is missing" )
1075
1076 # there should always only be one cluster
1077 main.step( "There is only one dataplane cluster" )
1078 try:
1079 numClusters = len( json.loads( clusters[ 0 ] ) )
1080 except ( ValueError, TypeError ):
1081 main.log.exception( "Error parsing clusters[0]: " +
1082 repr( clusters[ 0 ] ) )
1083 clusterResults = main.FALSE
1084 if numClusters == 1:
1085 clusterResults = main.TRUE
1086 utilities.assert_equals(
1087 expect=1,
1088 actual=numClusters,
1089 onpass="ONOS shows 1 SCC",
1090 onfail="ONOS shows " + str( numClusters ) + " SCCs" )
1091
1092 main.step( "Comparing ONOS topology to MN" )
1093 devicesResults = main.TRUE
1094 linksResults = main.TRUE
1095 hostsResults = main.TRUE
1096 mnSwitches = main.Mininet1.getSwitches()
1097 mnLinks = main.Mininet1.getLinks()
1098 mnHosts = main.Mininet1.getHosts()
Jon Halle1a3b752015-07-22 13:02:46 -07001099 for controller in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07001100 controllerStr = str( controller + 1 )
1101 if devices[ controller ] and ports[ controller ] and\
1102 "Error" not in devices[ controller ] and\
1103 "Error" not in ports[ controller ]:
1104
1105 currentDevicesResult = main.Mininet1.compareSwitches(
1106 mnSwitches,
1107 json.loads( devices[ controller ] ),
1108 json.loads( ports[ controller ] ) )
1109 else:
1110 currentDevicesResult = main.FALSE
1111 utilities.assert_equals( expect=main.TRUE,
1112 actual=currentDevicesResult,
1113 onpass="ONOS" + controllerStr +
1114 " Switches view is correct",
1115 onfail="ONOS" + controllerStr +
1116 " Switches view is incorrect" )
1117 if links[ controller ] and "Error" not in links[ controller ]:
1118 currentLinksResult = main.Mininet1.compareLinks(
1119 mnSwitches, mnLinks,
1120 json.loads( links[ controller ] ) )
1121 else:
1122 currentLinksResult = main.FALSE
1123 utilities.assert_equals( expect=main.TRUE,
1124 actual=currentLinksResult,
1125 onpass="ONOS" + controllerStr +
1126 " links view is correct",
1127 onfail="ONOS" + controllerStr +
1128 " links view is incorrect" )
1129
1130 if hosts[ controller ] or "Error" not in hosts[ controller ]:
1131 currentHostsResult = main.Mininet1.compareHosts(
1132 mnHosts,
1133 hosts[ controller ] )
1134 else:
1135 currentHostsResult = main.FALSE
1136 utilities.assert_equals( expect=main.TRUE,
1137 actual=currentHostsResult,
1138 onpass="ONOS" + controllerStr +
1139 " hosts exist in Mininet",
1140 onfail="ONOS" + controllerStr +
1141 " hosts don't match Mininet" )
1142
1143 devicesResults = devicesResults and currentDevicesResult
1144 linksResults = linksResults and currentLinksResult
1145 hostsResults = hostsResults and currentHostsResult
1146
1147 main.step( "Device information is correct" )
1148 utilities.assert_equals(
1149 expect=main.TRUE,
1150 actual=devicesResults,
1151 onpass="Device information is correct",
1152 onfail="Device information is incorrect" )
1153
1154 main.step( "Links are correct" )
1155 utilities.assert_equals(
1156 expect=main.TRUE,
1157 actual=linksResults,
1158 onpass="Link are correct",
1159 onfail="Links are incorrect" )
1160
1161 main.step( "Hosts are correct" )
1162 utilities.assert_equals(
1163 expect=main.TRUE,
1164 actual=hostsResults,
1165 onpass="Hosts are correct",
1166 onfail="Hosts are incorrect" )
1167
1168 def CASE6( self, main ):
1169 """
1170 The Failure case.
1171 """
1172 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001173 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001174 assert main, "main not defined"
1175 assert utilities.assert_equals, "utilities.assert_equals not defined"
1176
1177 # Reset non-persistent variables
1178 try:
1179 iCounterValue = 0
1180 except NameError:
1181 main.log.error( "iCounterValue not defined, setting to 0" )
1182 iCounterValue = 0
1183
1184 main.case( "Restart ONOS node" )
Jon Hall783bbf92015-07-23 14:33:19 -07001185 main.caseExplanation = "Killing ONOS process and restart cli " +\
Jon Hall85794ff2015-07-08 14:12:30 -07001186 "sessions once onos is up."
1187 main.step( "Killing ONOS processes" )
Jon Halle1a3b752015-07-22 13:02:46 -07001188 killResult = main.ONOSbench.onosKill( main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -07001189 start = time.time()
1190 utilities.assert_equals( expect=main.TRUE, actual=killResult,
1191 onpass="ONOS Killed",
1192 onfail="Error killing ONOS" )
1193
1194 main.step( "Checking if ONOS is up yet" )
1195 count = 0
1196 while count < 10:
Jon Halle1a3b752015-07-22 13:02:46 -07001197 onos1Isup = main.ONOSbench.isup( main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -07001198 if onos1Isup == main.TRUE:
1199 elapsed = time.time() - start
1200 break
1201 else:
1202 count = count + 1
1203 utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
1204 onpass="ONOS is back up",
1205 onfail="ONOS failed to start" )
1206
1207 main.log.step( "Starting ONOS CLI sessions" )
Jon Halle1a3b752015-07-22 13:02:46 -07001208 cliResults = main.ONOScli1.startOnosCli( main.nodes[0].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -07001209 utilities.assert_equals( expect=main.TRUE, actual=cliResults,
1210 onpass="ONOS cli startup successful",
1211 onfail="ONOS cli startup failed" )
1212
1213 if elapsed:
1214 main.log.info( "ESTIMATE: ONOS took %s seconds to restart" %
1215 str( elapsed ) )
1216 main.restartTime = elapsed
1217 else:
1218 main.restartTime = -1
1219 time.sleep( 5 )
1220 # rerun on election apps
1221 main.ONOScli1.electionTestRun()
1222
1223 def CASE7( self, main ):
1224 """
1225 Check state after ONOS failure
1226 """
1227 import json
Jon Halle1a3b752015-07-22 13:02:46 -07001228 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001229 assert main, "main not defined"
1230 assert utilities.assert_equals, "utilities.assert_equals not defined"
1231 main.case( "Running ONOS Constant State Tests" )
1232 main.step( "Check that each switch has a master" )
1233 # Assert that each device has a master
1234 rolesNotNull = main.ONOScli1.rolesNotNull()
1235 utilities.assert_equals(
1236 expect=main.TRUE,
1237 actual=rolesNotNull,
1238 onpass="Each device has a master",
1239 onfail="Some devices don't have a master assigned" )
1240
1241 main.step( "Check if switch roles are consistent across all nodes" )
1242 ONOS1Mastership = main.ONOScli1.roles()
1243 # FIXME: Refactor this whole case for single instance
1244 if "Error" in ONOS1Mastership or not ONOS1Mastership:
1245 main.log.error( "Error in getting ONOS mastership" )
1246 main.log.warn( "ONOS1 mastership response: " +
1247 repr( ONOS1Mastership ) )
1248 consistentMastership = main.FALSE
1249 else:
1250 consistentMastership = main.TRUE
1251 utilities.assert_equals(
1252 expect=main.TRUE,
1253 actual=consistentMastership,
1254 onpass="Switch roles are consistent across all ONOS nodes",
1255 onfail="ONOS nodes have different views of switch roles" )
1256
1257 description2 = "Compare switch roles from before failure"
1258 main.step( description2 )
1259
1260 currentJson = json.loads( ONOS1Mastership )
1261 oldJson = json.loads( mastershipState )
1262 mastershipCheck = main.TRUE
1263 for i in range( 1, 29 ):
1264 switchDPID = str(
1265 main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
1266
1267 current = [ switch[ 'master' ] for switch in currentJson
1268 if switchDPID in switch[ 'id' ] ]
1269 old = [ switch[ 'master' ] for switch in oldJson
1270 if switchDPID in switch[ 'id' ] ]
1271 if current == old:
1272 mastershipCheck = mastershipCheck and main.TRUE
1273 else:
1274 main.log.warn( "Mastership of switch %s changed" % switchDPID )
1275 mastershipCheck = main.FALSE
1276 utilities.assert_equals(
1277 expect=main.TRUE,
1278 actual=mastershipCheck,
1279 onpass="Mastership of Switches was not changed",
1280 onfail="Mastership of some switches changed" )
1281 mastershipCheck = mastershipCheck and consistentMastership
1282
1283 main.step( "Get the intents and compare across all nodes" )
1284 ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
1285 intentCheck = main.FALSE
1286 if "Error" in ONOS1Intents or not ONOS1Intents:
1287 main.log.error( "Error in getting ONOS intents" )
1288 main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
1289 else:
1290 intentCheck = main.TRUE
1291 utilities.assert_equals(
1292 expect=main.TRUE,
1293 actual=intentCheck,
1294 onpass="Intents are consistent across all ONOS nodes",
1295 onfail="ONOS nodes have different views of intents" )
1296 # Print the intent states
1297 intents = []
1298 intents.append( ONOS1Intents )
1299 intentStates = []
1300 for node in intents: # Iter through ONOS nodes
1301 nodeStates = []
1302 # Iter through intents of a node
1303 for intent in json.loads( node ):
1304 nodeStates.append( intent[ 'state' ] )
1305 intentStates.append( nodeStates )
1306 out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
1307 main.log.info( dict( out ) )
1308
1309 # NOTE: Store has no durability, so intents are lost across system
1310 # restarts
1311 """
1312 main.step( "Compare current intents with intents before the failure" )
1313 # NOTE: this requires case 5 to pass for intentState to be set.
1314 # maybe we should stop the test if that fails?
1315 sameIntents = main.FALSE
1316 if intentState and intentState == ONOSIntents[ 0 ]:
1317 sameIntents = main.TRUE
1318 main.log.info( "Intents are consistent with before failure" )
1319 # TODO: possibly the states have changed? we may need to figure out
1320 # what the acceptable states are
1321 elif len( intentState ) == len( ONOSIntents[ 0 ] ):
1322 sameIntents = main.TRUE
1323 try:
1324 before = json.loads( intentState )
1325 after = json.loads( ONOSIntents[ 0 ] )
1326 for intent in before:
1327 if intent not in after:
1328 sameIntents = main.FALSE
1329 main.log.debug( "Intent is not currently in ONOS " +
1330 "(at least in the same form):" )
1331 main.log.debug( json.dumps( intent ) )
1332 except ( ValueError, TypeError ):
1333 main.log.exception( "Exception printing intents" )
1334 main.log.debug( repr( ONOSIntents[0] ) )
1335 main.log.debug( repr( intentState ) )
1336 if sameIntents == main.FALSE:
1337 try:
1338 main.log.debug( "ONOS intents before: " )
1339 main.log.debug( json.dumps( json.loads( intentState ),
1340 sort_keys=True, indent=4,
1341 separators=( ',', ': ' ) ) )
1342 main.log.debug( "Current ONOS intents: " )
1343 main.log.debug( json.dumps( json.loads( ONOSIntents[ 0 ] ),
1344 sort_keys=True, indent=4,
1345 separators=( ',', ': ' ) ) )
1346 except ( ValueError, TypeError ):
1347 main.log.exception( "Exception printing intents" )
1348 main.log.debug( repr( ONOSIntents[0] ) )
1349 main.log.debug( repr( intentState ) )
1350 utilities.assert_equals(
1351 expect=main.TRUE,
1352 actual=sameIntents,
1353 onpass="Intents are consistent with before failure",
1354 onfail="The Intents changed during failure" )
1355 intentCheck = intentCheck and sameIntents
1356 """
1357 main.step( "Get the OF Table entries and compare to before " +
1358 "component failure" )
1359 FlowTables = main.TRUE
1360 flows2 = []
1361 for i in range( 28 ):
1362 main.log.info( "Checking flow table on s" + str( i + 1 ) )
Jon Hall9043c902015-07-30 14:23:44 -07001363 tmpFlows = main.Mininet1.getFlowTable( 1.3, "s" + str( i + 1 ) )
Jon Hall85794ff2015-07-08 14:12:30 -07001364 flows2.append( tmpFlows )
Jon Hall9043c902015-07-30 14:23:44 -07001365 tempResult = main.Mininet1.flowComp(
Jon Hall85794ff2015-07-08 14:12:30 -07001366 flow1=flows[ i ],
1367 flow2=tmpFlows )
1368 FlowTables = FlowTables and tempResult
1369 if FlowTables == main.FALSE:
1370 main.log.info( "Differences in flow table for switch: s" +
1371 str( i + 1 ) )
1372 utilities.assert_equals(
1373 expect=main.TRUE,
1374 actual=FlowTables,
1375 onpass="No changes were found in the flow tables",
1376 onfail="Changes were found in the flow tables" )
1377
1378 main.step( "Leadership Election is still functional" )
1379 # Test of LeadershipElection
1380
Jon Halle1a3b752015-07-22 13:02:46 -07001381 leader = main.nodes[0].ip_address
Jon Hall85794ff2015-07-08 14:12:30 -07001382 leaderResult = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07001383 for controller in range( 1, main.numCtrls + 1 ):
Jon Hall85794ff2015-07-08 14:12:30 -07001384 # loop through ONOScli handlers
1385 node = getattr( main, ( 'ONOScli' + str( controller ) ) )
1386 leaderN = node.electionTestLeader()
1387 # verify leader is ONOS1
1388 # NOTE even though we restarted ONOS, it is the only one so onos 1
1389 # must be leader
1390 if leaderN == leader:
1391 # all is well
1392 pass
1393 elif leaderN == main.FALSE:
1394 # error in response
1395 main.log.error( "Something is wrong with " +
1396 "electionTestLeader function, check the" +
1397 " error logs" )
1398 leaderResult = main.FALSE
1399 elif leader != leaderN:
1400 leaderResult = main.FALSE
1401 main.log.error( "ONOS" + str( controller ) + " sees " +
1402 str( leaderN ) +
1403 " as the leader of the election app. " +
1404 "Leader should be " + str( leader ) )
1405 utilities.assert_equals(
1406 expect=main.TRUE,
1407 actual=leaderResult,
1408 onpass="Leadership election passed",
1409 onfail="Something went wrong with Leadership election" )
1410
1411 def CASE8( self, main ):
1412 """
1413 Compare topo
1414 """
1415 import json
1416 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001417 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001418 assert main, "main not defined"
1419 assert utilities.assert_equals, "utilities.assert_equals not defined"
1420
1421 main.case( "Compare ONOS Topology view to Mininet topology" )
Jon Hall783bbf92015-07-23 14:33:19 -07001422 main.caseExplanation = "Compare topology objects between Mininet" +\
Jon Hall85794ff2015-07-08 14:12:30 -07001423 " and ONOS"
1424
1425 main.step( "Comparing ONOS topology to MN" )
1426 devicesResults = main.TRUE
1427 linksResults = main.TRUE
1428 hostsResults = main.TRUE
1429 hostAttachmentResults = True
1430 topoResult = main.FALSE
1431 elapsed = 0
1432 count = 0
1433 main.step( "Collecting topology information from ONOS" )
1434 startTime = time.time()
1435 # Give time for Gossip to work
1436 while topoResult == main.FALSE and elapsed < 60:
1437 count += 1
1438 cliStart = time.time()
1439 devices = []
1440 devices.append( main.ONOScli1.devices() )
1441 hosts = []
1442 hosts.append( json.loads( main.ONOScli1.hosts() ) )
1443 ipResult = main.TRUE
1444 for controller in range( 0, len( hosts ) ):
1445 controllerStr = str( controller + 1 )
1446 for host in hosts[ controller ]:
1447 if host is None or host.get( 'ipAddresses', [] ) == []:
1448 main.log.error(
1449 "DEBUG:Error with host ips on controller" +
1450 controllerStr + ": " + str( host ) )
1451 ipResult = main.FALSE
1452 ports = []
1453 ports.append( main.ONOScli1.ports() )
1454 links = []
1455 links.append( main.ONOScli1.links() )
1456 clusters = []
1457 clusters.append( main.ONOScli1.clusters() )
1458
1459 elapsed = time.time() - startTime
1460 cliTime = time.time() - cliStart
1461 print "CLI time: " + str( cliTime )
1462
1463 mnSwitches = main.Mininet1.getSwitches()
1464 mnLinks = main.Mininet1.getLinks()
1465 mnHosts = main.Mininet1.getHosts()
Jon Halle1a3b752015-07-22 13:02:46 -07001466 for controller in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07001467 controllerStr = str( controller + 1 )
1468 if devices[ controller ] and ports[ controller ] and\
1469 "Error" not in devices[ controller ] and\
1470 "Error" not in ports[ controller ]:
1471
1472 currentDevicesResult = main.Mininet1.compareSwitches(
1473 mnSwitches,
1474 json.loads( devices[ controller ] ),
1475 json.loads( ports[ controller ] ) )
1476 else:
1477 currentDevicesResult = main.FALSE
1478 utilities.assert_equals( expect=main.TRUE,
1479 actual=currentDevicesResult,
1480 onpass="ONOS" + controllerStr +
1481 " Switches view is correct",
1482 onfail="ONOS" + controllerStr +
1483 " Switches view is incorrect" )
1484
1485 if links[ controller ] and "Error" not in links[ controller ]:
1486 currentLinksResult = main.Mininet1.compareLinks(
1487 mnSwitches, mnLinks,
1488 json.loads( links[ controller ] ) )
1489 else:
1490 currentLinksResult = main.FALSE
1491 utilities.assert_equals( expect=main.TRUE,
1492 actual=currentLinksResult,
1493 onpass="ONOS" + controllerStr +
1494 " links view is correct",
1495 onfail="ONOS" + controllerStr +
1496 " links view is incorrect" )
1497
1498 if hosts[ controller ] or "Error" not in hosts[ controller ]:
1499 currentHostsResult = main.Mininet1.compareHosts(
1500 mnHosts,
1501 hosts[ controller ] )
1502 else:
1503 currentHostsResult = main.FALSE
1504 utilities.assert_equals( expect=main.TRUE,
1505 actual=currentHostsResult,
1506 onpass="ONOS" + controllerStr +
1507 " hosts exist in Mininet",
1508 onfail="ONOS" + controllerStr +
1509 " hosts don't match Mininet" )
1510 # CHECKING HOST ATTACHMENT POINTS
1511 hostAttachment = True
1512 zeroHosts = False
1513 # FIXME: topo-HA/obelisk specific mappings:
1514 # key is mac and value is dpid
1515 mappings = {}
1516 for i in range( 1, 29 ): # hosts 1 through 28
1517 # set up correct variables:
1518 macId = "00:" * 5 + hex( i ).split( "0x" )[1].upper().zfill(2)
1519 if i == 1:
1520 deviceId = "1000".zfill(16)
1521 elif i == 2:
1522 deviceId = "2000".zfill(16)
1523 elif i == 3:
1524 deviceId = "3000".zfill(16)
1525 elif i == 4:
1526 deviceId = "3004".zfill(16)
1527 elif i == 5:
1528 deviceId = "5000".zfill(16)
1529 elif i == 6:
1530 deviceId = "6000".zfill(16)
1531 elif i == 7:
1532 deviceId = "6007".zfill(16)
1533 elif i >= 8 and i <= 17:
1534 dpid = '3' + str( i ).zfill( 3 )
1535 deviceId = dpid.zfill(16)
1536 elif i >= 18 and i <= 27:
1537 dpid = '6' + str( i ).zfill( 3 )
1538 deviceId = dpid.zfill(16)
1539 elif i == 28:
1540 deviceId = "2800".zfill(16)
1541 mappings[ macId ] = deviceId
1542 if hosts[ controller ] or "Error" not in hosts[ controller ]:
1543 if hosts[ controller ] == []:
1544 main.log.warn( "There are no hosts discovered" )
1545 zeroHosts = True
1546 else:
1547 for host in hosts[ controller ]:
1548 mac = None
1549 location = None
1550 device = None
1551 port = None
1552 try:
1553 mac = host.get( 'mac' )
1554 assert mac, "mac field could not be found for this host object"
1555
1556 location = host.get( 'location' )
1557 assert location, "location field could not be found for this host object"
1558
1559 # Trim the protocol identifier off deviceId
1560 device = str( location.get( 'elementId' ) ).split(':')[1]
1561 assert device, "elementId field could not be found for this host location object"
1562
1563 port = location.get( 'port' )
1564 assert port, "port field could not be found for this host location object"
1565
1566 # Now check if this matches where they should be
1567 if mac and device and port:
1568 if str( port ) != "1":
1569 main.log.error( "The attachment port is incorrect for " +
1570 "host " + str( mac ) +
1571 ". Expected: 1 Actual: " + str( port) )
1572 hostAttachment = False
1573 if device != mappings[ str( mac ) ]:
1574 main.log.error( "The attachment device is incorrect for " +
1575 "host " + str( mac ) +
1576 ". Expected: " + mappings[ str( mac ) ] +
1577 " Actual: " + device )
1578 hostAttachment = False
1579 else:
1580 hostAttachment = False
1581 except AssertionError:
1582 main.log.exception( "Json object not as expected" )
1583 main.log.error( repr( host ) )
1584 hostAttachment = False
1585 else:
1586 main.log.error( "No hosts json output or \"Error\"" +
1587 " in output. hosts = " +
1588 repr( hosts[ controller ] ) )
1589 if zeroHosts is False:
1590 hostAttachment = True
1591
Jon Hall85794ff2015-07-08 14:12:30 -07001592 devicesResults = devicesResults and currentDevicesResult
1593 linksResults = linksResults and currentLinksResult
1594 hostsResults = hostsResults and currentHostsResult
1595 hostAttachmentResults = hostAttachmentResults and\
1596 hostAttachment
1597
1598 # "consistent" results don't make sense for single instance
1599 # there should always only be one cluster
1600 numClusters = len( json.loads( clusters[ 0 ] ) )
1601 clusterResults = main.FALSE
1602 if numClusters == 1:
1603 clusterResults = main.TRUE
1604 utilities.assert_equals(
1605 expect=1,
1606 actual=numClusters,
1607 onpass="ONOS shows 1 SCC",
1608 onfail="ONOS shows " + str( numClusters ) + " SCCs" )
1609
1610 topoResult = ( devicesResults and linksResults
1611 and hostsResults and ipResult and clusterResults and
1612 hostAttachmentResults )
1613
1614 topoResult = topoResult and int( count <= 2 )
1615 note = "note it takes about " + str( int( cliTime ) ) + \
1616 " seconds for the test to make all the cli calls to fetch " +\
1617 "the topology from each ONOS instance"
1618 main.log.info(
1619 "Very crass estimate for topology discovery/convergence( " +
1620 str( note ) + " ): " + str( elapsed ) + " seconds, " +
1621 str( count ) + " tries" )
1622 utilities.assert_equals( expect=main.TRUE, actual=topoResult,
1623 onpass="Topology Check Test successful",
1624 onfail="Topology Check Test NOT successful" )
1625
1626 def CASE9( self, main ):
1627 """
1628 Link s3-s28 down
1629 """
1630 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001631 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001632 assert main, "main not defined"
1633 assert utilities.assert_equals, "utilities.assert_equals not defined"
1634 # NOTE: You should probably run a topology check after this
1635
1636 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
1637
1638 description = "Turn off a link to ensure that Link Discovery " +\
1639 "is working properly"
1640 main.case( description )
1641
1642 main.step( "Kill Link between s3 and s28" )
1643 LinkDown = main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
1644 main.log.info( "Waiting " + str( linkSleep ) +
1645 " seconds for link down to be discovered" )
1646 time.sleep( linkSleep )
1647 utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
1648 onpass="Link down successful",
1649 onfail="Failed to bring link down" )
1650 # TODO do some sort of check here
1651
1652 def CASE10( self, main ):
1653 """
1654 Link s3-s28 up
1655 """
1656 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001657 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001658 assert main, "main not defined"
1659 assert utilities.assert_equals, "utilities.assert_equals not defined"
1660 # NOTE: You should probably run a topology check after this
1661
1662 linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
1663
1664 description = "Restore a link to ensure that Link Discovery is " + \
1665 "working properly"
1666 main.case( description )
1667
1668 main.step( "Bring link between s3 and s28 back up" )
1669 LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
1670 main.log.info( "Waiting " + str( linkSleep ) +
1671 " seconds for link up to be discovered" )
1672 time.sleep( linkSleep )
1673 utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
1674 onpass="Link up successful",
1675 onfail="Failed to bring link up" )
1676 # TODO do some sort of check here
1677
1678 def CASE11( self, main ):
1679 """
1680 Switch Down
1681 """
1682 # NOTE: You should probably run a topology check after this
1683 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001684 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001685 assert main, "main not defined"
1686 assert utilities.assert_equals, "utilities.assert_equals not defined"
1687
1688 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
1689
1690 description = "Killing a switch to ensure it is discovered correctly"
1691 main.case( description )
1692 switch = main.params[ 'kill' ][ 'switch' ]
1693 switchDPID = main.params[ 'kill' ][ 'dpid' ]
1694
1695 # TODO: Make this switch parameterizable
1696 main.step( "Kill " + switch )
1697 main.log.info( "Deleting " + switch )
1698 main.Mininet1.delSwitch( switch )
1699 main.log.info( "Waiting " + str( switchSleep ) +
1700 " seconds for switch down to be discovered" )
1701 time.sleep( switchSleep )
1702 device = main.ONOScli1.getDevice( dpid=switchDPID )
1703 # Peek at the deleted switch
1704 main.log.warn( str( device ) )
1705 result = main.FALSE
1706 if device and device[ 'available' ] is False:
1707 result = main.TRUE
1708 utilities.assert_equals( expect=main.TRUE, actual=result,
1709 onpass="Kill switch successful",
1710 onfail="Failed to kill switch?" )
1711
1712 def CASE12( self, main ):
1713 """
1714 Switch Up
1715 """
1716 # NOTE: You should probably run a topology check after this
1717 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001718 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001719 assert main, "main not defined"
1720 assert utilities.assert_equals, "utilities.assert_equals not defined"
1721
1722 switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
1723 switch = main.params[ 'kill' ][ 'switch' ]
1724 switchDPID = main.params[ 'kill' ][ 'dpid' ]
1725 links = main.params[ 'kill' ][ 'links' ].split()
1726 description = "Adding a switch to ensure it is discovered correctly"
1727 main.case( description )
1728
1729 main.step( "Add back " + switch )
1730 main.Mininet1.addSwitch( switch, dpid=switchDPID )
1731 for peer in links:
1732 main.Mininet1.addLink( switch, peer )
1733 ipList = []
Jon Halle1a3b752015-07-22 13:02:46 -07001734 for i in range( main.numCtrls ):
1735 ipList.append( main.nodes[ i ].ip_address )
Jon Hall85794ff2015-07-08 14:12:30 -07001736 main.Mininet1.assignSwController( sw=switch, ip=ipList )
1737 main.log.info( "Waiting " + str( switchSleep ) +
1738 " seconds for switch up to be discovered" )
1739 time.sleep( switchSleep )
1740 device = main.ONOScli1.getDevice( dpid=switchDPID )
1741 # Peek at the deleted switch
1742 main.log.warn( str( device ) )
1743 result = main.FALSE
1744 if device and device[ 'available' ]:
1745 result = main.TRUE
1746 utilities.assert_equals( expect=main.TRUE, actual=result,
1747 onpass="add switch successful",
1748 onfail="Failed to add switch?" )
1749
1750 def CASE13( self, main ):
1751 """
1752 Clean up
1753 """
1754 import os
1755 import time
Jon Halle1a3b752015-07-22 13:02:46 -07001756 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001757 assert main, "main not defined"
1758 assert utilities.assert_equals, "utilities.assert_equals not defined"
1759 # printing colors to terminal
1760 colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
1761 'blue': '\033[94m', 'green': '\033[92m',
1762 'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
1763 main.case( "Test Cleanup" )
1764 main.step( "Killing tcpdumps" )
1765 main.Mininet2.stopTcpdump()
1766
1767 testname = main.TEST
1768 if main.params[ 'BACKUP' ] == "True":
1769 main.step( "Copying MN pcap and ONOS log files to test station" )
1770 teststationUser = main.params[ 'BACKUP' ][ 'TESTONUSER' ]
1771 teststationIP = main.params[ 'BACKUP' ][ 'TESTONIP' ]
1772 # NOTE: MN Pcap file is being saved to ~/packet_captures
1773 # scp this file as MN and TestON aren't necessarily the same vm
1774 # FIXME: scp
1775 # mn files
1776 # TODO: Load these from params
1777 # NOTE: must end in /
1778 logFolder = "/opt/onos/log/"
1779 logFiles = [ "karaf.log", "karaf.log.1" ]
1780 # NOTE: must end in /
1781 dstDir = "~/packet_captures/"
1782 for f in logFiles:
Jon Halle1a3b752015-07-22 13:02:46 -07001783 main.ONOSbench.handle.sendline( "scp sdn@" + main.nodes[0].ip_address + ":" +
Jon Hall85794ff2015-07-08 14:12:30 -07001784 logFolder + f + " " +
1785 teststationUser + "@" +
1786 teststationIP + ":" + dstDir +
1787 str( testname ) + "-ONOS1-" + f )
1788 main.ONOSbench.handle.expect( "\$" )
1789
1790 # std*.log's
1791 # NOTE: must end in /
1792 logFolder = "/opt/onos/var/"
1793 logFiles = [ "stderr.log", "stdout.log" ]
1794 # NOTE: must end in /
1795 dstDir = "~/packet_captures/"
1796 for f in logFiles:
Jon Halle1a3b752015-07-22 13:02:46 -07001797 main.ONOSbench.handle.sendline( "scp sdn@" + main.nodes[0].ip_address + ":" +
Jon Hall85794ff2015-07-08 14:12:30 -07001798 logFolder + f + " " +
1799 teststationUser + "@" +
1800 teststationIP + ":" + dstDir +
1801 str( testname ) + "-ONOS1-" + f )
1802 main.ONOSbench.handle.expect( "\$" )
1803 # sleep so scp can finish
1804 time.sleep( 10 )
1805 main.step( "Packing and rotating pcap archives" )
1806 os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
1807
Jon Hall85794ff2015-07-08 14:12:30 -07001808 main.step( "Stopping Mininet" )
1809 mnResult = main.Mininet1.stopNet()
1810 utilities.assert_equals( expect=main.TRUE, actual=mnResult,
1811 onpass="Mininet stopped",
1812 onfail="MN cleanup NOT successful" )
1813
1814 main.step( "Checking ONOS Logs for errors" )
1815 print colors[ 'purple' ] + "Checking logs for errors on ONOS1:" + \
1816 colors[ 'end' ]
Jon Halle1a3b752015-07-22 13:02:46 -07001817 print main.ONOSbench.checkLogs( main.nodes[0].ip_address, restart=True )
Jon Hall85794ff2015-07-08 14:12:30 -07001818
1819 try:
1820 timerLog = open( main.logdir + "/Timers.csv", 'w')
1821 # Overwrite with empty line and close
1822 labels = "Gossip Intents, Restart"
1823 data = str( gossipTime ) + ", " + str( main.restartTime )
1824 timerLog.write( labels + "\n" + data )
1825 timerLog.close()
1826 except NameError, e:
1827 main.log.exception(e)
1828
1829 def CASE14( self, main ):
1830 """
1831 start election app on all onos nodes
1832 """
Jon Halle1a3b752015-07-22 13:02:46 -07001833 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001834 assert main, "main not defined"
1835 assert utilities.assert_equals, "utilities.assert_equals not defined"
1836
1837 main.case("Start Leadership Election app")
1838 main.step( "Install leadership election app" )
1839 appResult = main.ONOScli1.activateApp( "org.onosproject.election" )
1840 utilities.assert_equals(
1841 expect=main.TRUE,
1842 actual=appResult,
1843 onpass="Election app installed",
1844 onfail="Something went wrong with installing Leadership election" )
1845
1846 main.step( "Run for election on each node" )
1847 leaderResult = main.ONOScli1.electionTestRun()
1848 # check for leader
1849 leader = main.ONOScli1.electionTestLeader()
1850 # verify leader is ONOS1
Jon Halle1a3b752015-07-22 13:02:46 -07001851 if leader == main.nodes[0].ip_address:
Jon Hall85794ff2015-07-08 14:12:30 -07001852 # all is well
1853 pass
1854 elif leader is None:
1855 # No leader elected
1856 main.log.error( "No leader was elected" )
1857 leaderResult = main.FALSE
1858 elif leader == main.FALSE:
1859 # error in response
1860 # TODO: add check for "Command not found:" in the driver, this
1861 # means the app isn't loaded
1862 main.log.error( "Something is wrong with electionTestLeader" +
1863 " function, check the error logs" )
1864 leaderResult = main.FALSE
1865 else:
1866 # error in response
1867 main.log.error(
1868 "Unexpected response from electionTestLeader function:'" +
1869 str( leader ) +
1870 "'" )
1871 leaderResult = main.FALSE
1872 utilities.assert_equals(
1873 expect=main.TRUE,
1874 actual=leaderResult,
1875 onpass="Successfully ran for leadership",
1876 onfail="Failed to run for leadership" )
1877
1878 def CASE15( self, main ):
1879 """
1880 Check that Leadership Election is still functional
1881 """
Jon Halle1a3b752015-07-22 13:02:46 -07001882 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001883 assert main, "main not defined"
1884 assert utilities.assert_equals, "utilities.assert_equals not defined"
acsmars2c2fcdd2015-08-25 17:14:13 -07001885 electionResult = main.TRUE
1886 candidateElected = main.TRUE
Jon Hall85794ff2015-07-08 14:12:30 -07001887 description = "Check that Leadership Election is still functional"
1888 main.case( description )
1889 main.step( "Find current leader and withdraw" )
1890 leader = main.ONOScli1.electionTestLeader()
acsmars2c2fcdd2015-08-25 17:14:13 -07001891
1892 # save candidate status before leader withdraw
1893 candidateList = main.ONOScli1.specificLeaderCandidate(
1894 'org.onosproject.election' )
1895 # if there is only one leader available
1896 onlyOneLeader = False
1897 if len( candidateList ) == 2:
1898 main.log.info( "Leader and Candidate are the same, " +
1899 "assuming only 1 leader exists" )
1900 onlyOneLeader = True
1901
1902 # withdraw the current leader
Jon Hall85794ff2015-07-08 14:12:30 -07001903 withdrawResult = main.FALSE
Jon Halle1a3b752015-07-22 13:02:46 -07001904 if leader == main.nodes[0].ip_address:
Jon Hall85794ff2015-07-08 14:12:30 -07001905 oldLeader = getattr( main, "ONOScli1" )
1906 elif leader is None or leader == main.FALSE:
1907 main.log.error(
1908 "Leader for the election app should be an ONOS node," +
1909 "instead got '" + str( leader ) + "'" )
1910 leaderResult = main.FALSE
1911 oldLeader = None
1912 else:
1913 main.log.error( "Leader election --- why am I HERE?!?")
1914 leaderResult = main.FALSE
1915 oldLeader = None
1916 if oldLeader:
1917 withdrawResult = oldLeader.electionTestWithdraw()
1918 utilities.assert_equals(
1919 expect=main.TRUE,
1920 actual=withdrawResult,
1921 onpass="Node was withdrawn from election",
1922 onfail="Node was not withdrawn from election" )
1923
acsmars2c2fcdd2015-08-25 17:14:13 -07001924 main.step( "Checking Leadership Withdrawl and Election Result" )
1925 leaderN = main.ONOScli1.electionTestLeader() # Get new leader
1926 candidatePassMessage = ""
1927 # Check that the candidate was elected (if there was one)
1928 if leaderN == leader: # Case Fails
Jon Hall85794ff2015-07-08 14:12:30 -07001929 main.log.error( "ONOS still sees " + str( leaderN ) +
1930 " as leader after they withdrew" )
acsmars2c2fcdd2015-08-25 17:14:13 -07001931 electionResult = main.FALSE
1932 elif onlyOneLeader and ( leaderN == None ): # Case Passes
1933 candidateElected = main.TRUE
1934 candidatePassMessage = ( "No leader after only leader was " +
1935 "withdrawn. Election passed." )
1936 elif leaderN == candidateList[ 1 ]:
1937 # Case Passes
1938 candidateElected = main.TRUE
1939 candidatePassMessage = "Old leader's candidate elected to leader"
1940 elif leaderN == main.FALSE: # Case Fails
Jon Hall85794ff2015-07-08 14:12:30 -07001941 # error in response
1942 # TODO: add check for "Command not found:" in the driver, this
1943 # means the app isn't loaded
1944 main.log.error( "Something is wrong with electionTestLeader " +
1945 "function, check the error logs" )
acsmars2c2fcdd2015-08-25 17:14:13 -07001946 electionResult = main.FALSE
1947 else: # Case Fails
1948 # Catches weird cases like
1949 # leaderN = None when there was multiple leaders
1950 candidateElected = main.FALSE
Jon Hall85794ff2015-07-08 14:12:30 -07001951 utilities.assert_equals(
1952 expect=main.TRUE,
acsmars2c2fcdd2015-08-25 17:14:13 -07001953 actual=electionResult and candidateElected,
1954 onpass=candidatePassMessage,
1955 onfail="The new leader was not the old leader election candidate"
1956 )
Jon Hall85794ff2015-07-08 14:12:30 -07001957
acsmars2c2fcdd2015-08-25 17:14:13 -07001958 # Elect oldLeader back
Jon Hall85794ff2015-07-08 14:12:30 -07001959 main.step( "Run for election on old leader( just so everyone " +
1960 "is in the hat )" )
1961 if oldLeader:
1962 runResult = oldLeader.electionTestRun()
1963 else:
1964 runResult = main.FALSE
1965 utilities.assert_equals(
1966 expect=main.TRUE,
1967 actual=runResult,
1968 onpass="App re-ran for election",
1969 onfail="App failed to run for election" )
1970
1971 main.step( "Node became leader when it ran for election" )
1972 afterRun = main.ONOScli1.electionTestLeader()
1973 # verify leader is ONOS1
Jon Halle1a3b752015-07-22 13:02:46 -07001974 if afterRun == main.nodes[0].ip_address:
Jon Hall85794ff2015-07-08 14:12:30 -07001975 afterResult = main.TRUE
1976 else:
1977 afterResult = main.FALSE
1978
1979 utilities.assert_equals(
1980 expect=main.TRUE,
1981 actual=afterResult,
1982 onpass="Old leader successfully re-ran for election",
1983 onfail="Something went wrong with Leadership election after " +
1984 "the old leader re-ran for election" )
1985
1986 def CASE16( self, main ):
1987 """
1988 Install Distributed Primitives app
1989 """
Jon Halle1a3b752015-07-22 13:02:46 -07001990 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001991 assert main, "main not defined"
1992 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -07001993 assert main.CLIs, "main.CLIs not defined"
1994 assert main.nodes, "main.nodes not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001995
1996 # Variables for the distributed primitives tests
1997 global pCounterName
1998 global iCounterName
1999 global pCounterValue
2000 global iCounterValue
2001 global onosSet
2002 global onosSetName
2003 pCounterName = "TestON-Partitions"
2004 iCounterName = "TestON-inMemory"
2005 pCounterValue = 0
2006 iCounterValue = 0
2007 onosSet = set([])
2008 onosSetName = "TestON-set"
2009
2010 description = "Install Primitives app"
2011 main.case( description )
2012 main.step( "Install Primitives app" )
2013 appName = "org.onosproject.distributedprimitives"
Jon Halle1a3b752015-07-22 13:02:46 -07002014 appResults = main.CLIs[0].activateApp( appName )
Jon Hall85794ff2015-07-08 14:12:30 -07002015 utilities.assert_equals( expect=main.TRUE,
2016 actual=appResults,
2017 onpass="Primitives app activated",
2018 onfail="Primitives app not activated" )
2019
2020 def CASE17( self, main ):
2021 """
2022 Check for basic functionality with distributed primitives
2023 """
Jon Hall85794ff2015-07-08 14:12:30 -07002024 # Make sure variables are defined/set
Jon Halle1a3b752015-07-22 13:02:46 -07002025 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07002026 assert main, "main not defined"
2027 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -07002028 assert main.CLIs, "main.CLIs not defined"
2029 assert main.nodes, "main.nodes not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07002030 assert pCounterName, "pCounterName not defined"
2031 assert iCounterName, "iCounterName not defined"
2032 assert onosSetName, "onosSetName not defined"
2033 # NOTE: assert fails if value is 0/None/Empty/False
2034 try:
2035 pCounterValue
2036 except NameError:
2037 main.log.error( "pCounterValue not defined, setting to 0" )
2038 pCounterValue = 0
2039 try:
2040 iCounterValue
2041 except NameError:
2042 main.log.error( "iCounterValue not defined, setting to 0" )
2043 iCounterValue = 0
2044 try:
2045 onosSet
2046 except NameError:
2047 main.log.error( "onosSet not defined, setting to empty Set" )
2048 onosSet = set([])
2049 # Variables for the distributed primitives tests. These are local only
2050 addValue = "a"
2051 addAllValue = "a b c d e f"
2052 retainValue = "c d e f"
2053
2054 description = "Check for basic functionality with distributed " +\
2055 "primitives"
2056 main.case( description )
Jon Halle1a3b752015-07-22 13:02:46 -07002057 main.caseExplanation = "Test the methods of the distributed " +\
2058 "primitives (counters and sets) throught the cli"
Jon Hall85794ff2015-07-08 14:12:30 -07002059 # DISTRIBUTED ATOMIC COUNTERS
Jon Halle1a3b752015-07-22 13:02:46 -07002060 # Partitioned counters
2061 main.step( "Increment then get a default counter on each node" )
Jon Hall85794ff2015-07-08 14:12:30 -07002062 pCounters = []
2063 threads = []
2064 addedPValues = []
Jon Halle1a3b752015-07-22 13:02:46 -07002065 for i in range( main.numCtrls ):
2066 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2067 name="counterAddAndGet-" + str( i ),
Jon Hall85794ff2015-07-08 14:12:30 -07002068 args=[ pCounterName ] )
2069 pCounterValue += 1
2070 addedPValues.append( pCounterValue )
2071 threads.append( t )
2072 t.start()
2073
2074 for t in threads:
2075 t.join()
2076 pCounters.append( t.result )
2077 # Check that counter incremented numController times
2078 pCounterResults = True
2079 for i in addedPValues:
2080 tmpResult = i in pCounters
2081 pCounterResults = pCounterResults and tmpResult
2082 if not tmpResult:
2083 main.log.error( str( i ) + " is not in partitioned "
2084 "counter incremented results" )
2085 utilities.assert_equals( expect=True,
2086 actual=pCounterResults,
2087 onpass="Default counter incremented",
2088 onfail="Error incrementing default" +
2089 " counter" )
2090
Jon Halle1a3b752015-07-22 13:02:46 -07002091 main.step( "Get then Increment a default counter on each node" )
2092 pCounters = []
2093 threads = []
2094 addedPValues = []
2095 for i in range( main.numCtrls ):
2096 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2097 name="counterGetAndAdd-" + str( i ),
2098 args=[ pCounterName ] )
2099 addedPValues.append( pCounterValue )
2100 pCounterValue += 1
2101 threads.append( t )
2102 t.start()
2103
2104 for t in threads:
2105 t.join()
2106 pCounters.append( t.result )
2107 # Check that counter incremented numController times
2108 pCounterResults = True
2109 for i in addedPValues:
2110 tmpResult = i in pCounters
2111 pCounterResults = pCounterResults and tmpResult
2112 if not tmpResult:
2113 main.log.error( str( i ) + " is not in partitioned "
2114 "counter incremented results" )
2115 utilities.assert_equals( expect=True,
2116 actual=pCounterResults,
2117 onpass="Default counter incremented",
2118 onfail="Error incrementing default" +
2119 " counter" )
2120
2121 main.step( "Counters we added have the correct values" )
2122 incrementCheck = main.Counters.counterCheck( pCounterName, pCounterValue )
2123 utilities.assert_equals( expect=main.TRUE,
2124 actual=incrementCheck,
2125 onpass="Added counters are correct",
2126 onfail="Added counters are incorrect" )
2127
2128 main.step( "Add -8 to then get a default counter on each node" )
2129 pCounters = []
2130 threads = []
2131 addedPValues = []
2132 for i in range( main.numCtrls ):
2133 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2134 name="counterIncrement-" + str( i ),
2135 args=[ pCounterName ],
2136 kwargs={ "delta": -8 } )
2137 pCounterValue += -8
2138 addedPValues.append( pCounterValue )
2139 threads.append( t )
2140 t.start()
2141
2142 for t in threads:
2143 t.join()
2144 pCounters.append( t.result )
2145 # Check that counter incremented numController times
2146 pCounterResults = True
2147 for i in addedPValues:
2148 tmpResult = i in pCounters
2149 pCounterResults = pCounterResults and tmpResult
2150 if not tmpResult:
2151 main.log.error( str( i ) + " is not in partitioned "
2152 "counter incremented results" )
2153 utilities.assert_equals( expect=True,
2154 actual=pCounterResults,
2155 onpass="Default counter incremented",
2156 onfail="Error incrementing default" +
2157 " counter" )
2158
2159 main.step( "Add 5 to then get a default counter on each node" )
2160 pCounters = []
2161 threads = []
2162 addedPValues = []
2163 for i in range( main.numCtrls ):
2164 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2165 name="counterIncrement-" + str( i ),
2166 args=[ pCounterName ],
2167 kwargs={ "delta": 5 } )
2168 pCounterValue += 5
2169 addedPValues.append( pCounterValue )
2170 threads.append( t )
2171 t.start()
2172
2173 for t in threads:
2174 t.join()
2175 pCounters.append( t.result )
2176 # Check that counter incremented numController times
2177 pCounterResults = True
2178 for i in addedPValues:
2179 tmpResult = i in pCounters
2180 pCounterResults = pCounterResults and tmpResult
2181 if not tmpResult:
2182 main.log.error( str( i ) + " is not in partitioned "
2183 "counter incremented results" )
2184 utilities.assert_equals( expect=True,
2185 actual=pCounterResults,
2186 onpass="Default counter incremented",
2187 onfail="Error incrementing default" +
2188 " counter" )
2189
2190 main.step( "Get then add 5 to a default counter on each node" )
2191 pCounters = []
2192 threads = []
2193 addedPValues = []
2194 for i in range( main.numCtrls ):
2195 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2196 name="counterIncrement-" + str( i ),
2197 args=[ pCounterName ],
2198 kwargs={ "delta": 5 } )
2199 addedPValues.append( pCounterValue )
2200 pCounterValue += 5
2201 threads.append( t )
2202 t.start()
2203
2204 for t in threads:
2205 t.join()
2206 pCounters.append( t.result )
2207 # Check that counter incremented numController times
2208 pCounterResults = True
2209 for i in addedPValues:
2210 tmpResult = i in pCounters
2211 pCounterResults = pCounterResults and tmpResult
2212 if not tmpResult:
2213 main.log.error( str( i ) + " is not in partitioned "
2214 "counter incremented results" )
2215 utilities.assert_equals( expect=True,
2216 actual=pCounterResults,
2217 onpass="Default counter incremented",
2218 onfail="Error incrementing default" +
2219 " counter" )
2220
2221 main.step( "Counters we added have the correct values" )
2222 incrementCheck = main.Counters.counterCheck( pCounterName, pCounterValue )
2223 utilities.assert_equals( expect=main.TRUE,
2224 actual=incrementCheck,
2225 onpass="Added counters are correct",
2226 onfail="Added counters are incorrect" )
2227
2228 # In-Memory counters
2229 main.step( "Increment and get an in-memory counter on each node" )
Jon Hall85794ff2015-07-08 14:12:30 -07002230 iCounters = []
2231 addedIValues = []
2232 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002233 for i in range( main.numCtrls ):
2234 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002235 name="icounterIncrement-" + str( i ),
2236 args=[ iCounterName ],
2237 kwargs={ "inMemory": True } )
2238 iCounterValue += 1
2239 addedIValues.append( iCounterValue )
2240 threads.append( t )
2241 t.start()
2242
2243 for t in threads:
2244 t.join()
2245 iCounters.append( t.result )
2246 # Check that counter incremented numController times
2247 iCounterResults = True
2248 for i in addedIValues:
2249 tmpResult = i in iCounters
2250 iCounterResults = iCounterResults and tmpResult
2251 if not tmpResult:
2252 main.log.error( str( i ) + " is not in the in-memory "
2253 "counter incremented results" )
2254 utilities.assert_equals( expect=True,
2255 actual=iCounterResults,
Jon Halle1a3b752015-07-22 13:02:46 -07002256 onpass="In-memory counter incremented",
2257 onfail="Error incrementing in-memory" +
Jon Hall85794ff2015-07-08 14:12:30 -07002258 " counter" )
2259
Jon Halle1a3b752015-07-22 13:02:46 -07002260 main.step( "Get then Increment a in-memory counter on each node" )
2261 iCounters = []
2262 threads = []
2263 addedIValues = []
2264 for i in range( main.numCtrls ):
2265 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2266 name="counterGetAndAdd-" + str( i ),
2267 args=[ iCounterName ],
2268 kwargs={ "inMemory": True } )
2269 addedIValues.append( iCounterValue )
2270 iCounterValue += 1
2271 threads.append( t )
2272 t.start()
2273
2274 for t in threads:
2275 t.join()
2276 iCounters.append( t.result )
2277 # Check that counter incremented numController times
2278 iCounterResults = True
2279 for i in addedIValues:
2280 tmpResult = i in iCounters
2281 iCounterResults = iCounterResults and tmpResult
2282 if not tmpResult:
2283 main.log.error( str( i ) + " is not in in-memory "
2284 "counter incremented results" )
2285 utilities.assert_equals( expect=True,
2286 actual=iCounterResults,
2287 onpass="In-memory counter incremented",
2288 onfail="Error incrementing in-memory" +
2289 " counter" )
2290
2291 main.step( "Counters we added have the correct values" )
2292 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2293 utilities.assert_equals( expect=main.TRUE,
2294 actual=incrementCheck,
2295 onpass="Added counters are correct",
2296 onfail="Added counters are incorrect" )
2297
2298 main.step( "Add -8 to then get a in-memory counter on each node" )
2299 iCounters = []
2300 threads = []
2301 addedIValues = []
2302 for i in range( main.numCtrls ):
2303 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2304 name="counterIncrement-" + str( i ),
2305 args=[ iCounterName ],
2306 kwargs={ "delta": -8, "inMemory": True } )
2307 iCounterValue += -8
2308 addedIValues.append( iCounterValue )
2309 threads.append( t )
2310 t.start()
2311
2312 for t in threads:
2313 t.join()
2314 iCounters.append( t.result )
2315 # Check that counter incremented numController times
2316 iCounterResults = True
2317 for i in addedIValues:
2318 tmpResult = i in iCounters
2319 iCounterResults = iCounterResults and tmpResult
2320 if not tmpResult:
2321 main.log.error( str( i ) + " is not in in-memory "
2322 "counter incremented results" )
2323 utilities.assert_equals( expect=True,
2324 actual=pCounterResults,
2325 onpass="In-memory counter incremented",
2326 onfail="Error incrementing in-memory" +
2327 " counter" )
2328
2329 main.step( "Add 5 to then get a in-memory counter on each node" )
2330 iCounters = []
2331 threads = []
2332 addedIValues = []
2333 for i in range( main.numCtrls ):
2334 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2335 name="counterIncrement-" + str( i ),
2336 args=[ iCounterName ],
2337 kwargs={ "delta": 5, "inMemory": True } )
2338 iCounterValue += 5
2339 addedIValues.append( iCounterValue )
2340 threads.append( t )
2341 t.start()
2342
2343 for t in threads:
2344 t.join()
2345 iCounters.append( t.result )
2346 # Check that counter incremented numController times
2347 iCounterResults = True
2348 for i in addedIValues:
2349 tmpResult = i in iCounters
2350 iCounterResults = iCounterResults and tmpResult
2351 if not tmpResult:
2352 main.log.error( str( i ) + " is not in in-memory "
2353 "counter incremented results" )
2354 utilities.assert_equals( expect=True,
2355 actual=pCounterResults,
2356 onpass="In-memory counter incremented",
2357 onfail="Error incrementing in-memory" +
2358 " counter" )
2359
2360 main.step( "Get then add 5 to a in-memory counter on each node" )
2361 iCounters = []
2362 threads = []
2363 addedIValues = []
2364 for i in range( main.numCtrls ):
2365 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2366 name="counterIncrement-" + str( i ),
2367 args=[ iCounterName ],
2368 kwargs={ "delta": 5, "inMemory": True } )
2369 addedIValues.append( iCounterValue )
2370 iCounterValue += 5
2371 threads.append( t )
2372 t.start()
2373
2374 for t in threads:
2375 t.join()
2376 iCounters.append( t.result )
2377 # Check that counter incremented numController times
2378 iCounterResults = True
2379 for i in addedIValues:
2380 tmpResult = i in iCounters
2381 iCounterResults = iCounterResults and tmpResult
2382 if not tmpResult:
2383 main.log.error( str( i ) + " is not in in-memory "
2384 "counter incremented results" )
2385 utilities.assert_equals( expect=True,
2386 actual=iCounterResults,
2387 onpass="In-memory counter incremented",
2388 onfail="Error incrementing in-memory" +
2389 " counter" )
2390
2391 main.step( "Counters we added have the correct values" )
2392 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2393 utilities.assert_equals( expect=main.TRUE,
2394 actual=incrementCheck,
2395 onpass="Added counters are correct",
2396 onfail="Added counters are incorrect" )
2397
Jon Hall85794ff2015-07-08 14:12:30 -07002398 main.step( "Check counters are consistant across nodes" )
2399 onosCounters = []
2400 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002401 for i in range( main.numCtrls ):
2402 t = main.Thread( target=main.CLIs[i].counters,
Jon Hall85794ff2015-07-08 14:12:30 -07002403 name="counters-" + str( i ) )
2404 threads.append( t )
2405 t.start()
2406 for t in threads:
2407 t.join()
2408 onosCounters.append( t.result )
2409 tmp = [ i == onosCounters[ 0 ] for i in onosCounters ]
2410 if all( tmp ):
2411 main.log.info( "Counters are consistent across all nodes" )
2412 consistentCounterResults = main.TRUE
2413 else:
2414 main.log.error( "Counters are not consistent across all nodes" )
2415 consistentCounterResults = main.FALSE
2416 utilities.assert_equals( expect=main.TRUE,
2417 actual=consistentCounterResults,
2418 onpass="ONOS counters are consistent " +
2419 "across nodes",
2420 onfail="ONOS Counters are inconsistent " +
2421 "across nodes" )
2422
2423 main.step( "Counters we added have the correct values" )
Jon Halle1a3b752015-07-22 13:02:46 -07002424 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2425 incrementCheck = incrementCheck and \
2426 main.Counters.counterCheck( iCounterName, iCounterValue )
Jon Hall85794ff2015-07-08 14:12:30 -07002427 utilities.assert_equals( expect=main.TRUE,
Jon Halle1a3b752015-07-22 13:02:46 -07002428 actual=incrementCheck,
Jon Hall85794ff2015-07-08 14:12:30 -07002429 onpass="Added counters are correct",
2430 onfail="Added counters are incorrect" )
Jon Halle1a3b752015-07-22 13:02:46 -07002431
Jon Hall85794ff2015-07-08 14:12:30 -07002432 # DISTRIBUTED SETS
2433 main.step( "Distributed Set get" )
2434 size = len( onosSet )
2435 getResponses = []
2436 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002437 for i in range( main.numCtrls ):
2438 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002439 name="setTestGet-" + str( i ),
2440 args=[ onosSetName ] )
2441 threads.append( t )
2442 t.start()
2443 for t in threads:
2444 t.join()
2445 getResponses.append( t.result )
2446
2447 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002448 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002449 if isinstance( getResponses[ i ], list):
2450 current = set( getResponses[ i ] )
2451 if len( current ) == len( getResponses[ i ] ):
2452 # no repeats
2453 if onosSet != current:
2454 main.log.error( "ONOS" + str( i + 1 ) +
2455 " has incorrect view" +
2456 " of set " + onosSetName + ":\n" +
2457 str( getResponses[ i ] ) )
2458 main.log.debug( "Expected: " + str( onosSet ) )
2459 main.log.debug( "Actual: " + str( current ) )
2460 getResults = main.FALSE
2461 else:
2462 # error, set is not a set
2463 main.log.error( "ONOS" + str( i + 1 ) +
2464 " has repeat elements in" +
2465 " set " + onosSetName + ":\n" +
2466 str( getResponses[ i ] ) )
2467 getResults = main.FALSE
2468 elif getResponses[ i ] == main.ERROR:
2469 getResults = main.FALSE
2470 utilities.assert_equals( expect=main.TRUE,
2471 actual=getResults,
2472 onpass="Set elements are correct",
2473 onfail="Set elements are incorrect" )
2474
2475 main.step( "Distributed Set size" )
2476 sizeResponses = []
2477 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002478 for i in range( main.numCtrls ):
2479 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002480 name="setTestSize-" + str( i ),
2481 args=[ onosSetName ] )
2482 threads.append( t )
2483 t.start()
2484 for t in threads:
2485 t.join()
2486 sizeResponses.append( t.result )
2487
2488 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002489 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002490 if size != sizeResponses[ i ]:
2491 sizeResults = main.FALSE
2492 main.log.error( "ONOS" + str( i + 1 ) +
2493 " expected a size of " + str( size ) +
2494 " for set " + onosSetName +
2495 " but got " + str( sizeResponses[ i ] ) )
2496 utilities.assert_equals( expect=main.TRUE,
2497 actual=sizeResults,
2498 onpass="Set sizes are correct",
2499 onfail="Set sizes are incorrect" )
2500
2501 main.step( "Distributed Set add()" )
2502 onosSet.add( addValue )
2503 addResponses = []
2504 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002505 for i in range( main.numCtrls ):
2506 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002507 name="setTestAdd-" + str( i ),
2508 args=[ onosSetName, addValue ] )
2509 threads.append( t )
2510 t.start()
2511 for t in threads:
2512 t.join()
2513 addResponses.append( t.result )
2514
2515 # main.TRUE = successfully changed the set
2516 # main.FALSE = action resulted in no change in set
2517 # main.ERROR - Some error in executing the function
2518 addResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002519 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002520 if addResponses[ i ] == main.TRUE:
2521 # All is well
2522 pass
2523 elif addResponses[ i ] == main.FALSE:
2524 # Already in set, probably fine
2525 pass
2526 elif addResponses[ i ] == main.ERROR:
2527 # Error in execution
2528 addResults = main.FALSE
2529 else:
2530 # unexpected result
2531 addResults = main.FALSE
2532 if addResults != main.TRUE:
2533 main.log.error( "Error executing set add" )
2534
2535 # Check if set is still correct
2536 size = len( onosSet )
2537 getResponses = []
2538 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002539 for i in range( main.numCtrls ):
2540 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002541 name="setTestGet-" + str( i ),
2542 args=[ onosSetName ] )
2543 threads.append( t )
2544 t.start()
2545 for t in threads:
2546 t.join()
2547 getResponses.append( t.result )
2548 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002549 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002550 if isinstance( getResponses[ i ], list):
2551 current = set( getResponses[ i ] )
2552 if len( current ) == len( getResponses[ i ] ):
2553 # no repeats
2554 if onosSet != current:
2555 main.log.error( "ONOS" + str( i + 1 ) +
2556 " has incorrect view" +
2557 " of set " + onosSetName + ":\n" +
2558 str( getResponses[ i ] ) )
2559 main.log.debug( "Expected: " + str( onosSet ) )
2560 main.log.debug( "Actual: " + str( current ) )
2561 getResults = main.FALSE
2562 else:
2563 # error, set is not a set
2564 main.log.error( "ONOS" + str( i + 1 ) +
2565 " has repeat elements in" +
2566 " set " + onosSetName + ":\n" +
2567 str( getResponses[ i ] ) )
2568 getResults = main.FALSE
2569 elif getResponses[ i ] == main.ERROR:
2570 getResults = main.FALSE
2571 sizeResponses = []
2572 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002573 for i in range( main.numCtrls ):
2574 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002575 name="setTestSize-" + str( i ),
2576 args=[ onosSetName ] )
2577 threads.append( t )
2578 t.start()
2579 for t in threads:
2580 t.join()
2581 sizeResponses.append( t.result )
2582 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002583 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002584 if size != sizeResponses[ i ]:
2585 sizeResults = main.FALSE
2586 main.log.error( "ONOS" + str( i + 1 ) +
2587 " expected a size of " + str( size ) +
2588 " for set " + onosSetName +
2589 " but got " + str( sizeResponses[ i ] ) )
2590 addResults = addResults and getResults and sizeResults
2591 utilities.assert_equals( expect=main.TRUE,
2592 actual=addResults,
2593 onpass="Set add correct",
2594 onfail="Set add was incorrect" )
2595
2596 main.step( "Distributed Set addAll()" )
2597 onosSet.update( addAllValue.split() )
2598 addResponses = []
2599 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002600 for i in range( main.numCtrls ):
2601 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002602 name="setTestAddAll-" + str( i ),
2603 args=[ onosSetName, addAllValue ] )
2604 threads.append( t )
2605 t.start()
2606 for t in threads:
2607 t.join()
2608 addResponses.append( t.result )
2609
2610 # main.TRUE = successfully changed the set
2611 # main.FALSE = action resulted in no change in set
2612 # main.ERROR - Some error in executing the function
2613 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002614 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002615 if addResponses[ i ] == main.TRUE:
2616 # All is well
2617 pass
2618 elif addResponses[ i ] == main.FALSE:
2619 # Already in set, probably fine
2620 pass
2621 elif addResponses[ i ] == main.ERROR:
2622 # Error in execution
2623 addAllResults = main.FALSE
2624 else:
2625 # unexpected result
2626 addAllResults = main.FALSE
2627 if addAllResults != main.TRUE:
2628 main.log.error( "Error executing set addAll" )
2629
2630 # Check if set is still correct
2631 size = len( onosSet )
2632 getResponses = []
2633 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002634 for i in range( main.numCtrls ):
2635 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002636 name="setTestGet-" + str( i ),
2637 args=[ onosSetName ] )
2638 threads.append( t )
2639 t.start()
2640 for t in threads:
2641 t.join()
2642 getResponses.append( t.result )
2643 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002644 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002645 if isinstance( getResponses[ i ], list):
2646 current = set( getResponses[ i ] )
2647 if len( current ) == len( getResponses[ i ] ):
2648 # no repeats
2649 if onosSet != current:
2650 main.log.error( "ONOS" + str( i + 1 ) +
2651 " has incorrect view" +
2652 " of set " + onosSetName + ":\n" +
2653 str( getResponses[ i ] ) )
2654 main.log.debug( "Expected: " + str( onosSet ) )
2655 main.log.debug( "Actual: " + str( current ) )
2656 getResults = main.FALSE
2657 else:
2658 # error, set is not a set
2659 main.log.error( "ONOS" + str( i + 1 ) +
2660 " has repeat elements in" +
2661 " set " + onosSetName + ":\n" +
2662 str( getResponses[ i ] ) )
2663 getResults = main.FALSE
2664 elif getResponses[ i ] == main.ERROR:
2665 getResults = main.FALSE
2666 sizeResponses = []
2667 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002668 for i in range( main.numCtrls ):
2669 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002670 name="setTestSize-" + str( i ),
2671 args=[ onosSetName ] )
2672 threads.append( t )
2673 t.start()
2674 for t in threads:
2675 t.join()
2676 sizeResponses.append( t.result )
2677 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002678 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002679 if size != sizeResponses[ i ]:
2680 sizeResults = main.FALSE
2681 main.log.error( "ONOS" + str( i + 1 ) +
2682 " expected a size of " + str( size ) +
2683 " for set " + onosSetName +
2684 " but got " + str( sizeResponses[ i ] ) )
2685 addAllResults = addAllResults and getResults and sizeResults
2686 utilities.assert_equals( expect=main.TRUE,
2687 actual=addAllResults,
2688 onpass="Set addAll correct",
2689 onfail="Set addAll was incorrect" )
2690
2691 main.step( "Distributed Set contains()" )
2692 containsResponses = []
2693 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002694 for i in range( main.numCtrls ):
2695 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002696 name="setContains-" + str( i ),
2697 args=[ onosSetName ],
2698 kwargs={ "values": addValue } )
2699 threads.append( t )
2700 t.start()
2701 for t in threads:
2702 t.join()
2703 # NOTE: This is the tuple
2704 containsResponses.append( t.result )
2705
2706 containsResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002707 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002708 if containsResponses[ i ] == main.ERROR:
2709 containsResults = main.FALSE
2710 else:
2711 containsResults = containsResults and\
2712 containsResponses[ i ][ 1 ]
2713 utilities.assert_equals( expect=main.TRUE,
2714 actual=containsResults,
2715 onpass="Set contains is functional",
2716 onfail="Set contains failed" )
2717
2718 main.step( "Distributed Set containsAll()" )
2719 containsAllResponses = []
2720 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002721 for i in range( main.numCtrls ):
2722 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002723 name="setContainsAll-" + str( i ),
2724 args=[ onosSetName ],
2725 kwargs={ "values": addAllValue } )
2726 threads.append( t )
2727 t.start()
2728 for t in threads:
2729 t.join()
2730 # NOTE: This is the tuple
2731 containsAllResponses.append( t.result )
2732
2733 containsAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002734 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002735 if containsResponses[ i ] == main.ERROR:
2736 containsResults = main.FALSE
2737 else:
2738 containsResults = containsResults and\
2739 containsResponses[ i ][ 1 ]
2740 utilities.assert_equals( expect=main.TRUE,
2741 actual=containsAllResults,
2742 onpass="Set containsAll is functional",
2743 onfail="Set containsAll failed" )
2744
2745 main.step( "Distributed Set remove()" )
2746 onosSet.remove( addValue )
2747 removeResponses = []
2748 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002749 for i in range( main.numCtrls ):
2750 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07002751 name="setTestRemove-" + str( i ),
2752 args=[ onosSetName, addValue ] )
2753 threads.append( t )
2754 t.start()
2755 for t in threads:
2756 t.join()
2757 removeResponses.append( t.result )
2758
2759 # main.TRUE = successfully changed the set
2760 # main.FALSE = action resulted in no change in set
2761 # main.ERROR - Some error in executing the function
2762 removeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002763 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002764 if removeResponses[ i ] == main.TRUE:
2765 # All is well
2766 pass
2767 elif removeResponses[ i ] == main.FALSE:
2768 # not in set, probably fine
2769 pass
2770 elif removeResponses[ i ] == main.ERROR:
2771 # Error in execution
2772 removeResults = main.FALSE
2773 else:
2774 # unexpected result
2775 removeResults = main.FALSE
2776 if removeResults != main.TRUE:
2777 main.log.error( "Error executing set remove" )
2778
2779 # Check if set is still correct
2780 size = len( onosSet )
2781 getResponses = []
2782 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002783 for i in range( main.numCtrls ):
2784 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002785 name="setTestGet-" + str( i ),
2786 args=[ onosSetName ] )
2787 threads.append( t )
2788 t.start()
2789 for t in threads:
2790 t.join()
2791 getResponses.append( t.result )
2792 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002793 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002794 if isinstance( getResponses[ i ], list):
2795 current = set( getResponses[ i ] )
2796 if len( current ) == len( getResponses[ i ] ):
2797 # no repeats
2798 if onosSet != current:
2799 main.log.error( "ONOS" + str( i + 1 ) +
2800 " has incorrect view" +
2801 " of set " + onosSetName + ":\n" +
2802 str( getResponses[ i ] ) )
2803 main.log.debug( "Expected: " + str( onosSet ) )
2804 main.log.debug( "Actual: " + str( current ) )
2805 getResults = main.FALSE
2806 else:
2807 # error, set is not a set
2808 main.log.error( "ONOS" + str( i + 1 ) +
2809 " has repeat elements in" +
2810 " set " + onosSetName + ":\n" +
2811 str( getResponses[ i ] ) )
2812 getResults = main.FALSE
2813 elif getResponses[ i ] == main.ERROR:
2814 getResults = main.FALSE
2815 sizeResponses = []
2816 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002817 for i in range( main.numCtrls ):
2818 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002819 name="setTestSize-" + str( i ),
2820 args=[ onosSetName ] )
2821 threads.append( t )
2822 t.start()
2823 for t in threads:
2824 t.join()
2825 sizeResponses.append( t.result )
2826 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002827 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002828 if size != sizeResponses[ i ]:
2829 sizeResults = main.FALSE
2830 main.log.error( "ONOS" + str( i + 1 ) +
2831 " expected a size of " + str( size ) +
2832 " for set " + onosSetName +
2833 " but got " + str( sizeResponses[ i ] ) )
2834 removeResults = removeResults and getResults and sizeResults
2835 utilities.assert_equals( expect=main.TRUE,
2836 actual=removeResults,
2837 onpass="Set remove correct",
2838 onfail="Set remove was incorrect" )
2839
2840 main.step( "Distributed Set removeAll()" )
2841 onosSet.difference_update( addAllValue.split() )
2842 removeAllResponses = []
2843 threads = []
2844 try:
Jon Halle1a3b752015-07-22 13:02:46 -07002845 for i in range( main.numCtrls ):
2846 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07002847 name="setTestRemoveAll-" + str( i ),
2848 args=[ onosSetName, addAllValue ] )
2849 threads.append( t )
2850 t.start()
2851 for t in threads:
2852 t.join()
2853 removeAllResponses.append( t.result )
2854 except Exception, e:
2855 main.log.exception(e)
2856
2857 # main.TRUE = successfully changed the set
2858 # main.FALSE = action resulted in no change in set
2859 # main.ERROR - Some error in executing the function
2860 removeAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002861 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002862 if removeAllResponses[ i ] == main.TRUE:
2863 # All is well
2864 pass
2865 elif removeAllResponses[ i ] == main.FALSE:
2866 # not in set, probably fine
2867 pass
2868 elif removeAllResponses[ i ] == main.ERROR:
2869 # Error in execution
2870 removeAllResults = main.FALSE
2871 else:
2872 # unexpected result
2873 removeAllResults = main.FALSE
2874 if removeAllResults != main.TRUE:
2875 main.log.error( "Error executing set removeAll" )
2876
2877 # Check if set is still correct
2878 size = len( onosSet )
2879 getResponses = []
2880 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002881 for i in range( main.numCtrls ):
2882 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002883 name="setTestGet-" + str( i ),
2884 args=[ onosSetName ] )
2885 threads.append( t )
2886 t.start()
2887 for t in threads:
2888 t.join()
2889 getResponses.append( t.result )
2890 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002891 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002892 if isinstance( getResponses[ i ], list):
2893 current = set( getResponses[ i ] )
2894 if len( current ) == len( getResponses[ i ] ):
2895 # no repeats
2896 if onosSet != current:
2897 main.log.error( "ONOS" + str( i + 1 ) +
2898 " has incorrect view" +
2899 " of set " + onosSetName + ":\n" +
2900 str( getResponses[ i ] ) )
2901 main.log.debug( "Expected: " + str( onosSet ) )
2902 main.log.debug( "Actual: " + str( current ) )
2903 getResults = main.FALSE
2904 else:
2905 # error, set is not a set
2906 main.log.error( "ONOS" + str( i + 1 ) +
2907 " has repeat elements in" +
2908 " set " + onosSetName + ":\n" +
2909 str( getResponses[ i ] ) )
2910 getResults = main.FALSE
2911 elif getResponses[ i ] == main.ERROR:
2912 getResults = main.FALSE
2913 sizeResponses = []
2914 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002915 for i in range( main.numCtrls ):
2916 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002917 name="setTestSize-" + str( i ),
2918 args=[ onosSetName ] )
2919 threads.append( t )
2920 t.start()
2921 for t in threads:
2922 t.join()
2923 sizeResponses.append( t.result )
2924 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002925 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002926 if size != sizeResponses[ i ]:
2927 sizeResults = main.FALSE
2928 main.log.error( "ONOS" + str( i + 1 ) +
2929 " expected a size of " + str( size ) +
2930 " for set " + onosSetName +
2931 " but got " + str( sizeResponses[ i ] ) )
2932 removeAllResults = removeAllResults and getResults and sizeResults
2933 utilities.assert_equals( expect=main.TRUE,
2934 actual=removeAllResults,
2935 onpass="Set removeAll correct",
2936 onfail="Set removeAll was incorrect" )
2937
2938 main.step( "Distributed Set addAll()" )
2939 onosSet.update( addAllValue.split() )
2940 addResponses = []
2941 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002942 for i in range( main.numCtrls ):
2943 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002944 name="setTestAddAll-" + str( i ),
2945 args=[ onosSetName, addAllValue ] )
2946 threads.append( t )
2947 t.start()
2948 for t in threads:
2949 t.join()
2950 addResponses.append( t.result )
2951
2952 # main.TRUE = successfully changed the set
2953 # main.FALSE = action resulted in no change in set
2954 # main.ERROR - Some error in executing the function
2955 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002956 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002957 if addResponses[ i ] == main.TRUE:
2958 # All is well
2959 pass
2960 elif addResponses[ i ] == main.FALSE:
2961 # Already in set, probably fine
2962 pass
2963 elif addResponses[ i ] == main.ERROR:
2964 # Error in execution
2965 addAllResults = main.FALSE
2966 else:
2967 # unexpected result
2968 addAllResults = main.FALSE
2969 if addAllResults != main.TRUE:
2970 main.log.error( "Error executing set addAll" )
2971
2972 # Check if set is still correct
2973 size = len( onosSet )
2974 getResponses = []
2975 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002976 for i in range( main.numCtrls ):
2977 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002978 name="setTestGet-" + str( i ),
2979 args=[ onosSetName ] )
2980 threads.append( t )
2981 t.start()
2982 for t in threads:
2983 t.join()
2984 getResponses.append( t.result )
2985 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002986 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002987 if isinstance( getResponses[ i ], list):
2988 current = set( getResponses[ i ] )
2989 if len( current ) == len( getResponses[ i ] ):
2990 # no repeats
2991 if onosSet != current:
2992 main.log.error( "ONOS" + str( i + 1 ) +
2993 " has incorrect view" +
2994 " of set " + onosSetName + ":\n" +
2995 str( getResponses[ i ] ) )
2996 main.log.debug( "Expected: " + str( onosSet ) )
2997 main.log.debug( "Actual: " + str( current ) )
2998 getResults = main.FALSE
2999 else:
3000 # error, set is not a set
3001 main.log.error( "ONOS" + str( i + 1 ) +
3002 " has repeat elements in" +
3003 " set " + onosSetName + ":\n" +
3004 str( getResponses[ i ] ) )
3005 getResults = main.FALSE
3006 elif getResponses[ i ] == main.ERROR:
3007 getResults = main.FALSE
3008 sizeResponses = []
3009 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003010 for i in range( main.numCtrls ):
3011 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003012 name="setTestSize-" + str( i ),
3013 args=[ onosSetName ] )
3014 threads.append( t )
3015 t.start()
3016 for t in threads:
3017 t.join()
3018 sizeResponses.append( t.result )
3019 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003020 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003021 if size != sizeResponses[ i ]:
3022 sizeResults = main.FALSE
3023 main.log.error( "ONOS" + str( i + 1 ) +
3024 " expected a size of " + str( size ) +
3025 " for set " + onosSetName +
3026 " but got " + str( sizeResponses[ i ] ) )
3027 addAllResults = addAllResults and getResults and sizeResults
3028 utilities.assert_equals( expect=main.TRUE,
3029 actual=addAllResults,
3030 onpass="Set addAll correct",
3031 onfail="Set addAll was incorrect" )
3032
3033 main.step( "Distributed Set clear()" )
3034 onosSet.clear()
3035 clearResponses = []
3036 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003037 for i in range( main.numCtrls ):
3038 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07003039 name="setTestClear-" + str( i ),
3040 args=[ onosSetName, " "], # Values doesn't matter
3041 kwargs={ "clear": True } )
3042 threads.append( t )
3043 t.start()
3044 for t in threads:
3045 t.join()
3046 clearResponses.append( t.result )
3047
3048 # main.TRUE = successfully changed the set
3049 # main.FALSE = action resulted in no change in set
3050 # main.ERROR - Some error in executing the function
3051 clearResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003052 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003053 if clearResponses[ i ] == main.TRUE:
3054 # All is well
3055 pass
3056 elif clearResponses[ i ] == main.FALSE:
3057 # Nothing set, probably fine
3058 pass
3059 elif clearResponses[ i ] == main.ERROR:
3060 # Error in execution
3061 clearResults = main.FALSE
3062 else:
3063 # unexpected result
3064 clearResults = main.FALSE
3065 if clearResults != main.TRUE:
3066 main.log.error( "Error executing set clear" )
3067
3068 # Check if set is still correct
3069 size = len( onosSet )
3070 getResponses = []
3071 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003072 for i in range( main.numCtrls ):
3073 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003074 name="setTestGet-" + str( i ),
3075 args=[ onosSetName ] )
3076 threads.append( t )
3077 t.start()
3078 for t in threads:
3079 t.join()
3080 getResponses.append( t.result )
3081 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003082 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003083 if isinstance( getResponses[ i ], list):
3084 current = set( getResponses[ i ] )
3085 if len( current ) == len( getResponses[ i ] ):
3086 # no repeats
3087 if onosSet != current:
3088 main.log.error( "ONOS" + str( i + 1 ) +
3089 " has incorrect view" +
3090 " of set " + onosSetName + ":\n" +
3091 str( getResponses[ i ] ) )
3092 main.log.debug( "Expected: " + str( onosSet ) )
3093 main.log.debug( "Actual: " + str( current ) )
3094 getResults = main.FALSE
3095 else:
3096 # error, set is not a set
3097 main.log.error( "ONOS" + str( i + 1 ) +
3098 " has repeat elements in" +
3099 " set " + onosSetName + ":\n" +
3100 str( getResponses[ i ] ) )
3101 getResults = main.FALSE
3102 elif getResponses[ i ] == main.ERROR:
3103 getResults = main.FALSE
3104 sizeResponses = []
3105 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003106 for i in range( main.numCtrls ):
3107 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003108 name="setTestSize-" + str( i ),
3109 args=[ onosSetName ] )
3110 threads.append( t )
3111 t.start()
3112 for t in threads:
3113 t.join()
3114 sizeResponses.append( t.result )
3115 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003116 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003117 if size != sizeResponses[ i ]:
3118 sizeResults = main.FALSE
3119 main.log.error( "ONOS" + str( i + 1 ) +
3120 " expected a size of " + str( size ) +
3121 " for set " + onosSetName +
3122 " but got " + str( sizeResponses[ i ] ) )
3123 clearResults = clearResults and getResults and sizeResults
3124 utilities.assert_equals( expect=main.TRUE,
3125 actual=clearResults,
3126 onpass="Set clear correct",
3127 onfail="Set clear was incorrect" )
3128
3129 main.step( "Distributed Set addAll()" )
3130 onosSet.update( addAllValue.split() )
3131 addResponses = []
3132 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003133 for i in range( main.numCtrls ):
3134 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07003135 name="setTestAddAll-" + str( i ),
3136 args=[ onosSetName, addAllValue ] )
3137 threads.append( t )
3138 t.start()
3139 for t in threads:
3140 t.join()
3141 addResponses.append( t.result )
3142
3143 # main.TRUE = successfully changed the set
3144 # main.FALSE = action resulted in no change in set
3145 # main.ERROR - Some error in executing the function
3146 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003147 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003148 if addResponses[ i ] == main.TRUE:
3149 # All is well
3150 pass
3151 elif addResponses[ i ] == main.FALSE:
3152 # Already in set, probably fine
3153 pass
3154 elif addResponses[ i ] == main.ERROR:
3155 # Error in execution
3156 addAllResults = main.FALSE
3157 else:
3158 # unexpected result
3159 addAllResults = main.FALSE
3160 if addAllResults != main.TRUE:
3161 main.log.error( "Error executing set addAll" )
3162
3163 # Check if set is still correct
3164 size = len( onosSet )
3165 getResponses = []
3166 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003167 for i in range( main.numCtrls ):
3168 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003169 name="setTestGet-" + str( i ),
3170 args=[ onosSetName ] )
3171 threads.append( t )
3172 t.start()
3173 for t in threads:
3174 t.join()
3175 getResponses.append( t.result )
3176 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003177 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003178 if isinstance( getResponses[ i ], list):
3179 current = set( getResponses[ i ] )
3180 if len( current ) == len( getResponses[ i ] ):
3181 # no repeats
3182 if onosSet != current:
3183 main.log.error( "ONOS" + str( i + 1 ) +
3184 " has incorrect view" +
3185 " of set " + onosSetName + ":\n" +
3186 str( getResponses[ i ] ) )
3187 main.log.debug( "Expected: " + str( onosSet ) )
3188 main.log.debug( "Actual: " + str( current ) )
3189 getResults = main.FALSE
3190 else:
3191 # error, set is not a set
3192 main.log.error( "ONOS" + str( i + 1 ) +
3193 " has repeat elements in" +
3194 " set " + onosSetName + ":\n" +
3195 str( getResponses[ i ] ) )
3196 getResults = main.FALSE
3197 elif getResponses[ i ] == main.ERROR:
3198 getResults = main.FALSE
3199 sizeResponses = []
3200 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003201 for i in range( main.numCtrls ):
3202 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003203 name="setTestSize-" + str( i ),
3204 args=[ onosSetName ] )
3205 threads.append( t )
3206 t.start()
3207 for t in threads:
3208 t.join()
3209 sizeResponses.append( t.result )
3210 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003211 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003212 if size != sizeResponses[ i ]:
3213 sizeResults = main.FALSE
3214 main.log.error( "ONOS" + str( i + 1 ) +
3215 " expected a size of " + str( size ) +
3216 " for set " + onosSetName +
3217 " but got " + str( sizeResponses[ i ] ) )
3218 addAllResults = addAllResults and getResults and sizeResults
3219 utilities.assert_equals( expect=main.TRUE,
3220 actual=addAllResults,
3221 onpass="Set addAll correct",
3222 onfail="Set addAll was incorrect" )
3223
3224 main.step( "Distributed Set retain()" )
3225 onosSet.intersection_update( retainValue.split() )
3226 retainResponses = []
3227 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003228 for i in range( main.numCtrls ):
3229 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07003230 name="setTestRetain-" + str( i ),
3231 args=[ onosSetName, retainValue ],
3232 kwargs={ "retain": True } )
3233 threads.append( t )
3234 t.start()
3235 for t in threads:
3236 t.join()
3237 retainResponses.append( t.result )
3238
3239 # main.TRUE = successfully changed the set
3240 # main.FALSE = action resulted in no change in set
3241 # main.ERROR - Some error in executing the function
3242 retainResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003243 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003244 if retainResponses[ i ] == main.TRUE:
3245 # All is well
3246 pass
3247 elif retainResponses[ i ] == main.FALSE:
3248 # Already in set, probably fine
3249 pass
3250 elif retainResponses[ i ] == main.ERROR:
3251 # Error in execution
3252 retainResults = main.FALSE
3253 else:
3254 # unexpected result
3255 retainResults = main.FALSE
3256 if retainResults != main.TRUE:
3257 main.log.error( "Error executing set retain" )
3258
3259 # Check if set is still correct
3260 size = len( onosSet )
3261 getResponses = []
3262 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003263 for i in range( main.numCtrls ):
3264 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003265 name="setTestGet-" + str( i ),
3266 args=[ onosSetName ] )
3267 threads.append( t )
3268 t.start()
3269 for t in threads:
3270 t.join()
3271 getResponses.append( t.result )
3272 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003273 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003274 if isinstance( getResponses[ i ], list):
3275 current = set( getResponses[ i ] )
3276 if len( current ) == len( getResponses[ i ] ):
3277 # no repeats
3278 if onosSet != current:
3279 main.log.error( "ONOS" + str( i + 1 ) +
3280 " has incorrect view" +
3281 " of set " + onosSetName + ":\n" +
3282 str( getResponses[ i ] ) )
3283 main.log.debug( "Expected: " + str( onosSet ) )
3284 main.log.debug( "Actual: " + str( current ) )
3285 getResults = main.FALSE
3286 else:
3287 # error, set is not a set
3288 main.log.error( "ONOS" + str( i + 1 ) +
3289 " has repeat elements in" +
3290 " set " + onosSetName + ":\n" +
3291 str( getResponses[ i ] ) )
3292 getResults = main.FALSE
3293 elif getResponses[ i ] == main.ERROR:
3294 getResults = main.FALSE
3295 sizeResponses = []
3296 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003297 for i in range( main.numCtrls ):
3298 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003299 name="setTestSize-" + str( i ),
3300 args=[ onosSetName ] )
3301 threads.append( t )
3302 t.start()
3303 for t in threads:
3304 t.join()
3305 sizeResponses.append( t.result )
3306 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003307 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003308 if size != sizeResponses[ i ]:
3309 sizeResults = main.FALSE
3310 main.log.error( "ONOS" + str( i + 1 ) +
3311 " expected a size of " +
3312 str( size ) + " for set " + onosSetName +
3313 " but got " + str( sizeResponses[ i ] ) )
3314 retainResults = retainResults and getResults and sizeResults
3315 utilities.assert_equals( expect=main.TRUE,
3316 actual=retainResults,
3317 onpass="Set retain correct",
3318 onfail="Set retain was incorrect" )
3319
Jon Hall2a5002c2015-08-21 16:49:11 -07003320 # Transactional maps
3321 main.step( "Partitioned Transactional maps put" )
3322 tMapValue = "Testing"
3323 numKeys = 100
3324 putResult = True
3325 putResponses = main.CLIs[ 0 ].transactionalMapPut( numKeys, tMapValue )
3326 if len( putResponses ) == 100:
3327 for i in putResponses:
3328 if putResponses[ i ][ 'value' ] != tMapValue:
3329 putResult = False
3330 else:
3331 putResult = False
3332 if not putResult:
3333 main.log.debug( "Put response values: " + str( putResponses ) )
3334 utilities.assert_equals( expect=True,
3335 actual=putResult,
3336 onpass="Partitioned Transactional Map put successful",
3337 onfail="Partitioned Transactional Map put values are incorrect" )
3338
3339 main.step( "Partitioned Transactional maps get" )
3340 getCheck = True
3341 for n in range( 1, numKeys + 1 ):
3342 getResponses = []
3343 threads = []
3344 valueCheck = True
3345 for i in range( main.numCtrls ):
3346 t = main.Thread( target=main.CLIs[i].transactionalMapGet,
3347 name="TMap-get-" + str( i ),
3348 args=[ "Key" + str ( n ) ] )
3349 threads.append( t )
3350 t.start()
3351 for t in threads:
3352 t.join()
3353 getResponses.append( t.result )
3354 for node in getResponses:
3355 if node != tMapValue:
3356 valueCheck = False
3357 if not valueCheck:
3358 main.log.warn( "Values for key 'Key" + str( n ) + "' do not match:" )
3359 main.log.warn( getResponses )
3360 getCheck = getCheck and valueCheck
3361 utilities.assert_equals( expect=True,
3362 actual=getCheck,
3363 onpass="Partitioned Transactional Map get values were correct",
3364 onfail="Partitioned Transactional Map values incorrect" )
3365
3366 main.step( "In-memory Transactional maps put" )
3367 tMapValue = "Testing"
3368 numKeys = 100
3369 putResult = True
3370 putResponses = main.CLIs[ 0 ].transactionalMapPut( numKeys, tMapValue, inMemory=True )
3371 if len( putResponses ) == 100:
3372 for i in putResponses:
3373 if putResponses[ i ][ 'value' ] != tMapValue:
3374 putResult = False
3375 else:
3376 putResult = False
3377 if not putResult:
3378 main.log.debug( "Put response values: " + str( putResponses ) )
3379 utilities.assert_equals( expect=True,
3380 actual=putResult,
3381 onpass="In-Memory Transactional Map put successful",
3382 onfail="In-Memory Transactional Map put values are incorrect" )
3383
3384 main.step( "In-Memory Transactional maps get" )
3385 getCheck = True
3386 for n in range( 1, numKeys + 1 ):
3387 getResponses = []
3388 threads = []
3389 valueCheck = True
3390 for i in range( main.numCtrls ):
3391 t = main.Thread( target=main.CLIs[i].transactionalMapGet,
3392 name="TMap-get-" + str( i ),
3393 args=[ "Key" + str ( n ) ],
3394 kwargs={ "inMemory": True } )
3395 threads.append( t )
3396 t.start()
3397 for t in threads:
3398 t.join()
3399 getResponses.append( t.result )
3400 for node in getResponses:
3401 if node != tMapValue:
3402 valueCheck = False
3403 if not valueCheck:
3404 main.log.warn( "Values for key 'Key" + str( n ) + "' do not match:" )
3405 main.log.warn( getResponses )
3406 getCheck = getCheck and valueCheck
3407 utilities.assert_equals( expect=True,
3408 actual=getCheck,
3409 onpass="In-Memory Transactional Map get values were correct",
3410 onfail="In-Memory Transactional Map values incorrect" )