Tweaks to documentation files and sshd and xterms examples.
Added scratchnetuser.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
Executable
+43
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user