added documentation for HostWithPrivateDirs
This commit is contained in:
+51
-10
@@ -1,9 +1,38 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
|
||||||
"""
|
"""
|
||||||
bind.py: Bind mount prototype
|
bind.py: Bind mount example
|
||||||
|
|
||||||
This creates hosts with private directories as desired.
|
This creates hosts with private directories that the user specifies.
|
||||||
|
These hosts may have persistent directories that will be available
|
||||||
|
across multiple mininet session, or temporary directories that will
|
||||||
|
only last for one mininet session. To specify a persistent
|
||||||
|
directory, add a tuple to a list of private directories:
|
||||||
|
|
||||||
|
[ ( 'directory to be mounted on', 'directory to be mounted' ) ]
|
||||||
|
|
||||||
|
String expansion may be used to create a directory template for
|
||||||
|
each host. To do this, add a %(name)s in place of the host name
|
||||||
|
when creating your list of directories:
|
||||||
|
|
||||||
|
[ ( '/var/run', '/tmp/%(name)s/var/run' ) ]
|
||||||
|
|
||||||
|
If no persistent directory is specified, the directories will default
|
||||||
|
to temporary private directories. To do this, simply create a list of
|
||||||
|
directories to be made private. A tmpfs will then be mounted on them.
|
||||||
|
|
||||||
|
You may use both temporary and persistent directories at the same
|
||||||
|
time. In the following privateDirs string, each host will have a
|
||||||
|
persistent directory in the root filesystem at
|
||||||
|
"/tmp/(hostname)/var/run" mounted on "/var/run". Each host will also
|
||||||
|
have a temporary private directory mounted on "/var/log".
|
||||||
|
|
||||||
|
[ ( '/var/run', '/tmp/%(name)s/var/run' ), '/var/log' ]
|
||||||
|
|
||||||
|
This example runs TWO mininet instances, one after the other.
|
||||||
|
The first mounts persistent private directories on /var/log and
|
||||||
|
/var/run. The second mounts temporary private directories on the same
|
||||||
|
directories.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from mininet.net import Mininet
|
from mininet.net import Mininet
|
||||||
@@ -15,19 +44,18 @@ from mininet.log import setLogLevel, info, debug
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
|
|
||||||
# Sample usage
|
# Persistent directory sample usage
|
||||||
|
|
||||||
def testHostWithPrivateDirs():
|
def testPersistentPrivateDirs():
|
||||||
"Test bind mounts"
|
"Test bind mounts"
|
||||||
topo = SingleSwitchTopo( 10 )
|
topo = SingleSwitchTopo( 10 )
|
||||||
privateDirs = [ ( '/var/log', '/onos/%(name)s/var/log' ),
|
privateDirs = [ ( '/var/log', '/tmp/%(name)s/var/log' ),
|
||||||
( '/var/run', '/ovx/%(name)s/var/run' ),
|
( '/var/run', '/tmp/%(name)s/var/run' ) ]
|
||||||
'/mn' ]
|
|
||||||
host = partial( HostWithPrivateDirs,
|
host = partial( HostWithPrivateDirs,
|
||||||
privateDirs=privateDirs )
|
privateDirs=privateDirs )
|
||||||
net = Mininet( topo=topo, host=host )
|
net = Mininet( topo=topo, host=host )
|
||||||
net.start()
|
net.start()
|
||||||
info( 'private Directories: [ ' )
|
info( 'Private Directories: [ ' )
|
||||||
for directory in privateDirs:
|
for directory in privateDirs:
|
||||||
if isinstance( directory, tuple ):
|
if isinstance( directory, tuple ):
|
||||||
info( '%s, ' %directory[ 0 ] )
|
info( '%s, ' %directory[ 0 ] )
|
||||||
@@ -37,11 +65,24 @@ def testHostWithPrivateDirs():
|
|||||||
CLI( net )
|
CLI( net )
|
||||||
net.stop()
|
net.stop()
|
||||||
|
|
||||||
|
# Temporary directory sample usage
|
||||||
|
|
||||||
|
def testTempPrivateDirs():
|
||||||
|
"test bind mounts with temporary directories"
|
||||||
|
topo = SingleSwitchTopo( 10 )
|
||||||
|
privateDirs = [ '/var/log', '/var/run' ]
|
||||||
|
host = partial( HostWithPrivateDirs,
|
||||||
|
privateDirs=privateDirs )
|
||||||
|
net = Mininet( topo=topo, host=host )
|
||||||
|
net.start()
|
||||||
|
info( 'Private Directories: ', privateDirs, '\n' )
|
||||||
|
CLI( net )
|
||||||
|
net.stop()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
setLogLevel( 'info' )
|
setLogLevel( 'info' )
|
||||||
testHostWithPrivateDirs()
|
testPersistentPrivateDirs()
|
||||||
|
testTempPrivateDirs()
|
||||||
info( 'Done.\n' )
|
info( 'Done.\n' )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+9
-2
@@ -16,6 +16,11 @@ Host: a virtual host. By default, a host is simply a shell; commands
|
|||||||
CPULimitedHost: a virtual host whose CPU bandwidth is limited by
|
CPULimitedHost: a virtual host whose CPU bandwidth is limited by
|
||||||
RT or CFS bandwidth limiting.
|
RT or CFS bandwidth limiting.
|
||||||
|
|
||||||
|
HostWithPrivateDirs: a virtual host that has user-specified private
|
||||||
|
directories. These may be temporary directories stored as a tmpfs,
|
||||||
|
or persistent directories that are mounted from another directory in
|
||||||
|
the root filesystem.
|
||||||
|
|
||||||
Switch: superclass for switch nodes.
|
Switch: superclass for switch nodes.
|
||||||
|
|
||||||
UserSwitch: a switch using the user-space switch from the OpenFlow
|
UserSwitch: a switch using the user-space switch from the OpenFlow
|
||||||
@@ -729,22 +734,24 @@ class HostWithPrivateDirs( Host ):
|
|||||||
"Host with private directories"
|
"Host with private directories"
|
||||||
|
|
||||||
def __init__( self, name, *args, **kwargs ):
|
def __init__( self, name, *args, **kwargs ):
|
||||||
"""privateDirs: list of private directories"""
|
"privateDirs: list of private directory strings or tuples"
|
||||||
self.name = name
|
self.name = name
|
||||||
self.privateDirs = kwargs.pop( 'privateDirs', [] )
|
self.privateDirs = kwargs.pop( 'privateDirs', [] )
|
||||||
Host.__init__( self, name, *args, **kwargs )
|
Host.__init__( self, name, *args, **kwargs )
|
||||||
self.mountPrivateDirs()
|
self.mountPrivateDirs()
|
||||||
|
|
||||||
def mountPrivateDirs( self ):
|
def mountPrivateDirs( self ):
|
||||||
"mount the directories that have specified mountpoints"
|
"mount private directories"
|
||||||
for directory in self.privateDirs:
|
for directory in self.privateDirs:
|
||||||
if isinstance( directory, tuple ):
|
if isinstance( directory, tuple ):
|
||||||
|
# mount given private directory
|
||||||
privateDir = directory[ 1 ] %self.__dict__
|
privateDir = directory[ 1 ] %self.__dict__
|
||||||
mountPoint = directory[ 0 ]
|
mountPoint = directory[ 0 ]
|
||||||
self.cmd( 'mkdir -p %s' %privateDir )
|
self.cmd( 'mkdir -p %s' %privateDir )
|
||||||
self.cmd( 'mkdir -p %s' %mountPoint )
|
self.cmd( 'mkdir -p %s' %mountPoint )
|
||||||
self.cmd( 'mount --bind %s %s' %( privateDir, mountPoint ) )
|
self.cmd( 'mount --bind %s %s' %( privateDir, mountPoint ) )
|
||||||
else:
|
else:
|
||||||
|
# mount temporary filesystem on directory
|
||||||
self.cmd( 'mkdir -p %s' %directory )
|
self.cmd( 'mkdir -p %s' %directory )
|
||||||
self.cmd( 'mount -n -t tmpfs tmpfs %s' %directory )
|
self.cmd( 'mount -n -t tmpfs tmpfs %s' %directory )
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user