Tweaks to documentation files and sshd and xterms examples.

Added scratchnetuser.
This commit is contained in:
Bob Lantz
2009-12-14 13:22:03 -08:00
parent 433503cf8a
commit 98332cb616
6 changed files with 82 additions and 31 deletions
+4 -3
View File
@@ -14,9 +14,10 @@ Preliminary Mininet Installation/Configuration Notes
sudo ln -s /home/openflow/mininet/netns /usr/local/bin/netns sudo ln -s /home/openflow/mininet/netns /usr/local/bin/netns
Installation is simplest with a distribution that includes a kernel Installation is simplest with a distribution that includes a kernel
which supports the CLONE_NETNS unshare flag by default. Debian 5.0+ which supports the CLONE_NETNS unshare flag by default. Debian 5.0+ does
does; Ubuntu doesn't. If your kernel doesn't support it, you will need (e.g. current debian-testing release); Ubuntu doesn't. If your kernel
to build and install a kernel that does! doesn't support it, you will need to build and install a kernel that
does!
- Mininet should probably be run either on a machine with - Mininet should probably be run either on a machine with
no other important processes, or on a virtual machine no other important processes, or on a virtual machine
+10 -5
View File
@@ -21,7 +21,7 @@ creation of OpenFlow networks of varying sizes and topologies.
In order to run Mininet, you must have: In order to run Mininet, you must have:
* A Linux 2.6.26 or greater kernel compiled with network namespace support * A Linux 2.6.26 or greater kernel compiled with network namespace support
enabled. (Debian 5.0 or greater should work) enabled. (debian-testing seems to have such a kernel.)
* The OpenFlow reference implementation (either the user or kernel * The OpenFlow reference implementation (either the user or kernel
datapath may be used, and the tun or ofdatapath kernel modules must be datapath may be used, and the tun or ofdatapath kernel modules must be
@@ -48,11 +48,16 @@ Currently mininet includes:
- Some simple tests which can be run using someNetwork.run( test ) - Some simple tests which can be run using someNetwork.run( test )
- A simple command-line interface which may be invoked on a network using - A simple command-line interface which may be invoked on a network using
.run( Cli ) .run( Cli ). It provides useful diagnostic commands, as well as the
ability to send a command to a node. For example,
mininet> h11 ifconfig -a
tells host h11 to run the command 'ifconfig -a'
- A 'cleanup' script to get rid of junk (interfaces, processes, etc.) - A 'cleanup' script to get rid of junk (interfaces, processes, files in
which might be left around by mininet. Try this if things stop /tmp, etc.) which might be left around by mininet. Try this if things
working! stop working!
- Examples (in examples/ directory) to help you get started. - Examples (in examples/ directory) to help you get started.
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/python
"""
Build a simple network from scratch, using mininet primitives.
This is more complicated than using the higher-level classes,
but it exposes the configuration details and allows cusomization.
This version uses the user datapath.
"""
from mininet import init, Node, createLink
def scratchNet( cname='controller', cargs='ptcp:'):
# Create Network
controller = Node( 'c0' )
switch = Node( 's0')
h0 = Node( 'h0' )
h1 = Node( 'h1' )
createLink( controller, switch )
createLink( h0, switch )
createLink( h1, switch )
# Configure control network
controller.setIP( controller.intfs[ 0 ], '10.0.123.1', '/24' )
switch.setIP( switch.intfs[ 0 ], '10.0.123.2', '/24' )
# Configure hosts
h0.setIP( h0.intfs[ 0 ], '192.168.123.1', '/24' )
h1.setIP( h1.intfs[ 0 ], '192.168.123.2', '/24' )
# Start network using user datapath
controller.cmdPrint( cname + ' ' + cargs + '&' )
switch.cmdPrint( 'ifconfig lo 127.0.0.1' )
switch.cmdPrint( 'ofdatapath -i ' + ','.join( switch.intfs[ 1: ])
+ ' ptcp: &' )
switch.cmdPrint( 'ofprotocol tcp:' + controller.IP() + ' tcp:localhost &' )
# Run test
h0.cmdPrint( 'ping -c1 ' + h1.IP() )
# Stop network
controller.cmdPrint( 'kill %' + cname)
switch.cmdPrint( 'kill %ofdatapath' )
switch.cmdPrint( 'kill %ofprotocol' )
if __name__ == '__main__':
init()
scratchNet()
+10 -9
View File
@@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
""" """
Create a network and start sshd(8) on the hosts. Create a network and start sshd(8) on each host.
While something like rshd(8) would be lighter and faster, While something like rshd(8) would be lighter and faster,
(and perfectly adequate on an in-machine network) (and perfectly adequate on an in-machine network)
@@ -36,15 +36,10 @@ def connectToRootNS( network, switch ):
for net in routes: for net in routes:
root.cmdPrint( 'route add -net ' + net + ' dev ' + intf ) root.cmdPrint( 'route add -net ' + net + ' dev ' + intf )
def startServers( network, server ): def sshd( network ):
"Start network, and servers on each host." "Start a network, connect it to root ns, and run sshd on all hosts."
connectToRootNS( network, network.switches[ 0 ] ) connectToRootNS( network, network.switches[ 0 ] )
for host in network.hosts: host.cmdPrint( server ) for host in network.hosts: host.cmd( 'sshd -D &' )
if __name__ == '__main__':
init()
network = TreeNet( depth=1, fanout=4, kernel=True )
startServers( network, '/usr/sbin/sshd' )
print print
print "*** Hosts are running sshd at the following addresses:" print "*** Hosts are running sshd at the following addresses:"
print print
@@ -52,4 +47,10 @@ if __name__ == '__main__':
print print
print "*** Press return to shut down network: ", print "*** Press return to shut down network: ",
readline() readline()
for host in network.hosts: host.cmd( 'kill %sshd')
network.stop() network.stop()
if __name__ == '__main__':
init()
network = TreeNet( depth=1, fanout=4, kernel=True )
sshd( network )
+9 -11
View File
@@ -7,15 +7,18 @@ host. Requires xterm(1) and GNU screen(1).
import os, re import os, re
from subprocess import Popen from subprocess import Popen
from mininet import init, TreeNet, Cli, quietRun from mininet import init, TreeNet, quietRun
def makeXterm( node, title ): def makeXterm( node, title ):
"Run screen on a node, and hook up an xterm." "Run screen on a node, and hook up an xterm."
node.cmdPrint( 'screen -dmS ' + node.name )
title += ': ' + node.name title += ': ' + node.name
if not node.inNamespace: title += ' (root)' if not node.inNamespace: title += ' (root)'
cmd = [ 'xterm', '-title', title ] cmd = [ 'xterm', '-title', title, '-e' ]
cmd += [ '-e', 'screen', '-D', '-RR', '-S', node.name ] if not node.execed:
node.cmdPrint( 'screen -dmS ' + node.name )
cmd += [ 'screen', '-D', '-RR', '-S', node.name ]
else:
cmd += [ 'sh', '-c', 'exec tail -f /tmp/' + node.name + '*.log' ]
return Popen( cmd ) return Popen( cmd )
def cleanUpScreens(): def cleanUpScreens():
@@ -28,16 +31,11 @@ def cleanUpScreens():
quietRun( 'screen -S ' + m.group( 1 ) + ' -X kill' ) quietRun( 'screen -S ' + m.group( 1 ) + ' -X kill' )
def makeXterms( nodes, title ): def makeXterms( nodes, title ):
terms = [] return [ makeXterm( node, title) for node in nodes]
for node in nodes:
if not node.execed:
terms += [ makeXterm( node, title ) ]
return terms
def xterms( controllers, switches, hosts ): def xterms( controllers, switches, hosts ):
cleanUpScreens() cleanUpScreens()
terms = [] terms = makeXterms( controllers, 'controller' )
terms += makeXterms( controllers, 'controller' )
terms += makeXterms( switches, 'switch' ) terms += makeXterms( switches, 'switch' )
terms += makeXterms( hosts, 'host' ) terms += makeXterms( hosts, 'host' )
# Wait for xterms to exit # Wait for xterms to exit
+6 -3
View File
@@ -136,6 +136,7 @@ class Node( object ):
def terminate( self ): def terminate( self ):
self.cleanup() self.cleanup()
os.kill( self.pid, signal.SIGKILL ) os.kill( self.pid, signal.SIGKILL )
def stop( self ): self.terminate()
def waitReadable( self ): self.pollOut.poll() def waitReadable( self ): self.pollOut.poll()
def sendCmd( self, cmd ): def sendCmd( self, cmd ):
"""Send a command, followed by a command to echo a sentinel, """Send a command, followed by a command to echo a sentinel,
@@ -198,7 +199,7 @@ class Node( object ):
return intfName return intfName
def setIP( self, intf, ip, bits ): def setIP( self, intf, ip, bits ):
"Set an interface's IP address." "Set an interface's IP address."
result = self.cmd( [ 'ifconfig', intf, ip + bits, 'up' ] ) result = self.cmdPrint( [ 'ifconfig', intf, ip + bits, 'up' ] )
self.ips[ intf ] = ip self.ips[ intf ] = ip
return result return result
def setHostRoute( self, ip, intf ): def setHostRoute( self, ip, intf ):
@@ -246,11 +247,13 @@ class Controller( Node ):
def start( self, controller='controller', args='ptcp:' ): def start( self, controller='controller', args='ptcp:' ):
"Start <controller> <args> on controller, logging to /tmp/cN.log" "Start <controller> <args> on controller, logging to /tmp/cN.log"
cout = '/tmp/' + self.name + '.log' cout = '/tmp/' + self.name + '.log'
self.cmdPrint( controller + ' ' + args + self.cmdPrint( 'exec ' + controller + ' ' + args +
' 1> ' + cout + ' 2> ' + cout + ' &' ) ' 1> ' + cout + ' 2> ' + cout + ' &' )
self.execed = True
def stop( self, controller='controller' ): def stop( self, controller='controller' ):
"Stop controller cprog on controller" "Stop controller cprog on controller"
self.cmd( "kill %" + controller ) self.terminate()
# self.cmd( "kill %" + controller )
class Switch( Node ): class Switch( Node ):
"""A Switch is a Node that is running (or has execed) """A Switch is a Node that is running (or has execed)