From d334c1ccfe016ae521b6c9422127f00f96e9897a Mon Sep 17 00:00:00 2001 From: Brian O'Connor <bocon@onlab.us> Date: Thu, 28 Aug 2014 02:48:46 -0700 Subject: [PATCH] adding test for vlanhost.py and adding vlantopo example --- examples/README.md | 11 ++++++-- examples/test/test_vlanhost.py | 50 ++++++++++++++++++++++++++++++++++ examples/vlanhost.py | 40 +++++++++++++++++++++++---- 3 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 examples/test/test_vlanhost.py diff --git a/examples/README.md b/examples/README.md index 96e30d75..0369e5ba 100644 --- a/examples/README.md +++ b/examples/README.md @@ -79,6 +79,11 @@ This example shows how to connect a Mininet network to the Internet using NAT. It also answers the eternal question "why can't I ping `google.com`?" +#### numberedports.py + +This example verifies the mininet ofport numbers match up to the ovs port numbers. +It also verifies that the port numbers match up to the interface numbers + #### popen.py: This example monitors a number of hosts using `host.popen()` and @@ -118,7 +123,7 @@ memory and `sysctl` configuration (see `INSTALL`.) This example creates a 64-host tree network, and attempts to check full connectivity using `ping`, for different switch/datapath types. -#### numberedports.py +#### vlanhost.py: + +An example of how to subclass Host to use a VLAN on its primary interface. -This example verifies the mininet ofport numbers match up to the ovs port numbers. -It also verifies that the port numbers match up to the interface numbers diff --git a/examples/test/test_vlanhost.py b/examples/test/test_vlanhost.py new file mode 100644 index 00000000..b57f0d04 --- /dev/null +++ b/examples/test/test_vlanhost.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +""" +Test for vlanhost.py +""" + +import unittest +import pexpect +import sys +from mininet.util import quietRun + +class testVLANHost( unittest.TestCase ): + + prompt = 'mininet>' + + @unittest.skipIf( '-quick' in sys.argv, 'long test' ) + def testVLANTopo( self ): + "Test connectivity (or lack thereof) between hosts in VLANTopo" + p = pexpect.spawn( 'python -m mininet.examples.vlanhost' ) + p.expect( self.prompt ) + p.sendline( 'pingall 1' ) #ping timeout=1 + p.expect( '(\d+)% dropped', timeout=30 ) # there should be 24 failed pings + percent = int( p.match.group( 1 ) ) if p.match else -1 + p.expect( self.prompt ) + p.sendline( 'exit' ) + p.wait() + self.assertEqual( percent, 80 ) + + def testSpecificVLAN( self ): + "Test connectivity between hosts on a specific VLAN" + vlan = 1001 + p = pexpect.spawn( 'python -m mininet.examples.vlanhost %d' % vlan ) + p.expect( self.prompt ) + + p.sendline( 'h1 ping -c 1 h2' ) + p.expect ( '(\d+)% packet loss' ) + percent = int( p.match.group( 1 ) ) if p.match else -1 + p.expect( self.prompt ) + + p.sendline( 'h1 ifconfig' ) + i = p.expect( ['h1-eth0.%d' % vlan, pexpect.TIMEOUT ], timeout=2 ) + p.expect( self.prompt ) + + p.sendline( 'exit' ) + p.wait() + self.assertEqual( percent, 0 ) # no packet loss on ping + self.assertEqual( i, 0 ) # check vlan intf is present + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/examples/vlanhost.py b/examples/vlanhost.py index bf3e69cb..a9174029 100755 --- a/examples/vlanhost.py +++ b/examples/vlanhost.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python """ vlanhost.py: Host subclass that uses a VLAN tag for the default interface. @@ -24,6 +25,7 @@ """ from mininet.node import Host +from mininet.topo import Topo class VLANHost( Host ): @@ -52,7 +54,7 @@ def config( self, vlan=100, **params ): hosts = { 'vlan': VLANHost } -def exampleUsage( vlan ): +def exampleAllHosts( vlan ): """Simple example of how VLANHost can be used in a script""" # This is where the magic happens... host = partial( VLANHost, vlan=vlan ) @@ -65,6 +67,30 @@ def exampleUsage( vlan ): CLI( net ) net.stop() +class VLANStarTopo( Topo ): + """Example topology that uses host in multiple VLANs""" + + def build( self, k=2, n=2, vlanBase=100 ): + s1 = self.addSwitch( 's1' ) + for i in range( k ): + vlan = vlanBase + i + for j in range(n): + name = 'h%d-%d' % ( j+1, vlan ) + h = self.addHost( name, cls=VLANHost, vlan=vlan ) + self.addLink( h, s1 ) + for j in range( n ): + h = self.addHost( 'h%d' % (j+1) ) + self.addLink( h, s1 ) + + +def exampleCustomTags( vlan ): + """Simple example that exercises VLANStarTopo""" + + net = Mininet( topo=VLANStarTopo() ) + net.start() + CLI( net ) + net.stop() + if __name__ == '__main__': import sys from functools import partial @@ -72,12 +98,16 @@ def exampleUsage( vlan ): from mininet.net import Mininet from mininet.cli import CLI from mininet.topo import SingleSwitchTopo + from mininet.log import setLogLevel + + setLogLevel( 'info' ) try: vlan = int( sys.argv[ 1 ] ) except Exception: - print 'Usage: vlanhost.py <vlan id>\n' - print 'Using VLAN ID=100...' - vlan = 100 + vlan = None - exampleUsage( vlan ) + if vlan: + exampleAllHosts( vlan ) + else: + exampleCustomTags( vlan ) -- GitLab