From dc630c540acf72883b51146e669842818589b85e Mon Sep 17 00:00:00 2001 From: Bob Lantz <rlantz@cs.stanford.edu> Date: Wed, 3 Mar 2010 14:37:14 -0800 Subject: [PATCH] Restored scratchnet and scratchnetuser demos. Also changed the str format for nodes to use str() rather than repr() so we don't end up with extraneous quotes. --- examples/scratchnet.py | 54 ++++++++++++------------- examples/scratchnetuser.py | 82 +++++++++++++++++++++++--------------- mininet/node.py | 8 ++-- 3 files changed, 80 insertions(+), 64 deletions(-) diff --git a/examples/scratchnet.py b/examples/scratchnet.py index 84c74bed..030d0dde 100755 --- a/examples/scratchnet.py +++ b/examples/scratchnet.py @@ -11,44 +11,44 @@ from mininet.net import init from mininet.node import Node from mininet.util import createLink -from mininet.log import info - -# print out info() messages, including cmdPrint -logging.LOGLEVELDEFAULT = logging.INFO +from mininet.log import lg, info def scratchNet( cname='controller', cargs='ptcp:'): - # Create Network - print "*** creating Nodes" + + info( "*** Creating nodes\n" ) controller = Node( 'c0', inNamespace=False ) switch = Node( 's0', inNamespace=False ) h0 = Node( 'h0' ) h1 = Node( 'h1' ) - print "*** creating links" + + info( "*** Creating links\n" ) createLink( node1=h0, port1=0, node2=switch, port2=0 ) createLink( node1=h1, port1=0, node2=switch, port2=1 ) - # Configure hosts - print "*** configuring hosts" + + info( "*** Configuring hosts\n" ) h0.setIP( h0.intfs[ 0 ], '192.168.123.1', '/24' ) h1.setIP( h1.intfs[ 0 ], '192.168.123.2', '/24' ) - print h0 - print h1 - # Start network using kernel datapath - controller.cmdPrint( cname + ' ' + cargs + '&' ) - switch.cmdPrint( 'dpctl deldp nl:0' ) - switch.cmdPrint( 'dpctl adddp nl:0' ) + info( str( h0 ) + '\n' ) + info( str( h1 ) + '\n' ) + + info( "*** Starting network using kernel datapath\n" ) + controller.cmd( cname + ' ' + cargs + '&' ) + switch.cmd( 'dpctl deldp nl:0' ) + switch.cmd( 'dpctl adddp nl:0' ) for intf in switch.intfs.values(): - switch.cmdPrint( 'dpctl addif nl:0 ' + intf ) - switch.cmdPrint( 'ofprotocol nl:0 tcp:localhost &') - # Run test - print h0.cmd( 'ping -c1 ' + h1.IP() ) - # Stop network - controller.cmdPrint( 'kill %' + cname) - switch.cmdPrint( 'dpctl deldp nl:0' ) - switch.cmdPrint( 'kill %ofprotocol' ) - switch.stop() - controller.stop() + switch.cmd( 'dpctl addif nl:0 ' + intf ) + switch.cmd( 'ofprotocol nl:0 tcp:localhost &') + + info( "*** Running test\n" ) + h0.cmdPrint( 'ping -c1 ' + h1.IP() ) + + info( "*** Stopping network\n" ) + controller.cmd( 'kill %' + cname) + switch.cmd( 'dpctl deldp nl:0' ) + switch.cmd( 'kill %ofprotocol' ) if __name__ == '__main__': - info( '*** Scratch network demo\n' ) - init() + info( '*** Scratch network demo (kernel datapath)\n' ) + init() + lg.setLogLevel( 'info' ) scratchNet() diff --git a/examples/scratchnetuser.py b/examples/scratchnetuser.py index a321cd5e..345a2af0 100755 --- a/examples/scratchnetuser.py +++ b/examples/scratchnetuser.py @@ -8,40 +8,56 @@ This version uses the user datapath. """ -from mininet.mininet import init, Node, createLink +from mininet.net import init +from mininet.node import Node +from mininet.util import createLink +from mininet.log import lg, info def scratchNetUser( cname='controller', cargs='ptcp:'): - # Create Network - # It's not strictly necessary for the controller and switches - # to be in separate namespaces. For performance, they probably - # should be in the root namespace. However, it's interesting to - # see how they could work even if they are in separate namespaces. - 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' ) + # Create Network + # It's not strictly necessary for the controller and switches + # to be in separate namespaces. For performance, they probably + # should be in the root namespace. However, it's interesting to + # see how they could work even if they are in separate namespaces. + + info( '*** Creating Network\n' ) + controller = Node( 'c0' ) + switch = Node( 's0') + h0 = Node( 'h0' ) + h1 = Node( 'h1' ) + createLink( controller, 0, switch, 0 ) + createLink( h0, 0, switch, 1 ) + createLink( h1, 0, switch, 2 ) + + info( '*** Configuring control network\n' ) + controller.setIP( controller.intfs[ 0 ], '10.0.123.1', '/24' ) + switch.setIP( switch.intfs[ 0 ], '10.0.123.2', '/24' ) + + info( '*** Configuring hosts\n' ) + h0.setIP( h0.intfs[ 0 ], '192.168.123.1', '/24' ) + h1.setIP( h1.intfs[ 0 ], '192.168.123.2', '/24' ) + + info( '*** Network state:\n' ) + for node in controller, switch, h0, h1: + info( str( node ) + '\n' ) + + info( '*** Starting controller and user datapath\n' ) + controller.cmd( cname + ' ' + cargs + '&' ) + switch.cmd( 'ifconfig lo 127.0.0.1' ) + intfs = [ switch.intfs[ port ] for port in (1, 2) ] + switch.cmd( 'ofdatapath -i ' + ','.join( intfs ) + ' ptcp: &' ) + switch.cmd( 'ofprotocol tcp:' + controller.IP() + ' tcp:localhost &' ) + + info( '*** Running test\n' ) + h0.cmdPrint( 'ping -c1 ' + h1.IP() ) + + info( '*** Stopping network\n' ) + controller.cmd( 'kill %' + cname ) + switch.cmd( 'kill %ofdatapath' ) + switch.cmd( 'kill %ofprotocol' ) if __name__ == '__main__': - init() - scratchNetUser() + info( '*** Scratch network demo (user datapath)\n' ) + init() + lg.setLogLevel( 'info' ) + scratchNetUser() diff --git a/mininet/node.py b/mininet/node.py index eb60b85a..99935c6f 100644 --- a/mininet/node.py +++ b/mininet/node.py @@ -54,7 +54,7 @@ class Node( object ): def __init__( self, name, inNamespace=True ): self.name = name closeFds = False # speed vs. memory use - # xpgEcho is needed so we can echo our sentinel in sendCmd + # xpg_echo is needed so we can echo our sentinel in sendCmd cmd = [ '/bin/bash', '-O', 'xpg_echo' ] self.inNamespace = inNamespace if self.inNamespace: @@ -170,7 +170,7 @@ def cmd( self, cmd, verbose=False ): """Send a command, wait for output, and return it. cmd: string""" log = info if verbose else debug - log( '*** %s : %s', self.name, cmd ) + log( '*** %s : %s\n' % ( self.name, cmd ) ) self.sendCmd( cmd ) return self.waitOutput( verbose ) @@ -261,9 +261,9 @@ def intfIsUp( self, port ): # Other methods def __str__( self ): result = self.name + ':' - result += ' IP=' + repr( self.IP() ) + result += ' IP=' + str( self.IP() ) result += ' intfs=' + ','.join( sorted( self.intfs.values() ) ) - result += ' waiting=' + repr( self.waiting ) + result += ' waiting=' + str( self.waiting ) return result -- GitLab