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:
@@ -17,3 +17,9 @@ codecheck: $(PYSRC)
|
|||||||
|
|
||||||
test: $(MININET) $(TEST)
|
test: $(MININET) $(TEST)
|
||||||
mininet/test/test_nets.py
|
mininet/test/test_nets.py
|
||||||
|
|
||||||
|
install:
|
||||||
|
python setup.py install
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+37
-29
@@ -1,7 +1,10 @@
|
|||||||
#!/usr/bin/python
|
#!/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
|
Mininet creates scalable OpenFlow test networks by using
|
||||||
process-based virtualization and network namespaces.
|
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.
|
top of a single Linux kernel.
|
||||||
|
|
||||||
Each host has:
|
Each host has:
|
||||||
A virtual console ( pipes to a shell )
|
A virtual console (pipes to a shell)
|
||||||
A virtual interfaces ( half of a veth pair )
|
A virtual interfaces (half of a veth pair)
|
||||||
A parent shell ( and possibly some child processes ) in a namespace
|
A parent shell (and possibly some child processes) in a namespace
|
||||||
|
|
||||||
Hosts have a network interface which is configured via ifconfig/ip
|
Hosts have a network interface which is configured via ifconfig/ip
|
||||||
link/etc.
|
link/etc.
|
||||||
@@ -24,24 +27,28 @@ from the OpenFlow reference implementation.
|
|||||||
In kernel datapath mode, the controller and switches are simply
|
In kernel datapath mode, the controller and switches are simply
|
||||||
processes in the root namespace.
|
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
|
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
|
host namespace. In this mode, switch processes can simply connect to the
|
||||||
controller via the loopback interface.
|
controller via the loopback interface.
|
||||||
|
|
||||||
In user datapath mode, the controller and switches are full-service
|
In user datapath mode, the controller and switches are full-service
|
||||||
nodes that live in their own network namespaces and have management
|
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,
|
interfaces and IP addresses on a control network (e.g. 10.0.123.1,
|
||||||
currently routed although it could be bridged. )
|
currently routed although it could be bridged.)
|
||||||
|
|
||||||
In addition to a management interface, user mode switches also have
|
In addition to a management interface, user mode switches also have
|
||||||
several switch interfaces, halves of veth pairs whose other halves
|
several switch interfaces, halves of veth pairs whose other halves
|
||||||
reside in the host nodes that the switches are connected to.
|
reside in the host nodes that the switches are connected to.
|
||||||
|
|
||||||
Naming:
|
Naming:
|
||||||
Host nodes are named h1-hN
|
|
||||||
Switch nodes are named s0-sN
|
Host nodes are named h1-hN
|
||||||
Interfaces are named { nodename }-eth0 .. { nodename }-ethN,"""
|
Switch nodes are named s0-sN
|
||||||
|
Interfaces are named { nodename }-eth0 .. { nodename }-ethN
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import signal
|
import signal
|
||||||
@@ -79,7 +86,7 @@ class Mininet( object ):
|
|||||||
autoSetMacs=False, autoStaticArp=False ):
|
autoSetMacs=False, autoStaticArp=False ):
|
||||||
"""Create Mininet object.
|
"""Create Mininet object.
|
||||||
topo: Topo object
|
topo: Topo object
|
||||||
switch: Switch class
|
switch: Switch class
|
||||||
host: Host class
|
host: Host class
|
||||||
controller: Controller class
|
controller: Controller class
|
||||||
cparams: ControllerParams object
|
cparams: ControllerParams object
|
||||||
@@ -219,7 +226,8 @@ class Mininet( object ):
|
|||||||
lg.info( '\n' )
|
lg.info( '\n' )
|
||||||
lg.info( '*** Testing control network\n' )
|
lg.info( '*** Testing control network\n' )
|
||||||
while not controller.intfIsUp( controller.intfs[ 0 ] ):
|
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 )
|
sleep( 1 )
|
||||||
for switchDpid in self.topo.switches():
|
for switchDpid in self.topo.switches():
|
||||||
switch = self.nodes[ switchDpid ]
|
switch = self.nodes[ switchDpid ]
|
||||||
@@ -509,21 +517,21 @@ class MininetCLI( object ):
|
|||||||
# Commands
|
# Commands
|
||||||
def help( self, args ):
|
def help( self, args ):
|
||||||
"Semi-useful help for CLI."
|
"Semi-useful help for CLI."
|
||||||
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n' +
|
helpStr = ( 'Available commands are:' + str( self.cmds ) + '\n'
|
||||||
'You may also send a command to a node using:\n' +
|
'You may also send a command to a node using:\n'
|
||||||
' <node> command {args}\n' +
|
' <node> command {args}\n'
|
||||||
'For example:\n' +
|
'For example:\n'
|
||||||
' mininet> h0 ifconfig\n' +
|
' mininet> h0 ifconfig\n'
|
||||||
'\n' +
|
'\n'
|
||||||
'The interpreter automatically substitutes IP ' +
|
'The interpreter automatically substitutes IP '
|
||||||
'addresses\n' +
|
'addresses\n'
|
||||||
'for node names, so commands like\n' +
|
'for node names, so commands like\n'
|
||||||
' mininet> h0 ping -c1 h1\n' +
|
' mininet> h0 ping -c1 h1\n'
|
||||||
'should work.\n' +
|
'should work.\n'
|
||||||
'\n\n' +
|
'\n\n'
|
||||||
'Interactive commands are not really supported yet,\n' +
|
'Interactive commands are not really supported yet,\n'
|
||||||
'so please limit commands to ones that do not\n' +
|
'so please limit commands to ones that do not\n'
|
||||||
'require user interaction and will terminate\n' +
|
'require user interaction and will terminate\n'
|
||||||
'after a reasonable amount of time.\n' )
|
'after a reasonable amount of time.\n' )
|
||||||
print( helpStr )
|
print( helpStr )
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ class Node( object ):
|
|||||||
if self.inNamespace:
|
if self.inNamespace:
|
||||||
cmd = [ 'netns' ] + cmd
|
cmd = [ 'netns' ] + cmd
|
||||||
self.shell = Popen( cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
|
self.shell = Popen( cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
|
||||||
closeFds=closeFds )
|
close_fds=closeFds )
|
||||||
self.stdin = self.shell.stdin
|
self.stdin = self.shell.stdin
|
||||||
self.stdout = self.shell.stdout
|
self.stdout = self.shell.stdout
|
||||||
self.pollOut = select.poll()
|
self.pollOut = select.poll()
|
||||||
|
|||||||
+1
-1
@@ -100,7 +100,7 @@ def moveIntf( intf, node, printError=False, retries=3, delaySecs=0.001 ):
|
|||||||
intf: string, interface
|
intf: string, interface
|
||||||
node: Node object
|
node: Node object
|
||||||
printError: if true, print error"""
|
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 ):
|
def createLink( node1, node2, retries=10, delaySecs=0.001 ):
|
||||||
"""Create a link between nodes, making an interface for each.
|
"""Create a link between nodes, making an interface for each.
|
||||||
|
|||||||
Reference in New Issue
Block a user