Use new graph interfaces in CHOTestMonkey

Change-Id: If81ef8102665af2a2c96ae3820b107bc8c771ab4
diff --git a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
index 314bde9..75e95ca 100644
--- a/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
+++ b/TestON/tests/CHOTestMonkey/CHOTestMonkey.py
@@ -32,6 +32,7 @@
         """
         import time
         from threading import Lock, Condition
+        from core.graph import Graph
         from tests.CHOTestMonkey.dependencies.elements.ONOSElement import Controller
         from tests.CHOTestMonkey.dependencies.EventGenerator import EventGenerator
         from tests.CHOTestMonkey.dependencies.EventScheduler import EventScheduler
@@ -58,6 +59,7 @@
             if main.params[ 'EVENT' ][ eventName ][ 'status' ] == 'on':
                 main.enabledEvents[ int( main.params[ 'EVENT' ][ eventName ][ 'typeIndex' ] ) ] = eventName
         print main.enabledEvents
+        main.graph = Graph()
         main.eventScheduler = EventScheduler()
         main.eventGenerator = EventGenerator()
         main.variableLock = Lock()
diff --git a/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py b/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
index de32193..0811019 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/EventGenerator.py
@@ -5,7 +5,6 @@
 from threading import Lock, Condition
 from tests.CHOTestMonkey.dependencies.events.Event import EventType, EventStates, Event
 from tests.CHOTestMonkey.dependencies.EventScheduler import EventScheduleMethod
-from tests.CHOTestMonkey.dependencies.GraphHelper import GraphHelper
 
 class MessageType:
     def __init__( self ):
@@ -169,21 +168,10 @@
             main.log.warn( "Event Generator - Too many arguments for randomLinkToggle: %s" % ( args ) )
         else:
             downUpAvgInterval = int( args[ 0 ] )
-        with main.variableLock:
-            graphHelper = GraphHelper()
-            availableLinks = graphHelper.getNonCutEdges()
-            if len( availableLinks ) == 0:
-                main.log.warn( "All links are cut edges, aborting event" )
-                return
-            link = random.sample( availableLinks, 1 )
-
         self.eventGeneratorLock.acquire()
         main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_DOWN,
                                            scheduleMethod,
-                                           [ link[ 0 ].deviceA.name, link[ 0 ].deviceB.name ] )
-        with main.variableLock:
-            link[ 0 ].setPendingDown()
-            link[ 0 ].backwardLink.setPendingDown()
+                                           [ 'random', 'random' ] )
         sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkToggle' ][ 'sleepBeforeCheck' ] )
         main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
         self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
@@ -199,7 +187,7 @@
             time.sleep( downUpInterval )
         main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_UP,
                                            scheduleMethod,
-                                           [ link[ 0 ].deviceA.name, link[ 0 ].deviceB.name ] )
+                                           [ 'random', 'random' ] )
         main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
         self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
         if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
@@ -227,24 +215,12 @@
             linkGroupSize = int( args[ 0 ] )
             downDownAvgInterval = int( args[ 1 ] )
             downUpAvgInterval = int( args[ 2 ] )
-        downLinks = []
         for i in range( 0, linkGroupSize ):
-            with main.variableLock:
-                graphHelper = GraphHelper()
-                availableLinks = graphHelper.getNonCutEdges()
-                if len( availableLinks ) == 0:
-                    main.log.warn( "All links are cut edges, aborting event" )
-                    continue
-                link = random.sample( availableLinks, 1 )
             if i == 0:
                 self.eventGeneratorLock.acquire()
             main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_DOWN,
                                                scheduleMethod,
-                                               [ link[ 0 ].deviceA.name, link[ 0 ].deviceB.name ] )
-            with main.variableLock:
-                link[ 0 ].setPendingDown()
-                link[ 0 ].backwardLink.setPendingDown()
-            downLinks.append( link[ 0 ] )
+                                               [ 'random', 'random' ] )
             sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkGroupToggle' ][ 'sleepBeforeCheck' ] )
             main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
             self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
@@ -267,10 +243,10 @@
         else:
             time.sleep( downUpInterval )
 
-        for link in downLinks:
+        for i in range( 0, linkGroupSize ):
             main.eventScheduler.scheduleEvent( EventType().NETWORK_LINK_UP,
                                                scheduleMethod,
-                                               [ link.deviceA.name, link.deviceB.name ] )
+                                               [ 'random', 'random' ] )
             main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
             self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
             if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
@@ -301,20 +277,10 @@
             main.log.warn( "Event Generator - Too many arguments for randomDeviceToggle: %s" % ( args ) )
         else:
             downUpAvgInterval = int( args[ 0 ] )
-        with main.variableLock:
-            graphHelper = GraphHelper()
-            availableDevices = graphHelper.getNonCutVertices()
-            if len( availableDevices ) == 0:
-                main.log.warn( "All devices are Cut vertices, aborting event" )
-                return
-            device = random.sample( availableDevices, 1 )
-
         self.eventGeneratorLock.acquire()
         main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_DOWN,
                                            scheduleMethod,
-                                           [ device[ 0 ].name ] )
-        with main.variableLock:
-            device[ 0 ].setPendingDown()
+                                           [ 'random' ] )
         sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkToggle' ][ 'sleepBeforeCheck' ] )
         main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
         self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
@@ -330,7 +296,7 @@
             time.sleep( downUpInterval )
         main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_UP,
                                            scheduleMethod,
-                                           [ device[ 0 ].name ] )
+                                           [ 'random' ] )
         main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
         self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
         if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
@@ -358,23 +324,12 @@
             deviceGroupSize = int( args[ 0 ] )
             downDownAvgInterval = int( args[ 1 ] )
             downUpAvgInterval = int( args[ 2 ] )
-        downDevices = []
         for i in range( 0, deviceGroupSize ):
-            with main.variableLock:
-                graphHelper = GraphHelper()
-                availableDevices = graphHelper.getNonCutVertices()
-                if len( availableDevices ) == 0:
-                    main.log.warn( "All devices are cut vertices, aborting event" )
-                    continue
-                device = random.sample( availableDevices, 1 )
             if i == 0:
                 self.eventGeneratorLock.acquire()
             main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_DOWN,
                                                scheduleMethod,
-                                               [ device[ 0 ].name ] )
-            with main.variableLock:
-                device[ 0 ].setPendingDown()
-            downDevices.append( device[ 0 ] )
+                                               [ 'random' ] )
             sleepTime = int( main.params[ 'EVENT' ][ 'randomLinkGroupToggle' ][ 'sleepBeforeCheck' ] )
             main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
             self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
@@ -397,10 +352,10 @@
         else:
             time.sleep( downUpInterval )
 
-        for device in downDevices:
+        for i in range( 0, deviceGroupSize ):
             main.eventScheduler.scheduleEvent( EventType().NETWORK_DEVICE_UP,
                                                scheduleMethod,
-                                               [ device.name ] )
+                                               [ 'random' ] )
             main.eventScheduler.scheduleEvent( EventType().TEST_SLEEP, EventScheduleMethod().RUN_BLOCK, [ sleepTime ] )
             self.insertAllChecks( EventScheduleMethod().RUN_NON_BLOCK )
             if scheduleMethod == EventScheduleMethod().RUN_BLOCK:
diff --git a/TestON/tests/CHOTestMonkey/dependencies/EventScheduler.py b/TestON/tests/CHOTestMonkey/dependencies/EventScheduler.py
index 7e4c95c..99ead73 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/EventScheduler.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/EventScheduler.py
@@ -172,7 +172,7 @@
             if len( self.pendingEvents ) > 0:
                 events += str( self.pendingEvents[ -1 ].typeIndex )
         events += "]"
-        main.log.debug( "Event Scheduler - Events: " + events )
+        #main.log.debug( "Event Scheduler - Events: " + events )
 
     def isAvailable( self ):
         with self.pendingEventsCondition:
diff --git a/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py b/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
index 2a18ac7..b3618dd 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/elements/NetworkElement.py
@@ -18,9 +18,6 @@
     def isRemoved( self ):
         return self.status == 'removed'
 
-    def setPendingDown( self ):
-        self.status = 'pending_down'
-
     def setRemoved( self ):
         self.status = 'removed'
 
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
index d0408f9..babdebb 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/CheckEvent.py
@@ -99,6 +99,8 @@
                 if not host.isDown() and not host.isRemoved():
                     upHostNum += 1
         clusterNum = 1
+        with main.mininetLock:
+            graphDictMininet = main.Mininet1.getGraphDict( useId=True )
         for controller in main.controllers:
             if controller.isUp():
                 with controller.CLILock:
@@ -107,8 +109,14 @@
                     #if not topoState:
                     #    main.log.warn( "Topo Check - link or device number discoverd by ONOS%s is incorrect" % ( controller.index ) )
                     #    checkResult = EventStates().FAIL
-                    # Check links
+                    # Compare ONOS and Mininet topologies
+                    graphDictONOS = controller.CLI.getGraphDict()
+                    compareResult = main.graph.compareGraphs( graphDictONOS, graphDictMininet )
+                    if not compareResult:
+                        checkResult = EventStates().FAIL
+                        main.log.warn( "Topo Check - ONOS and Mininet topologies do not match" )
                     try:
+                        # Check links
                         links = controller.CLI.links()
                         links = json.loads( links )
                         if not len( links ) == upLinkNum:
diff --git a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
index 7247ecf..8ec62a1 100644
--- a/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
+++ b/TestON/tests/CHOTestMonkey/dependencies/events/NetworkEvent.py
@@ -4,7 +4,6 @@
 """
 from tests.CHOTestMonkey.dependencies.events.Event import EventType, EventStates, Event
 from tests.CHOTestMonkey.dependencies.elements.NetworkElement import NetworkElement, Device, Host, Link
