Merge "Adding more ONOS stability checks for ScaleTopoTest"
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
index 923f056..b0b8880 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/SCPFscaleTopo.py
@@ -217,6 +217,7 @@
         # First capture
 
         main.postResult = True
+        main.step( "Grep information from the ONOS log" )
         for i in range( 3 ):
             # Calculate total time
             main.allinfo[ 0 ][ 'info' + str( i ) ][ 'totalTime' ] = main.scaleTopoFunction.getInfoFromLog( main, main.searchTerm[ 'start' ], 'first', main.searchTerm[ 'end' ], 'last', index=i, funcMode='TD' )
@@ -230,7 +231,10 @@
             main.allinfo[ 0 ][ 'info' + str( i ) ][ 'disconnectRate' ] = main.scaleTopoFunction.getInfoFromLog( main, main.searchTerm[ 'Disconnect' ], 'num', main.searchTerm[ 'start' ], 'num', index=i, funcMode='DR' )
         main.log.debug( "The data is " + str( main.allinfo[ 0 ] ) )
         if -1 in main.allinfo[ 0 ][ 'info0' ].values() or -1 in main.allinfo[ 0 ][ 'info1' ].values() or -1 in main.allinfo[ 0 ][ 'info2' ].values():
-            main.log.warn( "Something happened to ONOS. Skip the rest of the steps" )
+            utilities.assert_equals( expect=main.TRUE,
+                                     actual=main.FALSE,
+                                     onpass="Everything installed properly to the ONOS.",
+                                     onfail="Something happened to ONOS. Skip the rest of the steps." )
             main.postResult = False
         else:
             main.case( "Verifying topology: TORUS %sx%s" % ( main.currScale, main.currScale ) )
@@ -239,87 +243,102 @@
 
             main.log.info( "Gathering topology information" )
             time.sleep( main.MNSleep )
-            stepResult = main.TRUE
-            main.step( "Comparing MN topology to ONOS topology" )
+
             compareRetry = 0
+            main.step( "Checking if ONOS is stable" )
+            main.scaleTopoFunction.checkingONOSStablility( main )
 
-            while compareRetry < 3:
-                currentDevicesResult = main.TRUE
-                currentLinksResult = main.TRUE
-                # While loop for retry
-                devices = main.topoRelated.getAll( "devices" )
-                ports = main.topoRelated.getAll( "ports" )
-                links = main.topoRelated.getAll( "links" )
-                mnSwitches = main.Mininet1.getSwitches( updateTimeout=main.basicMNTime + int( main.currScale ) * main.MNupdateTime )
-                main.log.info( "Comparing switches..." )
-                devicePool = []
-                for controller in range( len( main.Cluster.active() ) ):
-                    t = main.Thread( target=main.topoRelated.compareDevicePort,
-                                     threadID=main.threadID,
-                                     name="Compare-Device-Port",
-                                     args=[ main.Mininet1, controller,
-                                            mnSwitches,
-                                            devices, ports ] )
-                    devicePool.append( t )
-                    t.start()
-                    main.threadID = main.threadID + 1
+            if main.postResult:
+                main.step( "Comparing MN topology to ONOS topology" )
 
-                mnLinks = main.Mininet1.getLinks( timeout=main.basicMNTime + int( main.currScale ) * main.MNLinksTime,
-                                                  updateTimeout=main.basicMNTime + int(main.currScale) * main.MNupdateTime )
-                main.log.info( "Comparing links..." )
-                linkPool = []
-                for controller in range( len( main.Cluster.active() ) ):
-                    t = main.Thread( target=main.topoRelated.compareBase,
-                                     threadID=main.threadID,
-                                     name="Compare-Link-Result",
-                                     args=[ links, controller,
-                                            main.Mininet1.compareLinks,
-                                            [ mnSwitches, mnLinks ] ] )
-                    linkPool.append( t )
-                    t.start()
-                    main.threadID = main.threadID + 1
-
-                for t in devicePool:
-                    t.join()
-                    currentDevicesResult = currentDevicesResult and t.result
-                for t in linkPool:
-                    t.join()
-                    currentLinksResult = currentLinksResult and t.result
-                stepResult = stepResult and currentDevicesResult and currentLinksResult
-                if stepResult:
-                    break
-                compareRetry += 1
-            utilities.assert_equals( expect=main.TRUE,
-                                     actual=stepResult,
-                                     onpass=" Topology match Mininet",
-                                     onfail="ONOS Topology doesn't match Mininet" )
-
-            if stepResult:
-                if main.hostDiscover:
-                    hostList = []
-                    for i in range( 1, int( main.currScale ) + 1 ):
-                        for j in range( 1, int( main.currScale ) + 1 ):
-                            # Generate host list
-                            hoststr = "h" + str( i ) + "x" + str( j )
-                            hostList.append( hoststr )
-                    for i in range( len( hostList ) ):
-                        main.topo.sendArpPackage( main, hostList[ i ] )
-                    time.sleep( 20 )
-                    totalHost = main.topo.getHostNum( main )
-                    if totalHost == int( main.currScale ) * int( main.currScale ):
-                        main.log.info( "Discovered all hosts" )
-                        stepResult = stepResult and main.TRUE
-                    else:
-                        main.log.warn( "Some hosts ware not discovered by ONOS... Topology doesn't match!" )
+                compareRetry = 0
+                while compareRetry < 2:
+                    stepResult = main.TRUE
+                    currentDevicesResult = main.TRUE
+                    currentLinksResult = main.TRUE
+                    # While loop for retry
+                    devices = main.topoRelated.getAll( "devices" )
+                    ports = main.topoRelated.getAll( "ports" )
+                    links = main.topoRelated.getAll( "links" )
+                    if None in devices or None in ports or None in links:
+                        main.log.warn( "Something went wrong. Retrying..." )
+                        time.sleep( 20 )
                         stepResult = main.FALSE
