Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Improved documentation and install.sh
  • Loading branch information
darshanthaker committed Aug 5, 2014
commit c6334fff4af599f2844b2253e632d5f1ca2fa38a
1 change: 0 additions & 1 deletion examples/fattree.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
"Create a k = 4 fattree network and run CLI"

from functools import partial
from mininet.net import Mininet
from mininet.log import setLogLevel
from mininet.node import RiplPOX
from mininet.topolib import FatTreeNet
Expand Down
152 changes: 13 additions & 139 deletions mininet/topo.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NodeID(object):
'''Topo node identifier.'''
sdpidlist = []

def __init__(self, dpid = None, nodetype=None, name = None):
def __init__(self, dpid=None, nodetype=None, name=None):
'''Init.

@param dpid dpid
Expand All @@ -28,84 +28,49 @@ def __init__(self, dpid = None, nodetype=None, name = None):
self.name = name
self.nodetype = name[0]
if self.nodetype == 'h':
self.dpid = int(name[1:]) + max(self.sdpidlist)
self.dpid = int( name[1:] ) + max( self.sdpidlist )
else:
self.dpid = int(name[1:])
self.dpid = int( name[1:] )
elif nodetype == 's':
self.name = self.nodetype + str(dpid)
self.name = self.nodetype + str( dpid )
self.dpid = dpid
self.sdpidlist.append(dpid)
self.sdpidlist.append( dpid )
elif dpid not in self.sdpidlist:
self.nodetype = 'h'
self.name = self.nodetype + str(dpid - max(self.sdpidlist))
self.name = self.nodetype + str( dpid - max( self.sdpidlist ))
self.dpid = dpid
else:
self.nodetype = 's'
self.name = self.nodetype + str(dpid)
self.name = self.nodetype + str( dpid )
self.dpid = dpid

def __str__(self):
'''String conversion.

@return str dpid as string
'''
return str(self.dpid)
return str( self.dpid )

def name_str(self):
'''Name conversion.

@return name name as string
'''
if (self.nodetype == 'h'):
return self.nodetype + str(self.dpid - max(self.sdpidlist))
if self.nodetype == 'h':
return self.nodetype + str( self.dpid - max( self.sdpidlist ))
else:
return self.nodetype + str(self.dpid)
return self.nodetype + str( self.dpid )

def mac_str(self):
'''Return MAC string'''
return "00:00:00:00:00:%02x" % (self.dpid)
return "00:00:00:00:00:%02x" %( self.dpid )

def ip_str(self):
'''Name conversion.

@return ip ip as string
'''
#hi = (self.dpid & 0xff0000) >> 16
#mid = (self.dpid & 0xff00) >> 8
#lo = self.dpid & 0xff
#return "10.%i.%i.%i" % (hi, mid, lo)
return "10.0.0.%i" % self.dpid

#Borrowed from ripl/ripl/dctopo.py
class StructuredNodeSpec(object):
'''Layer-specific vertex metadata for a StructuredTopo graph.'''

def __init__(self, up_total, down_total, up_speed, down_speed,
type_str = None):
'''Init.

@param up_total number of up links
@param down_total number of down links
@param up_speed speed in Gbps of up links
@param down_speed speed in Gbps of down links
@param type_str string; model of switch or server
'''
self.up_total = up_total
self.down_total = down_total
self.up_speed = up_speed
self.down_speed = down_speed
self.type_str = type_str


class StructuredEdgeSpec(object):
'''Static edge metadata for a StructuredTopo graph.'''

def __init__(self, speed = 1.0):
'''Init.

@param speed bandwidth in Gbps
'''
self.speed = speed
return "10.0.0.%i" %( self.dpid )


class MultiGraph( object ):
Expand All @@ -120,7 +85,6 @@ def add_node( self, node ):

def add_edge( self, src, dest ):
"Add edge to graph"
#src, dest = sorted( ( src, dest ) )
self.add_node( src )
self.add_node( dest )
self.data[ src ].append( dest )
Expand Down Expand Up @@ -371,93 +335,3 @@ def __init__(self, k=2, n=1, **opts):
if lastSwitch:
self.addLink(switch, lastSwitch)
lastSwitch = switch

class StructuredTopo(Topo):
'''Data center network representation for structured multi-trees.'''

def __init__(self, node_specs, edge_specs):
'''Create StructuredTopo object.

