blob: 70bd0f24745d8c69f3966db00d73b85232bd34e9 [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"
1885 leaderResult = main.TRUE
1886 description = "Check that Leadership Election is still functional"
1887 main.case( description )
1888 main.step( "Find current leader and withdraw" )
1889 leader = main.ONOScli1.electionTestLeader()
1890 # do some sanity checking on leader before using it
1891 withdrawResult = main.FALSE
Jon Halle1a3b752015-07-22 13:02:46 -07001892 if leader == main.nodes[0].ip_address:
Jon Hall85794ff2015-07-08 14:12:30 -07001893 oldLeader = getattr( main, "ONOScli1" )
1894 elif leader is None or leader == main.FALSE:
1895 main.log.error(
1896 "Leader for the election app should be an ONOS node," +
1897 "instead got '" + str( leader ) + "'" )
1898 leaderResult = main.FALSE
1899 oldLeader = None
1900 else:
1901 main.log.error( "Leader election --- why am I HERE?!?")
1902 leaderResult = main.FALSE
1903 oldLeader = None
1904 if oldLeader:
1905 withdrawResult = oldLeader.electionTestWithdraw()
1906 utilities.assert_equals(
1907 expect=main.TRUE,
1908 actual=withdrawResult,
1909 onpass="Node was withdrawn from election",
1910 onfail="Node was not withdrawn from election" )
1911
1912 main.step( "Make sure new leader is elected" )
1913 leaderN = main.ONOScli1.electionTestLeader()
1914 if leaderN == leader:
1915 main.log.error( "ONOS still sees " + str( leaderN ) +
1916 " as leader after they withdrew" )
1917 leaderResult = main.FALSE
1918 elif leaderN == main.FALSE:
1919 # error in response
1920 # TODO: add check for "Command not found:" in the driver, this
1921 # means the app isn't loaded
1922 main.log.error( "Something is wrong with electionTestLeader " +
1923 "function, check the error logs" )
1924 leaderResult = main.FALSE
1925 elif leaderN is None:
1926 main.log.info(
1927 "There is no leader after the app withdrew from election" )
1928 leaderResult = main.TRUE
1929 utilities.assert_equals(
1930 expect=main.TRUE,
1931 actual=leaderResult,
1932 onpass="Leadership election passed",
1933 onfail="Something went wrong with Leadership election" )
1934
1935 main.step( "Run for election on old leader( just so everyone " +
1936 "is in the hat )" )
1937 if oldLeader:
1938 runResult = oldLeader.electionTestRun()
1939 else:
1940 runResult = main.FALSE
1941 utilities.assert_equals(
1942 expect=main.TRUE,
1943 actual=runResult,
1944 onpass="App re-ran for election",
1945 onfail="App failed to run for election" )
1946
1947 main.step( "Node became leader when it ran for election" )
1948 afterRun = main.ONOScli1.electionTestLeader()
1949 # verify leader is ONOS1
Jon Halle1a3b752015-07-22 13:02:46 -07001950 if afterRun == main.nodes[0].ip_address:
Jon Hall85794ff2015-07-08 14:12:30 -07001951 afterResult = main.TRUE
1952 else:
1953 afterResult = main.FALSE
1954
1955 utilities.assert_equals(
1956 expect=main.TRUE,
1957 actual=afterResult,
1958 onpass="Old leader successfully re-ran for election",
1959 onfail="Something went wrong with Leadership election after " +
1960 "the old leader re-ran for election" )
1961
1962 def CASE16( self, main ):
1963 """
1964 Install Distributed Primitives app
1965 """
Jon Halle1a3b752015-07-22 13:02:46 -07001966 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001967 assert main, "main not defined"
1968 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -07001969 assert main.CLIs, "main.CLIs not defined"
1970 assert main.nodes, "main.nodes not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07001971
1972 # Variables for the distributed primitives tests
1973 global pCounterName
1974 global iCounterName
1975 global pCounterValue
1976 global iCounterValue
1977 global onosSet
1978 global onosSetName
1979 pCounterName = "TestON-Partitions"
1980 iCounterName = "TestON-inMemory"
1981 pCounterValue = 0
1982 iCounterValue = 0
1983 onosSet = set([])
1984 onosSetName = "TestON-set"
1985
1986 description = "Install Primitives app"
1987 main.case( description )
1988 main.step( "Install Primitives app" )
1989 appName = "org.onosproject.distributedprimitives"
Jon Halle1a3b752015-07-22 13:02:46 -07001990 appResults = main.CLIs[0].activateApp( appName )
Jon Hall85794ff2015-07-08 14:12:30 -07001991 utilities.assert_equals( expect=main.TRUE,
1992 actual=appResults,
1993 onpass="Primitives app activated",
1994 onfail="Primitives app not activated" )
1995
1996 def CASE17( self, main ):
1997 """
1998 Check for basic functionality with distributed primitives
1999 """
Jon Hall85794ff2015-07-08 14:12:30 -07002000 # Make sure variables are defined/set
Jon Halle1a3b752015-07-22 13:02:46 -07002001 assert main.numCtrls, "main.numCtrls not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07002002 assert main, "main not defined"
2003 assert utilities.assert_equals, "utilities.assert_equals not defined"
Jon Halle1a3b752015-07-22 13:02:46 -07002004 assert main.CLIs, "main.CLIs not defined"
2005 assert main.nodes, "main.nodes not defined"
Jon Hall85794ff2015-07-08 14:12:30 -07002006 assert pCounterName, "pCounterName not defined"
2007 assert iCounterName, "iCounterName not defined"
2008 assert onosSetName, "onosSetName not defined"
2009 # NOTE: assert fails if value is 0/None/Empty/False
2010 try:
2011 pCounterValue
2012 except NameError:
2013 main.log.error( "pCounterValue not defined, setting to 0" )
2014 pCounterValue = 0
2015 try:
2016 iCounterValue
2017 except NameError:
2018 main.log.error( "iCounterValue not defined, setting to 0" )
2019 iCounterValue = 0
2020 try:
2021 onosSet
2022 except NameError:
2023 main.log.error( "onosSet not defined, setting to empty Set" )
2024 onosSet = set([])
2025 # Variables for the distributed primitives tests. These are local only
2026 addValue = "a"
2027 addAllValue = "a b c d e f"
2028 retainValue = "c d e f"
2029
2030 description = "Check for basic functionality with distributed " +\
2031 "primitives"
2032 main.case( description )
Jon Halle1a3b752015-07-22 13:02:46 -07002033 main.caseExplanation = "Test the methods of the distributed " +\
2034 "primitives (counters and sets) throught the cli"
Jon Hall85794ff2015-07-08 14:12:30 -07002035 # DISTRIBUTED ATOMIC COUNTERS
Jon Halle1a3b752015-07-22 13:02:46 -07002036 # Partitioned counters
2037 main.step( "Increment then get a default counter on each node" )
Jon Hall85794ff2015-07-08 14:12:30 -07002038 pCounters = []
2039 threads = []
2040 addedPValues = []
Jon Halle1a3b752015-07-22 13:02:46 -07002041 for i in range( main.numCtrls ):
2042 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2043 name="counterAddAndGet-" + str( i ),
Jon Hall85794ff2015-07-08 14:12:30 -07002044 args=[ pCounterName ] )
2045 pCounterValue += 1
2046 addedPValues.append( pCounterValue )
2047 threads.append( t )
2048 t.start()
2049
2050 for t in threads:
2051 t.join()
2052 pCounters.append( t.result )
2053 # Check that counter incremented numController times
2054 pCounterResults = True
2055 for i in addedPValues:
2056 tmpResult = i in pCounters
2057 pCounterResults = pCounterResults and tmpResult
2058 if not tmpResult:
2059 main.log.error( str( i ) + " is not in partitioned "
2060 "counter incremented results" )
2061 utilities.assert_equals( expect=True,
2062 actual=pCounterResults,
2063 onpass="Default counter incremented",
2064 onfail="Error incrementing default" +
2065 " counter" )
2066
Jon Halle1a3b752015-07-22 13:02:46 -07002067 main.step( "Get then Increment a default counter on each node" )
2068 pCounters = []
2069 threads = []
2070 addedPValues = []
2071 for i in range( main.numCtrls ):
2072 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2073 name="counterGetAndAdd-" + str( i ),
2074 args=[ pCounterName ] )
2075 addedPValues.append( pCounterValue )
2076 pCounterValue += 1
2077 threads.append( t )
2078 t.start()
2079
2080 for t in threads:
2081 t.join()
2082 pCounters.append( t.result )
2083 # Check that counter incremented numController times
2084 pCounterResults = True
2085 for i in addedPValues:
2086 tmpResult = i in pCounters
2087 pCounterResults = pCounterResults and tmpResult
2088 if not tmpResult:
2089 main.log.error( str( i ) + " is not in partitioned "
2090 "counter incremented results" )
2091 utilities.assert_equals( expect=True,
2092 actual=pCounterResults,
2093 onpass="Default counter incremented",
2094 onfail="Error incrementing default" +
2095 " counter" )
2096
2097 main.step( "Counters we added have the correct values" )
2098 incrementCheck = main.Counters.counterCheck( pCounterName, pCounterValue )
2099 utilities.assert_equals( expect=main.TRUE,
2100 actual=incrementCheck,
2101 onpass="Added counters are correct",
2102 onfail="Added counters are incorrect" )
2103
2104 main.step( "Add -8 to then get a default counter on each node" )
2105 pCounters = []
2106 threads = []
2107 addedPValues = []
2108 for i in range( main.numCtrls ):
2109 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2110 name="counterIncrement-" + str( i ),
2111 args=[ pCounterName ],
2112 kwargs={ "delta": -8 } )
2113 pCounterValue += -8
2114 addedPValues.append( pCounterValue )
2115 threads.append( t )
2116 t.start()
2117
2118 for t in threads:
2119 t.join()
2120 pCounters.append( t.result )
2121 # Check that counter incremented numController times
2122 pCounterResults = True
2123 for i in addedPValues:
2124 tmpResult = i in pCounters
2125 pCounterResults = pCounterResults and tmpResult
2126 if not tmpResult:
2127 main.log.error( str( i ) + " is not in partitioned "
2128 "counter incremented results" )
2129 utilities.assert_equals( expect=True,
2130 actual=pCounterResults,
2131 onpass="Default counter incremented",
2132 onfail="Error incrementing default" +
2133 " counter" )
2134
2135 main.step( "Add 5 to then get a default counter on each node" )
2136 pCounters = []
2137 threads = []
2138 addedPValues = []
2139 for i in range( main.numCtrls ):
2140 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2141 name="counterIncrement-" + str( i ),
2142 args=[ pCounterName ],
2143 kwargs={ "delta": 5 } )
2144 pCounterValue += 5
2145 addedPValues.append( pCounterValue )
2146 threads.append( t )
2147 t.start()
2148
2149 for t in threads:
2150 t.join()
2151 pCounters.append( t.result )
2152 # Check that counter incremented numController times
2153 pCounterResults = True
2154 for i in addedPValues:
2155 tmpResult = i in pCounters
2156 pCounterResults = pCounterResults and tmpResult
2157 if not tmpResult:
2158 main.log.error( str( i ) + " is not in partitioned "
2159 "counter incremented results" )
2160 utilities.assert_equals( expect=True,
2161 actual=pCounterResults,
2162 onpass="Default counter incremented",
2163 onfail="Error incrementing default" +
2164 " counter" )
2165
2166 main.step( "Get then add 5 to a default counter on each node" )
2167 pCounters = []
2168 threads = []
2169 addedPValues = []
2170 for i in range( main.numCtrls ):
2171 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2172 name="counterIncrement-" + str( i ),
2173 args=[ pCounterName ],
2174 kwargs={ "delta": 5 } )
2175 addedPValues.append( pCounterValue )
2176 pCounterValue += 5
2177 threads.append( t )
2178 t.start()
2179
2180 for t in threads:
2181 t.join()
2182 pCounters.append( t.result )
2183 # Check that counter incremented numController times
2184 pCounterResults = True
2185 for i in addedPValues:
2186 tmpResult = i in pCounters
2187 pCounterResults = pCounterResults and tmpResult
2188 if not tmpResult:
2189 main.log.error( str( i ) + " is not in partitioned "
2190 "counter incremented results" )
2191 utilities.assert_equals( expect=True,
2192 actual=pCounterResults,
2193 onpass="Default counter incremented",
2194 onfail="Error incrementing default" +
2195 " counter" )
2196
2197 main.step( "Counters we added have the correct values" )
2198 incrementCheck = main.Counters.counterCheck( pCounterName, pCounterValue )
2199 utilities.assert_equals( expect=main.TRUE,
2200 actual=incrementCheck,
2201 onpass="Added counters are correct",
2202 onfail="Added counters are incorrect" )
2203
2204 # In-Memory counters
2205 main.step( "Increment and get an in-memory counter on each node" )
Jon Hall85794ff2015-07-08 14:12:30 -07002206 iCounters = []
2207 addedIValues = []
2208 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002209 for i in range( main.numCtrls ):
2210 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002211 name="icounterIncrement-" + str( i ),
2212 args=[ iCounterName ],
2213 kwargs={ "inMemory": True } )
2214 iCounterValue += 1
2215 addedIValues.append( iCounterValue )
2216 threads.append( t )
2217 t.start()
2218
2219 for t in threads:
2220 t.join()
2221 iCounters.append( t.result )
2222 # Check that counter incremented numController times
2223 iCounterResults = True
2224 for i in addedIValues:
2225 tmpResult = i in iCounters
2226 iCounterResults = iCounterResults and tmpResult
2227 if not tmpResult:
2228 main.log.error( str( i ) + " is not in the in-memory "
2229 "counter incremented results" )
2230 utilities.assert_equals( expect=True,
2231 actual=iCounterResults,
Jon Halle1a3b752015-07-22 13:02:46 -07002232 onpass="In-memory counter incremented",
2233 onfail="Error incrementing in-memory" +
Jon Hall85794ff2015-07-08 14:12:30 -07002234 " counter" )
2235
Jon Halle1a3b752015-07-22 13:02:46 -07002236 main.step( "Get then Increment a in-memory counter on each node" )
2237 iCounters = []
2238 threads = []
2239 addedIValues = []
2240 for i in range( main.numCtrls ):
2241 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2242 name="counterGetAndAdd-" + str( i ),
2243 args=[ iCounterName ],
2244 kwargs={ "inMemory": True } )
2245 addedIValues.append( iCounterValue )
2246 iCounterValue += 1
2247 threads.append( t )
2248 t.start()
2249
2250 for t in threads:
2251 t.join()
2252 iCounters.append( t.result )
2253 # Check that counter incremented numController times
2254 iCounterResults = True
2255 for i in addedIValues:
2256 tmpResult = i in iCounters
2257 iCounterResults = iCounterResults and tmpResult
2258 if not tmpResult:
2259 main.log.error( str( i ) + " is not in in-memory "
2260 "counter incremented results" )
2261 utilities.assert_equals( expect=True,
2262 actual=iCounterResults,
2263 onpass="In-memory counter incremented",
2264 onfail="Error incrementing in-memory" +
2265 " counter" )
2266
2267 main.step( "Counters we added have the correct values" )
2268 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2269 utilities.assert_equals( expect=main.TRUE,
2270 actual=incrementCheck,
2271 onpass="Added counters are correct",
2272 onfail="Added counters are incorrect" )
2273
2274 main.step( "Add -8 to then get a in-memory counter on each node" )
2275 iCounters = []
2276 threads = []
2277 addedIValues = []
2278 for i in range( main.numCtrls ):
2279 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2280 name="counterIncrement-" + str( i ),
2281 args=[ iCounterName ],
2282 kwargs={ "delta": -8, "inMemory": True } )
2283 iCounterValue += -8
2284 addedIValues.append( iCounterValue )
2285 threads.append( t )
2286 t.start()
2287
2288 for t in threads:
2289 t.join()
2290 iCounters.append( t.result )
2291 # Check that counter incremented numController times
2292 iCounterResults = True
2293 for i in addedIValues:
2294 tmpResult = i in iCounters
2295 iCounterResults = iCounterResults and tmpResult
2296 if not tmpResult:
2297 main.log.error( str( i ) + " is not in in-memory "
2298 "counter incremented results" )
2299 utilities.assert_equals( expect=True,
2300 actual=pCounterResults,
2301 onpass="In-memory counter incremented",
2302 onfail="Error incrementing in-memory" +
2303 " counter" )
2304
2305 main.step( "Add 5 to then get a in-memory counter on each node" )
2306 iCounters = []
2307 threads = []
2308 addedIValues = []
2309 for i in range( main.numCtrls ):
2310 t = main.Thread( target=main.CLIs[i].counterTestAddAndGet,
2311 name="counterIncrement-" + str( i ),
2312 args=[ iCounterName ],
2313 kwargs={ "delta": 5, "inMemory": True } )
2314 iCounterValue += 5
2315 addedIValues.append( iCounterValue )
2316 threads.append( t )
2317 t.start()
2318
2319 for t in threads:
2320 t.join()
2321 iCounters.append( t.result )
2322 # Check that counter incremented numController times
2323 iCounterResults = True
2324 for i in addedIValues:
2325 tmpResult = i in iCounters
2326 iCounterResults = iCounterResults and tmpResult
2327 if not tmpResult:
2328 main.log.error( str( i ) + " is not in in-memory "
2329 "counter incremented results" )
2330 utilities.assert_equals( expect=True,
2331 actual=pCounterResults,
2332 onpass="In-memory counter incremented",
2333 onfail="Error incrementing in-memory" +
2334 " counter" )
2335
2336 main.step( "Get then add 5 to a in-memory counter on each node" )
2337 iCounters = []
2338 threads = []
2339 addedIValues = []
2340 for i in range( main.numCtrls ):
2341 t = main.Thread( target=main.CLIs[i].counterTestGetAndAdd,
2342 name="counterIncrement-" + str( i ),
2343 args=[ iCounterName ],
2344 kwargs={ "delta": 5, "inMemory": True } )
2345 addedIValues.append( iCounterValue )
2346 iCounterValue += 5
2347 threads.append( t )
2348 t.start()
2349
2350 for t in threads:
2351 t.join()
2352 iCounters.append( t.result )
2353 # Check that counter incremented numController times
2354 iCounterResults = True
2355 for i in addedIValues:
2356 tmpResult = i in iCounters
2357 iCounterResults = iCounterResults and tmpResult
2358 if not tmpResult:
2359 main.log.error( str( i ) + " is not in in-memory "
2360 "counter incremented results" )
2361 utilities.assert_equals( expect=True,
2362 actual=iCounterResults,
2363 onpass="In-memory counter incremented",
2364 onfail="Error incrementing in-memory" +
2365 " counter" )
2366
2367 main.step( "Counters we added have the correct values" )
2368 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2369 utilities.assert_equals( expect=main.TRUE,
2370 actual=incrementCheck,
2371 onpass="Added counters are correct",
2372 onfail="Added counters are incorrect" )
2373
Jon Hall85794ff2015-07-08 14:12:30 -07002374 main.step( "Check counters are consistant across nodes" )
2375 onosCounters = []
2376 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002377 for i in range( main.numCtrls ):
2378 t = main.Thread( target=main.CLIs[i].counters,
Jon Hall85794ff2015-07-08 14:12:30 -07002379 name="counters-" + str( i ) )
2380 threads.append( t )
2381 t.start()
2382 for t in threads:
2383 t.join()
2384 onosCounters.append( t.result )
2385 tmp = [ i == onosCounters[ 0 ] for i in onosCounters ]
2386 if all( tmp ):
2387 main.log.info( "Counters are consistent across all nodes" )
2388 consistentCounterResults = main.TRUE
2389 else:
2390 main.log.error( "Counters are not consistent across all nodes" )
2391 consistentCounterResults = main.FALSE
2392 utilities.assert_equals( expect=main.TRUE,
2393 actual=consistentCounterResults,
2394 onpass="ONOS counters are consistent " +
2395 "across nodes",
2396 onfail="ONOS Counters are inconsistent " +
2397 "across nodes" )
2398
2399 main.step( "Counters we added have the correct values" )
Jon Halle1a3b752015-07-22 13:02:46 -07002400 incrementCheck = main.Counters.counterCheck( iCounterName, iCounterValue )
2401 incrementCheck = incrementCheck and \
2402 main.Counters.counterCheck( iCounterName, iCounterValue )
Jon Hall85794ff2015-07-08 14:12:30 -07002403 utilities.assert_equals( expect=main.TRUE,
Jon Halle1a3b752015-07-22 13:02:46 -07002404 actual=incrementCheck,
Jon Hall85794ff2015-07-08 14:12:30 -07002405 onpass="Added counters are correct",
2406 onfail="Added counters are incorrect" )
Jon Halle1a3b752015-07-22 13:02:46 -07002407
Jon Hall85794ff2015-07-08 14:12:30 -07002408 # DISTRIBUTED SETS
2409 main.step( "Distributed Set get" )
2410 size = len( onosSet )
2411 getResponses = []
2412 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002413 for i in range( main.numCtrls ):
2414 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002415 name="setTestGet-" + str( i ),
2416 args=[ onosSetName ] )
2417 threads.append( t )
2418 t.start()
2419 for t in threads:
2420 t.join()
2421 getResponses.append( t.result )
2422
2423 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002424 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002425 if isinstance( getResponses[ i ], list):
2426 current = set( getResponses[ i ] )
2427 if len( current ) == len( getResponses[ i ] ):
2428 # no repeats
2429 if onosSet != current:
2430 main.log.error( "ONOS" + str( i + 1 ) +
2431 " has incorrect view" +
2432 " of set " + onosSetName + ":\n" +
2433 str( getResponses[ i ] ) )
2434 main.log.debug( "Expected: " + str( onosSet ) )
2435 main.log.debug( "Actual: " + str( current ) )
2436 getResults = main.FALSE
2437 else:
2438 # error, set is not a set
2439 main.log.error( "ONOS" + str( i + 1 ) +
2440 " has repeat elements in" +
2441 " set " + onosSetName + ":\n" +
2442 str( getResponses[ i ] ) )
2443 getResults = main.FALSE
2444 elif getResponses[ i ] == main.ERROR:
2445 getResults = main.FALSE
2446 utilities.assert_equals( expect=main.TRUE,
2447 actual=getResults,
2448 onpass="Set elements are correct",
2449 onfail="Set elements are incorrect" )
2450
2451 main.step( "Distributed Set size" )
2452 sizeResponses = []
2453 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002454 for i in range( main.numCtrls ):
2455 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002456 name="setTestSize-" + str( i ),
2457 args=[ onosSetName ] )
2458 threads.append( t )
2459 t.start()
2460 for t in threads:
2461 t.join()
2462 sizeResponses.append( t.result )
2463
2464 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002465 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002466 if size != sizeResponses[ i ]:
2467 sizeResults = main.FALSE
2468 main.log.error( "ONOS" + str( i + 1 ) +
2469 " expected a size of " + str( size ) +
2470 " for set " + onosSetName +
2471 " but got " + str( sizeResponses[ i ] ) )
2472 utilities.assert_equals( expect=main.TRUE,
2473 actual=sizeResults,
2474 onpass="Set sizes are correct",
2475 onfail="Set sizes are incorrect" )
2476
2477 main.step( "Distributed Set add()" )
2478 onosSet.add( addValue )
2479 addResponses = []
2480 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002481 for i in range( main.numCtrls ):
2482 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002483 name="setTestAdd-" + str( i ),
2484 args=[ onosSetName, addValue ] )
2485 threads.append( t )
2486 t.start()
2487 for t in threads:
2488 t.join()
2489 addResponses.append( t.result )
2490
2491 # main.TRUE = successfully changed the set
2492 # main.FALSE = action resulted in no change in set
2493 # main.ERROR - Some error in executing the function
2494 addResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002495 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002496 if addResponses[ i ] == main.TRUE:
2497 # All is well
2498 pass
2499 elif addResponses[ i ] == main.FALSE:
2500 # Already in set, probably fine
2501 pass
2502 elif addResponses[ i ] == main.ERROR:
2503 # Error in execution
2504 addResults = main.FALSE
2505 else:
2506 # unexpected result
2507 addResults = main.FALSE
2508 if addResults != main.TRUE:
2509 main.log.error( "Error executing set add" )
2510
2511 # Check if set is still correct
2512 size = len( onosSet )
2513 getResponses = []
2514 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002515 for i in range( main.numCtrls ):
2516 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002517 name="setTestGet-" + str( i ),
2518 args=[ onosSetName ] )
2519 threads.append( t )
2520 t.start()
2521 for t in threads:
2522 t.join()
2523 getResponses.append( t.result )
2524 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002525 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002526 if isinstance( getResponses[ i ], list):
2527 current = set( getResponses[ i ] )
2528 if len( current ) == len( getResponses[ i ] ):
2529 # no repeats
2530 if onosSet != current:
2531 main.log.error( "ONOS" + str( i + 1 ) +
2532 " has incorrect view" +
2533 " of set " + onosSetName + ":\n" +
2534 str( getResponses[ i ] ) )
2535 main.log.debug( "Expected: " + str( onosSet ) )
2536 main.log.debug( "Actual: " + str( current ) )
2537 getResults = main.FALSE
2538 else:
2539 # error, set is not a set
2540 main.log.error( "ONOS" + str( i + 1 ) +
2541 " has repeat elements in" +
2542 " set " + onosSetName + ":\n" +
2543 str( getResponses[ i ] ) )
2544 getResults = main.FALSE
2545 elif getResponses[ i ] == main.ERROR:
2546 getResults = main.FALSE
2547 sizeResponses = []
2548 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002549 for i in range( main.numCtrls ):
2550 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002551 name="setTestSize-" + str( i ),
2552 args=[ onosSetName ] )
2553 threads.append( t )
2554 t.start()
2555 for t in threads:
2556 t.join()
2557 sizeResponses.append( t.result )
2558 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002559 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002560 if size != sizeResponses[ i ]:
2561 sizeResults = main.FALSE
2562 main.log.error( "ONOS" + str( i + 1 ) +
2563 " expected a size of " + str( size ) +
2564 " for set " + onosSetName +
2565 " but got " + str( sizeResponses[ i ] ) )
2566 addResults = addResults and getResults and sizeResults
2567 utilities.assert_equals( expect=main.TRUE,
2568 actual=addResults,
2569 onpass="Set add correct",
2570 onfail="Set add was incorrect" )
2571
2572 main.step( "Distributed Set addAll()" )
2573 onosSet.update( addAllValue.split() )
2574 addResponses = []
2575 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002576 for i in range( main.numCtrls ):
2577 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002578 name="setTestAddAll-" + str( i ),
2579 args=[ onosSetName, addAllValue ] )
2580 threads.append( t )
2581 t.start()
2582 for t in threads:
2583 t.join()
2584 addResponses.append( t.result )
2585
2586 # main.TRUE = successfully changed the set
2587 # main.FALSE = action resulted in no change in set
2588 # main.ERROR - Some error in executing the function
2589 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002590 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002591 if addResponses[ i ] == main.TRUE:
2592 # All is well
2593 pass
2594 elif addResponses[ i ] == main.FALSE:
2595 # Already in set, probably fine
2596 pass
2597 elif addResponses[ i ] == main.ERROR:
2598 # Error in execution
2599 addAllResults = main.FALSE
2600 else:
2601 # unexpected result
2602 addAllResults = main.FALSE
2603 if addAllResults != main.TRUE:
2604 main.log.error( "Error executing set addAll" )
2605
2606 # Check if set is still correct
2607 size = len( onosSet )
2608 getResponses = []
2609 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002610 for i in range( main.numCtrls ):
2611 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002612 name="setTestGet-" + str( i ),
2613 args=[ onosSetName ] )
2614 threads.append( t )
2615 t.start()
2616 for t in threads:
2617 t.join()
2618 getResponses.append( t.result )
2619 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002620 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002621 if isinstance( getResponses[ i ], list):
2622 current = set( getResponses[ i ] )
2623 if len( current ) == len( getResponses[ i ] ):
2624 # no repeats
2625 if onosSet != current:
2626 main.log.error( "ONOS" + str( i + 1 ) +
2627 " has incorrect view" +
2628 " of set " + onosSetName + ":\n" +
2629 str( getResponses[ i ] ) )
2630 main.log.debug( "Expected: " + str( onosSet ) )
2631 main.log.debug( "Actual: " + str( current ) )
2632 getResults = main.FALSE
2633 else:
2634 # error, set is not a set
2635 main.log.error( "ONOS" + str( i + 1 ) +
2636 " has repeat elements in" +
2637 " set " + onosSetName + ":\n" +
2638 str( getResponses[ i ] ) )
2639 getResults = main.FALSE
2640 elif getResponses[ i ] == main.ERROR:
2641 getResults = main.FALSE
2642 sizeResponses = []
2643 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002644 for i in range( main.numCtrls ):
2645 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002646 name="setTestSize-" + str( i ),
2647 args=[ onosSetName ] )
2648 threads.append( t )
2649 t.start()
2650 for t in threads:
2651 t.join()
2652 sizeResponses.append( t.result )
2653 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002654 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002655 if size != sizeResponses[ i ]:
2656 sizeResults = main.FALSE
2657 main.log.error( "ONOS" + str( i + 1 ) +
2658 " expected a size of " + str( size ) +
2659 " for set " + onosSetName +
2660 " but got " + str( sizeResponses[ i ] ) )
2661 addAllResults = addAllResults and getResults and sizeResults
2662 utilities.assert_equals( expect=main.TRUE,
2663 actual=addAllResults,
2664 onpass="Set addAll correct",
2665 onfail="Set addAll was incorrect" )
2666
2667 main.step( "Distributed Set contains()" )
2668 containsResponses = []
2669 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002670 for i in range( main.numCtrls ):
2671 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002672 name="setContains-" + str( i ),
2673 args=[ onosSetName ],
2674 kwargs={ "values": addValue } )
2675 threads.append( t )
2676 t.start()
2677 for t in threads:
2678 t.join()
2679 # NOTE: This is the tuple
2680 containsResponses.append( t.result )
2681
2682 containsResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002683 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002684 if containsResponses[ i ] == main.ERROR:
2685 containsResults = main.FALSE
2686 else:
2687 containsResults = containsResults and\
2688 containsResponses[ i ][ 1 ]
2689 utilities.assert_equals( expect=main.TRUE,
2690 actual=containsResults,
2691 onpass="Set contains is functional",
2692 onfail="Set contains failed" )
2693
2694 main.step( "Distributed Set containsAll()" )
2695 containsAllResponses = []
2696 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002697 for i in range( main.numCtrls ):
2698 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002699 name="setContainsAll-" + str( i ),
2700 args=[ onosSetName ],
2701 kwargs={ "values": addAllValue } )
2702 threads.append( t )
2703 t.start()
2704 for t in threads:
2705 t.join()
2706 # NOTE: This is the tuple
2707 containsAllResponses.append( t.result )
2708
2709 containsAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002710 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002711 if containsResponses[ i ] == main.ERROR:
2712 containsResults = main.FALSE
2713 else:
2714 containsResults = containsResults and\
2715 containsResponses[ i ][ 1 ]
2716 utilities.assert_equals( expect=main.TRUE,
2717 actual=containsAllResults,
2718 onpass="Set containsAll is functional",
2719 onfail="Set containsAll failed" )
2720
2721 main.step( "Distributed Set remove()" )
2722 onosSet.remove( addValue )
2723 removeResponses = []
2724 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002725 for i in range( main.numCtrls ):
2726 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07002727 name="setTestRemove-" + str( i ),
2728 args=[ onosSetName, addValue ] )
2729 threads.append( t )
2730 t.start()
2731 for t in threads:
2732 t.join()
2733 removeResponses.append( t.result )
2734
2735 # main.TRUE = successfully changed the set
2736 # main.FALSE = action resulted in no change in set
2737 # main.ERROR - Some error in executing the function
2738 removeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002739 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002740 if removeResponses[ i ] == main.TRUE:
2741 # All is well
2742 pass
2743 elif removeResponses[ i ] == main.FALSE:
2744 # not in set, probably fine
2745 pass
2746 elif removeResponses[ i ] == main.ERROR:
2747 # Error in execution
2748 removeResults = main.FALSE
2749 else:
2750 # unexpected result
2751 removeResults = main.FALSE
2752 if removeResults != main.TRUE:
2753 main.log.error( "Error executing set remove" )
2754
2755 # Check if set is still correct
2756 size = len( onosSet )
2757 getResponses = []
2758 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002759 for i in range( main.numCtrls ):
2760 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002761 name="setTestGet-" + str( i ),
2762 args=[ onosSetName ] )
2763 threads.append( t )
2764 t.start()
2765 for t in threads:
2766 t.join()
2767 getResponses.append( t.result )
2768 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002769 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002770 if isinstance( getResponses[ i ], list):
2771 current = set( getResponses[ i ] )
2772 if len( current ) == len( getResponses[ i ] ):
2773 # no repeats
2774 if onosSet != current:
2775 main.log.error( "ONOS" + str( i + 1 ) +
2776 " has incorrect view" +
2777 " of set " + onosSetName + ":\n" +
2778 str( getResponses[ i ] ) )
2779 main.log.debug( "Expected: " + str( onosSet ) )
2780 main.log.debug( "Actual: " + str( current ) )
2781 getResults = main.FALSE
2782 else:
2783 # error, set is not a set
2784 main.log.error( "ONOS" + str( i + 1 ) +
2785 " has repeat elements in" +
2786 " set " + onosSetName + ":\n" +
2787 str( getResponses[ i ] ) )
2788 getResults = main.FALSE
2789 elif getResponses[ i ] == main.ERROR:
2790 getResults = main.FALSE
2791 sizeResponses = []
2792 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002793 for i in range( main.numCtrls ):
2794 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002795 name="setTestSize-" + str( i ),
2796 args=[ onosSetName ] )
2797 threads.append( t )
2798 t.start()
2799 for t in threads:
2800 t.join()
2801 sizeResponses.append( t.result )
2802 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002803 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002804 if size != sizeResponses[ i ]:
2805 sizeResults = main.FALSE
2806 main.log.error( "ONOS" + str( i + 1 ) +
2807 " expected a size of " + str( size ) +
2808 " for set " + onosSetName +
2809 " but got " + str( sizeResponses[ i ] ) )
2810 removeResults = removeResults and getResults and sizeResults
2811 utilities.assert_equals( expect=main.TRUE,
2812 actual=removeResults,
2813 onpass="Set remove correct",
2814 onfail="Set remove was incorrect" )
2815
2816 main.step( "Distributed Set removeAll()" )
2817 onosSet.difference_update( addAllValue.split() )
2818 removeAllResponses = []
2819 threads = []
2820 try:
Jon Halle1a3b752015-07-22 13:02:46 -07002821 for i in range( main.numCtrls ):
2822 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07002823 name="setTestRemoveAll-" + str( i ),
2824 args=[ onosSetName, addAllValue ] )
2825 threads.append( t )
2826 t.start()
2827 for t in threads:
2828 t.join()
2829 removeAllResponses.append( t.result )
2830 except Exception, e:
2831 main.log.exception(e)
2832
2833 # main.TRUE = successfully changed the set
2834 # main.FALSE = action resulted in no change in set
2835 # main.ERROR - Some error in executing the function
2836 removeAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002837 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002838 if removeAllResponses[ i ] == main.TRUE:
2839 # All is well
2840 pass
2841 elif removeAllResponses[ i ] == main.FALSE:
2842 # not in set, probably fine
2843 pass
2844 elif removeAllResponses[ i ] == main.ERROR:
2845 # Error in execution
2846 removeAllResults = main.FALSE
2847 else:
2848 # unexpected result
2849 removeAllResults = main.FALSE
2850 if removeAllResults != main.TRUE:
2851 main.log.error( "Error executing set removeAll" )
2852
2853 # Check if set is still correct
2854 size = len( onosSet )
2855 getResponses = []
2856 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002857 for i in range( main.numCtrls ):
2858 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002859 name="setTestGet-" + str( i ),
2860 args=[ onosSetName ] )
2861 threads.append( t )
2862 t.start()
2863 for t in threads:
2864 t.join()
2865 getResponses.append( t.result )
2866 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002867 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002868 if isinstance( getResponses[ i ], list):
2869 current = set( getResponses[ i ] )
2870 if len( current ) == len( getResponses[ i ] ):
2871 # no repeats
2872 if onosSet != current:
2873 main.log.error( "ONOS" + str( i + 1 ) +
2874 " has incorrect view" +
2875 " of set " + onosSetName + ":\n" +
2876 str( getResponses[ i ] ) )
2877 main.log.debug( "Expected: " + str( onosSet ) )
2878 main.log.debug( "Actual: " + str( current ) )
2879 getResults = main.FALSE
2880 else:
2881 # error, set is not a set
2882 main.log.error( "ONOS" + str( i + 1 ) +
2883 " has repeat elements in" +
2884 " set " + onosSetName + ":\n" +
2885 str( getResponses[ i ] ) )
2886 getResults = main.FALSE
2887 elif getResponses[ i ] == main.ERROR:
2888 getResults = main.FALSE
2889 sizeResponses = []
2890 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002891 for i in range( main.numCtrls ):
2892 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002893 name="setTestSize-" + str( i ),
2894 args=[ onosSetName ] )
2895 threads.append( t )
2896 t.start()
2897 for t in threads:
2898 t.join()
2899 sizeResponses.append( t.result )
2900 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002901 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002902 if size != sizeResponses[ i ]:
2903 sizeResults = main.FALSE
2904 main.log.error( "ONOS" + str( i + 1 ) +
2905 " expected a size of " + str( size ) +
2906 " for set " + onosSetName +
2907 " but got " + str( sizeResponses[ i ] ) )
2908 removeAllResults = removeAllResults and getResults and sizeResults
2909 utilities.assert_equals( expect=main.TRUE,
2910 actual=removeAllResults,
2911 onpass="Set removeAll correct",
2912 onfail="Set removeAll was incorrect" )
2913
2914 main.step( "Distributed Set addAll()" )
2915 onosSet.update( addAllValue.split() )
2916 addResponses = []
2917 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002918 for i in range( main.numCtrls ):
2919 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07002920 name="setTestAddAll-" + str( i ),
2921 args=[ onosSetName, addAllValue ] )
2922 threads.append( t )
2923 t.start()
2924 for t in threads:
2925 t.join()
2926 addResponses.append( t.result )
2927
2928 # main.TRUE = successfully changed the set
2929 # main.FALSE = action resulted in no change in set
2930 # main.ERROR - Some error in executing the function
2931 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002932 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002933 if addResponses[ i ] == main.TRUE:
2934 # All is well
2935 pass
2936 elif addResponses[ i ] == main.FALSE:
2937 # Already in set, probably fine
2938 pass
2939 elif addResponses[ i ] == main.ERROR:
2940 # Error in execution
2941 addAllResults = main.FALSE
2942 else:
2943 # unexpected result
2944 addAllResults = main.FALSE
2945 if addAllResults != main.TRUE:
2946 main.log.error( "Error executing set addAll" )
2947
2948 # Check if set is still correct
2949 size = len( onosSet )
2950 getResponses = []
2951 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002952 for i in range( main.numCtrls ):
2953 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07002954 name="setTestGet-" + str( i ),
2955 args=[ onosSetName ] )
2956 threads.append( t )
2957 t.start()
2958 for t in threads:
2959 t.join()
2960 getResponses.append( t.result )
2961 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002962 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002963 if isinstance( getResponses[ i ], list):
2964 current = set( getResponses[ i ] )
2965 if len( current ) == len( getResponses[ i ] ):
2966 # no repeats
2967 if onosSet != current:
2968 main.log.error( "ONOS" + str( i + 1 ) +
2969 " has incorrect view" +
2970 " of set " + onosSetName + ":\n" +
2971 str( getResponses[ i ] ) )
2972 main.log.debug( "Expected: " + str( onosSet ) )
2973 main.log.debug( "Actual: " + str( current ) )
2974 getResults = main.FALSE
2975 else:
2976 # error, set is not a set
2977 main.log.error( "ONOS" + str( i + 1 ) +
2978 " has repeat elements in" +
2979 " set " + onosSetName + ":\n" +
2980 str( getResponses[ i ] ) )
2981 getResults = main.FALSE
2982 elif getResponses[ i ] == main.ERROR:
2983 getResults = main.FALSE
2984 sizeResponses = []
2985 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07002986 for i in range( main.numCtrls ):
2987 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07002988 name="setTestSize-" + str( i ),
2989 args=[ onosSetName ] )
2990 threads.append( t )
2991 t.start()
2992 for t in threads:
2993 t.join()
2994 sizeResponses.append( t.result )
2995 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07002996 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07002997 if size != sizeResponses[ i ]:
2998 sizeResults = main.FALSE
2999 main.log.error( "ONOS" + str( i + 1 ) +
3000 " expected a size of " + str( size ) +
3001 " for set " + onosSetName +
3002 " but got " + str( sizeResponses[ i ] ) )
3003 addAllResults = addAllResults and getResults and sizeResults
3004 utilities.assert_equals( expect=main.TRUE,
3005 actual=addAllResults,
3006 onpass="Set addAll correct",
3007 onfail="Set addAll was incorrect" )
3008
3009 main.step( "Distributed Set clear()" )
3010 onosSet.clear()
3011 clearResponses = []
3012 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003013 for i in range( main.numCtrls ):
3014 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07003015 name="setTestClear-" + str( i ),
3016 args=[ onosSetName, " "], # Values doesn't matter
3017 kwargs={ "clear": True } )
3018 threads.append( t )
3019 t.start()
3020 for t in threads:
3021 t.join()
3022 clearResponses.append( t.result )
3023
3024 # main.TRUE = successfully changed the set
3025 # main.FALSE = action resulted in no change in set
3026 # main.ERROR - Some error in executing the function
3027 clearResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003028 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003029 if clearResponses[ i ] == main.TRUE:
3030 # All is well
3031 pass
3032 elif clearResponses[ i ] == main.FALSE:
3033 # Nothing set, probably fine
3034 pass
3035 elif clearResponses[ i ] == main.ERROR:
3036 # Error in execution
3037 clearResults = main.FALSE
3038 else:
3039 # unexpected result
3040 clearResults = main.FALSE
3041 if clearResults != main.TRUE:
3042 main.log.error( "Error executing set clear" )
3043
3044 # Check if set is still correct
3045 size = len( onosSet )
3046 getResponses = []
3047 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003048 for i in range( main.numCtrls ):
3049 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003050 name="setTestGet-" + str( i ),
3051 args=[ onosSetName ] )
3052 threads.append( t )
3053 t.start()
3054 for t in threads:
3055 t.join()
3056 getResponses.append( t.result )
3057 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003058 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003059 if isinstance( getResponses[ i ], list):
3060 current = set( getResponses[ i ] )
3061 if len( current ) == len( getResponses[ i ] ):
3062 # no repeats
3063 if onosSet != current:
3064 main.log.error( "ONOS" + str( i + 1 ) +
3065 " has incorrect view" +
3066 " of set " + onosSetName + ":\n" +
3067 str( getResponses[ i ] ) )
3068 main.log.debug( "Expected: " + str( onosSet ) )
3069 main.log.debug( "Actual: " + str( current ) )
3070 getResults = main.FALSE
3071 else:
3072 # error, set is not a set
3073 main.log.error( "ONOS" + str( i + 1 ) +
3074 " has repeat elements in" +
3075 " set " + onosSetName + ":\n" +
3076 str( getResponses[ i ] ) )
3077 getResults = main.FALSE
3078 elif getResponses[ i ] == main.ERROR:
3079 getResults = main.FALSE
3080 sizeResponses = []
3081 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003082 for i in range( main.numCtrls ):
3083 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003084 name="setTestSize-" + str( i ),
3085 args=[ onosSetName ] )
3086 threads.append( t )
3087 t.start()
3088 for t in threads:
3089 t.join()
3090 sizeResponses.append( t.result )
3091 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003092 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003093 if size != sizeResponses[ i ]:
3094 sizeResults = main.FALSE
3095 main.log.error( "ONOS" + str( i + 1 ) +
3096 " expected a size of " + str( size ) +
3097 " for set " + onosSetName +
3098 " but got " + str( sizeResponses[ i ] ) )
3099 clearResults = clearResults and getResults and sizeResults
3100 utilities.assert_equals( expect=main.TRUE,
3101 actual=clearResults,
3102 onpass="Set clear correct",
3103 onfail="Set clear was incorrect" )
3104
3105 main.step( "Distributed Set addAll()" )
3106 onosSet.update( addAllValue.split() )
3107 addResponses = []
3108 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003109 for i in range( main.numCtrls ):
3110 t = main.Thread( target=main.CLIs[i].setTestAdd,
Jon Hall85794ff2015-07-08 14:12:30 -07003111 name="setTestAddAll-" + str( i ),
3112 args=[ onosSetName, addAllValue ] )
3113 threads.append( t )
3114 t.start()
3115 for t in threads:
3116 t.join()
3117 addResponses.append( t.result )
3118
3119 # main.TRUE = successfully changed the set
3120 # main.FALSE = action resulted in no change in set
3121 # main.ERROR - Some error in executing the function
3122 addAllResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003123 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003124 if addResponses[ i ] == main.TRUE:
3125 # All is well
3126 pass
3127 elif addResponses[ i ] == main.FALSE:
3128 # Already in set, probably fine
3129 pass
3130 elif addResponses[ i ] == main.ERROR:
3131 # Error in execution
3132 addAllResults = main.FALSE
3133 else:
3134 # unexpected result
3135 addAllResults = main.FALSE
3136 if addAllResults != main.TRUE:
3137 main.log.error( "Error executing set addAll" )
3138
3139 # Check if set is still correct
3140 size = len( onosSet )
3141 getResponses = []
3142 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003143 for i in range( main.numCtrls ):
3144 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003145 name="setTestGet-" + str( i ),
3146 args=[ onosSetName ] )
3147 threads.append( t )
3148 t.start()
3149 for t in threads:
3150 t.join()
3151 getResponses.append( t.result )
3152 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003153 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003154 if isinstance( getResponses[ i ], list):
3155 current = set( getResponses[ i ] )
3156 if len( current ) == len( getResponses[ i ] ):
3157 # no repeats
3158 if onosSet != current:
3159 main.log.error( "ONOS" + str( i + 1 ) +
3160 " has incorrect view" +
3161 " of set " + onosSetName + ":\n" +
3162 str( getResponses[ i ] ) )
3163 main.log.debug( "Expected: " + str( onosSet ) )
3164 main.log.debug( "Actual: " + str( current ) )
3165 getResults = main.FALSE
3166 else:
3167 # error, set is not a set
3168 main.log.error( "ONOS" + str( i + 1 ) +
3169 " has repeat elements in" +
3170 " set " + onosSetName + ":\n" +
3171 str( getResponses[ i ] ) )
3172 getResults = main.FALSE
3173 elif getResponses[ i ] == main.ERROR:
3174 getResults = main.FALSE
3175 sizeResponses = []
3176 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003177 for i in range( main.numCtrls ):
3178 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003179 name="setTestSize-" + str( i ),
3180 args=[ onosSetName ] )
3181 threads.append( t )
3182 t.start()
3183 for t in threads:
3184 t.join()
3185 sizeResponses.append( t.result )
3186 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003187 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003188 if size != sizeResponses[ i ]:
3189 sizeResults = main.FALSE
3190 main.log.error( "ONOS" + str( i + 1 ) +
3191 " expected a size of " + str( size ) +
3192 " for set " + onosSetName +
3193 " but got " + str( sizeResponses[ i ] ) )
3194 addAllResults = addAllResults and getResults and sizeResults
3195 utilities.assert_equals( expect=main.TRUE,
3196 actual=addAllResults,
3197 onpass="Set addAll correct",
3198 onfail="Set addAll was incorrect" )
3199
3200 main.step( "Distributed Set retain()" )
3201 onosSet.intersection_update( retainValue.split() )
3202 retainResponses = []
3203 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003204 for i in range( main.numCtrls ):
3205 t = main.Thread( target=main.CLIs[i].setTestRemove,
Jon Hall85794ff2015-07-08 14:12:30 -07003206 name="setTestRetain-" + str( i ),
3207 args=[ onosSetName, retainValue ],
3208 kwargs={ "retain": True } )
3209 threads.append( t )
3210 t.start()
3211 for t in threads:
3212 t.join()
3213 retainResponses.append( t.result )
3214
3215 # main.TRUE = successfully changed the set
3216 # main.FALSE = action resulted in no change in set
3217 # main.ERROR - Some error in executing the function
3218 retainResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003219 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003220 if retainResponses[ i ] == main.TRUE:
3221 # All is well
3222 pass
3223 elif retainResponses[ i ] == main.FALSE:
3224 # Already in set, probably fine
3225 pass
3226 elif retainResponses[ i ] == main.ERROR:
3227 # Error in execution
3228 retainResults = main.FALSE
3229 else:
3230 # unexpected result
3231 retainResults = main.FALSE
3232 if retainResults != main.TRUE:
3233 main.log.error( "Error executing set retain" )
3234
3235 # Check if set is still correct
3236 size = len( onosSet )
3237 getResponses = []
3238 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003239 for i in range( main.numCtrls ):
3240 t = main.Thread( target=main.CLIs[i].setTestGet,
Jon Hall85794ff2015-07-08 14:12:30 -07003241 name="setTestGet-" + str( i ),
3242 args=[ onosSetName ] )
3243 threads.append( t )
3244 t.start()
3245 for t in threads:
3246 t.join()
3247 getResponses.append( t.result )
3248 getResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003249 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003250 if isinstance( getResponses[ i ], list):
3251 current = set( getResponses[ i ] )
3252 if len( current ) == len( getResponses[ i ] ):
3253 # no repeats
3254 if onosSet != current:
3255 main.log.error( "ONOS" + str( i + 1 ) +
3256 " has incorrect view" +
3257 " of set " + onosSetName + ":\n" +
3258 str( getResponses[ i ] ) )
3259 main.log.debug( "Expected: " + str( onosSet ) )
3260 main.log.debug( "Actual: " + str( current ) )
3261 getResults = main.FALSE
3262 else:
3263 # error, set is not a set
3264 main.log.error( "ONOS" + str( i + 1 ) +
3265 " has repeat elements in" +
3266 " set " + onosSetName + ":\n" +
3267 str( getResponses[ i ] ) )
3268 getResults = main.FALSE
3269 elif getResponses[ i ] == main.ERROR:
3270 getResults = main.FALSE
3271 sizeResponses = []
3272 threads = []
Jon Halle1a3b752015-07-22 13:02:46 -07003273 for i in range( main.numCtrls ):
3274 t = main.Thread( target=main.CLIs[i].setTestSize,
Jon Hall85794ff2015-07-08 14:12:30 -07003275 name="setTestSize-" + str( i ),
3276 args=[ onosSetName ] )
3277 threads.append( t )
3278 t.start()
3279 for t in threads:
3280 t.join()
3281 sizeResponses.append( t.result )
3282 sizeResults = main.TRUE
Jon Halle1a3b752015-07-22 13:02:46 -07003283 for i in range( main.numCtrls ):
Jon Hall85794ff2015-07-08 14:12:30 -07003284 if size != sizeResponses[ i ]:
3285 sizeResults = main.FALSE
3286 main.log.error( "ONOS" + str( i + 1 ) +
3287 " expected a size of " +
3288 str( size ) + " for set " + onosSetName +
3289 " but got " + str( sizeResponses[ i ] ) )
3290 retainResults = retainResults and getResults and sizeResults
3291 utilities.assert_equals( expect=main.TRUE,
3292 actual=retainResults,
3293 onpass="Set retain correct",
3294 onfail="Set retain was incorrect" )
3295
Jon Hall2a5002c2015-08-21 16:49:11 -07003296 # Transactional maps
3297 main.step( "Partitioned Transactional maps put" )
3298 tMapValue = "Testing"
3299 numKeys = 100
3300 putResult = True
3301 putResponses = main.CLIs[ 0 ].transactionalMapPut( numKeys, tMapValue )
3302 if len( putResponses ) == 100:
3303 for i in putResponses:
3304 if putResponses[ i ][ 'value' ] != tMapValue:
3305 putResult = False
3306 else:
3307 putResult = False
3308 if not putResult:
3309 main.log.debug( "Put response values: " + str( putResponses ) )
3310 utilities.assert_equals( expect=True,
3311 actual=putResult,
3312 onpass="Partitioned Transactional Map put successful",
3313 onfail="Partitioned Transactional Map put values are incorrect" )
3314
3315 main.step( "Partitioned Transactional maps get" )
3316 getCheck = True
3317 for n in range( 1, numKeys + 1 ):
3318 getResponses = []
3319 threads = []
3320 valueCheck = True
3321 for i in range( main.numCtrls ):
3322 t = main.Thread( target=main.CLIs[i].transactionalMapGet,
3323 name="TMap-get-" + str( i ),
3324 args=[ "Key" + str ( n ) ] )
3325 threads.append( t )
3326 t.start()
3327 for t in threads:
3328 t.join()
3329 getResponses.append( t.result )
3330 for node in getResponses:
3331 if node != tMapValue:
3332 valueCheck = False
3333 if not valueCheck:
3334 main.log.warn( "Values for key 'Key" + str( n ) + "' do not match:" )
3335 main.log.warn( getResponses )
3336 getCheck = getCheck and valueCheck
3337 utilities.assert_equals( expect=True,
3338 actual=getCheck,
3339 onpass="Partitioned Transactional Map get values were correct",
3340 onfail="Partitioned Transactional Map values incorrect" )
3341
3342 main.step( "In-memory Transactional maps put" )
3343 tMapValue = "Testing"
3344 numKeys = 100
3345 putResult = True
3346 putResponses = main.CLIs[ 0 ].transactionalMapPut( numKeys, tMapValue, inMemory=True )
3347 if len( putResponses ) == 100:
3348 for i in putResponses:
3349 if putResponses[ i ][ 'value' ] != tMapValue:
3350 putResult = False
3351 else:
3352 putResult = False
3353 if not putResult:
3354 main.log.debug( "Put response values: " + str( putResponses ) )
3355 utilities.assert_equals( expect=True,
3356 actual=putResult,
3357 onpass="In-Memory Transactional Map put successful",
3358 onfail="In-Memory Transactional Map put values are incorrect" )
3359
3360 main.step( "In-Memory Transactional maps get" )
3361 getCheck = True
3362 for n in range( 1, numKeys + 1 ):
3363 getResponses = []
3364 threads = []
3365 valueCheck = True
3366 for i in range( main.numCtrls ):
3367 t = main.Thread( target=main.CLIs[i].transactionalMapGet,
3368 name="TMap-get-" + str( i ),
3369 args=[ "Key" + str ( n ) ],
3370 kwargs={ "inMemory": True } )
3371 threads.append( t )
3372 t.start()
3373 for t in threads:
3374 t.join()
3375 getResponses.append( t.result )
3376 for node in getResponses:
3377 if node != tMapValue:
3378 valueCheck = False
3379 if not valueCheck:
3380 main.log.warn( "Values for key 'Key" + str( n ) + "' do not match:" )
3381 main.log.warn( getResponses )
3382 getCheck = getCheck and valueCheck
3383 utilities.assert_equals( expect=True,
3384 actual=getCheck,
3385 onpass="In-Memory Transactional Map get values were correct",
3386 onfail="In-Memory Transactional Map values incorrect" )