Merge "Fix flow installation count in flow throughput test"
diff --git a/TestON/core/utilities.py b/TestON/core/utilities.py
index ed37ae3..2f7e5bb 100644
--- a/TestON/core/utilities.py
+++ b/TestON/core/utilities.py
@@ -295,7 +295,8 @@
             return 0
 
     def retry( self, f, retValue, args=(), kwargs={},
-               sleep=1, attempts=2, randomTime=False ):
+               sleep=1, attempts=2, randomTime=False,
+               getRetryingTime=False ):
         """
         Given a function and bad return values, retry will retry a function
         until successful or give up after a certain number of attempts.
@@ -321,6 +322,8 @@
             assert sleep >= 0, "sleep must be >= 0"
             if not isinstance( retValue, list ):
                 retValue = [ retValue ]
+            if getRetryingTime:
+                startTime = time.time()
             for i in range( 0, attempts ):
                 ret = f( *args, **kwargs )
                 if ret not in retValue:
@@ -333,6 +336,8 @@
                 time.sleep( sleeptime )
             if i > 0:
                 main.log.debug( str( f ) + " was retried " + str( i ) + " times." )
+                if getRetryingTime:
+                    main.log.debug( "Took " + str( time.time() - startTime ) + " seconds for retrying." )
             return ret
         except AssertionError:
             main.log.exception( "Invalid arguements for retry: " )
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.params b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
index 1215e16..bff8823 100644
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.params
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.params
@@ -47,17 +47,24 @@
     <SLEEP>
         <startup>15</startup>
         <reroute>5</reroute>
-        <removeintent>10</removeintent>
+        <removeintent>5</removeintent>
         <checkintent>5</checkintent>
         <fwd>10</fwd>
         <topoAttempts>3</topoAttempts>
         <flowDuration>10</flowDuration>
-        <checkConnection>30</checkConnection>
-        <checkFlowCount>20</checkFlowCount>
+        <checkConnection>1</checkConnection> # because the scapyCheckConnection itself takes 12 seconds.
+        <checkFlowCount>5</checkFlowCount>
         <checkIntentHost>5</checkIntentHost>
         <checkIntentPoint>5</checkIntentPoint>
     </SLEEP>
 
+    <RETRY>
+        <generalAttempts>36</generalAttempts>
+        <middleAttempts>5</middleAttempts>
+        <minimumAttempts>1</minimumAttempts>
+        <checkConnectionAtt>15</checkConnectionAtt> # because the scapyCheckConnection itself takes 12 seconds.
+        <removeIntentAtt>20</removeIntentAtt>
+    </RETRY>
     <MININET>
         <switch>7</switch>
         <links>20</links>
diff --git a/TestON/tests/FUNC/FUNCintent/FUNCintent.py b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
index 2b85fc2..c0374f8 100644
--- a/TestON/tests/FUNC/FUNCintent/FUNCintent.py
+++ b/TestON/tests/FUNC/FUNCintent/FUNCintent.py
@@ -71,6 +71,11 @@
             main.checkIntentPointSleep = int( main.params[ 'SLEEP' ][ 'checkIntentPoint' ] )
             main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
             main.flowDurationSleep = int( main.params[ 'SLEEP' ][ 'flowDuration' ] )
+            main.generalAttemptsNum = int( main.params[ 'RETRY' ][ 'generalAttempts' ] )
+            main.middleAttemptsNum = int( main.params[ 'RETRY' ][ 'middleAttempts' ] )
+            main.minimumAttemptsNum = int( main.params[ 'RETRY' ][ 'minimumAttempts' ] )
+            main.checkConnectionAttNum = int( main.params[ 'RETRY' ][ 'checkConnectionAtt' ] )
+            main.removeIntentAttNum = int( main.params[ 'RETRY' ][ 'removeIntentAtt' ] )
             main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
             main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
             main.hostsData = {}
diff --git a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
index 6299ac2..bdd0e74 100644
--- a/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
+++ b/TestON/tests/FUNC/FUNCintent/dependencies/FuncIntentFunction.py
@@ -243,9 +243,9 @@
 
     # Check intent state
     if hostIntentFailFlag:
-        attempts = 1
+        attempts = main.minimumAttemptsNum
     else:
-        attempts = 50
+        attempts = main.generalAttemptsNum
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
                         args=( main, [ intentId ] ),
@@ -255,7 +255,7 @@
     else:
         main.assertReturnString += 'Initial Intent State Failed\n'
         testResult = main.FALSE
-        attempts = 1
+        attempts = main.minimumAttemptsNum
 
     # Check flows count in each node
     if utilities.retry( f=checkFlowsCount,
@@ -275,9 +275,10 @@
     # Check Connectivity
     if utilities.retry( f=scapyCheckConnection,
                         retValue=main.FALSE,
-                        attempts=attempts,
+                        attempts=main.checkConnectionAttNum,
                         sleep=main.checkConnectionSleep,
-                        args=( main, senderNames, recipientNames, vlanId ) ):
+                        args=( main, senderNames, recipientNames, vlanId ),
+                        getRetryingTime=True ):
         main.assertReturnString += 'Initial Ping Passed\n'
     else:
         main.assertReturnString += 'Initial Ping Failed\n'
@@ -334,7 +335,8 @@
                             retValue=main.FALSE,
                             args=( main, senderNames, recipientNames, vlanId ),
                             sleep=main.checkConnectionSleep,
-                            attempts=attempts ):
+                            attempts=main.checkConnectionAttNum,
+                            getRetryingTime=True ):
             main.assertReturnString += 'Link Down Pingall Passed\n'
         else:
             main.assertReturnString += 'Link Down Pingall Failed\n'
@@ -391,7 +393,8 @@
         # Check Connection
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.FALSE,
-                            args=( main, senderNames, recipientNames, vlanId ) ):
+                            args=( main, senderNames, recipientNames, vlanId ),
+                            getRetryingTime=True ):
             main.assertReturnString += 'Link Up Pingall Passed\n'
         else:
             main.assertReturnString += 'Link Up Pingall Failed\n'
@@ -400,7 +403,7 @@
     # Remove all intents
     if utilities.retry( f=removeAllIntents,
                         retValue=main.FALSE,
-                        attempts=10,
+                        attempts=main.removeIntentAttNum,
                         args=( main, [ intentId ] ) ):
         main.assertReturnString += 'Remove Intents Passed'
     else:
@@ -973,9 +976,9 @@
 
     # Check intents state
     if singleToMultiFailFlag:
-        attempts = 5
+        attempts = main.middleAttemptsNum
     else:
-        attempts = 50
+        attempts = main.generalAttemptsNum
 
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
@@ -1122,9 +1125,9 @@
 
     # Check intents state
     if multiToSingleFailFlag:
-        attempts = 5
+        attempts = main.middleAttemptsNum
     else:
-        attempts = 50
+        attempts = main.generalAttemptsNum
 
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
@@ -1261,9 +1264,9 @@
     main.log.info( itemName + ": Adding single point to multi point intents" )
 
     if pointIntentFailFlag or singleToMultiFailFlag or multiToSingleFailFlag:
-        attempts = 1
+        attempts = main.minimumAttemptsNum
     else:
-        attempts = 50
+        attempts = main.generalAttemptsNum
 
     # Check intent state
     if utilities.retry( f=checkIntentState,
@@ -1275,7 +1278,7 @@
     else:
         main.assertReturnString += 'Initial Intent State Failed\n'
         testResult = main.FALSE
-        attempts = 1
+        attempts = main.minimumAttemptsNum
 
     # Check flows count in each node
     if utilities.retry( f=checkFlowsCount,
@@ -1296,8 +1299,9 @@
     if utilities.retry( f=scapyCheckConnection,
                         retValue=main.FALSE,
                         args=( main, senderNames, recipientNames, vlanId, useTCP ),
-                        attempts=attempts,
-                        sleep=main.checkConnectionSleep ):
+                        attempts=main.checkConnectionAttNum,
+                        sleep=main.checkConnectionSleep,
+                        getRetryingTime=True ):
         main.assertReturnString += 'Initial Ping Passed\n'
     else:
         main.assertReturnString += 'Initial Ping Failed\n'
@@ -1309,7 +1313,8 @@
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.FALSE,
                             args=( main, badSenderNames, recipientNames ),
-                            kwargs={ "expectFailure": True } ):
+                            kwargs={ "expectFailure": True },
+                            getRetryingTime=True ):
             main.assertReturnString += 'Bad Sender Ping Passed\n'
         else:
             main.assertReturnString += 'Bad Sender Ping Failed\n'
@@ -1320,7 +1325,8 @@
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.FALSE,
                             args=( main, senderNames, badRecipientNames ),
-                            kwargs={ "expectFailure": True } ):
+                            kwargs={ "expectFailure": True },
+                            getRetryingTime=True ):
             main.assertReturnString += 'Bad Recipient Ping Passed\n'
         else:
             main.assertReturnString += 'Bad Recipient Ping Failed\n'
@@ -1341,7 +1347,8 @@
             # Check Connection
             if utilities.retry( f=scapyCheckConnection,
                                 retValue=main.FALSE,
-                                args=( main, senderNames, recipientNames, vlanId, useTCP ) ):
+                                args=( main, senderNames, recipientNames, vlanId, useTCP ),
+                                getRetryingTime=True ):
                 main.assertReturnString += 'Link down Scapy Packet Received Passed\n'
             else:
                 main.assertReturnString += 'Link down Scapy Packet Recieved Failed\n'
@@ -1393,7 +1400,8 @@
                             retValue=main.FALSE,
                             args=( main, senderNames, recipientNames, vlanId, useTCP ),
                             sleep=main.checkConnectionSleep,
-                            attempts=attempts ):
+                            attempts=main.checkConnectionAttNum,
+                            getRetryingTime=True ):
             main.assertReturnString += 'Link Down Pingall Passed\n'
         else:
             main.assertReturnString += 'Link Down Pingall Failed\n'
@@ -1451,8 +1459,9 @@
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.FALSE,
                             sleep=main.checkConnectionSleep,
-                            attempts=attempts,
-                            args=( main, senderNames, recipientNames, vlanId, useTCP ) ):
+                            attempts=main.checkConnectionAttNum,
+                            args=( main, senderNames, recipientNames, vlanId, useTCP ),
+                            getRetryingTime=True ):
             main.assertReturnString += 'Link Up Scapy Packet Received Passed\n'
         else:
             main.assertReturnString += 'Link Up Scapy Packet Recieved Failed\n'
@@ -1461,7 +1470,7 @@
     # Remove all intents
     if utilities.retry( f=removeAllIntents,
                         retValue=main.FALSE,
-                        attempts=10,
+                        attempts=main.removeIntentAttNum,
                         args=( main, [ intentId ] ) ):
         main.assertReturnString += 'Remove Intents Passed'
     else:
@@ -1537,9 +1546,9 @@
 
     # Check intent state
     if singleToMultiFailFlag or multiToSingleFailFlag:
-        attempts = 1
+        attempts = main.minimumAttemptsNum
     else:
-        attempts = 50
+        attempts = main.generalAttemptsNum
 
     if utilities.retry( f=checkIntentState,
                         retValue=main.FALSE,
@@ -1550,7 +1559,7 @@
     else:
         main.assertReturnString += 'Initial Intent State Failed\n'
         testResult = main.FALSE
-        attempts = 1
+        attempts = main.minimumAttemptsNum
 
     # Check flows count in each node
     if utilities.retry( f=checkFlowsCount,
@@ -1568,7 +1577,8 @@
     # Check Connectivity
     if utilities.retry( f=scapyCheckConnection,
                         retValue=main.FALSE,
-                        args=( main, senderNames, recipientNames ) ):
+                        args=( main, senderNames, recipientNames ),
+                        getRetryingTime=True ):
         main.assertReturnString += 'Initial Connectivity Check Passed\n'
     else:
         main.assertReturnString += 'Initial Connectivity Check Failed\n'
@@ -1631,7 +1641,8 @@
     # Check Connection
     if utilities.retry( f=scapyCheckConnection,
                         retValue=main.FALSE,
-                        args=( main, senderNames, recipientNames ) ):
+                        args=( main, senderNames, recipientNames ),
+                        getRetryingTime=True ):
         main.assertReturnString += 'Link Down Connectivity Check Passed\n'
     else:
         main.assertReturnString += 'Link Down Connectivity Check Failed\n'
@@ -1714,8 +1725,9 @@
         # Next check connectivity of connected senders and recipients
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.FALSE,
-                            attempts=attempts,
-                            args=( main, connectedSenderNames, connectedRecipientNames ) ):
+                            attempts=main.checkConnectionAttNum,
+                            args=( main, connectedSenderNames, connectedRecipientNames ),
+                            getRetryingTime=True ):
             main.assertReturnString += 'Partial failure isolation link Down Connectivity Check Passed\n'
         else:
             main.assertReturnString += 'Partial failure isolation link Down Connectivity Check Failed\n'
@@ -1788,7 +1800,8 @@
         # Next check connectivity of connected senders and recipients
         if utilities.retry( f=scapyCheckConnection,
                             retValue=main.TRUE,
-                            args=( main, connectedSenderNames, connectedRecipientNames, None, None, None, None, main.TRUE ) ):
+                            args=( main, connectedSenderNames, connectedRecipientNames, None, None, None, None, main.TRUE ),
+                            getRetryingTime=True ):
             main.assertReturnString += 'Isolation link Down Connectivity Check Passed\n'
         else:
             main.assertReturnString += 'Isolation link Down Connectivity Check Failed\n'
@@ -1865,8 +1878,9 @@
     if utilities.retry( f=scapyCheckConnection,
                         retValue=main.FALSE,
                         sleep=main.checkConnectionSleep,
-                        attempts=attempts,
-                        args=( main, senderNames, recipientNames ) ):
+                        attempts=main.checkConnectionAttNum,
+                        args=( main, senderNames, recipientNames ),
+                        getRetryingTime=True ):
         main.assertReturnString += 'Link Up Scapy Packet Received Passed\n'
     else:
         main.assertReturnString += 'Link Up Scapy Packet Recieved Failed\n'
@@ -1875,7 +1889,7 @@
     # Remove all intents
     if utilities.retry( f=removeAllIntents,
                         retValue=main.FALSE,
-                        attempts=10,
+                        attempts=main.removeIntentAttNum,
                         args=( main, [ intentId ] ) ):
         main.assertReturnString += 'Remove Intents Passed'
     else:
diff --git a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
index f8d352a..7a1f738 100644
--- a/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
+++ b/TestON/tests/SCPF/SCPFflowTp1g/SCPFflowTp1g.py
@@ -309,4 +309,4 @@
 
         main.log.report( "Result line to file: " + resultString )
 
-        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
+        main.ONOSbench.logReport( main.Cluster.active( 0 ).ipAddress, [ "ERROR", "WARNING", "EXCEPT" ], outputMode="d" )
\ No newline at end of file