blob: 03aafd3a0e23140fe15faeac066992af10ea9435 [file] [log] [blame]
You Wangdb927a52016-02-26 11:03:28 -08001"""
2This file contains the event generator class for CHOTestMonkey
3Author: you@onlab.us
4"""
5from threading import Lock, Condition
6from tests.CHOTestMonkey.dependencies.events.Event import EventType, EventStates, Event
7from tests.CHOTestMonkey.dependencies.EventScheduler import EventScheduleMethod
You Wangdb927a52016-02-26 11:03:28 -08008
Jon Hall2bb3e212017-05-24 17:07:25 -07009
You Wangdb927a52016-02-26 11:03:28 -080010class MessageType:
Jon Hall2bb3e212017-05-24 17:07:25 -070011
You Wangdb927a52016-02-26 11:03:28 -080012 def __init__( self ):
13 self.map = {}
14 # This message type is used for requesting an event injection from outside CHOTestMonkey
15 self.EVENT_REQUEST = 1
16 self.map[ 1 ] = 'EVENT_REQUEST'
17 # This message tyoe will force the event generator to accept the event injection request for debugging purpose
18 self.EVENT_REQUEST_DEBUG = 2
19 self.map[ 2 ] = 'EVENT_REQUEST_DEBUG'
20 # This message type implies the event generator has inserted the event
21 self.EVENT_INSERTED = 10
22 self.map[ 10 ] = 'EVENT_INSERTED'
23 # This message type implies CHOTestMonkey has refused the event injection request
24 # due to, e.g. too many pending events in the scheduler
25 self.EVENT_DENIED = 11
26 self.map[ 11 ] = 'EVENT_DENIED'
27 # The followings are error messages
28 self.UNKNOWN_MESSAGE = 20
29 self.map[ 20 ] = 'UNKNOWN_MESSAGE'
30 self.UNKNOWN_EVENT_TYPE = 21
31 self.map[ 21 ] = 'UNKNOWN_EVENT_TYPE'
32 self.UNKNOWN_SCHEDULE_METHOD = 22
33 self.map[ 22 ] = 'UNKNOWN_SCHEDULE_METHOD'
34 self.NOT_ENOUGH_ARGUMENT = 23
35 self.map[ 23 ] = 'NOT_ENOUGH_ARGUMENT'
36
Jon Hall2bb3e212017-05-24 17:07:25 -070037
You Wangdb927a52016-02-26 11:03:28 -080038class EventGenerator:
Jon Hall2bb3e212017-05-24 17:07:25 -070039
You Wangdb927a52016-02-26 11:03:28 -080040 def __init__( self ):
41 self.default = ''
42 self.eventGeneratorLock = Lock()
43
44 def startListener( self ):
45 """
46 Listen to event triggers
47 """
48 from multiprocessing.connection import Listener
49 import time
50
51 host = "localhost"
52 port = int( main.params[ 'GENERATOR' ][ 'listenerPort' ] )
53 address = ( host, port )
54 listener = Listener( address )
55 main.log.info( "Event Generator - Event listener start listening on %s:%s" % ( host, port ) )
56
Jon Hall2bb3e212017-05-24 17:07:25 -070057 while True:
You Wangdb927a52016-02-26 11:03:28 -080058 conn = listener.accept()
59 t = main.Thread( target=self.handleConnection,
60 threadID=main.threadID,
61 name="handleConnection",
Jon Hall2bb3e212017-05-24 17:07:25 -070062 args=[ conn ] )
You Wangdb927a52016-02-26 11:03:28 -080063 t.start()
64 with main.variableLock:
65 main.threadID += 1
66 listener.close()
67
68 def handleConnection( self, conn ):
69 """
70 Handle connections from event triggers
71 """
72 request = conn.recv()
73 if isinstance( request, list ) and ( request[ 0 ] == MessageType().EVENT_REQUEST or request[ 0 ] == MessageType().EVENT_REQUEST_DEBUG ):
74 if len( request ) < 3:
75 response = MessageType().NOT_ENOUGH_ARGUMENT
76 elif request[ 0 ] == MessageType().EVENT_REQUEST and not main.eventScheduler.isAvailable():
77 response = MessageType().EVENT_DENIED
78 else:
79 typeString = str( request[ 1 ] )
80 scheduleMethodString = str( request[ 2 ] )
81 if len( request ) > 3:
82 args = request[ 3: ]
83 else:
84 args = None
85 for key, value in EventType().map.items():
86 if value == typeString:
87 typeIndex = key
88 break
89 if not value == typeString:
90 response = MessageType().UNKNOWN_EVENT_TYPE
91 else:
92 for key, value in EventScheduleMethod().map.items():
93 if value == scheduleMethodString:
94 scheduleMethod = key
95 break
96 if not value == scheduleMethodString:
97 response = MessageType().UNKNOWN_SCHEDULE_METHOD
98 else:
99 self.insertEvent( typeIndex, scheduleMethod, args )
100 response = MessageType().EVENT_INSERTED
101 else:
102 response = MessageType().UNKNOWN_MESSAGE
103 conn.send( response )
104 conn.close()
105
106 def triggerEvent( self, typeIndex, scheduleMethod, *args ):
107 """
108 This function triggers an event from inside of CHOTestMonkey
109 """
110 import time
111 if not typeIndex in EventType().map.keys():
112 main.log.warn( "Event Generator - Unknown event type: " + str( typeIndex ) )
113 return
114 if not scheduleMethod in EventScheduleMethod().map.keys():
115 main.log.warn( "Event Generator - Unknown event schedule method: " + str( scheduleMethod ) )
116 return
117 while not main.eventScheduler.isAvailable():
118 time.sleep( int( main.params[ 'GENERATOR' ][ 'insertEventRetryInterval' ] ) )
119 self.insertEvent( typeIndex, scheduleMethod, list( args ) )
120
121 def insertEvent( self, typeIndex, scheduleMethod, args=None ):
122 """
123 This function inserts an event into the scheduler
124 """
125 if typeIndex > 100:
126 # Handle group events
127 if not typeIndex in main.enabledEvents.keys():
128 main.log.warn( "Event Generator - event type %s not enabled" % ( typeIndex ) )
129 return
130 function = getattr( self, main.enabledEvents[ typeIndex ] )
Jon Hall2bb3e212017-05-24 17:07:25 -0700131 assert function is not None, "Event Generator - funtion for group event " + typeIndex + " not found"
You Wangdb927a52016-02-26 11:03:28 -0800132 function( scheduleMethod, args )
133 else:
134 # Add individual events to the scheduler
135 main.eventScheduler.scheduleEvent( typeIndex, scheduleMethod, args )
136
137 def insertAllChecks( self, args=None ):
138 """
139 Acquire eventGeneratorLock before calling this funtion
140 """
141 for eventType in main.enabledEvents.keys():
142 if eventType < 100 and EventType().map[ eventType ].startswith( 'CHECK' ):
143 main.eventScheduler.scheduleEvent( eventType,
144 EventScheduleMethod().RUN_NON_BLOCK,
145 args )
146
147 def addAllChecks( self, scheduleMethod, args=None ):
148 """
149 The function adds all check events into the scheduler
150 """
151 with self.eventGeneratorLock:
152 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
153 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
154 self.insertAllChecks( args )
155 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
156 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
157
158 def randomLinkToggle( self, scheduleMethod, args=[ 5 ], blocking=True ):
159 """
160 The function randomly adds a link down-up event pair into the scheduler
161 After each individual link event, all checks are inserted into the scheduler
162 param:
Jon Hall2bb3e212017-05-24 17:07:25 -0700163 args[ 0 ] is the average interval between link down and link up events
You Wangdb927a52016-02-26 11:03:28 -0800164 blocking means blocking other events from being scheduled between link down and link up
165 """
166 import random
167 import time
168
169 if len( args ) < 1:
170 main.log.warn( "Event Generator - Not enough arguments for randomLinkToggle: %s" % ( args ) )
171 elif len( args ) > 1:
172 main.log.warn( "Event Generator - Too many arguments for randomLinkToggle: %s" % ( args ) )
173 else:
174 downUpAvgInterval = int( args[ 0 ] )
You Wangdb927a52016-02-26 11:03:28 -0800175 self.eventGeneratorLock.acquire()
176 main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_DOWN,
177 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700178 [ 'random', 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800179 sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkToggle' ][ 'sleepBeforeCheck' ] )
180 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
181 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
182 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
183 # Insert a NULL BLOCK event
184 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
185 downUpInterval = abs( random.gauss( downUpAvgInterval, 1 ) )
186 if not blocking:
187 self.eventGeneratorLock.release()
188 time.sleep( downUpInterval )
189 self.eventGeneratorLock.acquire()
190 else:
191 time.sleep( downUpInterval )
192 main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_UP,
193 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700194 [ 'random', 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800195 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
196 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
197 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
198 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
199 self.eventGeneratorLock.release()
200
201 def randomLinkGroupToggle( self, scheduleMethod, args=None, blocking=True ):
202 """
203 The function randomly adds a group of link down-up events into the scheduler
204 After each link down or up, all checks are inserted into the scheduler
205 param:
Jon Hall2bb3e212017-05-24 17:07:25 -0700206 args[ 0 ] is the number of links that are to be brought down
207 args[ 1 ] is the average interval between link down events
208 args[ 2 ] is the average interval between link group down and group up events
You Wangdb927a52016-02-26 11:03:28 -0800209 blocking means blocking other events from being scheduled between link events
210 """
211 import random
212 import time
213
214 if len( args ) < 3:
215 main.log.warn( "Event Generator - Not enough arguments for randomLinkGroupToggle: %s" % ( args ) )
216 elif len( args ) > 3:
217 main.log.warn( "Event Generator - Too many arguments for randomLinkGroupToggle: %s" % ( args ) )
218 else:
219 linkGroupSize = int( args[ 0 ] )
220 downDownAvgInterval = int( args[ 1 ] )
221 downUpAvgInterval = int( args[ 2 ] )
You Wangdb927a52016-02-26 11:03:28 -0800222 for i in range( 0, linkGroupSize ):
You Wangdb927a52016-02-26 11:03:28 -0800223 if i == 0:
224 self.eventGeneratorLock.acquire()
225 main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_DOWN,
226 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700227 [ 'random', 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800228 sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkGroupToggle' ][ 'sleepBeforeCheck' ] )
229 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
230 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
231 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
232 # Insert a NULL BLOCK event
233 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
234 downDownInterval = abs( random.gauss( downDownAvgInterval, 1 ) )
235 if not blocking:
236 self.eventGeneratorLock.release()
237 time.sleep( downDownInterval )
238 self.eventGeneratorLock.acquire()
239 else:
240 time.sleep( downDownInterval )
241
242 downUpInterval = abs( random.gauss( downUpAvgInterval, 1 ) )
243 if not blocking:
244 self.eventGeneratorLock.release()
245 time.sleep( downUpInterval )
246 self.eventGeneratorLock.acquire()
247 else:
248 time.sleep( downUpInterval )
249
You Wang221db322016-06-03 15:45:52 -0700250 for i in range( 0, linkGroupSize ):
You Wangdb927a52016-02-26 11:03:28 -0800251 main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_UP,
252 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700253 [ 'random', 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800254 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
255 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
256 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
257 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
258 upUpInterval = abs( random.gauss( downDownAvgInterval, 1 ) )
259 if not blocking:
260 self.eventGeneratorLock.release()
261 time.sleep( upUpInterval )
262 self.eventGeneratorLock.acquire()
263 else:
264 time.sleep( upUpInterval )
265 self.eventGeneratorLock.release()
266
267 def randomDeviceToggle( self, scheduleMethod, args=[ 5 ], blocking=True ):
268 """
269 The function randomly removes a device and then adds it back
270 After each individual device event, all checks are inserted into the scheduler
271 param:
Jon Hall2bb3e212017-05-24 17:07:25 -0700272 args[ 0 ] is the average interval between device down and device up events
You Wangdb927a52016-02-26 11:03:28 -0800273 blocking means blocking other events from being scheduled between device down and device up
274 """
275 import random
276 import time
277
278 if len( args ) < 1:
279 main.log.warn( "Event Generator - Not enough arguments for randomDeviceToggle: %s" % ( args ) )
280 elif len( args ) > 1:
281 main.log.warn( "Event Generator - Too many arguments for randomDeviceToggle: %s" % ( args ) )
282 else:
283 downUpAvgInterval = int( args[ 0 ] )
You Wangdb927a52016-02-26 11:03:28 -0800284 self.eventGeneratorLock.acquire()
285 main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_DOWN,
286 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700287 [ 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800288 sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkToggle' ][ 'sleepBeforeCheck' ] )
289 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
290 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
291 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
292 # Insert a NULL BLOCK event
293 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
294 downUpInterval = abs( random.gauss( downUpAvgInterval, 1 ) )
295 if not blocking:
296 self.eventGeneratorLock.release()
297 time.sleep( downUpInterval )
298 self.eventGeneratorLock.acquire()
299 else:
300 time.sleep( downUpInterval )
301 main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_UP,
302 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700303 [ 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800304 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
305 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
306 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
307 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
308 self.eventGeneratorLock.release()
309
310 def randomDeviceGroupToggle( self, scheduleMethod, args=None, blocking=True ):
311 """
312 The function randomly adds a group of device down-up events into the scheduler
313 After each device down or up, all checks are inserted into the scheduler
314 param:
Jon Hall2bb3e212017-05-24 17:07:25 -0700315 args[ 0 ] is the number of devices that are to be brought down
316 args[ 1 ] is the average interval between device down events
317 args[ 2 ] is the average interval between device group down and group up events
You Wangdb927a52016-02-26 11:03:28 -0800318 blocking means blocking other events from being scheduled between device events
319 """
320 import random
321 import time
322
323 if len( args ) < 3:
324 main.log.warn( "Event Generator - Not enough arguments for randomDeviceGroupToggle: %s" % ( args ) )
325 elif len( args ) > 3:
326 main.log.warn( "Event Generator - Too many arguments for randomDeviceGroupToggle: %s" % ( args ) )
327 else:
328 deviceGroupSize = int( args[ 0 ] )
329 downDownAvgInterval = int( args[ 1 ] )
330 downUpAvgInterval = int( args[ 2 ] )
You Wangdb927a52016-02-26 11:03:28 -0800331 for i in range( 0, deviceGroupSize ):
You Wangdb927a52016-02-26 11:03:28 -0800332 if i == 0:
333 self.eventGeneratorLock.acquire()
334 main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_DOWN,
335 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700336 [ 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800337 sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkGroupToggle' ][ 'sleepBeforeCheck' ] )
338 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
339 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
340 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
341 # Insert a NULL BLOCK event
342 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
343 downDownInterval = abs( random.gauss( downDownAvgInterval, 1 ) )
344 if not blocking:
345 self.eventGeneratorLock.release()
346 time.sleep( downDownInterval )
347 self.eventGeneratorLock.acquire()
348 else:
349 time.sleep( downDownInterval )
350
351 downUpInterval = abs( random.gauss( downUpAvgInterval, 1 ) )
352 if not blocking:
353 self.eventGeneratorLock.release()
354 time.sleep( downUpInterval )
355 self.eventGeneratorLock.acquire()
356 else:
357 time.sleep( downUpInterval )
358
You Wang221db322016-06-03 15:45:52 -0700359 for i in range( 0, deviceGroupSize ):
You Wangdb927a52016-02-26 11:03:28 -0800360 main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_UP,
361 scheduleMethod,
You Wang221db322016-06-03 15:45:52 -0700362 [ 'random' ] )
You Wangdb927a52016-02-26 11:03:28 -0800363 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
364 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
365 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
366 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
367 upUpInterval = abs( random.gauss( downDownAvgInterval, 1 ) )
368 if not blocking:
369 self.eventGeneratorLock.release()
370 time.sleep( upUpInterval )
371 self.eventGeneratorLock.acquire()
372 else:
373 time.sleep( upUpInterval )
374 self.eventGeneratorLock.release()
375
376 def installAllHostIntents( self, scheduleMethod, args=None ):
377 """
378 This function installs host intents for all host pairs
379 After all intent events are inserted, this funciton also insert intent and traffic checks
380 """
381 import itertools
382
383 with self.eventGeneratorLock:
384 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
385 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
386 availableControllers = []
387 for controller in main.controllers:
388 if controller.isUp():
389 availableControllers.append( controller.index )
390 if len( availableControllers ) == 0:
391 main.log.warn( "Event Generator - No available controllers" )
392 return
393 hostCombos = list( itertools.combinations( main.hosts, 2 ) )
394 for i in xrange( 0, len( hostCombos ), len( availableControllers ) ):
395 for CLIIndex in availableControllers:
396 if i >= len( hostCombos ):
397 break
398 main.eventScheduler.scheduleEvent( EventType().APP_INTENT_HOST_ADD,
399 EventScheduleMethod().RUN_NON_BLOCK,
400 [ hostCombos[ i ][ 0 ].name, hostCombos[ i ][ 1 ].name, CLIIndex ] )
401 i += 1
402 # Pending checks after installing all intents
403 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
404 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
405 sleepTime = int( main.params[ 'EVENT' ][ 'installAllHostIntents' ][ 'sleepBeforeCheck' ] )
406 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
You Wang55503a32016-06-27 15:11:40 -0700407 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
You Wangdb927a52016-02-26 11:03:28 -0800408 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
409 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
410
411 def removeAllHostIntents( self, scheduleMethod, args=None ):
412 """
413 This function removes host intents for all host pairs
414 After all intent events are inserted, this funciton also insert intent and traffic checks
415 """
416 import itertools
417
418 with self.eventGeneratorLock:
419 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
420 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
421 availableControllers = []
422 for controller in main.controllers:
423 if controller.isUp():
424 availableControllers.append( controller.index )
425 if len( availableControllers ) == 0:
426 main.log.warn( "Event Generator - No available controllers" )
427 return
428 hostCombos = list( itertools.combinations( main.hosts, 2 ) )
429 for i in xrange( 0, len( hostCombos ), len( availableControllers ) ):
430 for CLIIndex in availableControllers:
431 if i >= len( hostCombos ):
432 break
433 main.eventScheduler.scheduleEvent( EventType().APP_INTENT_HOST_DEL,
434 EventScheduleMethod().RUN_NON_BLOCK,
435 [ hostCombos[ i ][ 0 ].name, hostCombos[ i ][ 1 ].name, CLIIndex ] )
436 i += 1
437 # Pending checks after removing all intents
438 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
439 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
440 sleepTime = int( main.params[ 'EVENT' ][ 'removeAllHostIntents' ][ 'sleepBeforeCheck' ] )
441 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
You Wang55503a32016-06-27 15:11:40 -0700442 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
You Wangdb927a52016-02-26 11:03:28 -0800443 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
444 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
445
446 def installAllPointIntents( self, scheduleMethod, args=None ):
447 """
448 This function installs point intents for all device pairs
449 After all intent events are inserted, this funciton also insert intent and traffic checks
450 """
451 import itertools
452
453 with self.eventGeneratorLock:
454 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
455 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
456 availableControllers = []
457 for controller in main.controllers:
458 if controller.isUp():
459 availableControllers.append( controller.index )
460 if len( availableControllers ) == 0:
461 main.log.warn( "Event Generator - No available controllers" )
462 return
463 deviceCombos = list( itertools.permutations( main.devices, 2 ) )
464 for i in xrange( 0, len( deviceCombos ), len( availableControllers ) ):
465 for CLIIndex in availableControllers:
466 if i >= len( deviceCombos ):
467 break
468 main.eventScheduler.scheduleEvent( EventType().APP_INTENT_POINT_ADD,
469 EventScheduleMethod().RUN_NON_BLOCK,
470 [ deviceCombos[ i ][ 0 ].name, deviceCombos[ i ][ 1 ].name, CLIIndex ] )
471 i += 1
472 # Pending checks after installing all intents
473 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
474 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
475 sleepTime = int( main.params[ 'EVENT' ][ 'installAllPointIntents' ][ 'sleepBeforeCheck' ] )
476 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
You Wang55503a32016-06-27 15:11:40 -0700477 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
You Wangdb927a52016-02-26 11:03:28 -0800478 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
479 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
480
481 def removeAllPointIntents( self, scheduleMethod, args=None ):
482 """
483 This function removes point intents for all device pairs
484 After all intent events are inserted, this funciton also insert intent and traffic checks
485 """
486 import itertools
487
488 with self.eventGeneratorLock:
489 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
490 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
491 availableControllers = []
492 for controller in main.controllers:
493 if controller.isUp():
494 availableControllers.append( controller.index )
495 if len( availableControllers ) == 0:
496 main.log.warn( "Event Generator - No available controllers" )
497 return
498 deviceCombos = list( itertools.permutations( main.devices, 2 ) )
499 for i in xrange( 0, len( deviceCombos ), len( availableControllers ) ):
500 for CLIIndex in availableControllers:
501 if i >= len( deviceCombos ):
502 break
503 main.eventScheduler.scheduleEvent( EventType().APP_INTENT_POINT_DEL,
504 EventScheduleMethod().RUN_NON_BLOCK,
505 [ deviceCombos[ i ][ 0 ].name, deviceCombos[ i ][ 1 ].name, CLIIndex ] )
506 i += 1
507 # Pending checks after removing all intents
508 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
509 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
510 sleepTime = int( main.params[ 'EVENT' ][ 'removeAllPointIntents' ][ 'sleepBeforeCheck' ] )
511 main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
You Wang55503a32016-06-27 15:11:40 -0700512 self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
You Wangdb927a52016-02-26 11:03:28 -0800513 if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
514 main.eventScheduler.scheduleEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )