From 4d381f0b58499dad18c4ac4cabc1e759db72efa9 Mon Sep 17 00:00:00 2001 From: cody burkard <cody@onlab.us> Date: Sat, 19 Jul 2014 02:05:37 -0700 Subject: [PATCH] testing link stuff --- bin/mn | 1 - mininet/link.py | 26 ++++++++++++++++++++++---- mininet/net.py | 9 ++++++++- mininet/util.py | 8 +++++--- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/bin/mn b/bin/mn index 71c76ecf..75166b76 100755 --- a/bin/mn +++ b/bin/mn @@ -272,7 +272,6 @@ class MininetRunner( object ): if self.options.post: CLI( mn, script=self.options.post ) - mn.stop() elapsed = float( time.time() - start ) info( 'completed in %0.3f seconds\n' % elapsed ) diff --git a/mininet/link.py b/mininet/link.py index be73d521..3e325380 100644 --- a/mininet/link.py +++ b/mininet/link.py @@ -86,6 +86,7 @@ def updateIP( self ): def updateMAC( self ): "Return updated MAC address based on ifconfig" + #heres where we send the unecessary ifconfigs ifconfig = self.ifconfig() macs = self._macMatchRegex.findall( ifconfig ) self.mac = macs[ 0 ] if macs else None @@ -102,8 +103,13 @@ def MAC( self ): def isUp( self, setUp=False ): "Return whether interface is up" if setUp: - self.ifconfig( 'up' ) - return "UP" in self.ifconfig() + r = self.ifconfig( 'up' ) + if r: + return False + else: + return True + else: + return "UP" in self.ifconfig() def rename( self, newname ): "Rename interface" @@ -138,6 +144,16 @@ def setParam( self, results, method, **param ): results[ name ] = result return result + def updateAddr( self ): + "instead of updating ip and mac separately, use one ifconfig call to do it simultaneously" + ifconfig = self.ifconfig() + print ifconfig + ips = self._ipMatchRegex.findall( ifconfig ) + macs = self._macMatchRegex.findall( ifconfig ) + self.ip = ips[ 0 ] if ips else None + self.mac = macs[ 0 ] if macs else None + return self.ip, self.mac + def config( self, mac=None, ip=None, ifconfig=None, up=True, **_params ): """Configure Node according to (optional) parameters: @@ -154,8 +170,10 @@ def config( self, mac=None, ip=None, ifconfig=None, self.setParam( r, 'setIP', ip=ip ) self.setParam( r, 'isUp', up=up ) self.setParam( r, 'ifconfig', ifconfig=ifconfig ) - self.updateIP() - self.updateMAC() + #should combine these next two operations into one. this is unecessary + #self.updateAddr() + #self.updateIP() + #self.updateMAC() return r def delete( self ): diff --git a/mininet/net.py b/mininet/net.py index 8edaee3d..135807bd 100755 --- a/mininet/net.py +++ b/mininet/net.py @@ -100,6 +100,7 @@ from mininet.util import quietRun, fixLimits, numCores, ensureRoot from mininet.util import macColonHex, ipStr, ipParse, netParse, ipAdd from mininet.term import cleanUpScreens, makeTerms +from multiprocessing.pool import ThreadPool # Mininet version: should be consistent with README and LICENSE VERSION = "2.1.0+" @@ -157,6 +158,8 @@ def __init__( self, topo=None, switch=OVSKernelSwitch, host=Host, self.terms = [] # list of spawned xterm processes + self.pool = ThreadPool( 64 ) + Mininet.init() # Initialize Mininet if necessary self.built = False @@ -337,13 +340,17 @@ def buildFromTopo( self, topo=None ): info( switchName + ' ' ) info( '\n*** Adding links:\n' ) + # need to 'asynchronize' this too for srcName, dstName in topo.links(sort=True): src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ] params = topo.linkInfo( srcName, dstName ) srcPort, dstPort = topo.port( srcName, dstName ) self.addLink( src, dst, srcPort, dstPort, **params ) + #self.pool.apply( self.addLink, ( src, dst, srcPort, dstPort, params, ) ) + #self.pool.apply_async( self.addLink, args = ( src, dst )+ params, kwds = { 'Port1':srcPort, 'Port2':dstPort } ) info( '(%s, %s) ' % ( src.name, dst.name ) ) - + #self.pool.close() + #self.pool.join() info( '\n' ) def configureControlNetwork( self ): diff --git a/mininet/util.py b/mininet/util.py index 5cb27f44..b4d213a0 100644 --- a/mininet/util.py +++ b/mininet/util.py @@ -82,6 +82,8 @@ def errRun( *cmd, **kwargs ): poller.register( popen.stdout, POLLIN ) fdtofile = { popen.stdout.fileno(): popen.stdout } outDone, errDone = False, True + #bookmark: rearrange this for aynch startup. shouldnt have to keep + # maybe we dont rearrange this. we really just need a method to call a command and NOT poll for output if popen.stderr: fdtofile[ popen.stderr.fileno() ] = popen.stderr poller.register( popen.stderr, POLLIN ) @@ -185,10 +187,10 @@ def moveIntfNoRetry( intf, dstNode, srcNode=None, printError=False ): intf = str( intf ) cmd = 'ip link set %s netns %s' % ( intf, dstNode.pid ) if srcNode: - srcNode.cmd( cmd ) + output = srcNode.cmd( cmd ) else: - quietRun( cmd ) - if ( ' %s:' % intf ) not in dstNode.cmd( 'ip link show', intf ): + output = quietRun( cmd ) + if output: if printError: error( '*** Error: moveIntf: ' + intf + ' not successfully moved to ' + dstNode.name + '\n' ) -- GitLab