Minor changes to get 'make test' to pass.

- some namespace conflicts due to unpep8
- fixed infinite recursion caused by removing redundant makeIntfPair
This commit is contained in:
Bob Lantz
2010-02-05 16:42:01 -08:00
parent 80a8fa62d5
commit 281f6e59db
4 changed files with 45 additions and 31 deletions
+6
View File
@@ -17,3 +17,9 @@ codecheck: $(PYSRC)
test: $(MININET) $(TEST)
mininet/test/test_nets.py
install:
python setup.py install
+37 -29
View File
@@ -1,7 +1,10 @@
#!/usr/bin/python
"""Mininet: A simple networking testbed for OpenFlow!
author: Bob Lantz ( rlantz@cs.stanford.edu )
author: Brandon Heller ( brandonh@stanford.edu )
"""
Mininet: A simple networking testbed for OpenFlow!
author: Bob Lantz (rlantz@cs.stanford.edu)
author: Brandon Heller (brandonh@stanford.edu)
Mininet creates scalable OpenFlow test networks by using
process-based virtualization and network namespaces.
@@ -11,9 +14,9 @@ namespaces. This allows a complete OpenFlow network to be simulated on
top of a single Linux kernel.
Each host has:
A virtual console ( pipes to a shell )
A virtual interfaces ( half of a veth pair )
A parent shell ( and possibly some child processes ) in a namespace
A virtual console (pipes to a shell)
A virtual interfaces (half of a veth pair)
A parent shell (and possibly some child processes) in a namespace
Hosts have a network interface which is configured via ifconfig/ip
link/etc.
@@ -24,24 +27,28 @@ from the OpenFlow reference implementation.
In kernel datapath mode, the controller and switches are simply
processes in the root namespace.
Kernel OpenFlow datapaths are instantiated using dpctl( 8 ), and are
Kernel OpenFlow datapaths are instantiated using dpctl(8), and are
attached to the one side of a veth pair; the other side resides in the
host namespace. In this mode, switch processes can simply connect to the
controller via the loopback interface.
In user datapath mode, the controller and switches are full-service
nodes that live in their own network namespaces and have management
interfaces and IP addresses on a control network ( e.g. 10.0.123.1,
currently routed although it could be bridged. )
interfaces and IP addresses on a control network (e.g. 10.0.123.1,
currently routed although it could be bridged.)
In addition to a management interface, user mode switches also have
several switch interfaces, halves of veth pairs whose other halves
reside in the host nodes that the switches are connected to.
Naming:
Host nodes are named h1-hN
Switch nodes are named s0-sN
Interfaces are named { nodename }-eth0 .. { nodename }-ethN,"""
Host nodes are named h1-hN
Switch nodes are named s0-sN
Interfaces are named { nodename }-eth0 .. { nodename }-ethN
"""
import os
import re
import signal
@@ -79,7 +86,7 @@ class Mininet( object ):
autoSetMacs=False, autoStaticArp=False ):
"""Create Mininet object.
topo: Topo object
switch: Switch class
switch: Switch class
host: Host class
controller: Controller class
cparams: ControllerParams object
@@ -219,7 +226,8 @@ class Mininet( object ):
lg.info( '\n' )
lg.info( '*** Testing control network\n' )
while not controller.intfIsUp( controller.intfs[ 0 ] ):
lg.info( '*** Waiting for %s to come up\n', controller.intfs[ 0 ] )
lg.info( '*** Waiting for %s to come up\n',
controller.intfs[ 0 ] )
sleep( 1 )
for switchDpid in self.topo.switches():
switch = self.nodes[ switchDpid ]
@@ -509,21 +517,21 @@ class MininetCLI( object ):
# Commands
def help( self, args ):
"Semi-useful help for CLI."
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n' +
'You may also send a command to a node using:\n' +
' <node> command {args}\n' +
'For example:\n' +
' mininet> h0 ifconfig\n' +
'\n' +
'The interpreter automatically substitutes IP ' +
'addresses\n' +
'for node names, so commands like\n' +
' mininet> h0 ping -c1 h1\n' +
'should work.\n' +
'\n\n' +
'Interactive commands are not really supported yet,\n' +
'so please limit commands to ones that do not\n' +
'require user interaction and will terminate\n' +
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n'
'You may also send a command to a node using:\n'
' <node> command {args}\n'
'For example:\n'
' mininet> h0 ifconfig\n'
'\n'
'The interpreter automatically substitutes IP '
'addresses\n'
'for node names, so commands like\n'
' mininet> h0 ping -c1 h1\n'
'should work.\n'
'\n\n'
'Interactive commands are not really supported yet,\n'
'so please limit commands to ones that do not\n'
'require user interaction and will terminate\n'
'after a reasonable amount of time.\n' )
print( helpStr )
+1 -1
View File
@@ -28,7 +28,7 @@ class Node( object ):
if self.inNamespace:
cmd = [ 'netns' ] + cmd
self.shell = Popen( cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
closeFds=closeFds )
close_fds=closeFds )
self.stdin = self.shell.stdin
self.stdout = self.shell.stdout
self.pollOut = select.poll()
+1 -1
View File
@@ -100,7 +100,7 @@ def moveIntf( intf, node, printError=False, retries=3, delaySecs=0.001 ):
intf: string, interface
node: Node object
printError: if true, print error"""
retry( retries, delaySecs, moveIntf, intf, node, printError )
retry( retries, delaySecs, moveIntfNoRetry, intf, node, printError )
def createLink( node1, node2, retries=10, delaySecs=0.001 ):
"""Create a link between nodes, making an interface for each.