@param node_specs list of StructuredNodeSpec objects, one per layer
@param edge_specs list of StructuredEdgeSpec objects for down-links,
one per layer
'''
super(StructuredTopo, self).__init__()
self.node_specs = node_specs
self.edge_specs = edge_specs

def def_nopts(self, layer):
'''Return default dict for a structured topo.

@param layer layer of node
@return d dict with layer key/val pair, plus anything else (later)
'''
return {'layer': layer}

def layer(self, name):
'''Return layer of a node

@param name name of switch
@return layer layer of switch
'''
return self.node_info[name]['layer']

def isPortUp(self, port):
''' Returns whether port is facing up or down

@param port port number
@return portUp boolean is port facing up?
'''
return port % 2 == PORT_BASE

def layer_nodes(self, layer):
'''Return nodes at a provided layer.

@param layer layer
@return names list of names
'''
def is_layer(n):
'''Returns true if node is at layer.'''
return self.layer(n) == layer

nodes = [n for n in self.g.nodes() if is_layer(n)]
return nodes

def up_nodes(self, name):
'''Return edges one layer higher (closer to core).

@param name name

@return names list of names
'''
layer = self.layer(name) - 1
nodes = [n for n in self.g[name] if self.layer(n) == layer]
return nodes

def down_nodes(self, name):
'''Return edges one layer higher (closer to hosts).

@param name name
@return names list of names
'''
layer = self.layer(name) + 1
nodes = [n for n in self.g[name] if self.layer(n) == layer]
return nodes

def up_edges(self, name):
'''Return edges one layer higher (closer to core).

@param name name
@return up_edges list of name pairs
'''
edges = [(name, n) for n in self.up_nodes(name)]
return edges

def down_edges(self, name):
'''Return edges one layer lower (closer to hosts).

@param name name
@return down_edges list of name pairs
'''
edges = [(name, n) for n in self.down_nodes(name)]
return edges
37 changes: 19 additions & 18 deletions mininet/topolib.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"Library of potentially useful topologies for Mininet"

from mininet.topo import ( Topo, NodeID, StructuredEdgeSpec, StructuredNodeSpec,
StructuredTopo )
from mininet.topo import Topo, NodeID
from mininet.log import debug
from ripl.dctopo import StructuredEdgeSpec, StructuredNodeSpec, StructuredTopo
from mininet.net import Mininet
from mininet.util import irange

Expand Down Expand Up @@ -81,7 +82,7 @@ class FatTreeTopo1( StructuredTopo ):
LAYER_AGG = 1
LAYER_EDGE = 2
LAYER_HOST = 3
portlist = []
portlist = []

def def_nopts( self, layer, name=None ):
'''Return default dict for a FatTree topo.
Expand Down Expand Up @@ -130,30 +131,30 @@ def addFatTree( self, k, fanout ):
core_opts = self.def_nopts( self.LAYER_CORE, core_switch_id )
switch1 = self.addSwitch( core_switch_id, **core_opts )
core_switches.append( core_switch_id )
#print "Added cs%s, dpid = %s" %(i, dpid)
debug( "Added cs%s, dpid = %s" %( i, dpid ) + "\n" )
dpid += 1

for j in irange( 0, (k / 2)*k - 1 ):
agg_switch_id = self.id_gen( dpid, 's' ).name_str()
agg_opts = self.def_nopts( self.LAYER_AGG, agg_switch_id )
switch1 = self.addSwitch( agg_switch_id, **agg_opts )
agg_switches.append( agg_switch_id )
#print "Added as%s, dpid = %s" %(j, dpid)
debug( "Added as%s, dpid = %s" %( j, dpid ) + "\n" )
dpid += 1

edge_switch_id = self.id_gen( dpid, 's' ).name_str()
edge_opts = self.def_nopts( self.LAYER_EDGE, edge_switch_id )
switch2 = self.addSwitch( edge_switch_id, **edge_opts )
edg_switches.append( edge_switch_id )
#print "Added es%s, dpid = %s" %(j, dpid)
debug( "Added es%s, dpid = %s" %( j, dpid ) + "\n" )
dpid += 1

