[ONOS-7524] Mininet based SRMulticast tests

Change-Id: I92f69417f10b24fad386fe348fa4ed148ad173e7
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 23d442d..ca86a89 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -1121,6 +1121,36 @@
                 main.log.exception( self.name + ": Uncaught exception!" )
                 main.cleanAndExit()
 
+    def addRoute( self, host, dstIP, interface, ipv6=False ):
+        """
+        Add a route to host
+        Ex: h1 route add -host 224.2.0.1 h1-eth0
+        """
+        if self.handle:
+            try:
+                cmd = str( host )
+                if ipv6:
+                    cmd += " route -A inet6 add "
+                else:
+                    cmd += " route add -host "
+                cmd += str( dstIP ) + " " + str( interface )
+                self.handle.sendline( cmd )
+                self.handle.expect( "mininet>" )
+                response = self.handle.before
+                main.log.debug( "response = " + response )
+                return main.TRUE
+            except pexpect.TIMEOUT:
+                main.log.error( self.name + ": TIMEOUT exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
+                main.cleanAndExit()
+            except pexpect.EOF:
+                main.log.error( self.name + ": EOF exception found" )
+                main.log.error( self.name + ":     " + self.handle.before )
+                return main.FALSE
+            except Exception:
+                main.log.exception( self.name + ": Uncaught exception!" )
+                main.cleanAndExit()
+
     def addStaticMACAddress( self, host, GW, macaddr ):
         """
            Changes the mac address of a gateway host"""
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index b7d10bd..03fb50f 100755
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -6115,3 +6115,205 @@
         except Exception:
             main.log.exception( self.name + ": Uncaught exception!" )
             main.cleanAndExit()
+
+    def mcastJoin( self, sIP, groupIP, sPort, dPorts ):
+        """
+        Create a multicast route by calling 'mcast-join' command
+        sIP: source IP of the multicast route
+        groupIP: group IP of the multicast route
+        sPort: source port (e.g. of:0000000000000001/3 ) of the multicast route
+        dPorts: a list of destination ports of the multicast route
+        Returns main.TRUE if mcast route is added; Otherwise main.FALSE
+        """
+        try:
+            cmdStr = "mcast-join"
+            cmdStr += " " + str( sIP )
+            cmdStr += " " + str( groupIP )
+            cmdStr += " " + str( sPort )
+            assert isinstance( dPorts, list )
+            for dPort in dPorts:
+                cmdStr += " " + str( dPort )
+            handle = self.sendline( cmdStr )
+            assert handle is not None, "Error in sendline"
+            assert "Command not found:" not in handle, handle
+            assert "Unsupported command:" not in handle, handle
+            assert "Error executing command" not in handle, handle
+            if "Added the mcast route" in handle:
+                return main.TRUE
+            else:
+                return main.FALSE
+        except AssertionError:
+            main.log.exception( "" )
+            return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def mcastDelete( self, sIP, groupIP, dPorts ):
+        """
+        Delete a multicast route by calling 'mcast-delete' command
+        sIP: source IP of the multicast route
+        groupIP: group IP of the multicast route
+        dPorts: a list of destination ports of the multicast route
+        Returns main.TRUE if mcast route is deleted; Otherwise main.FALSE
+        """
+        try:
+            cmdStr = "mcast-delete"
+            cmdStr += " " + str( sIP )
+            cmdStr += " " + str( groupIP )
+            assert isinstance( dPorts, list )
+            for dPort in dPorts:
+                cmdStr += " " + str( dPort )
+            handle = self.sendline( cmdStr )
+            assert handle is not None, "Error in sendline"
+            assert "Command not found:" not in handle, handle
+            assert "Unsupported command:" not in handle, handle
+            assert "Error executing command" not in handle, handle
+            if "Updated the mcast route" in handle:
+                return main.TRUE
+            else:
+                return main.FALSE
+        except AssertionError:
+            main.log.exception( "" )
+            return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def mcastHostJoin( self, sAddr, gAddr, srcs, sinks ):
+        """
+        Create a multicast route by calling 'mcast-host-join' command
+        sAddr: we can provide * for ASM or a specific address for SSM
+        gAddr: specifies multicast group address
+        srcs: a list of the source connect points e.g. ["of:0000000000000003/12"]
+        sinks: a list of HostId of the sinks e.g. ["00:AA:00:00:01:05/40"]
+        Returns main.TRUE if mcast route is added; Otherwise main.FALSE
+        """
+        try:
+            cmdStr = "mcast-host-join"
+            cmdStr += " -sAddr " + str( sAddr )
+            cmdStr += " -gAddr " + str( gAddr )
+            assert isinstance( srcs, list )
+            for src in srcs:
+                cmdStr += " -srcs " + str( src )
+            assert isinstance( sinks, list )
+            for sink in sinks:
+                cmdStr += " -sinks " + str( sink )
+            handle = self.sendline( cmdStr )
+            assert handle is not None, "Error in sendline"
+            assert "Command not found:" not in handle, handle
+            assert "Unsupported command:" not in handle, handle
+            assert "Error executing command" not in handle, handle
+            if "Added the mcast route" in handle:
+                return main.TRUE
+            else:
+                return main.FALSE
+        except AssertionError:
+            main.log.exception( "" )
+            return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def mcastHostDelete( self, sAddr, gAddr, host=None ):
+        """
+        Delete multicast sink(s) by calling 'mcast-host-delete' command
+        sAddr: we can provide * for ASM or a specific address for SSM
+        gAddr: specifies multicast group address
+        hosts: HostId of the sink e.g. "00:AA:00:00:01:05/40",
+               will delete the route if not specified
+        Returns main.TRUE if the mcast sink is deleted; Otherwise main.FALSE
+        """
+        try:
+            cmdStr = "mcast-host-delete"
+            cmdStr += " -sAddr " + str( sAddr )
+            cmdStr += " -gAddr " + str( gAddr )
+            if host:
+                cmdStr += " -h " + str( host )
+            handle = self.sendline( cmdStr )
+            assert handle is not None, "Error in sendline"
+            assert "Command not found:" not in handle, handle
+            assert "Unsupported command:" not in handle, handle
+            assert "Error executing command" not in handle, handle
+            if "Updated the mcast route" in handle:
+                return main.TRUE
+            elif "Deleted the mcast route" in handle:
+                return main.TRUE
+            else:
+                return main.FALSE
+        except AssertionError:
+            main.log.exception( "" )
+            return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
+
+    def mcastSourceDelete( self, sAddr, gAddr, srcs=None ):
+        """
+        Delete multicast src(s) by calling 'mcast-source-delete' command
+        sAddr: we can provide * for ASM or a specific address for SSM
+        gAddr: specifies multicast group address
+        srcs: a list of connect points of the sources e.g. ["00:AA:00:00:01:05/40"],
+              will delete the route if not specified
+        Returns main.TRUE if mcast sink is deleted; Otherwise main.FALSE
+        """
+        try:
+            cmdStr = "mcast-source-delete"
+            cmdStr += " -sAddr " + str( sAddr )
+            cmdStr += " -gAddr " + str( gAddr )
+            if srcs:
+                assert isinstance( srcs, list )
+                for src in srcs:
+                    cmdStr += " -src " + str( src )
+            handle = self.sendline( cmdStr )
+            assert handle is not None, "Error in sendline"
+            assert "Command not found:" not in handle, handle
+            assert "Unsupported command:" not in handle, handle
+            assert "Error executing command" not in handle, handle
+            if "Updated the mcast route" in handle:
+                return main.TRUE
+            elif "Deleted the mcast route" in handle:
+                return main.TRUE
+            else:
+                return main.FALSE
+        except AssertionError:
+            main.log.exception( "" )
+            return None
+        except TypeError:
+            main.log.exception( self.name + ": Object not as expected" )
+            return None
+        except pexpect.EOF:
+            main.log.error( self.name + ": EOF exception found" )
+            main.log.error( self.name + ":    " + self.handle.before )
+            main.cleanAndExit()
+        except Exception:
+            main.log.exception( self.name + ": Uncaught exception!" )
+            main.cleanAndExit()
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.params b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.params
index 0189744..6af0cde 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.params
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.params
@@ -1,5 +1,5 @@
 <PARAMS>
-    <testcases>1</testcases>
+    <testcases>1,2,3,4,5,6,7,8,101,102,103,201</testcases>
 
     <GRAPH>
         <nodeCluster>Fabric</nodeCluster>
@@ -7,20 +7,21 @@
     </GRAPH>
 
     <SCALE>
-        <size>1</size>
-        <max>1</max>
+        <size>3</size>
+        <max>3</max>
     </SCALE>
 
     <DEPENDENCY>
         <useCommonConf>False</useCommonConf>
         <useCommonTopo>True</useCommonTopo>
-        <topology>trellis_fabric.py</topology>
+        <topology>hagg_fabric.py</topology>
         <lib>routinglib.py,trellislib.py</lib>
+        <conf>bgpdbgp1.conf,bgpdbgp2.conf,bgpdr1.conf,bgpdr2.conf,dhcpd6.conf,dhcpd.conf,zebradbgp1.conf,zebradbgp2.conf</conf>
     </DEPENDENCY>
 
     <ENV>
         <cellName>productionCell</cellName>
-        <cellApps>drivers,segmentrouting,openflow,fpm,netcfghostprovider</cellApps>
+        <cellApps>drivers,segmentrouting,openflow,fpm,dhcprelay,netcfghostprovider,routeradvertisement,t3,mcast</cellApps>
     </ENV>
 
     <GIT>
@@ -33,11 +34,17 @@
     </CTRL>
 
     <timers>
-        <LinkDiscovery>12</LinkDiscovery>
-        <SwitchDiscovery>12</SwitchDiscovery>
+        <LinkDiscovery>30</LinkDiscovery>
+        <SwitchDiscovery>30</SwitchDiscovery>
+        <OnosDiscovery>30</OnosDiscovery>
+        <loadNetcfgSleep>5</loadNetcfgSleep>
+        <startMininetSleep>60</startMininetSleep>
+        <balanceMasterSleep>10</balanceMasterSleep>
+        <mcastSleep>5</mcastSleep>
     </timers>
 
-    <SLEEP>
-        <startup>10</startup>
-    </SLEEP>
+    <SCAPY>
+        <HOSTNAMES>h1v4,h3v4,h4v4,h8v4,h1v6,h3v6,h4v6,h8v6</HOSTNAMES>
+    </SCAPY>
+
 </PARAMS>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.py b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.py
index 616ba4c..b2a7139 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.py
@@ -4,8 +4,12 @@
 
     def CASE1( self, main ):
         """
-        Sets up 3 ONOS instances
-        Start 2x2 topology of hardware switches
+        Sets up 3 ONOS instances, start H-AGG topology
+        Create a Multicast flow between a source and sink on the same dual-tor leaf
+        Verify flows and groups
+        Verify traffic
+        Remove sink
+        Verify flows and groups
         """
         try:
             from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
@@ -18,135 +22,260 @@
             main.funcs = SRMulticastTest()
         main.funcs.runTest( main,
                             test_idx=1,
-                            topology='2x2',
-                            onosNodes=1,
-                            description="TBD" )
+                            onosNodes=3,
+                            description="Create a Multicast flow between a source and sink on the same dual-tor leaf" )
 
