Modify loop algorithm
    - Re-run iteration if it was failed.
    - Check result is valid for database.

Change-Id: I44ad1183282559199bf73f5bedb12a4db773f908
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
index 182f4b6..fa861cf 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/SCPFintentRerouteLat.py
@@ -123,11 +123,6 @@
             main.ONOSbench.onosDie(main.ONOSip[i])
 
         main.log.info("NODE COUNT = %s" % main.numCtrls)
-
-        # tempOnosIp = []
-        # for i in range(main.numCtrls):
-        #    tempOnosIp.append(main.AllONOSip[i])
-        # print(tempOnosIp)
         main.ONOSbench.createCellFile(main.ONOSbench.ip_address,
                                       main.cellName,
                                       main.MN1Ip,
@@ -227,10 +222,13 @@
         for batchSize in main.intentsList:
             main.log.report("Intent Batch size: " + str(batchSize) + "\n      ")
             main.LatencyList = []
-            for run in range(0, (main.warmUp + main.sampleSize)):
-                if run >= main.warmUp:
+            validRun = 0
+            invalidRun = 0
+            while validRun <= main.warmUp + main.sampleSize and invalidRun <= 20:
+                if validRun >= main.warmUp:
                     main.log.info("================================================")
-                    main.log.info("Starting test iteration " + str(run - main.warmUp))
+                    main.log.info("Starting test iteration: {} ".format(validRun - main.warmUp))
+                    main.log.info("Total iteration: {}".format(validRun + invalidRun))
                     main.log.info("================================================")
                 else:
                     main.log.info("====================Warm Up=====================")
@@ -257,7 +255,20 @@
                 if not verify:
                     main.log.warn("Links or flows number are not match!")
                     main.log.warn("links: {}, flows: {} ".format(linkCheck, flowsCheck))
-                    continue
+                    # bring back topology
+                    main.CLIs[0].removeAllIntents(purge=True, sync=True, timeout=main.timeout)
+                    time.sleep(1)
+                    main.CLIs[0].purgeWithdrawnIntents()
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=0)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="false")
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=8)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="true")
+                    if validRun >= main.warmUp:
+                        invalidRun += 1
+                        continue
+                    else:
+                        validRun += 1
+                        continue
 
                 # Bring link down
                 main.CLIs[0].link("0000000000000004/1", "0000000000000003/2", "down",
@@ -278,7 +289,20 @@
                 if not verify:
                     main.log.warn("Links number are not match in TopologyManager log!")
                     main.log.warn(topoManagerLog)
-                    continue
+                    # bring back topology
+                    main.CLIs[0].removeAllIntents(purge=True, sync=True, timeout=main.timeout)
+                    time.sleep(1)
+                    main.CLIs[0].purgeWithdrawnIntents()
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=0)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="false")
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=8)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="true")
+                    if validRun >= main.warmUp:
+                        invalidRun += 1
+                        continue
+                    else:
+                        validRun += 1
+                        continue
 
                 try:
                     # expect twice to clean the pexpect buffer
@@ -302,6 +326,19 @@
                 except:
                     main.log.error("Topology Log is not correct!")
                     print(topoManagerLog)
+                    # bring back topology
+                    verify = main.FALSE
+                    main.CLIs[0].removeAllIntents(purge=True, sync=True, timeout=main.timeout)
+                    time.sleep(1)
+                    main.CLIs[0].purgeWithdrawnIntents()
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=0)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="false")
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=8)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="true")
+                    if validRun >= main.warmUp:
+                        invalidRun += 1
+                    else:
+                        validRun += 1
                     # If we got wrong Topology log, we should skip this iteration, and continue for next one
                     continue
 
@@ -314,12 +351,14 @@
                 for i in range(0, len(installedTemp)):
                     main.log.info("ONOS Node {} Installed Time stemp: {}".format((i + 1), installedTemp[i]))
                 maxInstallTime = float(max(installedTemp))
-                if run >= main.warmUp:
+                if validRun >= main.warmUp and verify:
                     main.log.info("Installed time stemp: {0:f}".format(maxInstallTime))
                     main.log.info("CutTimestamp: {0:f}".format(cutTimestamp))
                     # Both timeStemps are milliseconds
                     main.log.info("Latency: {0:f}".format(float(maxInstallTime - cutTimestamp)))
                     main.LatencyList.append(float(maxInstallTime - cutTimestamp))
+                # We get valid latency, validRun + 1
+                validRun += 1
 
                 # Verify Summary after we bring up link, and withdrawn intents
                 main.CLIs[0].link("0000000000000004/1", "0000000000000003/2", "up",
@@ -345,6 +384,15 @@
                 if not verify:
                     main.log.error("links, flows, or intents are not correct!")
                     main.log.info("links: {}, flows: {}, intents: {} ".format(linkCheck, flowsCheck, intentCheck))
+                    # bring back topology
+                    main.log.info("Bring back topology...")
+                    main.CLIs[0].removeAllIntents(purge=True, sync=True, timeout=main.timeout)
+                    time.sleep(1)
+                    main.CLIs[0].purgeWithdrawnIntents()
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=0)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="false")
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=8)
+                    main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="true")
                     continue
 
             aveLatency = 0
@@ -356,11 +404,13 @@
             main.log.report("Latency standard deviation:....." + str(stdLatency))
             main.log.report("________________________________________________________")
 
-            resultsDB = open(main.dbFileName, "a")
-            resultsDB.write("'" + main.commit + "',")
-            resultsDB.write(str(main.numCtrls) + ",")
-            resultsDB.write(str(batchSize) + ",")
-            resultsDB.write(str(aveLatency) + ",")
-            resultsDB.write(str(stdLatency) + "\n")
-            resultsDB.close()
+            if not (numpy.isnan(aveLatency) or numpy.isnan(stdLatency)):
+                # check if got NaN for result
+                resultsDB = open(main.dbFileName, "a")
+                resultsDB.write("'" + main.commit + "',")
+                resultsDB.write(str(main.numCtrls) + ",")
+                resultsDB.write(str(batchSize) + ",")
+                resultsDB.write(str(aveLatency) + ",")
+                resultsDB.write(str(stdLatency) + "\n")
+                resultsDB.close()
         del main.scale[0]