Merge pull request #424 from cdburkard/devel/mergePrivate

merge HostWithPrivateDirs into Node
This commit is contained in:
lantz
2014-11-04 15:09:20 -08:00
3 changed files with 36 additions and 65 deletions
+4 -7
View File
@@ -35,7 +35,7 @@ on '/var/mn'
""" """
from mininet.net import Mininet from mininet.net import Mininet
from mininet.node import Host, HostWithPrivateDirs from mininet.node import Host
from mininet.cli import CLI from mininet.cli import CLI
from mininet.topo import SingleSwitchTopo from mininet.topo import SingleSwitchTopo
from mininet.log import setLogLevel, info, debug from mininet.log import setLogLevel, info, debug
@@ -51,15 +51,12 @@ def testHostWithPrivateDirs():
privateDirs = [ ( '/var/log', '/tmp/%(name)s/var/log' ), privateDirs = [ ( '/var/log', '/tmp/%(name)s/var/log' ),
( '/var/run', '/tmp/%(name)s/var/run' ), ( '/var/run', '/tmp/%(name)s/var/run' ),
'/var/mn' ] '/var/mn' ]
host = partial( HostWithPrivateDirs, host = partial( Host,
privateDirs=privateDirs ) privateDirs=privateDirs )
net = Mininet( topo=topo, host=host ) net = Mininet( topo=topo, host=host )
net.start() net.start()
directories = [] directories = [ directory[ 0 ] if isinstance( directory, tuple )
for directory in privateDirs: else directory for directory in privateDirs ]
directories.append( directory[ 0 ]
if isinstance( directory, tuple )
else directory )
info( 'Private Directories:', directories, '\n' ) info( 'Private Directories:', directories, '\n' )
CLI( net ) CLI( net )
net.stop() net.stop()
+4 -29
View File
@@ -43,7 +43,7 @@ from mininet.util import buildTopo
from mininet.util import custom, customConstructor from mininet.util import custom, customConstructor
from mininet.term import makeTerm, cleanUpScreens from mininet.term import makeTerm, cleanUpScreens
from mininet.node import Controller, RemoteController, NOX, OVSController from mininet.node import Controller, RemoteController, NOX, OVSController
from mininet.node import CPULimitedHost, Host, Node, HostWithPrivateDirs from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, OVSSwitch, UserSwitch from mininet.node import OVSKernelSwitch, OVSSwitch, UserSwitch
from mininet.link import TCLink, Intf, Link from mininet.link import TCLink, Intf, Link
from mininet.cli import CLI from mininet.cli import CLI
@@ -78,32 +78,6 @@ HOSTS = { 'proc': Host,
'cfs': custom( CPULimitedHost, sched='cfs' ) } 'cfs': custom( CPULimitedHost, sched='cfs' ) }
class CPULimitedHostWithPrivateDirs( CPULimitedHost ):
"Host with private directories"
def __init__( self, name, sched='cfs', **kwargs ):
"privateDirs: list of private directory strings or tuples"
self.name = name
self.privateDirs = kwargs.pop( 'privateDirs', [] )
CPULimitedHost.__init__( self, name, sched, **kwargs )
self.mountPrivateDirs()
def mountPrivateDirs( self ):
"mount private directories"
for directory in self.privateDirs:
if isinstance( directory, tuple ):
# mount given private directory
privateDir = directory[ 1 ] % self.__dict__
mountPoint = directory[ 0 ]
self.cmd( 'mkdir -p %s' % privateDir )
self.cmd( 'mkdir -p %s' % mountPoint )
self.cmd( 'mount --bind %s %s' %
( privateDir, mountPoint ) )
else:
# mount temporary filesystem on directory
self.cmd( 'mkdir -p %s' % directory )
self.cmd( 'mount -n -t tmpfs tmpfs %s' % directory )
class InbandController( RemoteController ): class InbandController( RemoteController ):
def checkListening( self ): def checkListening( self ):
@@ -2784,16 +2758,17 @@ class MiniEdit( Frame ):
# Create the correct host class # Create the correct host class
if 'cores' in opts or 'cpu' in opts: if 'cores' in opts or 'cpu' in opts:
if ('privateDirectory' in opts): if ('privateDirectory' in opts):
hostCls = partial( CPULimitedHostWithPrivateDirs, hostCls = partial( CPULimitedHost,
privateDirs=opts['privateDirectory'] ) privateDirs=opts['privateDirectory'] )
else: else:
hostCls=CPULimitedHost hostCls=CPULimitedHost
else: else:
if ('privateDirectory' in opts): if ('privateDirectory' in opts):
hostCls = partial( HostWithPrivateDirs, hostCls = partial( Host,
privateDirs=opts['privateDirectory'] ) privateDirs=opts['privateDirectory'] )
else: else:
hostCls=Host hostCls=Host
print hostCls
newHost = net.addHost( name, newHost = net.addHost( name,
cls=hostCls, cls=hostCls,
ip=ip, ip=ip,
+28 -29
View File
@@ -75,12 +75,14 @@ class Node( object ):
def __init__( self, name, inNamespace=True, **params ): def __init__( self, name, inNamespace=True, **params ):
"""name: name of node """name: name of node
inNamespace: in network namespace? inNamespace: in network namespace?
privateDirs: list of private directory strings or tuples
params: Node parameters (see config() for details)""" params: Node parameters (see config() for details)"""
# Make sure class actually works # Make sure class actually works
self.checkSetup() self.checkSetup()
self.name = params.get( 'name', name ) self.name = params.get( 'name', name )
self.privateDirs = params.get( 'privateDirs', [] )
self.inNamespace = params.get( 'inNamespace', inNamespace ) self.inNamespace = params.get( 'inNamespace', inNamespace )
# Stash configuration parameters for future reference # Stash configuration parameters for future reference
@@ -100,6 +102,7 @@ class Node( object ):
# Start command interpreter shell # Start command interpreter shell
self.startShell() self.startShell()
self.mountPrivateDirs()
# File descriptor to node mapping support # File descriptor to node mapping support
# Class variables and methods # Class variables and methods
@@ -161,6 +164,30 @@ class Node( object ):
self.cmd( 'stty -echo' ) self.cmd( 'stty -echo' )
self.cmd( 'set +m' ) self.cmd( 'set +m' )
def mountPrivateDirs( self ):
"mount private directories"
for directory in self.privateDirs:
if isinstance( directory, tuple ):
# mount given private directory
privateDir = directory[ 1 ] % self.__dict__
mountPoint = directory[ 0 ]
self.cmd( 'mkdir -p %s' % privateDir )
self.cmd( 'mkdir -p %s' % mountPoint )
self.cmd( 'mount --bind %s %s' %
( privateDir, mountPoint ) )
else:
# mount temporary filesystem on directory
self.cmd( 'mkdir -p %s' % directory )
self.cmd( 'mount -n -t tmpfs tmpfs %s' % directory )
def unmountPrivateDirs( self ):
"mount private directories"
for directory in self.privateDirs:
if isinstance( directory, tuple ):
self.cmd( 'umount ', directory[ 0 ] )
else:
self.cmd( 'umount ', directory )
def _popen( self, cmd, **params ): def _popen( self, cmd, **params ):
"""Internal method: spawn and return a process """Internal method: spawn and return a process
cmd: command to run (list) cmd: command to run (list)
@@ -210,6 +237,7 @@ class Node( object ):
def terminate( self ): def terminate( self ):
"Send kill signal to Node and clean up after it." "Send kill signal to Node and clean up after it."
self.unmountPrivateDirs()
if self.shell: if self.shell:
if self.shell.poll() is None: if self.shell.poll() is None:
os.killpg( self.shell.pid, signal.SIGHUP ) os.killpg( self.shell.pid, signal.SIGHUP )
@@ -590,12 +618,10 @@ class Node( object ):
"Make sure our class dependencies are available" "Make sure our class dependencies are available"
pathCheck( 'mnexec', 'ifconfig', moduleName='Mininet') pathCheck( 'mnexec', 'ifconfig', moduleName='Mininet')
class Host( Node ): class Host( Node ):
"A host is simply a Node" "A host is simply a Node"
pass pass
class CPULimitedHost( Host ): class CPULimitedHost( Host ):
"CPU limited host" "CPU limited host"
@@ -762,33 +788,6 @@ class CPULimitedHost( Host ):
mountCgroups() mountCgroups()
cls.inited = True cls.inited = True
class HostWithPrivateDirs( Host ):
"Host with private directories"
def __init__( self, name, *args, **kwargs ):
"privateDirs: list of private directory strings or tuples"
self.name = name
self.privateDirs = kwargs.pop( 'privateDirs', [] )
Host.__init__( self, name, *args, **kwargs )
self.mountPrivateDirs()
def mountPrivateDirs( self ):
"mount private directories"
for directory in self.privateDirs:
if isinstance( directory, tuple ):
# mount given private directory
privateDir = directory[ 1 ] % self.__dict__
mountPoint = directory[ 0 ]
self.cmd( 'mkdir -p %s' % privateDir )
self.cmd( 'mkdir -p %s' % mountPoint )
self.cmd( 'mount --bind %s %s' %
( privateDir, mountPoint ) )
else:
# mount temporary filesystem on directory
self.cmd( 'mkdir -p %s' % directory )
self.cmd( 'mount -n -t tmpfs tmpfs %s' % directory )
# Some important things to note: # Some important things to note:
# #