-    def CASE01( self, main ):
+    def CASE2( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Create a Multicast flow between a source and sink on the same dual-tor leaf
-        Verify flows and groups
-        Verify traffic
-        Remove sink
-        Verify flows and groups
-        """
-        pass
-
-    def CASE02( self, main ):
-        """
-        Sets up 3 ONOS instances, start 2x5 topology
+        Sets up 3 ONOS instances, start H-AGG topology
         Create a Multicast flow between a source and sink on different dual-tor leaves
         Verify flows and groups
         Verify traffic
         Remove sink
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=2,
+                            onosNodes=3,
+                            description="Create a Multicast flow between a source and sink on different dual-tor leaves" )
 
-    def CASE03( self, main ):
+    def CASE3( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
+        Sets up 3 ONOS instances, start H-AGG topology
         Create a Multicast flow between a source and sink on different leaves (sink on single-tor)
         Verify flows and groups
         Verify traffic
         Remove sink
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=3,
+                            onosNodes=3,
+                            description="Create a Multicast flow between a source and sink on different leaves (sink on single-tor)" )
 
-    def CASE04( self, main ):
+    def CASE4( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE01 and CASE02
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE1 and CASE2
         Verify flows and groups
         Verify traffic
         Remove sinks
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=4,
+                            onosNodes=3,
+                            description="Combines CASE1 and CASE2" )
 
-    def CASE05( self, main ):
+    def CASE5( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE02 and CASE03
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE2 and CASE3
         Verify flows and groups
         Verify traffic
         Remove sinks
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=5,
+                            onosNodes=3,
+                            description="Combines CASE2 and CASE3" )
 
-    def CASE06( self, main ):
+    def CASE6( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE01 and CASE03
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE1 and CASE3
         Verify flows and groups
         Verify traffic
         Remove sinks
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=5,
+                            onosNodes=3,
+                            description="Combines CASE1 and CASE3" )
 
-    def CASE07( self, main ):
+    def CASE7( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE01, CASE02 and CASE03
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE1, CASE2 and CASE3
         Verify flows and groups
         Verify traffic
         Remove sinks
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=7,
+                            onosNodes=3,
+                            description="Combines CASE7 with route removal" )
 
