Support random host intent add/delete event in CHOTestMonkey

Change-Id: I56e9e9fdb3bea31376dcfb6897aa79c2923bb244
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
index 7b07758..11459b3 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
@@ -762,6 +762,104 @@
                                  onfail="Balance masters test failed" )
         time.sleep( main.caseSleep )
 
+    def CASE70( self, main ):
+        """
+        Randomly generate events
+        """
+        import time
+        import random
+        from tests.CHOTestMonkey.dependencies.events.Event import EventType
+        from tests.CHOTestMonkey.dependencies.EventScheduler import EventScheduleMethod
+
+        main.log.report( "Randomly generate events" )
+        main.log.report( "__________________________________________________" )
+        main.case( "Randomly generate events" )
+        main.step( "Randomly generate events" )
+        main.caseResult = main.TRUE
+        sleepSec = int( main.params[ 'CASE70' ][ 'sleepSec' ] )
+        hostIntentNum = 0
+        pointIntentNum = 0
+        downDeviceNum = 0
+        downLinkNum = 0
+        upControllers = [ 1, 2, 3 ]
+        while True:
+            events = []
+            for i in range( int( main.params[ 'CASE70' ][ 'addHostIntentWeight' ] ) ):
+                events.append( 'add-host-intent' )
+            for i in range( int( main.params[ 'CASE70' ][ 'addPointIntentWeight' ] ) ):
+                events.append( 'add-point-intent' )
+            for i in range( int( main.params[ 'CASE70' ][ 'linkDownWeight' ] ) ):
+                events.append( 'link-down' )
+            for i in range( int( main.params[ 'CASE70' ][ 'deviceDownWeight' ] ) ):
+                events.append( 'device-down' )
+            for i in range( int( pow( hostIntentNum, 1.5 ) / 100 ) ):
+                events.append( 'del-host-intent' )
+            for i in range( int( pow( pointIntentNum/2, 1.5 ) / 100 ) ):
+                events.append( 'del-point-intent' )
+            for i in range( pow( 2, downLinkNum ) - 1 ):
+                events.append( 'link-up' )
+            for i in range( pow( 5, downDeviceNum ) - 1 ):
+                events.append( 'device-up' )
+            main.log.debug( events )
+            event = random.sample( events, 1 )[ 0 ]
+            if event == 'add-host-intent':
+                n = random.randint( 5, 50 )
+                for i in range( n ):
+                    cliIndex = random.sample( upControllers, 1 )[ 0 ]
+                    main.eventGenerator.triggerEvent( EventType().APP_INTENT_HOST_ADD, EventScheduleMethod().RUN_NON_BLOCK, 'random', 'random', cliIndex )
+                    hostIntentNum += 1
+                main.eventGenerator.triggerEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
+            elif event == 'del-host-intent':
+                n = random.randint( 5, hostIntentNum )
+                for i in range( n ):
+                    cliIndex = random.sample( upControllers, 1 )[ 0 ]
+                    main.eventGenerator.triggerEvent( EventType().APP_INTENT_HOST_DEL, EventScheduleMethod().RUN_NON_BLOCK, 'random', 'random', cliIndex )
+                    hostIntentNum -= 1
+                main.eventGenerator.triggerEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
+            elif event == 'add-point-intent':
+                n = random.randint( 5, 50 )
+                for i in range( n ):
+                    cliIndex = random.sample( upControllers, 1 )[ 0 ]
+                    main.eventGenerator.triggerEvent( EventType().APP_INTENT_POINT_ADD, EventScheduleMethod().RUN_NON_BLOCK, 'random', 'random', cliIndex, 'bidirectional' )
+                    pointIntentNum += 1
+                main.eventGenerator.triggerEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
+            elif event == 'del-point-intent':
+                n = random.randint( 5, pointIntentNum )
+                for i in range( n ):
+                    cliIndex = random.sample( upControllers, 1 )[ 0 ]
+                    main.eventGenerator.triggerEvent( EventType().APP_INTENT_POINT_DEL, EventScheduleMethod().RUN_NON_BLOCK, 'random', 'random', cliIndex, 'bidirectional' )
+                    pointIntentNum -= 1
+                main.eventGenerator.triggerEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
+            elif event == 'link-down':
+                main.eventGenerator.triggerEvent( EventType().NETWORK_LINK_DOWN, EventScheduleMethod().RUN_BLOCK, 'random', 'random' )
+                downLinkNum += 1
+            elif event == 'link-up':
+                main.eventGenerator.triggerEvent( EventType().NETWORK_LINK_UP, EventScheduleMethod().RUN_BLOCK, 'random', 'random' )
+                downLinkNum -= 1
+            elif event == 'device-down':
+                main.eventGenerator.triggerEvent( EventType().NETWORK_DEVICE_DOWN, EventScheduleMethod().RUN_BLOCK, 'random' )
+                downDeviceNum += 1
+            elif event == 'device-up':
+                main.eventGenerator.triggerEvent( EventType().NETWORK_DEVICE_UP, EventScheduleMethod().RUN_BLOCK, 'random' )
+                downDeviceNum -= 1
+            else:
+                pass
+            main.eventGenerator.triggerEvent( EventType().CHECK_TOPO, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().CHECK_ONOS, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().CHECK_TRAFFIC, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().CHECK_FLOW, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().CHECK_INTENT, EventScheduleMethod().RUN_NON_BLOCK )
+            main.eventGenerator.triggerEvent( EventType().NULL, EventScheduleMethod().RUN_BLOCK )
+            with main.eventScheduler.idleCondition:
+                while not main.eventScheduler.isIdle():
+                    main.eventScheduler.idleCondition.wait()
+            #time.sleep( sleepSec )
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=main.caseResult,
+                                 onpass="Randomly generate events test passed",
+                                 onfail="Randomly generate events test failed" )
+        time.sleep( main.caseSleep )
+
     def CASE90( self, main ):
         """
         Sleep for some time