for h in irange( 0, fanout*(k / 2)*k - 1 ):
host_id = self.id_gen( dpid, 'h' ).name_str()
host_opts = self.def_nopts( self.LAYER_HOST, host_id )
host1 = self.addHost( host_id, **host_opts )
hosts.append( host_id )
#print "Added h%s, dpid = %s" %(h, dpid)
debug( "Added h%s, dpid = %s" %( h, dpid ) + "\n" )
dpid += 1

#Creates links between core switches and aggregation switches.
Expand All @@ -169,13 +170,13 @@ def addFatTree( self, k, fanout ):
src = core_switches[ core_switch ]
dst = agg_switches[ agg_switch_count*pod + counter ]
self.addLink( src, dst, srcport, dstport )
#print "Link created between %s and %s. srcport=%s dstport=%s" %(self.id_gen(name = src).name_str(),
# self.id_gen(name = dst).name_str(),
# srcport, dstport)
debug( "Link created between %s and %s. srcport=%s dstport=%s" %( self.id_gen( name = src ).name_str(),
self.id_gen( name = dst ).name_str(),
srcport, dstport ) + "\n" )
self.port( src=src, dst=dst, src_port=srcport, dst_port=dstport )
dstport += 2

#Creates links between aggregation switches and edge switches.
#Creates links between aggregation switches and edge switches.
for pod in irange( 0, pod_count - 1 ):
dstport = 1
for agg_switch in irange( agg_switch_count*pod, agg_switch_count*pod + ( k / 2 ) - 1 ):
Expand All @@ -184,9 +185,9 @@ def addFatTree( self, k, fanout ):
src = agg_switches[ agg_switch ]
dst = edg_switches[ edg_switch ]
self.addLink( src, dst, srcport, dstport )
#print "Link created between %s and %s. srcport=%s, dstport=%s" %(self.id_gen(name = src).name_str(),
# self.id_gen(name = dst).name_str(),
# srcport, dstport)
debug( "Link created between %s and %s. srcport=%s, dstport=%s" %( self.id_gen( name = src ).name_str(),
self.id_gen( name = dst ).name_str(),
srcport, dstport ) + "\n" )
self.port( src=src, dst=dst, src_port=srcport, dst_port=dstport )
srcport += 2
dstport += 2
Expand All @@ -198,9 +199,9 @@ def addFatTree( self, k, fanout ):
src = edg_switches[ edg_switch ]
dst = hosts[ edg_switch*fanout + host ]
self.addLink( src, dst, srcport )
#print "Link created between %s and %s. srcport=%s, dstport=%s" %(self.id_gen(name = src).name_str(),
# self.id_gen(name = dst).name_str(),
# srcport, 0)
debug( "Link created between %s and %s. srcport=%s, dstport=%s" %( self.id_gen( name = src ).name_str(),
self.id_gen( name = dst ).name_str(),
srcport, 0 ) + "\n" )
self.port( src=src, dst=dst, src_port=srcport, dst_port=0 )
if srcport >= k:
srcport += 1
Expand Down Expand Up @@ -249,7 +250,7 @@ def port( self, src, dst, src_port=None, dst_port=None ):

src_port = self.portlist[srcid][dstid]
dst_port = self.portlist[dstid][srcid]
#print ("for srcid %s and dstid %s srcport = %s dstport = %s" % (srcid, dstid, src_port, dst_port))
debug( "for srcid %s and dstid %s srcport = %s dstport = %s" % ( srcid, dstid, src_port, dst_port ) + "\n" )

return ( src_port, dst_port )

Expand Down
15 changes: 11 additions & 4 deletions util/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -494,18 +494,25 @@ function oftest {
# Install RiplPOX
function riplpox {
echo "Installing RiplPOX"
cd $BUILD_DIR/pox
POX_SRC=$BUILD_DIR/pox
cd $POX_SRC

#Checkout POX at tested version
git checkout 0a1bbb8
cd $BUILD_DIR
sudo apt-get install -y python-setuptools

#Install dependencies, build RipL, and apply patch
$install python-setuptools
git clone git://github.com/brandonheller/ripl.git
cd ripl
patch -p1 < $MININET_DIR/mininet/util/ripl-patches/ripl.patch
sudo python setup.py develop
sudo python setup.py install

#Install from source and build Ripcord-POX
cd $BUILD_DIR
git clone git://github.com/brandonheller/riplpox.git
cd riplpox
sudo python setup.py develop
sudo python setup.py install
}

# Install cbench
Expand Down