Made net compliant with dict semantics and added function comments

Fixed locals bug (now they are persisent across calls)
This commit is contained in:
Brian O'Connor
2013-08-09 17:07:39 -07:00
parent 8e04a9f844
commit 9281719d74
2 changed files with 21 additions and 20 deletions
+11 -16
View File
@@ -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
View File
@@ -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,