Made net compliant with dict semantics and added function comments
Fixed locals bug (now they are persisent across calls)
This commit is contained in:
+11
-16
@@ -43,6 +43,8 @@ class CLI( Cmd ):
|
|||||||
|
|
||||||
def __init__( self, mininet, stdin=sys.stdin, script=None ):
|
def __init__( self, mininet, stdin=sys.stdin, script=None ):
|
||||||
self.mn = mininet
|
self.mn = mininet
|
||||||
|
# CLI locals for py commands
|
||||||
|
self.locals = { 'net': mininet }
|
||||||
# Attempt to handle input
|
# Attempt to handle input
|
||||||
self.stdin = stdin
|
self.stdin = stdin
|
||||||
self.inPoller = poll()
|
self.inPoller = poll()
|
||||||
@@ -71,11 +73,10 @@ class CLI( Cmd ):
|
|||||||
"Don't repeat last command when you hit return."
|
"Don't repeat last command when you hit return."
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def locals( self ):
|
def getLocals( self ):
|
||||||
"Local variable bindings for py command"
|
"Local variable bindings for py command"
|
||||||
locals = { 'net': self.mn }
|
self.locals.update( self.mn )
|
||||||
locals.update( self.mn )
|
return self.locals
|
||||||
return locals
|
|
||||||
|
|
||||||
# Disable pylint "Unused argument: 'arg's'" messages, as well as
|
# Disable pylint "Unused argument: 'arg's'" messages, as well as
|
||||||
# "method could be a function" warning, since each CLI function
|
# "method could be a function" warning, since each CLI function
|
||||||
@@ -109,14 +110,12 @@ class CLI( Cmd ):
|
|||||||
|
|
||||||
def do_nodes( self, _line ):
|
def do_nodes( self, _line ):
|
||||||
"List all nodes."
|
"List all nodes."
|
||||||
# self.mn.values()
|
nodes = ' '.join( sorted( self.mn ) )
|
||||||
nodes = ' '.join( [ node.name for node in sorted( self.mn ) ] )
|
|
||||||
output( 'available nodes are: \n%s\n' % nodes )
|
output( 'available nodes are: \n%s\n' % nodes )
|
||||||
|
|
||||||
def do_net( self, _line ):
|
def do_net( self, _line ):
|
||||||
"List network connections."
|
"List network connections."
|
||||||
# self.mn.values()
|
dumpNodeConnections( self.mn.values() )
|
||||||
dumpNodeConnections( self.mn )
|
|
||||||
|
|
||||||
def do_sh( self, line ):
|
def do_sh( self, line ):
|
||||||
"Run an external shell command"
|
"Run an external shell command"
|
||||||
@@ -129,7 +128,7 @@ class CLI( Cmd ):
|
|||||||
"""Evaluate a Python expression.
|
"""Evaluate a Python expression.
|
||||||
Node names may be used, e.g.: py h1.cmd('ls')"""
|
Node names may be used, e.g.: py h1.cmd('ls')"""
|
||||||
try:
|
try:
|
||||||
result = eval( line, globals(), self.locals() )
|
result = eval( line, globals(), self.getLocals() )
|
||||||
if not result:
|
if not result:
|
||||||
return
|
return
|
||||||
elif isinstance( result, str ):
|
elif isinstance( result, str ):
|
||||||
@@ -146,7 +145,7 @@ class CLI( Cmd ):
|
|||||||
"""Execute a Python statement.
|
"""Execute a Python statement.
|
||||||
Node names may be used, e.g.: px print h1.cmd('ls')"""
|
Node names may be used, e.g.: px print h1.cmd('ls')"""
|
||||||
try:
|
try:
|
||||||
exec( line, globals(), self.locals() )
|
exec( line, globals(), self.getLocals() )
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
output( str( e ) + '\n' )
|
output( str( e ) + '\n' )
|
||||||
|
|
||||||
@@ -177,7 +176,6 @@ class CLI( Cmd ):
|
|||||||
hosts = []
|
hosts = []
|
||||||
err = False
|
err = False
|
||||||
for arg in args:
|
for arg in args:
|
||||||
# self.mn.keys()
|
|
||||||
if arg not in self.mn:
|
if arg not in self.mn:
|
||||||
err = True
|
err = True
|
||||||
error( "node '%s' not in network\n" % arg )
|
error( "node '%s' not in network\n" % arg )
|
||||||
@@ -211,15 +209,13 @@ class CLI( Cmd ):
|
|||||||
|
|
||||||
def do_intfs( self, _line ):
|
def do_intfs( self, _line ):
|
||||||
"List interfaces."
|
"List interfaces."
|
||||||
# self.mn.values()
|
for node in self.mn.values():
|
||||||
for node in self.mn:
|
|
||||||
output( '%s: %s\n' %
|
output( '%s: %s\n' %
|
||||||
( node.name, ','.join( node.intfNames() ) ) )
|
( node.name, ','.join( node.intfNames() ) ) )
|
||||||
|
|
||||||
def do_dump( self, _line ):
|
def do_dump( self, _line ):
|
||||||
"Dump node info."
|
"Dump node info."
|
||||||
# self.mn.values()
|
for node in self.mn.values():
|
||||||
for node in self.mn:
|
|
||||||
output( '%s\n' % repr( node ) )
|
output( '%s\n' % repr( node ) )
|
||||||
|
|
||||||
def do_link( self, line ):
|
def do_link( self, line ):
|
||||||
@@ -239,7 +235,6 @@ class CLI( Cmd ):
|
|||||||
error( 'usage: %s node1 node2 ...\n' % term )
|
error( 'usage: %s node1 node2 ...\n' % term )
|
||||||
else:
|
else:
|
||||||
for arg in args:
|
for arg in args:
|
||||||
# self.mn.keys()
|
|
||||||
if arg not in self.mn:
|
if arg not in self.mn:
|
||||||
error( "node '%s' not in network\n" % arg )
|
error( "node '%s' not in network\n" % arg )
|
||||||
else:
|
else:
|
||||||
|
|||||||
+10
-4
@@ -237,21 +237,27 @@ class Mininet( object ):
|
|||||||
def __iter__( self ):
|
def __iter__( self ):
|
||||||
"return iterator over nodes"
|
"return iterator over nodes"
|
||||||
#or dow we want to iterate of the keys i.e. node.name like a dict
|
#or dow we want to iterate of the keys i.e. node.name like a dict
|
||||||
return chain( self.hosts, self.switches, self.controllers )
|
for node in chain( self.hosts, self.switches, self.controllers ):
|
||||||
|
yield node.name
|
||||||
|
|
||||||
def __len__( self ):
|
def __len__( self ):
|
||||||
|
"returns number of nodes in net"
|
||||||
return len( self.hosts ) + len( self.switches ) + len( self.controllers )
|
return len( self.hosts ) + len( self.switches ) + len( self.controllers )
|
||||||
|
|
||||||
def __contains__( self, item ):
|
def __contains__( self, item ):
|
||||||
|
"returns True if net contains named node"
|
||||||
return item in self.keys()
|
return item in self.keys()
|
||||||
|
|
||||||
def keys( self ):
|
def keys( self ):
|
||||||
return [ node.name for node in self.__iter__() ]
|
"return a list of all node names or net's keys"
|
||||||
|
|
||||||
def values( self ):
|
|
||||||
return list( self.__iter__() )
|
return list( self.__iter__() )
|
||||||
|
|
||||||
|
def values( self ):
|
||||||
|
"return a list of all nodes or net's values"
|
||||||
|
return [ self[name] for name in self.__iter__() ]
|
||||||
|
|
||||||
def items( self ):
|
def items( self ):
|
||||||
|
"return (key,value) tuple list for every node in net"
|
||||||
return zip( self.keys(), self.values() )
|
return zip( self.keys(), self.values() )
|
||||||
|
|
||||||
def addLink( self, node1, node2, port1=None, port2=None,
|
def addLink( self, node1, node2, port1=None, port2=None,
|
||||||
|
|||||||
Reference in New Issue
Block a user