Merge "[ONOS-7544]: FUNCnetconf test fix: config format & added nodes check"
diff --git a/TestON/bin/cleanup.sh b/TestON/bin/cleanup.sh
index ec67ea6..7f3687d 100755
--- a/TestON/bin/cleanup.sh
+++ b/TestON/bin/cleanup.sh
@@ -36,6 +36,7 @@
sudo pkill dhclient
sudo pkill dhcpd
sudo kill -9 `ps -ef | grep "bird" | grep -v grep | awk '{print $2}'`
+sudo kill -9 `ps ax | grep '[p]ython -m SimpleHTTPServer 8000' | awk '{print $1}'`
# Restore persistent firewall rules
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/HA/HAscaling/HAscaling.params b/TestON/tests/HA/HAscaling/HAscaling.params
index 035b12b..8478214 100644
--- a/TestON/tests/HA/HAscaling/HAscaling.params
+++ b/TestON/tests/HA/HAscaling/HAscaling.params
@@ -30,7 +30,7 @@
<scaling>1,3b,3,3b,5b,5,5b,7b,7,7b,5b,5,5b,3b,3,3b,1</scaling>
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
diff --git a/TestON/tests/HA/HAscaling/HAscaling.params.fabric b/TestON/tests/HA/HAscaling/HAscaling.params.fabric
index b3a9fcf..1566713 100644
--- a/TestON/tests/HA/HAscaling/HAscaling.params.fabric
+++ b/TestON/tests/HA/HAscaling/HAscaling.params.fabric
@@ -30,7 +30,7 @@
<scaling>1,3b,3,3b,5b,5,5b,7b,7,7b,5b,5,5b,3b,3,3b,1</scaling>
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
diff --git a/TestON/tests/HA/HAscaling/HAscaling.params.intents b/TestON/tests/HA/HAscaling/HAscaling.params.intents
index 0ce1246..53b96b5 100644
--- a/TestON/tests/HA/HAscaling/HAscaling.params.intents
+++ b/TestON/tests/HA/HAscaling/HAscaling.params.intents
@@ -30,7 +30,7 @@
<scaling>1,3b,3,3b,5b,5,5b,7b,7,7b,5b,5,5b,3b,3,3b,1</scaling>
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
diff --git a/TestON/tests/HA/HAscaling/dependencies/Server.py b/TestON/tests/HA/HAscaling/dependencies/Server.py
index dbb1247..0c5e743 100644
--- a/TestON/tests/HA/HAscaling/dependencies/Server.py
+++ b/TestON/tests/HA/HAscaling/dependencies/Server.py
@@ -59,7 +59,7 @@
handle = component.handle
# cd to rootDir
handle.sendline( "cd " + str( rootDir ) )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
# Start server
cmd = "python -m SimpleHTTPServer {}".format( port )
if logDir:
@@ -68,15 +68,19 @@
cmd += "&> {dev/null}" # Throw away all output
cmd += " &"
handle.sendline( cmd )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
response = handle.before
# Return to home dir
handle.sendline( "cd " + component.home )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
response += handle.before
if "Exit" in response:
main.log.error( "Error starting server. Check server log for details" )
main.log.debug( handle.before )
+ # Show the log
+ handle.sendline( "cat {}".format( logDir ))
+ handle.expect( component.prompt )
+ main.log.debug( handle.before )
retValue = main.FALSE
# capture PID for later use
# EX: [ 1 ] 67987
@@ -108,7 +112,7 @@
handle = self.component.handle
cmd = "sudo kill {}".format( self.PID )
handle.sendline( cmd )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
# TODO: What is bad output? cannot sudo?
else:
main.log.error( "Component handle is not set" )
@@ -147,16 +151,16 @@
handle = self.component.handle
# cd to rootDir
handle.sendline( "cd " + str( self.rootDir ) )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
cmd = "./onos-gen-partitions {} {} ".format( filename, nodes )
if equal:
cmd += "-e"
handle.sendline( cmd )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
response = handle.before
# Return to home dir
handle.sendline( "cd " + self.component.home )
- handle.expect( "\$" )
+ handle.expect( component.prompt )
response += handle.before
if "Traceback" in response:
main.log.error( handle.before )
diff --git a/TestON/tests/HA/HAswapNodes/HAswapNodes.params b/TestON/tests/HA/HAswapNodes/HAswapNodes.params
index 7cac443..8ed012a 100644
--- a/TestON/tests/HA/HAswapNodes/HAswapNodes.params
+++ b/TestON/tests/HA/HAswapNodes/HAswapNodes.params
@@ -29,7 +29,7 @@
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
diff --git a/TestON/tests/HA/HAswapNodes/HAswapNodes.params.fabric b/TestON/tests/HA/HAswapNodes/HAswapNodes.params.fabric
index 37aca8f..7ba6fd4 100644
--- a/TestON/tests/HA/HAswapNodes/HAswapNodes.params.fabric
+++ b/TestON/tests/HA/HAswapNodes/HAswapNodes.params.fabric
@@ -29,7 +29,7 @@
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
diff --git a/TestON/tests/HA/HAswapNodes/HAswapNodes.params.intents b/TestON/tests/HA/HAswapNodes/HAswapNodes.params.intents
index fe7c881..ec9b84b 100644
--- a/TestON/tests/HA/HAswapNodes/HAswapNodes.params.intents
+++ b/TestON/tests/HA/HAswapNodes/HAswapNodes.params.intents
@@ -29,7 +29,7 @@
<server>
<port>8000</port>
- <interface>eth0</interface>
+ <interface></interface>
</server>
<apps></apps>
<ONOS_Configuration>
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" )