[ONOS-7747] Add router failure test cases to SRRouting

Change-Id: I06706c36caa181fff50c0f13c5976298e017940f
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
index 5bd3bdd..7ec46f2 100644
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
@@ -781,6 +781,40 @@
                                  onfail="Failed to recover switch?" )
 
     @staticmethod
+    def killRouter( main, router, sleep=None ):
+        """
+        Kill bgpd process on a quagga router
+        router: name of the router to be killed. E.g. "bgp1"
+        """
+        sleep = float( sleep )
+        main.step( "Kill " + str( router ) )
+        if hasattr( main, 'Mininet1' ):
+            main.Mininet1.handle.sendline( "px {}.stopProtocols()".format( router ) )
+            main.Mininet1.handle.expect( "mininet>" )
+        else:
+            # TODO: support killing router in physical network
+            pass
+        main.log.info( "Waiting %s seconds for router down to be discovered" % ( sleep ) )
+        time.sleep( sleep )
+
+    @staticmethod
+    def recoverRouter( main, router, sleep=None ):
+        """
+        Restart bgpd process on a quagga router
+        router: name of the router to be recovered. E.g. "bgp1"
+        """
+        sleep = float( sleep )
+        main.step( "Recovering " + str( router ) )
+        if hasattr( main, 'Mininet1' ):
+            main.Mininet1.handle.sendline( "px {}.startProtocols()".format( router ) )
+            main.Mininet1.handle.expect( "mininet>" )
+        else:
+            # TODO: support recovering router in physical network
+            pass
+        main.log.info( "Waiting %s seconds for router up to be discovered" % ( sleep ) )
+        time.sleep( sleep )
+
+    @staticmethod
     def cleanup( main, copyKarafLog=True, removeHostComponent=False ):
         """
         Stop Onos-cluster.
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/routinglib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/routinglib.py
index 621b372..13a75e2 100644
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/routinglib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/routinglib.py
@@ -156,6 +156,14 @@
         if self.defaultRoute:
             self.cmd('ip route add default via %s' % self.defaultRoute)
 
+    def stopProtocols(self, **kwargs):
+        for p in self.protocols:
+            p.stop(**kwargs)
+
+    def startProtocols(self, **kwargs):
+        for p in self.protocols:
+            p.start(**kwargs)
+
     def terminate(self, **kwargs):
         self.cmd("ps ax | grep '%s' | awk '{print $1}' | xargs kill"
                  % (self.socket))
@@ -175,6 +183,12 @@
     def config(self, **kwargs):
         pass
 
+    def stop(self, **kwargs):
+        pass
+
+    def start(self, **kwargs):
+        pass
+
     def terminate(self, **kwargs):
         pass
 
@@ -199,6 +213,14 @@
         self.qr.cmd('%s/bgpd -d -f %s -z %s -i %s'
                      % (QuaggaRouter.binDir, self.configFile, self.qr.socket, bgpdPidFile))
 
+    def stop(self, **kwargs):
+        self.qr.cmd('pkill -f %s' % self.configFile)
+
+    def start(self, **kwargs):
+        bgpdPidFile = '%s/bgpd%s.pid' % (self.qr.runDir, self.qr.name)
+        self.qr.cmd('%s/bgpd -d -f %s -z %s -i %s'
+                     % (QuaggaRouter.binDir, self.configFile, self.qr.socket, bgpdPidFile))
+
     def generateConfig(self):
         conf = ConfigurationWriter(self.configFile)