-from tests.CHOTestMonkey.dependencies.GraphHelper import GraphHelper
 
 class LinkEvent( Event ):
     def __init__( self ):
@@ -28,18 +27,16 @@
                 main.log.warn( "%s - Too many arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
             if args[ 0 ] == 'random' or args[ 1 ] == 'random':
-                import random
                 if self.typeIndex == EventType().NETWORK_LINK_DOWN:
-                    with main.variableLock:
-                        graphHelper = GraphHelper()
-                        availableLinks = graphHelper.getNonCutEdges()
-                        if len( availableLinks ) == 0:
-                            main.log.warn( "All links are cut edges, aborting event" )
-                            return EventStates().ABORT
-                        linkList = random.sample( availableLinks, 1 )
-                        self.linkA = linkList[ 0 ]
-                        self.linkB = linkList[ 0 ].backwardLink
+                    with main.mininetLock:
+                        linkRandom = main.Mininet1.getLinkRandom()
+                    if linkRandom == None:
+                        main.log.warn( "No link available, aborting event" )
+                        return EventStates().ABORT
+                    args[ 0 ] = linkRandom[ 0 ]
+                    args[ 1 ] = linkRandom[ 1 ]
                 elif self.typeIndex == EventType().NETWORK_LINK_UP:
+                    import random
                     with main.variableLock:
                         downLinks = []
                         for link in main.links:
@@ -54,7 +51,7 @@
             elif args[ 0 ] == args[ 1 ]:
                 main.log.warn( "%s - invalid arguments: %s" % ( self.typeString, args ) )
                 return EventStates().ABORT
-            else:
+            if self.linkA == None or self.linkB == None:
                 for link in main.links:
                     if link.deviceA.name == args[ 0 ] and link.deviceB.name == args[ 1 ]:
                         self.linkA = link
@@ -88,9 +85,13 @@
                 main.log.warn( "Link Down - link has been removed" )
                 return EventStates().ABORT
         with main.mininetLock:
+            '''
             result = main.Mininet1.link( END1=self.linkA.deviceA.name,
                                          END2=self.linkA.deviceB.name,
                                          OPTION="down")
+            '''
+            result = main.Mininet1.delLink( self.linkA.deviceA.name,
+                                            self.linkA.deviceB.name )
         if not result:
             main.log.warn( "%s - failed to bring down link" % ( self.typeString ) )
             return EventStates().FAIL
@@ -118,9 +119,13 @@
                 main.log.warn( "Link Up - link has been removed" )
                 return EventStates().ABORT
         with main.mininetLock:
+            '''
             result = main.Mininet1.link( END1=self.linkA.deviceA.name,
                                          END2=self.linkA.deviceB.name,
                                          OPTION="up")
+            '''
+            result = main.Mininet1.addLink( self.linkA.deviceA.name,
+                                            self.linkA.deviceB.name )
         if not result:
             main.log.warn( "%s - failed to bring up link" % ( self.typeString ) )
             return EventStates().FAIL
@@ -152,14 +157,12 @@
             if args[ 0 ] == 'random':
                 import random
                 if self.typeIndex == EventType().NETWORK_DEVICE_DOWN:
-                    with main.variableLock:
-                        graphHelper = GraphHelper()
-                        availableDevices = graphHelper.getNonCutVertices()
-                        if len( availableDevices ) == 0:
-                            main.log.warn( "All devices are cut vertices, aborting event" )
-                            return EventStates().ABORT
-                        deviceList = random.sample( availableDevices, 1 )
-                        self.device = deviceList[ 0 ]
+                    with main.mininetLock:
+                        switchRandom = main.Mininet1.getSwitchRandom()
+                    if switchRandom == None:
+                        main.log.warn( "No switch available, aborting event" )
+                        return EventStates().ABORT
+                    args[ 0 ] = switchRandom
                 elif self.typeIndex == EventType().NETWORK_DEVICE_UP:
                     with main.variableLock:
                         removedDevices = []
@@ -171,7 +174,7 @@
                             return EventStates().ABORT
                         deviceList = random.sample( removedDevices, 1 )
                         self.device = deviceList[ 0 ]
-            else:
+            if self.device == None:
                 for device in main.devices:
                     if device.name == args[ 0 ]:
                         self.device = device