-    def CASE08( self, main ):
+    def CASE8( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with route removal
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with route removal
         Verify flows and groups
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=8,
+                            onosNodes=3,
+                            description="Combines CASE7 with route removal",
+                            removeRoute=True )
 
     def CASE101( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with a link failure (link ingress-spine)
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with a link failure (link ingress-spine)
         Verify flows and groups
         Verify traffic
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=101,
+                            onosNodes=3,
+                            description="Combines CASE7 with a link failure (link ingress-spine)",
+                            linkFailure=True )
 
     def CASE102( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with a link failure (link spine-egress-dt-leaf)
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with a link failure (link spine-egress-dt-leaf)
         Verify flows and groups
         Verify traffic
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=102,
+                            onosNodes=3,
+                            description="Combines CASE7 with a link failure (link spine-engress-dt-leaf)",
+                            linkFailure=True )
 
     def CASE103( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with a link failure (link spine-egress-st-leaf)
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with a link failure (link spine-egress-st-leaf)
         Verify flows and groups
         Verify traffic
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=103,
+                            onosNodes=3,
+                            description="Combines CASE7 with a link failure (link spine-engress-st-leaf)",
+                            linkFailure=True )
 
     def CASE201( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with spine failure
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with spine failure
         Verify flows and groups
         Verify traffic
         """
-        pass
+        try:
+            from tests.USECASE.SegmentRouting.SRMulticast.dependencies.SRMulticastTest import SRMulticastTest
+        except ImportError:
+            main.log.error( "SRMulticastTest not found. Exiting the test" )
+            main.cleanAndExit()
+        try:
+            main.funcs
+        except ( NameError, AttributeError ):
+            main.funcs = SRMulticastTest()
+        main.funcs.runTest( main,
+                            test_idx=201,
+                            onosNodes=3,
+                            description="Combines CASE7 with spine failure",
+                            switchFailure=True )
 
     def CASE202( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with ingress failure and recovery
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with ingress failure and recovery
         Verify flows and groups are removed (failure)
         Verify flows and groups (recovery)
         Verify traffic (recovery)
@@ -155,8 +284,8 @@
 
     def CASE203( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with egress-dt-leaf failure and recovery
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with egress-dt-leaf failure and recovery
         Verify flows and groups are removed for the failing sink (failure)
         Verify traffic on remaining sinks (failure)
         Verify flows and groups (recovery)
@@ -166,8 +295,8 @@
 
     def CASE204( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with egress-st-leaf failure and recovery
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with egress-st-leaf failure and recovery
         Verify flows and groups are removed for the failing sink (failure)
         Verify traffic on remaining sinks (failure)
         Verify flows and groups (recovery)
@@ -177,8 +306,8 @@
 
     def CASE205( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with egress leaves failure and recovery
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with egress leaves failure and recovery
         Verify flows and groups are removed for the failing sinks (failure)
         Verify traffic on remaining sink (failure)
         Verify flows and groups (recovery)
@@ -188,8 +317,8 @@
 
     def CASE301( self, main ):
         """
-        Sets up 3 ONOS instances, start 2x5 topology
-        Combines CASE07 with ONOS failure and recovery
+        Sets up 3 ONOS instances, start H-AGG topology
+        Combines CASE7 with ONOS failure and recovery
         Verify flows and groups (failure)
         Verify traffic (failure)
         Verify flows and groups (recovery)
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
index 34a2013..1c3f8a6 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo
@@ -16,151 +16,32 @@
                 <rest_port></rest_port>
                 <prompt></prompt>  # TODO: we technically need a few of these, one per component
                 <onos_home></onos_home>  # defines where onos home is
-                <nodes>1</nodes>  # number of nodes in the cluster
+                <nodes>3</nodes>  # number of nodes in the cluster
             </COMPONENTS>
         </ONOScell>
 
-        <OFDPASwitchLeaf205>
-            <host>10.128.0.205</host>
-            <user>root</user>
-            <password>onl</password>
-            <type>OFDPASwitchDriver</type>
-            <connect_order>2</connect_order>
-            <COMPONENTS>
-                <shortName>leaf205</shortName>
-                <dpid>0x205</dpid>
-                <port1>49</port1>
-                <link1>OFDPASwitchSpine227</link1>
-                <port2>51</port2>
-                <link2>OFDPASwitchSpine228</link2>
-                <port3>33</port3>
-                <link3>Host1</link3>
-                <port4>44</port4>
-                <link4>Host2</link4>
-            </COMPONENTS>
-        </OFDPASwitchLeaf205>
-
-        <OFDPASwitchLeaf206>
-            <host>10.128.0.206</host>
-            <user>root</user>
-            <password>onl</password>
-            <type>OFDPASwitchDriver</type>
-            <connect_order>3</connect_order>
-            <COMPONENTS>
-                <shortName>leaf206</shortName>
-                <dpid>0x206</dpid>
-                <port1>49</port1>
-                <link1>OFDPASwitchSpine227</link1>
-                <port2>51</port2>
-                <link2>OFDPASwitchSpine228</link2>
-                <port3>33</port3>
-                <link3>Host3</link3>
-                <port4>44</port4>
-                <link4>Host4</link4>
-            </COMPONENTS>
-        </OFDPASwitchLeaf206>
-
-        <OFDPASwitchSpine227>
-            <host>10.128.0.227</host>
-            <user>root</user>
-            <password>onl</password>
-            <type>OFDPASwitchDriver</type>
-            <connect_order>4</connect_order>
-            <COMPONENTS>
-                <shortName>spine227</shortName>
-                <dpid>0x227</dpid>
-                <port1>25</port1>
-                <link1>OFDPASwitchLeaf205</link1>
-                <port2>27</port2>
-                <link2>OFDPASwitchLeaf206</link2>
-            </COMPONENTS>
-        </OFDPASwitchSpine227>
-
-        <OFDPASwitchSpine228>
-            <host>10.128.0.228</host>
-            <user>root</user>
-            <password>onl</password>
-            <type>OFDPASwitchDriver</type>
-            <connect_order>5</connect_order>
-            <COMPONENTS>
-                <shortName>spine228</shortName>
-                <dpid>0x228</dpid>
-                <port1>25</port1>
-                <link1>OFDPASwitchLeaf205</link1>
-                <port2>27</port2>
-                <link2>OFDPASwitchLeaf206</link2>
-            </COMPONENTS>
-        </OFDPASwitchSpine228>
-
-        <Host1>
-            <host>10.128.100.58</host>
-            <user>mininet</user>
-            <password>mininet</password>
-            <type>HostDriver</type>
-            <connect_order>6</connect_order>
-            <COMPONENTS>
-                <ip>10.0.10.10</ip>
-                <ip6></ip6>
-                <shortName>h1</shortName>
-                <port1>0</port1>
-                <link1>OFDPASwitchLeaf205</link1>
-            </COMPONENTS>
-        </Host1>
-
-        <Host2>
-            <host>10.128.100.59</host>
-            <user>mininet</user>
-            <password>mininet</password>
-            <type>HostDriver</type>
-            <connect_order>7</connect_order>
-            <COMPONENTS>
-                <ip>10.0.10.20</ip>
-                <ip6></ip6>
-                <shortName>h2</shortName>
-                <port1>0</port1>
-                <link1>OFDPASwitchLeaf205</link1>
-            </COMPONENTS>
-        </Host2>
-
-        <Host3>
-            <host>10.128.100.60</host>
-            <user>mininet</user>
-            <password>mininet</password>
-            <type>HostDriver</type>
-            <connect_order>8</connect_order>
-            <COMPONENTS>
-                <ip>10.0.20.10</ip>
-                <ip6></ip6>
-                <shortName>h3</shortName>
-                <port1>0</port1>
-                <link1>OFDPASwitchLeaf206</link1>
-            </COMPONENTS>
-        </Host3>
-
-        <Host4>
-            <host>10.128.100.61</host>
-            <user>mininet</user>
-            <password>mininet</password>
-            <type>HostDriver</type>
-            <connect_order>9</connect_order>
-            <COMPONENTS>
-                <ip>10.0.20.20</ip>
-                <ip6></ip6>
-                <shortName>h4</shortName>
-                <port1>0</port1>
-                <link1>OFDPASwitchLeaf206</link1>
-            </COMPONENTS>
-        </Host4>
-
-        <NetworkBench>
-            <host>localhost</host>
+        <Mininet1>
+            <host>OCN</host>
             <user>sdn</user>
             <password>rocks</password>
-            <type>NetworkDriver</type>
-            <connect_order>10</connect_order>
+            <type>MininetCliDriver</type>
+            <connect_order>2</connect_order>
             <COMPONENTS>
+                <home>~/mininet/custom/</home>
+                <prompt></prompt>
             </COMPONENTS>
-        </NetworkBench>
+        </Mininet1>
+
+        <Scapy>
+            <host>OCN</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>MininetScapyCliDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+                <prompt></prompt>
+            </COMPONENTS>
+        </Scapy>
 
     </COMPONENT>
 </TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.physical b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.physical
new file mode 100644
index 0000000..34a2013
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/SRMulticast.topo.physical
@@ -0,0 +1,166 @@
+<TOPOLOGY>
+    <COMPONENT>
+        <ONOScell>
+            <host>localhost</host>  # ONOS "bench" machine
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosClusterDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+                <cluster_name></cluster_name>  # Used as a prefix for cluster components. Defaults to 'ONOS'
+                <diff_clihost></diff_clihost> # if it has different host other than localhost for CLI. True or empty. OC# will be used if True.
+                <karaf_username></karaf_username>
+                <karaf_password></karaf_password>
+                <web_user></web_user>
+                <web_pass></web_pass>
+                <rest_port></rest_port>
+                <prompt></prompt>  # TODO: we technically need a few of these, one per component
+                <onos_home></onos_home>  # defines where onos home is
+                <nodes>1</nodes>  # number of nodes in the cluster
+            </COMPONENTS>
+        </ONOScell>
+
+        <OFDPASwitchLeaf205>
+            <host>10.128.0.205</host>
+            <user>root</user>
+            <password>onl</password>
+            <type>OFDPASwitchDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS>
+                <shortName>leaf205</shortName>
+                <dpid>0x205</dpid>
+                <port1>49</port1>
+                <link1>OFDPASwitchSpine227</link1>
+                <port2>51</port2>
+                <link2>OFDPASwitchSpine228</link2>
+                <port3>33</port3>
+                <link3>Host1</link3>
+                <port4>44</port4>
+                <link4>Host2</link4>
+            </COMPONENTS>
+        </OFDPASwitchLeaf205>
+
+        <OFDPASwitchLeaf206>
+            <host>10.128.0.206</host>
+            <user>root</user>
+            <password>onl</password>
+            <type>OFDPASwitchDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS>
+                <shortName>leaf206</shortName>
+                <dpid>0x206</dpid>
+                <port1>49</port1>
+                <link1>OFDPASwitchSpine227</link1>
+                <port2>51</port2>
+                <link2>OFDPASwitchSpine228</link2>
+                <port3>33</port3>
+                <link3>Host3</link3>
+                <port4>44</port4>
+                <link4>Host4</link4>
+            </COMPONENTS>
+        </OFDPASwitchLeaf206>
+
+        <OFDPASwitchSpine227>
+            <host>10.128.0.227</host>
+            <user>root</user>
+            <password>onl</password>
+            <type>OFDPASwitchDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS>
+                <shortName>spine227</shortName>
+                <dpid>0x227</dpid>
+                <port1>25</port1>
+                <link1>OFDPASwitchLeaf205</link1>
+                <port2>27</port2>
+                <link2>OFDPASwitchLeaf206</link2>
+            </COMPONENTS>
+        </OFDPASwitchSpine227>
+
+        <OFDPASwitchSpine228>
+            <host>10.128.0.228</host>
+            <user>root</user>
+            <password>onl</password>
+            <type>OFDPASwitchDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <shortName>spine228</shortName>
+                <dpid>0x228</dpid>
+                <port1>25</port1>
+                <link1>OFDPASwitchLeaf205</link1>
+                <port2>27</port2>
+                <link2>OFDPASwitchLeaf206</link2>
+            </COMPONENTS>
+        </OFDPASwitchSpine228>
+
+        <Host1>
+            <host>10.128.100.58</host>
+            <user>mininet</user>
+            <password>mininet</password>
+            <type>HostDriver</type>
+            <connect_order>6</connect_order>
+            <COMPONENTS>
+                <ip>10.0.10.10</ip>
+                <ip6></ip6>
+                <shortName>h1</shortName>
+                <port1>0</port1>
+                <link1>OFDPASwitchLeaf205</link1>
+            </COMPONENTS>
+        </Host1>
+
+        <Host2>
+            <host>10.128.100.59</host>
+            <user>mininet</user>
+            <password>mininet</password>
+            <type>HostDriver</type>
+            <connect_order>7</connect_order>
+            <COMPONENTS>
+                <ip>10.0.10.20</ip>
+                <ip6></ip6>
+                <shortName>h2</shortName>
+                <port1>0</port1>
+                <link1>OFDPASwitchLeaf205</link1>
+            </COMPONENTS>
+        </Host2>
+
+        <Host3>
+            <host>10.128.100.60</host>
+            <user>mininet</user>
+            <password>mininet</password>
+            <type>HostDriver</type>
+            <connect_order>8</connect_order>
+            <COMPONENTS>
+                <ip>10.0.20.10</ip>
+                <ip6></ip6>
+                <shortName>h3</shortName>
+                <port1>0</port1>
+                <link1>OFDPASwitchLeaf206</link1>
+            </COMPONENTS>
+        </Host3>
+
+        <Host4>
+            <host>10.128.100.61</host>
+            <user>mininet</user>
+            <password>mininet</password>
+            <type>HostDriver</type>
+            <connect_order>9</connect_order>
+            <COMPONENTS>
+                <ip>10.0.20.20</ip>
+                <ip6></ip6>
+                <shortName>h4</shortName>
+                <port1>0</port1>
+                <link1>OFDPASwitchLeaf206</link1>
+            </COMPONENTS>
+        </Host4>
+
+        <NetworkBench>
+            <host>localhost</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>NetworkDriver</type>
+            <connect_order>10</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </NetworkBench>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/SRMulticastTest.py b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/SRMulticastTest.py
index e822c29..734dc52 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/SRMulticastTest.py
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/SRMulticastTest.py
@@ -19,19 +19,16 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 """
 
+import time
 from tests.USECASE.SegmentRouting.dependencies.Testcaselib import Testcaselib as run
 
 class SRMulticastTest ():
 
     def __init__( self ):
         self.default = ''
-        self.topo = dict()
-        # (number of spine switch, number of leaf switch, dual-homed, description, minFlowCount - leaf)
-        self.topo[ '2x2' ] = ( 2, 2, False, '2x2 leaf-spine topology', 1 )
-        self.switchNames = {}
-        self.switchNames[ '2x2' ] = [ "leaf205", "leaf206", "spine227", "spine228" ]
+        self.switchNames = [ "leaf205", "leaf206", "spine227", "spine228" ]
 
-    def runTest( self, main, test_idx, topology, onosNodes, description, vlan = [] ):
+    def runTest( self, main, test_idx, onosNodes, description, removeRoute=False, linkFailure=False, switchFailure=False ):
         skipPackage = False
         init = False
         if not hasattr( main, 'apps' ):
@@ -41,21 +38,76 @@
         if not init and onosNodes == main.Cluster.numCtrls:
             skipPackage = True
 
-        main.case( '%s, with %s and %d ONOS instance%s' %
-                   ( description, self.topo[ topology ][ 3 ], onosNodes, 's' if onosNodes > 1 else '' ) )
-
-        main.cfgName = 'CASE%01d%01d' % ( test_idx / 10, ( ( test_idx - 1 ) % 10 ) % 4 + 1 )
+        main.resultFileName = 'CASE%03d' % test_idx
         main.Cluster.setRunningNode( onosNodes )
         run.installOnos( main, skipPackage=skipPackage, cliSleep=5 )
+        # Load configuration files
+        main.step("Load configurations")
+        main.cfgName = 'TEST_CONFIG_ipv4=1_ipv6=1_dhcp=1_routers=1'
+        run.loadJson( main )
+        main.cfgName = 'CASE%03d' % test_idx
+        run.loadMulticastConfig( main )
+        if linkFailure:
+            run.loadLinkFailureChart( main )
+        if switchFailure:
+            run.loadSwitchFailureChart( main )
+        time.sleep( float( main.params[ 'timers' ][ 'loadNetcfgSleep' ] ) )
+
         if hasattr( main, 'Mininet1' ):
-            # TODO Mininet implementation
-            pass
+            # Run the test with Mininet
+            mininet_args = ' --dhcp=1 --routers=1 --ipv6=1 --ipv4=1'
+            run.startMininet( main, main.params['DEPENDENCY']['topology'], args=mininet_args )
+            time.sleep( float( main.params[ 'timers' ][ 'startMininetSleep' ] ) )
         else:
             # Run the test with physical devices
-            run.connectToPhysicalNetwork( main, self.switchNames[ topology ] )
-        # Check if the devices are up
-        run.checkDevices( main, switches=len(self.switchNames[ topology ]))
-        # Check the flows against the devices
-        run.checkFlows( main, minFlowCount=self.topo[ topology ][ 4 ] * self.topo[ topology ][ 1 ], sleep=5 )
+            run.connectToPhysicalNetwork( main, self.switchNames )
+            # Check if the devices are up
+            run.checkDevices( main, switches=len( self.switchNames ) )
+
+        # Create scapy components
+        run.startScapyHosts( main )
+
+        for entry in main.multicastConfig:
+            main.step("Verify adding multicast route with group IP {}".format(entry["group"]))
+            # Create a multicast route
+            main.Cluster.active( 0 ).CLI.mcastHostJoin( entry["sIP"], entry["group"], entry["sPorts"], entry["dHosts"] )
+            time.sleep( float( main.params[ 'timers' ][ 'mcastSleep' ] ) )
+            # Check the flows against the devices
+            # run.checkFlows( main, minFlowCount=2, sleep=5 )
+            # Verify multicast traffic
+            run.verifyMulticastTraffic( main, entry, True, skipOnFail=True )
+
+            # Test switch failures
+            if switchFailure:
+                for switch, expected in main.switchFailureChart.items():
+                    run.killSwitch( main, switch, expected['switches_after_failure'], expected['links_after_failure'] )
+                    run.verifyMulticastTraffic( main, entry, True, skipOnFail=True )
+
+                    run.recoverSwitch( main, switch, expected['switches_before_failure'], expected['links_before_failure'] )
+                    run.verifyMulticastTraffic( main, entry, True, skipOnFail=True )
+
+            # Test link failures
+            if linkFailure:
+                for link_batch_name, info in main.linkFailureChart.items():
+                    linksToRemove = info['links'].values()
+                    linksBefore = info['links_before']
+                    linksAfter = info['links_after']
+
+                    run.killLinkBatch( main, linksToRemove, linksAfter, switches=10 )
+                    run.verifyMulticastTraffic( main, entry, True, skipOnFail=True )
+
+                    run.restoreLinkBatch( main, linksToRemove, linksBefore, switches=10 )
+                    run.verifyMulticastTraffic( main, entry, True, skipOnFail=True )
+
+            if removeRoute:
+                main.step("Verify deleting multicast route with group IP {}".format(entry["group"]))
+                # delete a multicast route
+                main.Cluster.active( 0 ).CLI.mcastHostDelete( entry["sIP"], entry["group"] )
+                time.sleep( float( main.params[ 'timers' ][ 'mcastSleep' ] ) )
+                # Check the flows against the devices
+                # run.checkFlows( main, minFlowCount=2, sleep=5 )
+                # Verify multicast traffic (traffic check is expected to fail)
+                run.verifyMulticastTraffic( main, entry, False, skipOnFail=True )
+
         # Clean up the environment
-        run.cleanup( main, physical=(not hasattr( main, 'Mininet1' )))
+        run.cleanup( main, copyKarafLog=False )
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp1.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp1.conf
index 8870fb4..474bf02 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp1.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp1.conf
@@ -8,6 +8,21 @@
 ip prefix-list 1 seq 20 permit 10.1.2.0/24
 ip prefix-list 1 seq 30 permit 10.0.3.0/24
 ip prefix-list 1 seq 40 permit 10.0.4.0/24
+
+ip prefix-list 1 seq 50 permit 10.1.0.0/24
+ip prefix-list 1 seq 70 permit 10.1.10.0/24
+ip prefix-list 1 seq 80 permit 10.2.0.0/24
+ip prefix-list 1 seq 90 permit 10.2.30.0/24
+ip prefix-list 1 seq 100 permit 10.2.20.0/24
+ip prefix-list 1 seq 110 permit 10.2.10.0/24
+ip prefix-list 1 seq 120 permit 10.2.40.0/24
+ip prefix-list 1 seq 130 permit 10.3.0.0/24
+ip prefix-list 1 seq 140 permit 10.3.30.0/24
+ip prefix-list 1 seq 150 permit 10.3.10.0/24
+ip prefix-list 1 seq 160 permit 10.3.20.0/24
+ip prefix-list 1 seq 170 permit 10.5.10.0/24
+ip prefix-list 1 seq 180 permit 10.5.20.0/24
+
 !
 route-map NEXTHOP41 permit 10
 match ip address prefix-list 1
@@ -22,6 +37,20 @@
 !
 ipv6 prefix-list 2 seq 10 permit 2000::200/120
 ipv6 prefix-list 2 seq 20 permit 2000::300/120
+
+ipv6 prefix-list 2 seq 30 permit 1000::300/120
+ipv6 prefix-list 2 seq 40 permit 1001::300/120
+ipv6 prefix-list 2 seq 50 permit 1002::300/120
+ipv6 prefix-list 2 seq 60 permit 1003::300/120
+ipv6 prefix-list 2 seq 70 permit 1004::300/120
+ipv6 prefix-list 2 seq 80 permit 1005::300/120
+ipv6 prefix-list 2 seq 90 permit 1006::300/120
+ipv6 prefix-list 2 seq 100 permit 1007::300/120
+ipv6 prefix-list 2 seq 110 permit 1008::300/120
+ipv6 prefix-list 2 seq 120 permit 1009::300/120
+ipv6 prefix-list 2 seq 130 permit 1010::300/120
+ipv6 prefix-list 2 seq 140 permit 1011::300/120
+ipv6 prefix-list 2 seq 150 permit 1012::300/120
 !
 route-map NEXTHOP61 permit 10
 match ipv6 address prefix-list 2
@@ -64,6 +93,21 @@
 neighbor 2000::701 advertisement-interval 1
 no neighbor 2000::701 activate
 !
+
+network 10.1.0.0/24
+network 10.1.10.0/24
+network 10.2.0.0/24
+network 10.2.30.0/24
+network 10.2.20.0/24
+network 10.2.10.0/24
+network 10.2.40.0/24
+network 10.3.0.0/24
+network 10.3.30.0/24
+network 10.3.10.0/24
+network 10.3.20.0/24
+network 10.5.10.0/24
+network 10.5.20.0/24
+
 network 10.0.2.0/24
 network 10.1.2.0/24
 network 10.0.3.0/24
@@ -72,8 +116,24 @@
 ! IPv6
 !
 address-family ipv6
+
+network 1000::300/120
+network 1001::300/120
+network 1002::300/120
+network 1003::300/120
+network 1004::300/120
+network 1005::300/120
+network 1006::300/120
+network 1007::300/120
+network 1008::300/120
+network 1009::300/120
+network 1010::300/120
+network 1011::300/120
+network 1012::300/120
+
 network 2000::200/120
 network 2000::300/120
+
 neighbor 2000::101 activate
 neighbor 2000::101 route-map NEXTHOP61 out
 neighbor 2000::701 activate
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp2.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp2.conf
index e554de4..421d5c2 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp2.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/bgpdbgp2.conf
@@ -8,6 +8,21 @@
 ip prefix-list 1 seq 20 permit 10.1.2.0/24
 ip prefix-list 1 seq 30 permit 10.0.3.0/24
 ip prefix-list 1 seq 40 permit 10.0.4.0/24
+
+ip prefix-list 1 seq 50 permit 10.1.0.0/24
+ip prefix-list 1 seq 60 permit 10.1.10.0/24
+ip prefix-list 1 seq 70 permit 10.2.0.0/24
+ip prefix-list 1 seq 80 permit 10.2.30.0/24
+ip prefix-list 1 seq 90 permit 10.2.20.0/24
+ip prefix-list 1 seq 100 permit 10.2.10.0/24
+ip prefix-list 1 seq 110 permit 10.2.40.0/24
+ip prefix-list 1 seq 120 permit 10.3.0.0/24
+ip prefix-list 1 seq 130 permit 10.3.30.0/24
+ip prefix-list 1 seq 140 permit 10.3.10.0/24
+ip prefix-list 1 seq 150 permit 10.3.20.0/24
+ip prefix-list 1 seq 160 permit 10.5.10.0/24
+ip prefix-list 1 seq 170 permit 10.5.20.0/24
+
 !
 route-map NEXTHOP45 permit 10
 match ip address prefix-list 1
@@ -22,6 +37,22 @@
 !
 ipv6 prefix-list 2 seq 10 permit 2000::200/120
 ipv6 prefix-list 2 seq 20 permit 2000::300/120
+
+ipv6 prefix-list 2 seq 30 permit 1000::300/120
+ipv6 prefix-list 2 seq 40 permit 1001::300/120
+ipv6 prefix-list 2 seq 50 permit 1002::300/120
+ipv6 prefix-list 2 seq 60 permit 1003::300/120
+ipv6 prefix-list 2 seq 70 permit 1004::300/120
+ipv6 prefix-list 2 seq 80 permit 1005::300/120
+ipv6 prefix-list 2 seq 90 permit 1006::300/120
+ipv6 prefix-list 2 seq 100 permit 1007::300/120
+ipv6 prefix-list 2 seq 110 permit 1008::300/120
+ipv6 prefix-list 2 seq 120 permit 1009::300/120
+ipv6 prefix-list 2 seq 130 permit 1010::300/120
+ipv6 prefix-list 2 seq 140 permit 1011::300/120
+ipv6 prefix-list 2 seq 150 permit 1012::300/120
+!
+
 !
 route-map NEXTHOP65 permit 10
 match ipv6 address prefix-list 2
@@ -64,6 +95,22 @@
 neighbor 2000::601 advertisement-interval 1
 no neighbor 2000::601 activate
 !
+
+network 10.1.0.0/24
+network 10.1.10.0/24
+network 10.2.0.0/24
+network 10.2.30.0/24
+network 10.2.20.0/24
+network 10.2.10.0/24
+network 10.2.40.0/24
+network 10.3.0.0/24
+network 10.3.30.0/24
+network 10.3.10.0/24
+network 10.3.20.0/24
+network 10.5.10.0/24
+network 10.5.20.0/24
+
+network 10.1.0.0/24
 network 10.0.2.0/24
 network 10.1.2.0/24
 network 10.0.3.0/24
@@ -72,6 +119,21 @@
 ! IPv6
 !
 address-family ipv6
+
+network 1000::300/120
+network 1001::300/120
+network 1002::300/120
+network 1003::300/120
+network 1004::300/120
+network 1005::300/120
+network 1006::300/120
+network 1007::300/120
+network 1008::300/120
+network 1009::300/120
+network 1010::300/120
+network 1011::300/120
+network 1012::300/120
+
 network 2000::200/120
 network 2000::300/120
 neighbor 2000::501 activate
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd.conf
index aa559d2..2676b07 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd.conf
@@ -6,50 +6,138 @@
 option domain-name-servers 8.8.8.8, 8.8.4.4;
 option domain-name "trellis.local";
 
-subnet 10.0.2.0 netmask 255.255.255.0 {
-  range 10.0.2.100 10.0.2.240;
-  option routers 10.0.2.254;
-}
-
-subnet 10.1.2.0 netmask 255.255.255.0 {
-  range 10.1.2.100 10.1.2.240;
-  option routers 10.1.2.254;
-}
-
 subnet 10.0.3.0 netmask 255.255.255.0 {
   range 10.0.3.100 10.0.3.240;
   option routers 10.0.3.254;
 }
 
-subnet 10.0.4.0 netmask 255.255.255.0 {
-  range 10.0.4.100 10.0.4.240;
-  option routers 10.0.4.254;
+subnet 10.1.0.0 netmask 255.255.255.0 {
+  range 10.1.0.1 10.1.0.100;
+  option routers 10.1.0.254;
 }
 
-subnet 10.0.99.3 netmask 255.255.255.255 {
+subnet 10.1.10.0 netmask 255.255.255.0 {
+  range 10.1.10.1 10.1.10.100;
+  option routers 10.1.10.254;
 }
 
-host h1 {
+subnet 10.2.0.0 netmask 255.255.255.0 {
+  range 10.2.0.1 10.2.0.100;
+  option routers 10.2.0.254;
+}
+
+subnet 10.2.30.0 netmask 255.255.255.0 {
+  range 10.2.30.1 10.2.30.100;
+  option routers 10.2.30.254;
+}
+
+subnet 10.2.20.0 netmask 255.255.255.0 {
+  range 10.2.20.1 10.2.20.100;
+  option routers 10.2.20.254;
+}
+
+subnet 10.2.10.0 netmask 255.255.255.0 {
+  range 10.2.10.1 10.2.10.100;
+  option routers 10.2.10.254;
+}
+
+subnet 10.2.40.0 netmask 255.255.255.0 {
+  range 10.2.40.1 10.2.40.100;
+  option routers 10.2.40.254;
+}
+
+subnet 10.3.0.0 netmask 255.255.255.0 {
+  range 10.3.0.1 10.3.0.100;
+  option routers 10.3.0.254;
+}
+
+subnet 10.3.10.0 netmask 255.255.255.0 {
+  range 10.3.10.1 10.3.10.100;
+  option routers 10.3.10.254;
+}
+
+subnet 10.3.30.0 netmask 255.255.255.0 {
+  range 10.3.30.1 10.3.30.100;
+  option routers 10.3.30.254;
+}
+
+subnet 10.3.20.0 netmask 255.255.255.0 {
+  range 10.3.20.1 10.3.20.100;
+  option routers 10.3.20.254;
+}
+
+subnet 10.5.10.0 netmask 255.255.255.0 {
+  range 10.5.10.1 10.5.10.100;
+  option routers 10.5.10.254;
+}
+
+subnet 10.5.20.0 netmask 255.255.255.0 {
+  range 10.5.20.1 10.5.20.100;
+  option routers 10.5.20.254;
+}
+
+host h1v4 {
   hardware ethernet 00:aa:00:00:00:01;
-  fixed-address 10.0.2.1;
+  fixed-address 10.1.0.1;
 }
 
-host h2 {
+host h2v4 {
+  hardware ethernet 00:aa:00:00:01:01;
+  fixed-address 10.1.10.1;
+}
+
+host h3v4 {
   hardware ethernet 00:aa:00:00:00:02;
-  fixed-address 10.0.2.2;
+  fixed-address 10.2.0.1;
 }
 
-host h3 {
+host h4v4 {
   hardware ethernet 00:aa:00:00:00:03;
-  fixed-address 10.0.3.1;
+  fixed-address 10.2.30.1;
 }
 
-host h4 {
+host h5v4 {
   hardware ethernet 00:aa:00:00:00:04;
-  fixed-address 10.0.3.2;
+  fixed-address 10.2.20.1;
 }
 
-host dh1 {
-  hardware ethernet 00:cc:00:00:00:01;
-  fixed-address 10.1.2.1;
+host h6v4 {
+  hardware ethernet 00:aa:00:00:00:05;
+  fixed-address 10.2.10.1;
 }
+
+host h7v4 {
+  hardware ethernet 00:aa:00:00:01:05;
+  fixed-address 10.2.40.1;
+}
+
+host h8v4 {
+  hardware ethernet 00:aa:00:00:00:06;
+  fixed-address 10.3.0.1;
+}
+
+host h9v4 {
+  hardware ethernet 00:aa:00:00:00:07;
+  fixed-address 10.3.10.1;
+}
+
+host h10v4 {
+  hardware ethernet 00:aa:00:00:00:08;
+  fixed-address 10.3.30.1;
+}
+
+host h11v4 {
+  hardware ethernet 00:aa:00:00:00:0a;
+  fixed-address 10.3.20.1;
+}
+
+host h12v4 {
+  hardware ethernet 00:aa:00:00:02:01;
+  fixed-address 10.5.10.1;
+}
+
+host h13v4 {
+  hardware ethernet 00:aa:00:00:02:02;
+  fixed-address 10.5.20.1;
+}
+
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd6.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd6.conf
index 526de85..3afa617 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd6.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/dhcpd6.conf
@@ -3,35 +3,143 @@
 
 option dhcp6.next-hop code 242 = ip6-address;
 
-subnet6 2000::200/120 {
-  range6 2000::260 2000::2fe;
-  option dhcp6.next-hop 2000::02ff;
-}
-
 subnet6 2000::300/120 {
   range6 2000::360 2000::3fe;
   option dhcp6.next-hop 2000::03ff;
 }
 
-subnet6 2000::9903/128 {
+subnet6 1000::300/120 {
+  range6 1000::360 1000::3fe;
+  option dhcp6.next-hop 1000::03ff;
+}
+
+subnet6 1001::300/120 {
+  range6 1001::360 1001::3fe;
+  option dhcp6.next-hop 1001::03ff;
+}
+
+subnet6 1002::300/120 {
+  range6 1002::360 1002::3fe;
+  option dhcp6.next-hop 1002::03ff;
+}
+
+subnet6 1003::300/120 {
+  range6 1003::360 1003::3fe;
+  option dhcp6.next-hop 1003::03ff;
+}
+
+subnet6 1004::300/120 {
+  range6 1004::360 1004::3fe;
+  option dhcp6.next-hop 1004::03ff;
+}
+
+subnet6 1005::300/120 {
+  range6 1005::360 1005::3fe;
+  option dhcp6.next-hop 1005::03ff;
+}
+
+subnet6 1006::300/120 {
+  range6 1006::360 1006::3fe;
+  option dhcp6.next-hop 1006::03ff;
+}
+
+subnet6 1007::300/120 {
+  range6 1007::360 1007::3fe;
+  option dhcp6.next-hop 1007::03ff;
+}
+
+subnet6 1008::300/120 {
+  range6 1008::360 1008::3fe;
+  option dhcp6.next-hop 1008::03ff;
+}
+
+subnet6 1009::300/120 {
+  range6 1009::360 1009::3fe;
+  option dhcp6.next-hop 1009::03ff;
+}
+
+subnet6 1010::300/120 {
+  range6 1010::360 1010::3fe;
+  option dhcp6.next-hop 1010::03ff;
+}
+
+subnet6 1011::300/120 {
+  range6 1011::360 1011::3fe;
+  option dhcp6.next-hop 1011::03ff;
+}
+
+subnet6 1012::300/120 {
+  range6 1012::360 1012::3fe;
+  option dhcp6.next-hop 1012::03ff;
 }
 
 host h1v6 {
   hardware ethernet 00:bb:00:00:00:01;
-  fixed-address6 2000::201;
+  fixed-address6 1000::3fe;
 }
 
 host h2v6 {
-  hardware ethernet 00:bb:00:00:00:02;
-  fixed-address6 2000::202;
+  hardware ethernet 00:bb:00:00:01:01;
+  fixed-address6 1001::3fe;
 }
 
 host h3v6 {
-  hardware ethernet 00:bb:00:00:00:03;
-  fixed-address6 2000::301;
+  hardware ethernet 00:bb:00:00:00:02;
+  fixed-address6 1002::3fe;
 }
 
 host h4v6 {
-  hardware ethernet 00:bb:00:00:00:04;
-  fixed-address6 2000::302;
+  hardware ethernet 00:bb:00:00:00:03;
+  fixed-address6 1003::3fe;
 }
+
+host h5v6 {
+  hardware ethernet 00:bb:00:00:00:04;
+  fixed-address6 1004::3fe;
+}
+
+host h6v6 {
+  hardware ethernet 00:bb:00:00:00:05;
+  fixed-address6 1005::3fe;
+}
+
+host h7v6 {
+  hardware ethernet 00:bb:00:00:01:05;
+  fixed-address6 1006::3fe;
+}
+
+host h8v6 {
+  hardware ethernet 00:bb:00:00:00:06;
+  fixed-address6 1007::3fe;
+}
+
+host h9v6 {
+  hardware ethernet 00:bb:00:00:00:07;
+  fixed-address6 1008::3fe;
+}
+
+host h10v6 {
+  hardware ethernet 00:bb:00:00:00:08;
+  fixed-address6 1009::3fe;
+}
+
+host h11v6 {
+  hardware ethernet 00:bb:00:00:00:0a;
+  fixed-address6 1010::3fe;
+}
+
+host h12v6 {
+  hardware ethernet 00:bb:00:00:01:0a;
+  fixed-address6 1011::3fe;
+}
+
+host h13v6 {
+  hardware ethernet 00:bb:00:00:02:0a;
+  fixed-address6 1012::3fe;
+}
+
+
+
+
+
+
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp1.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp1.conf
index 51991a4..34472bb 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp1.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp1.conf
@@ -6,4 +6,4 @@
 !
 ip route 0.0.0.0/0 172.16.0.1
 !
-fpm connection ip 192.168.56.11 port 2620
+fpm connection ip 10.192.19.121 port 2620
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp2.conf b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp2.conf
index dce218d..9c6e3f4 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp2.conf
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/conf/zebradbgp2.conf
@@ -6,4 +6,4 @@
 !
 ip route 0.0.0.0/0 172.16.0.1
 !
-fpm connection ip 192.168.56.11 port 2620
+fpm connection ip 10.192.19.122 port 2620
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/json/TEST_CONFIG_ipv4=1_ipv6=1_dhcp=1_routers=1.json b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/json/TEST_CONFIG_ipv4=1_ipv6=1_dhcp=1_routers=1.json
new file mode 100644
index 0000000..7c6b51e
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/json/TEST_CONFIG_ipv4=1_ipv6=1_dhcp=1_routers=1.json
@@ -0,0 +1,580 @@
+{
+    "ports" : {
+         "of:0000000000000006/3" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1011::3ff/120" ],
+                    "vlan-tagged": [10]
+                }
+            ]
+        },
+        "of:0000000000000006/4" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1012::3ff/120" ],
+                    "vlan-untagged": 20
+                }
+            ]
+        },
+	"of:0000000000000006/5" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.5.10.254/24" ],
+                    "vlan-tagged": [10]
+                }
+            ]
+        },
+        "of:0000000000000006/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.5.20.254/24" ],
+                    "vlan-untagged": 20
+                }
+            ]
+        },
+
+        "of:0000000000000001/3" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1000::3ff/120" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000001/4" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1001::3ff/120" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000001/5" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.1.0.254/24" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000001/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.1.10.254/24" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000002/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1002::3ff/120" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000002/7" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1003::3ff/120" ],
+                    "vlan-untagged": 15
+                }
+            ]
+        },
+        "of:0000000000000002/8" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1004::3ff/120" ],
+                    "vlan-tagged": [30]
+                }
+            ]
+        },
+        "of:0000000000000002/9" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.0.254/24" ],
+                    "vlan-untagged": 10
+                }
+            ]
+        },
+        "of:0000000000000002/10" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.30.254/24" ],
+                    "vlan-untagged": 16
+                }
+            ]
+        },
+        "of:0000000000000002/11" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.20.254/24" ],
+                    "vlan-tagged": [30]
+                }
+            ]
+        },
+        "of:0000000000000003/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1003::3ff/120" ],
+                    "vlan-untagged": 15
+                }
+            ]
+        },
+        "of:0000000000000003/7" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1004::3ff/120" ],
+                    "vlan-tagged": [30]
+                }
+            ]
+        },
+        "of:0000000000000003/8" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1005::3ff/120" ],
+                    "vlan-tagged": [20]
+                }
+            ]
+        },
+	"of:0000000000000003/9" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1006::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000003/10" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.30.254/24" ],
+                    "vlan-untagged": 15
+                }
+            ]
+        },
+        "of:0000000000000003/11" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.20.254/24" ],
+                    "vlan-tagged": [30]
+                }
+            ]
+        },
+        "of:0000000000000003/12" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.10.254/24" ],
+                    "vlan-tagged": [20]
+                }
+            ]
+        },
+	"of:0000000000000003/13" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.2.40.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000004/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1007::3ff/120" ],
+                    "vlan-untagged": 30
+                }
+            ]
+        },
+        "of:0000000000000004/7" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1008::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000004/8" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1009::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000004/9" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.0.254/24" ],
+                    "vlan-untagged": 30
+                }
+            ]
+        },
+        "of:0000000000000004/10" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.10.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000004/11" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.30.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000004/12" : {
+            "interfaces" : [
+                {
+			"ips" : [ "10.0.1.254/24", "10.0.7.254/24", "2000::1ff/120", "2000::7ff/120" ],
+			"vlan-tagged": [110, 170]
+
+                }
+            ]
+        },
+        "of:0000000000000004/13" : {
+            "interfaces" : [
+                {
+			"ips" : [ "10.0.1.254/24", "2000::1ff/120"],
+			"vlan-untagged": 110
+
+                }
+            ]
+        },
+        "of:0000000000000004/14" : {
+            "interfaces" : [
+                {
+			"ips" : [ "10.0.7.254/24", "2000::7ff/120" ],
+			"vlan-untagged": 170
+
+                }
+            ]
+        },
+        "of:0000000000000005/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1008::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/7" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1009::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/8" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "1010::3ff/120" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/9" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.10.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/10" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.30.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/11" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.3.20.254/24" ],
+                    "vlan-tagged": [40]
+                }
+            ]
+        },
+        "of:0000000000000005/12" : {
+            "interfaces" : [
+                {
+                       "ips" : [ "10.0.5.254/24", "10.0.6.254/24", "2000::5ff/120", "2000::6ff/120" ],
+	               "vlan-tagged": [150, 160]
+                }
+            ]
+        },
+        "of:0000000000000005/13" : {
+            "interfaces" : [
+                {
+                       "ips" : [ "10.0.5.254/24", "2000::5ff/120"],
+	               "vlan-untagged": 150
+                }
+            ]
+        },
+        "of:0000000000000005/14" : {
+            "interfaces" : [
+                {
+                       "ips" : [ "10.0.6.254/24", "2000::6ff/120" ],
+	               "vlan-untagged": 160
+                }
+            ]
+        },
+        "of:0000000000000005/15" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.0.3.254/24", "2000::3ff/120" ],
+                    "vlan-untagged": 15
+                }
+            ]
+        }
+    },
+    "hosts" : {
+	"00:BB:00:00:01:0A/10" : {
+		"basic": {
+			"locations": ["of:0000000000000006/3"],
+			"ips": ["1011::3fe"]
+		     }
+	    },
+	"00:bb:00:00:00:04/30" : {
+		"basic": {
+			"locations": ["of:0000000000000003/7","of:0000000000000002/8"],
+			"ips": ["1004::3fe"]
+		     }
+	    },
+	"00:bb:00:00:00:05/20" : {
+		"basic": {
+			"locations": ["of:0000000000000003/8"],
+			"ips": ["1005::3fe"]
+		     }
+	    },
+	"00:bb:00:00:01:05/40" : {
+		"basic": {
+			"locations": ["of:0000000000000003/9"],
+			"ips": ["1006::3fe"]
+		     }
+	    },
+	"00:bb:00:00:00:07/40" : {
+		"basic": {
+			"locations": ["of:0000000000000005/6", "of:0000000000000004/7"],
+			"ips": ["1008::3fe"]
+		     }
+	    },
+	"00:bb:00:00:00:08/40" : {
+		"basic": {
+			"locations": ["of:0000000000000004/8","of:0000000000000005/7"],
+			"ips": ["1009::3fe"]
+		     }
+	    },
+	"00:bb:00:00:00:0A/40" : {
+		"basic": {
+			"locations": ["of:0000000000000005/8"],
+			"ips": ["1010::3fe"]
+		     }
+	    }
+    },
+    "devices" : {
+	"of:0000000000000006" : {
+            "segmentrouting" : {
+                "name" : "s006",
+                "ipv4NodeSid" : 1006,
+		"ipv6NodeSid" : 2006,
+		"ipv6Loopback" : "2000::c0a8:0006",
+                "ipv4Loopback" : "192.168.0.6",
+                "routerMac" : "00:00:00:00:00:06",
+                "isEdgeRouter" : true,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s006",
+                "driver" : "ofdpa-ovs",
+		"latitude":30,
+		"longitude":-110
+            }
+        },
+        "of:0000000000000103" : {
+            "segmentrouting" : {
+                "name" : "s103",
+                "ipv4NodeSid" : 1103,
+                "ipv4Loopback" : "192.168.0.103",
+		"ipv6NodeSid" : 2103,
+		"ipv6Loopback" : "2000::c0a8:0203",
+                "routerMac" : "00:00:00:00:01:03",
+                "isEdgeRouter" : false,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                 "name" : "s103",
+                 "driver" : "ofdpa-ovs",
+		 "latitude":35,
+		 "longitude":-115
+            }
+        },
+        "of:0000000000000104" : {
+            "segmentrouting" : {
+                "name" : "s104",
+                "ipv4NodeSid" : 1104,
+                "ipv4Loopback" : "192.168.0.104",
+		"ipv6NodeSid" : 2104,
+		"ipv6Loopback" : "2000::c0a8:0204",
+                "routerMac" : "00:00:00:00:01:04",
+                "isEdgeRouter" : false,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s104",
+                 "driver" : "ofdpa-ovs",
+		 "latitude":35,
+		 "longitude":-110
+            }
+    	},
+        "of:0000000000000001" : {
+            "segmentrouting" : {
+                "name" : "s001",
+                "ipv4NodeSid" : 1001,
+		"ipv6NodeSid" : 2001,
+		"ipv6Loopback" : "2000::c0a8:0001",
+                "ipv4Loopback" : "192.168.0.1",
+                "routerMac" : "00:00:00:00:00:01",
+                "isEdgeRouter" : true,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s001",
+                "driver" : "ofdpa-ovs",
+		"latitude":30,
+		"longitude":-105
+            }
+        },
+        "of:0000000000000002" : {
+            "segmentrouting" : {
+                "name" : "s002",
+                "ipv4NodeSid" : 1002,
+                "ipv4Loopback" : "192.168.0.2",
+		"ipv6NodeSid" : 2002,
+		"ipv6Loopback" : "2000::c0a8:0002",
+                "routerMac" : "00:00:00:00:00:02",
+                "isEdgeRouter" : true,
+                "pairLocalPort" : 5,
+                "pairDeviceId": "of:0000000000000003",
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s002",
+                "driver" : "ofdpa-ovs",
+		"latitude":34,
+		"longitude":-95
+            }
+        },
+        "of:0000000000000003" : {
+            "segmentrouting" : {
+                "name" : "s003",
+                "ipv4NodeSid" : 1003,
+                "ipv4Loopback" : "192.168.0.3",
+        	"ipv6NodeSid" : 2003,
+		"ipv6Loopback" : "2000::c0a8:0003",
+                "routerMac" : "00:00:00:00:00:02",
+                "isEdgeRouter" : true,
+                "pairLocalPort" : 5,
+                "pairDeviceId": "of:0000000000000002",
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s003",
+                "driver" : "ofdpa-ovs",
+		"latitude":34,
+		"longitude":-90
+            }
+        },
+        "of:0000000000000004" : {
+            "segmentrouting" : {
+                "name" : "s004",
+                "ipv4NodeSid" : 1004,
+                "ipv4Loopback" : "192.168.0.4",
+		"ipv6NodeSid" : 2004,
+		"ipv6Loopback" : "2000::c0a8:0004",
+                "routerMac" : "00:00:00:00:00:04",
+                "isEdgeRouter" : true,
+                "pairLocalPort" : 5,
+                "pairDeviceId": "of:0000000000000005",
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s004",
+                "driver" : "ofdpa-ovs",
+		"latitude":34,
+		"longitude":-85
+            }
+        },
+        "of:0000000000000005" : {
+            "segmentrouting" : {
+                "name" : "s005",
+                "ipv4NodeSid" : 1005,
+                "ipv4Loopback" : "192.168.0.5",
+		"ipv6NodeSid" : 2005,
+		"ipv6Loopback" : "2000::c0a8:0005",
+                "routerMac" : "00:00:00:00:00:04",
+                "isEdgeRouter" : true,
+                "pairLocalPort" : 5,
+                "pairDeviceId": "of:0000000000000004",
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s005",
+                "driver" : "ofdpa-ovs",
+		"latitude":34,
+		"longitude":-80
+            }
+        },
+        "of:0000000000000101" : {
+            "segmentrouting" : {
+                "name" : "s101",
+                "ipv4NodeSid" : 1101,
+                "ipv4Loopback" : "192.168.0.101",
+		"ipv6NodeSid" : 2101,
+		"ipv6Loopback" : "2000::c0a8:0101",
+                "routerMac" : "00:00:00:00:01:01",
+                "isEdgeRouter" : false,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s101",
+                "driver" : "ofdpa-ovs",
+		"latitude":42,
+                "longitude":-100
+            }
+        },
+        "of:0000000000000102" : {
+            "segmentrouting" : {
+                "name" : "s102",
+                "ipv4NodeSid" : 1102,
+                "ipv4Loopback" : "192.168.0.102",
+		"ipv6NodeSid" : 2102,
+		"ipv6Loopback" : "2000::c0a8:0202",
+                "routerMac" : "00:00:00:00:01:02",
+                "isEdgeRouter" : false,
+                "adjacencySids" : []
+            },
+            "basic" : {
+                "name" : "s102",
+                 "driver" : "ofdpa-ovs",
+		 "latitude":42,
+		 "longitude":-95
+            }
+        }
+    },
+    "apps" : {
+        "org.onosproject.dhcprelay" : {
+            "default": [
+                {
+                    "dhcpServerConnectPoint": "of:0000000000000005/15",
+                    "serverIps": ["10.0.3.253", "2000::3fd"]
+                }
+            ]
+        }
+    }
+}
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE101.linkFailureChart b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE101.linkFailureChart
new file mode 100644
index 0000000..8a9e052
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE101.linkFailureChart
@@ -0,0 +1,8 @@
+{
+    "link_batch_1" : { "links" : { "link1" : ["leaf2", "spine101"] },
+                       "links_before" : 48,
+                       "links_after" : 44 },
+    "link_batch_2" : { "links" : { "link1" : ["leaf2", "spine102"] },
+                       "links_before" : 48,
+                       "links_after" : 44 }
+}
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE102.linkFailureChart b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE102.linkFailureChart
new file mode 100644
index 0000000..f102be4
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE102.linkFailureChart
@@ -0,0 +1,9 @@
+{
+    "link_batch_1" : { "links" : { "link1" : ["leaf4", "spine101"] },
+                       "links_before" : 48,
+                       "links_after" : 44 },
+    "link_batch_2" : { "links" : { "link1" : ["leaf4", "spine102"] },
+                       "links_before" : 48,
+                       "links_after" : 44 }
+}
+
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE103.linkFailureChart b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE103.linkFailureChart
new file mode 100644
index 0000000..8041a05
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/linkFailure/CASE103.linkFailureChart
@@ -0,0 +1,9 @@
+{
+    "link_batch_1" : { "links" : { "link1" : ["spine103", "spine101"] },
+                       "links_before" : 48,
+                       "links_after" : 46 },
+    "link_batch_2" : { "links" : { "link1" : ["spine104", "spine102"] },
+                       "links_before" : 48,
+                       "links_after" : 46 }
+}
+
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE001.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE001.multicastConfig
new file mode 100644
index 0000000..0068a5f
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE001.multicastConfig
@@ -0,0 +1,48 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10"],
+        "dHosts": ["00:AA:00:00:00:03/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7"],
+        "dHosts": ["00:BB:00:00:00:03/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE002.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE002.multicastConfig
new file mode 100644
index 0000000..b6c77bf
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE002.multicastConfig
@@ -0,0 +1,48 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000004/9"],
+        "dHosts": ["00:AA:00:00:00:06/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h8v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000004/6"],
+        "dHosts": ["00:BB:00:00:00:06/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h8v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE003.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE003.multicastConfig
new file mode 100644
index 0000000..6c25ca0
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE003.multicastConfig
@@ -0,0 +1,48 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE004.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE004.multicastConfig
new file mode 100644
index 0000000..9a138d7
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE004.multicastConfig
@@ -0,0 +1,54 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE005.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE005.multicastConfig
new file mode 100644
index 0000000..d2e2fdf
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE005.multicastConfig
@@ -0,0 +1,54 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE006.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE006.multicastConfig
new file mode 100644
index 0000000..97d1579
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE006.multicastConfig
@@ -0,0 +1,54 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE007.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE007.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE007.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE008.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE008.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE008.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE101.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE101.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE101.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE102.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE102.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE102.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE103.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE103.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE103.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE201.multicastConfig b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE201.multicastConfig
new file mode 100644
index 0000000..06d5876
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/multicast/CASE201.multicastConfig
@@ -0,0 +1,60 @@
+[
+    {
+        "ipVersion": 4,
+        "sIP": "10.2.0.1",
+        "group": "224.2.0.1",
+        "sPorts": ["of:0000000000000002/9"],
+        "dPorts": ["of:0000000000000002/10", "of:0000000000000004/9", "of:0000000000000001/5"],
+        "dHosts": ["00:AA:00:00:00:03/None", "00:AA:00:00:00:06/None", "00:AA:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v4",
+                "interface": "h3v4-eth0",
+                "Ether": "01:00:5e:02:00:01",
+                "UDP": 40051,
+                "filter": "ip host 224.2.0.1",
+                "packet": "dst=01:00:5e:02:00:01 src=00:aa:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v4"
+                },
+                {
+                    "host": "h8v4"
+                },
+                {
+                    "host": "h1v4"
+                }
+            ]
+        }
+    },
+    {
+        "ipVersion": 6,
+        "sIP": "1002::3fe",
+        "group": "ff08::3fe",
+        "sPorts": ["of:0000000000000002/6"],
+        "dPorts": ["of:0000000000000002/7", "of:0000000000000004/6", "of:0000000000000001/3"],
+        "dHosts": ["00:BB:00:00:00:03/None", "00:BB:00:00:00:06/None", "00:BB:00:00:00:01/None"],
+        "scapy": {
+            "src": {
+                "host": "h3v6",
+                "interface": "h3v6-eth0",
+                "Ether": "33:33:00:00:03:fe",
+                "UDP": 40051,
+                "filter": "ip6 host ff08::3fe",
+                "packet": "dst=33:33:00:00:03:fe src=00:bb:00:00:00:02"
+            },
+            "dst": [
+                {
+                    "host": "h4v6"
+                },
+                {
+                    "host": "h8v6"
+                },
+                {
+                    "host": "h1v6"
+                }
+            ]
+        }
+    }
+]
diff --git a/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/switchFailure/CASE201.switchFailureChart b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/switchFailure/CASE201.switchFailureChart
new file mode 100644
index 0000000..6614e5f
--- /dev/null
+++ b/TestON/tests/USECASE/SegmentRouting/SRMulticast/dependencies/switchFailure/CASE201.switchFailureChart
@@ -0,0 +1,18 @@
+{
+    "spine101": { "switches_before_failure": 10,
+                  "links_before_failure": 48,
+                  "switches_after_failure": 9,
+                  "links_after_failure": 30 },
+    "spine102": { "switches_before_failure": 10,
+                  "links_before_failure": 48,
+                  "switches_after_failure": 9,
+                  "links_after_failure": 30 },
+    "spine103": { "switches_before_failure": 10,
+                  "links_before_failure": 48,
+                  "switches_after_failure": 9,
+                  "links_after_failure": 42 },
+    "spine104": { "switches_before_failure": 10,
+                  "links_before_failure": 48,
+                  "switches_after_failure": 9,
+                  "links_after_failure": 42 }
+}
diff --git a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.params b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.params
index 1b6aec0..e8199bd 100644
--- a/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.params
+++ b/TestON/tests/USECASE/SegmentRouting/SRRouting/SRRouting.params
@@ -43,7 +43,4 @@
         <balanceMasterSleep>10</balanceMasterSleep>
     </timers>
 
-    <SLEEP>
-        <startup>10</startup>
-    </SLEEP>
 </PARAMS>
diff --git a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
index 3afb6d3..1711ef9 100644
--- a/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
+++ b/TestON/tests/USECASE/SegmentRouting/dependencies/Testcaselib.py
@@ -67,12 +67,12 @@
             main.forHost = "host/"
             main.forSwitchFailure = "switchFailure/"
             main.forLinkFailure = "linkFailure/"
+            main.forMulticast = "multicast/"
             main.topology = main.params[ 'DEPENDENCY' ][ 'topology' ]
             main.topologyLib = main.params[ 'DEPENDENCY' ][ 'lib' ] if 'lib' in main.params[ 'DEPENDENCY' ] else None
             main.topologyConf = main.params[ 'DEPENDENCY' ][ 'conf' ] if 'conf' in main.params[ 'DEPENDENCY' ] else None
             main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
             main.maxNodes = int( main.params[ 'SCALE' ][ 'max' ] )
-            main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
 
             stepResult = main.testSetUp.envSetup( False )
         except Exception as e:
@@ -160,8 +160,14 @@
     @staticmethod
     def loadLinkFailureChart( main ):
         with open( "%s%s.linkFailureChart" % ( main.configPath + main.forLinkFailure,
-                                                 main.cfgName ) ) as sfc:
-            main.linkFailureChart = json.load( sfc )
+                                                 main.cfgName ) ) as lfc:
+            main.linkFailureChart = json.load( lfc )
+
+    @staticmethod
+    def loadMulticastConfig( main ):
+        with open( "%s%s.multicastConfig" % ( main.configPath + main.forMulticast,
+                                                 main.cfgName ) ) as cfg:
+            main.multicastConfig = json.load( cfg )
 
     @staticmethod
     def startMininet( main, topology, args="" ):
@@ -681,6 +687,16 @@
         except ( NameError, AttributeError ):
             main.utils = Utils()
 
+        if hasattr( main, "scapyHosts" ):
+            scapyResult = main.TRUE
+            for host in main.scapyHosts:
+                scapyResult = host.stopScapy() and scapyResult
+                main.log.info( "Stopped Scapy Host: {0}".format( host.name ) )
+            for host in main.scapyHosts:
+                scapyResult = main.Scapy.removeHostComponent( host.name ) and scapyResult
+                main.log.info( "Removed Scapy Host Component: {0}".format( host.name ) )
+            main.scapyHosts = []
+
         if hasattr( main, 'Mininet1' ):
             main.utils.mininetCleanup( main.Mininet1 )
 
@@ -939,3 +955,67 @@
                 cfg[ "ports" ][ connectPoint ][ "interfaces" ][ 0 ][ "vlan-native" ] = native
 
         main.Cluster.active( 0 ).REST.setNetCfg( json.loads( json.dumps( cfg ) ) )
+
+    @staticmethod
+    def startScapyHosts( main ):
+        """
+        Create host components and start Scapy CLIs
+        """
+        main.step( "Start Scapy CLIs" )
+        main.scapyHostNames = main.params[ 'SCAPY' ][ 'HOSTNAMES' ].split( ',' )
+        main.scapyHosts = []
+        for hostName in main.scapyHostNames:
+            main.Scapy.createHostComponent( hostName )
+            main.scapyHosts.append( getattr( main, hostName ) )
+        for host in main.scapyHosts:
+            host.startHostCli()
+            host.startScapy()
+            host.updateSelf()
+            main.log.debug( host.name )
+            main.log.debug( host.hostIp )
+            main.log.debug( host.hostMac )
+
+    @staticmethod
+    def verifyMulticastTraffic( main, entry, expect, skipOnFail=False ):
+        """
+        Verify multicast traffic using scapy
+        """
+        srcEntry = entry["scapy"]["src"]
+        for dstEntry in entry["scapy"]["dst"]:
+            # Set up scapy receiver
+            receiver = getattr( main, dstEntry["host"] )
+            receiver.startFilter( pktFilter=srcEntry["filter"] )
+            # Set up scapy sender
+            main.Network.addRoute( str( srcEntry["host"] ),
+                                   str( entry["group"] ),
+                                   str( srcEntry["interface"] ),
+                                   True if entry["ipVersion"] == 6 else False )
+            sender = getattr( main, srcEntry["host"] )
+            sender.buildEther( dst=str( srcEntry["Ether"] ) )
+            if entry["ipVersion"] == 4:
+                sender.buildIP( dst=str( entry["group"] ) )
+            elif entry["ipVersion"] == 6:
+                sender.buildIPv6( dst=str( entry["group"] ) )
+            sender.buildUDP( ipVersion=entry["ipVersion"], dport=srcEntry["UDP"] )
+            # Send packet and check received packet
+            sender.sendPacket( iface=srcEntry["interface"] )
+            finished = receiver.checkFilter()
+            packet = ""
+            if finished:
+                packets = receiver.readPackets()
+                for packet in packets.splitlines():
+                    main.log.debug( packet )
+            else:
+                kill = receiver.killFilter()
+                main.log.debug( kill )
+                sender.handle.sendline( "" )
+                sender.handle.expect( sender.scapyPrompt )
+                main.log.debug( sender.handle.before )
+            if skipOnFail and finished != expect:
+                Testcaselib.saveOnosDiagnostics( main )
+                Testcaselib.cleanup( main, copyKarafLog=False )
+                main.skipCase()
+            utilities.assert_equals( expect=expect,
+                                     actual=srcEntry["packet"] in packet,
+                                     onpass="Pass",
+                                     onfail="Fail" )