+                        compareRetry += 1
+                        continue
+                    mnSwitches = main.Mininet1.getSwitches( updateTimeout=main.basicMNTime + int( main.currScale ) * main.MNupdateTime )
+                    main.log.info( "Comparing switches..." )
+                    devicePool = []
+                    for controller in range( len( main.Cluster.active() ) ):
+                        t = main.Thread( target=main.topoRelated.compareDevicePort,
+                                         threadID=main.threadID,
+                                         name="Compare-Device-Port",
+                                         args=[ main.Mininet1, controller,
+                                                mnSwitches,
+                                                devices, ports ] )
+                        devicePool.append( t )
+                        t.start()
+                        main.threadID = main.threadID + 1
+
+                    mnLinks = main.Mininet1.getLinks( timeout=main.basicMNTime + int( main.currScale ) * main.MNLinksTime,
+                                                      updateTimeout=main.basicMNTime + int(main.currScale) * main.MNupdateTime )
+                    main.log.info( "Comparing links..." )
+                    linkPool = []
+                    for controller in range( len( main.Cluster.active() ) ):
+                        t = main.Thread( target=main.topoRelated.compareBase,
+                                         threadID=main.threadID,
+                                         name="Compare-Link-Result",
+                                         args=[ links, controller,
+                                                main.Mininet1.compareLinks,
+                                                [ mnSwitches, mnLinks ] ] )
+                        linkPool.append( t )
+                        t.start()
+                        main.threadID = main.threadID + 1
+
+                    for t in devicePool:
+                        t.join()
+                        currentDevicesResult = currentDevicesResult and t.result
+                    for t in linkPool:
+                        t.join()
+                        currentLinksResult = currentLinksResult and t.result
+                    stepResult = stepResult and currentDevicesResult and currentLinksResult
+                    if stepResult:
+                        break
+                    compareRetry += 1
+                utilities.assert_equals( expect=main.TRUE,
+                                         actual=stepResult,
+                                         onpass=" Topology match Mininet",
+                                         onfail="ONOS Topology doesn't match Mininet" )
+                main.scaleTopoFunction.checkingONOSStablility( main )
+                if stepResult and main.postResult:
+                    if main.hostDiscover:
+                        hostList = []
+                        for i in range( 1, int( main.currScale ) + 1 ):
+                            for j in range( 1, int( main.currScale ) + 1 ):
+                                # Generate host list
+                                hoststr = "h" + str( i ) + "x" + str( j )
+                                hostList.append( hoststr )
+                        for i in range( len( hostList ) ):
+                            main.topo.sendArpPackage( main, hostList[ i ] )
+                        time.sleep( 20 )
+                        totalHost = main.topo.getHostNum( main )
+                        if totalHost == int( main.currScale ) * int( main.currScale ):
+                            main.log.info( "Discovered all hosts" )
+                            stepResult = stepResult and main.TRUE
+                        else:
+                            main.log.warn( "Some hosts ware not discovered by ONOS... Topology doesn't match!" )
+                            stepResult = main.FALSE
+                        utilities.assert_equals( expect=main.TRUE,
+                                                 actual=stepResult,
+                                                 onpass=" Topology match Mininet",
+                                                 onfail="ONOS Topology doesn't match Mininet" )
+                    main.log.info( "Finished this iteration, continue to scale next topology." )
+                else:
                     utilities.assert_equals( expect=main.TRUE,
-                                             actual=stepResult,
-                                             onpass=" Topology match Mininet",
-                                             onfail="ONOS Topology doesn't match Mininet" )
-                main.log.info( "Finished this iteration, continue to scale next topology." )
-            else:
-                main.log.info( "Clean up and exit TestON. Finished this test." )
-                main.cleanAndExit()
+                                             actual=main.FALSE,
+                                             onpass="ONOS is stable.",
+                                             onfail="Something happened to ONOS. Skip the rest of the steps." )
+                    main.postResult = False
 
     def CASE100( self, main ):
         """
diff --git a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
index 964f0c2..a48ddf7 100644
--- a/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
+++ b/TestON/tests/SCPF/SCPFscaleTopo/dependencies/scaleTopoFunction.py
@@ -440,3 +440,15 @@
         restartResult = main.FALSE
 
     return restartResult
+
+def checkingONOSStablility( main ):
+    compareRetry = 0
+    while compareRetry < 3 and main.postResult:
+        for controller in main.Cluster.active():
+            if controller.CLI.summary() is None:
+                main.info.error( "Something happened to ONOS. Skip the rest of the steps" )
+                main.postResult = False
+                break
+            time.sleep( 5 )
+        compareRetry += 1
+        time.sleep( 10 )