[ONOS-7488] Add retries to ping for SRRouting

Change-Id: If616185a41b1d54d2ebdc99f7a87a8cd2a9f449e
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 580b3b5..d962e92 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -491,13 +491,13 @@
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
 
-    def pingIpv6Hosts( self, hostList, prefix='1000::', wait=1 ):
+    def pingIpv6Hosts( self, hostList, wait=1, acceptableFailed=0 ):
         """
-        IPv6 ping all hosts in hostList. If no prefix passed this will use
-        default prefix of 1000::
+        IPv6 ping all hosts in hostList.
+
+        acceptableFailed: max number of acceptable failed pings
 
         Returns main.TRUE if all hosts specified can reach each other
-
         Returns main.FALSE if one or more of hosts specified cannot reach each other
         """
         try:
@@ -506,7 +506,7 @@
             wait = int( wait )
             cmd = " ping6 -c 1 -i 1 -W " + str( wait ) + " "
             pingResponse = "IPv6 Pingall output:\n"
-            failedPings = 0
+            failedPingsTotal = 0
             for host in hostList:
                 listIndex = hostList.index( host )
                 # List of hosts to ping other than itself
@@ -517,19 +517,26 @@
 
                 for temp in pingList:
                     # Current host pings all other hosts specified
+                    failedPings = 0
                     pingCmd = str( host ) + cmd + str( self.getIPAddress( temp, proto='IPv6' ) )
-                    self.handle.sendline( pingCmd )
-                    self.handle.expect( "mininet>", timeout=wait + 1 )
-                    response = self.handle.before
-                    if re.search( ',\s0\%\spacket\sloss', response ):
-                        pingResponse += str( " h" + str( temp[ 1: ] ) )
-                    else:
-                        pingResponse += " X"
+                    while failedPings <= acceptableFailed:
+                        main.log.debug( "Pinging from " + str( host ) + " to " + str( temp ) )
+                        self.handle.sendline( pingCmd )
+                        self.handle.expect( "mininet>", timeout=wait + 1 )
+                        response = self.handle.before
+                        if re.search( ',\s0\%\spacket\sloss', response ):
+                            pingResponse += str( " h" + str( temp[ 1: ] ) )
+                            break
+                        else:
+                            failedPings += 1
+                            time.sleep(1)
+                    if failedPings > acceptableFailed:
                         # One of the host to host pair is unreachable
+                        pingResponse += " X"
                         isReachable = main.FALSE
-                        failedPings += 1
+                        failedPingsTotal += 1
                 pingResponse += "\n"
-            main.log.info( pingResponse + "Failed pings: " + str( failedPings ) )
+            main.log.info( pingResponse + "Failed pings: " + str( failedPingsTotal ) )
             return isReachable
 
         except pexpect.TIMEOUT:
diff --git a/TestON/tests/USECASE/SegmentRouting/SRRouting/dependencies/SRRoutingTest.py b/TestON/tests/USECASE/SegmentRouting/SRRouting/dependencies/SRRoutingTest.py
index b1c8ea1..7566ff4 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRRouting/dependencies/SRRoutingTest.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRRouting/dependencies/SRRoutingTest.py
@@ -73,7 +73,7 @@
             time.sleep(60)
 
         # ping hosts
-        run.pingAllBasedOnIp( main, 'CASE%02d' % test_idx )
+        run.pingAll( main, 'CASE%02d' % test_idx, acceptableFailed=5, basedOnIp=True )
 
         if hasattr(main, 'Mininet1'):
             run.cleanup(main)
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
index bc021c6..c5271f5 100644
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
@@ -286,7 +286,11 @@
                 onfail="Flow count looks wrong: " + count )
 
     @staticmethod
-    def pingAllBasedOnIp( main, tag="", dumpflows=True ):
+    def pingAll( main, tag="", dumpflows=True, acceptableFailed=0, basedOnIp=False ):
+        '''
+        acceptableFailed: max number of acceptable failed pings. Only works for ping6
+        basedOnIp: if True, run ping or ping6 based on suffix of host names
+        '''
         main.log.report( "Check full connectivity" )
         print main.pingChart
         if tag == "":
@@ -300,16 +304,22 @@
                 expect = main.FALSE
             main.step( "Connectivity for %s %s" % ( str( hosts ), tag ) )
 
-            if ("v4" in hosts[0]):
+            if basedOnIp:
+                if ("v4" in hosts[0]):
+                    pa = main.Network.pingallHosts( hosts )
+                    utilities.assert_equals( expect=expect, actual=pa,
+                                             onpass="IPv4 connectivity successfully tested",
+                                             onfail="IPv4 connectivity failed" )
+                if ("v6" in hosts[0]):
+                    pa = main.Network.pingIpv6Hosts( hosts, acceptableFailed=acceptableFailed )
+                    utilities.assert_equals( expect=expect, actual=pa,
+                                             onpass="IPv6 connectivity successfully tested",
+                                             onfail="IPv6 connectivity failed" )
+            else:
                 pa = main.Network.pingallHosts( hosts )
                 utilities.assert_equals( expect=expect, actual=pa,
-                                         onpass="IPv4 connectivity successfully tested",
-                                         onfail="IPv4 connectivity failed" )
-            if ("v6" in hosts[0]):
-                pa = main.Network.pingIpv6Hosts( hosts )
-                utilities.assert_equals( expect=expect, actual=pa,
-                                         onpass="IPv6 connectivity successfully tested",
-                                         onfail="IPv6 connectivity failed" )
+                                         onpass="IP connectivity successfully tested",
+                                         onfail="IP connectivity failed" )
 
         if dumpflows:
             main.ONOSbench.dumpONOSCmd( main.Cluster.active( 0 ).ipAddress,
@@ -322,35 +332,6 @@
                                         tag + "_GroupsOn" )
 
     @staticmethod
-    def pingAll( main, tag="", dumpflows=True ):
-        main.log.report( "Check full connectivity" )
-        print main.pingChart
-        if tag == "":
-            tag = 'CASE%d' % main.CurrentTestCaseNumber
-        for entry in main.pingChart.itervalues():
-            print entry
-            hosts, expect = entry[ 'hosts' ], entry[ 'expect' ]
-            try:
-                expect = main.TRUE if str(expect).lower() == 'true' else main.FALSE
-            except:
-                expect = main.FALSE
-            main.step( "Connectivity for %s %s" % ( str( hosts ), tag ) )
-            pa = main.Network.pingallHosts( hosts )
-
-            utilities.assert_equals( expect=expect, actual=pa,
-                                     onpass="IP connectivity successfully tested",
-                                     onfail="IP connectivity failed" )
-        if dumpflows:
-            main.ONOSbench.dumpONOSCmd( main.Cluster.active( 0 ).ipAddress,
-                                        "flows",
-                                        main.logdir,
-                                        tag + "_FlowsOn" )
-            main.ONOSbench.dumpONOSCmd( main.Cluster.active( 0 ).ipAddress,
-                                        "groups",
-                                        main.logdir,
-                                        tag + "_GroupsOn" )
-
-    @staticmethod
     def killLink( main, end1, end2, switches, links ):
         """
         end1,end2: identify the switches, ex.: 'leaf1', 'spine1'