Skip to content

Commit 8e04a9f

Browse files
committed
Replaced nodelist and nodemap in CLI with mn
Updated Mininet to be more compliant with dict Fixes mininet#182
1 parent 6df4371 commit 8e04a9f

2 files changed

Lines changed: 45 additions & 24 deletions

File tree

mininet/cli.py

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,6 @@ class CLI( Cmd ):
4343

4444
def __init__( self, mininet, stdin=sys.stdin, script=None ):
4545
self.mn = mininet
46-
self.nodelist = self.mn.controllers + self.mn.switches + self.mn.hosts
47-
self.nodemap = {} # map names to Node objects
48-
for node in self.nodelist:
49-
self.nodemap[ node.name ] = node
50-
# Local variable bindings for py command
51-
self.locals = { 'net': mininet }
52-
self.locals.update( self.nodemap )
5346
# Attempt to handle input
5447
self.stdin = stdin
5548
self.inPoller = poll()
@@ -63,7 +56,7 @@ def __init__( self, mininet, stdin=sys.stdin, script=None ):
6356
while True:
6457
try:
6558
# Make sure no nodes are still waiting
66-
for node in self.nodelist:
59+
for node in self.mn.values():
6760
while node.waiting:
6861
node.sendInt()
6962
node.monitor()
@@ -78,6 +71,12 @@ def emptyline( self ):
7871
"Don't repeat last command when you hit return."
7972
pass
8073

74+
def locals( self ):
75+
"Local variable bindings for py command"
76+
locals = { 'net': self.mn }
77+
locals.update( self.mn )
78+
return locals
79+
8180
# Disable pylint "Unused argument: 'arg's'" messages, as well as
8281
# "method could be a function" warning, since each CLI function
8382
# must have the same interface
@@ -110,12 +109,14 @@ def do_help( self, line ):
110109

111110
def do_nodes( self, _line ):
112111
"List all nodes."
113-
nodes = ' '.join( [ node.name for node in sorted( self.nodelist ) ] )
112+
# self.mn.values()
113+
nodes = ' '.join( [ node.name for node in sorted( self.mn ) ] )
114114
output( 'available nodes are: \n%s\n' % nodes )
115115

116116
def do_net( self, _line ):
117117
"List network connections."
118-
dumpNodeConnections( self.nodelist )
118+
# self.mn.values()
119+
dumpNodeConnections( self.mn )
119120

120121
def do_sh( self, line ):
121122
"Run an external shell command"
@@ -128,7 +129,7 @@ def do_py( self, line ):
128129
"""Evaluate a Python expression.
129130
Node names may be used, e.g.: py h1.cmd('ls')"""
130131
try:
131-
result = eval( line, globals(), self.locals )
132+
result = eval( line, globals(), self.locals() )
132133
if not result:
133134
return
134135
elif isinstance( result, str ):
@@ -145,7 +146,7 @@ def do_px( self, line ):
145146
"""Execute a Python statement.
146147
Node names may be used, e.g.: px print h1.cmd('ls')"""
147148
try:
148-
exec( line, globals(), self.locals )
149+
exec( line, globals(), self.locals() )
149150
except Exception, e:
150151
output( str( e ) + '\n' )
151152

@@ -176,11 +177,12 @@ def do_iperf( self, line ):
176177
hosts = []
177178
err = False
178179
for arg in args:
179-
if arg not in self.nodemap:
180+
# self.mn.keys()
181+
if arg not in self.mn:
180182
err = True
181183
error( "node '%s' not in network\n" % arg )
182184
else:
183-
hosts.append( self.nodemap[ arg ] )
185+
hosts.append( self.mn[ arg ] )
184186
if not err:
185187
self.mn.iperf( hosts )
186188
else:
@@ -196,11 +198,11 @@ def do_iperfudp( self, line ):
196198
hosts = []
197199
err = False
198200
for arg in args[ 1:3 ]:
199-
if arg not in self.nodemap:
201+
if arg not in self.mn:
200202
err = True
201203
error( "node '%s' not in network\n" % arg )
202204
else:
203-
hosts.append( self.nodemap[ arg ] )
205+
hosts.append( self.mn[ arg ] )
204206
if not err:
205207
self.mn.iperf( hosts, l4Type='UDP', udpBw=udpBw )
206208
else:
@@ -209,13 +211,15 @@ def do_iperfudp( self, line ):
209211

210212
def do_intfs( self, _line ):
211213
"List interfaces."
212-
for node in self.nodelist:
214+
# self.mn.values()
215+
for node in self.mn:
213216
output( '%s: %s\n' %
214217
( node.name, ','.join( node.intfNames() ) ) )
215218

216219
def do_dump( self, _line ):
217220
"Dump node info."
218-
for node in self.nodelist:
221+
# self.mn.values()
222+
for node in self.mn:
219223
output( '%s\n' % repr( node ) )
220224

221225
def do_link( self, line ):
@@ -235,10 +239,11 @@ def do_xterm( self, line, term='xterm' ):
235239
error( 'usage: %s node1 node2 ...\n' % term )
236240
else:
237241
for arg in args:
238-
if arg not in self.nodemap:
242+
# self.mn.keys()
243+
if arg not in self.mn:
239244
error( "node '%s' not in network\n" % arg )
240245
else:
241-
node = self.nodemap[ arg ]
246+
node = self.mn[ arg ]
242247
self.mn.terms += makeTerms( [ node ], term = term )
243248

244249
def do_x( self, line ):
@@ -329,11 +334,11 @@ def default( self, line ):
329334
args = args[ :-1 ]
330335
rest = args.split( ' ' )
331336

332-
if first in self.nodemap:
333-
node = self.nodemap[ first ]
337+
if first in self.mn:
338+
node = self.mn[ first ]
334339
# Substitute IP addresses for node names in command
335-
rest = [ self.nodemap[ arg ].defaultIntf().updateIP()
336-
if arg in self.nodemap else arg
340+
rest = [ self.mn[ arg ].defaultIntf().updateIP()
341+
if arg in self.mn else arg
337342
for arg in rest ]
338343
rest = ' '.join( rest )
339344
# Run cmd on node:

mininet/net.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,24 @@ def __getitem__( self, *args ):
236236

237237
def __iter__( self ):
238238
"return iterator over nodes"
239+
#or dow we want to iterate of the keys i.e. node.name like a dict
239240
return chain( self.hosts, self.switches, self.controllers )
240241

242+
def __len__( self ):
243+
return len( self.hosts ) + len( self.switches ) + len( self.controllers )
244+
245+
def __contains__( self, item ):
246+
return item in self.keys()
247+
248+
def keys( self ):
249+
return [ node.name for node in self.__iter__() ]
250+
251+
def values( self ):
252+
return list( self.__iter__() )
253+
254+
def items( self ):
255+
return zip( self.keys(), self.values() )
256+
241257
def addLink( self, node1, node2, port1=None, port2=None,
242258
cls=None, **params ):
243259
""""Add a link from node1 to node2

0 commit comments

Comments
 (0)