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
Cleaned up git merge junk additions
  • Loading branch information
darshan authored and darshan committed Jul 30, 2014
commit 1a41f342a48e64d9226489d50cf0b57814698497
25 changes: 3 additions & 22 deletions bin/mn
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,13 @@ from mininet.cli import CLI
from mininet.log import lg, LEVELS, info, debug, error
from mininet.net import Mininet, MininetWithControlNet, VERSION
from mininet.node import ( Host, CPULimitedHost, Controller, OVSController,
<<<<<<< Updated upstream
NOX, RemoteController, DefaultController,
UserSwitch, OVSSwitch,
OVSLegacyKernelSwitch, IVSSwitch )
from mininet.nodelib import LinuxBridge
from mininet.link import Link, TCLink
from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
from mininet.topolib import TreeTopo, TorusTopo
=======
NOX, RemoteController, UserSwitch, OVSKernelSwitch,
OVSLegacyKernelSwitch, IVSSwitch, RiplPOX )
from mininet.nodelib import LinuxBridge
from mininet.link import Link, TCLink
from mininet.topo import SingleSwitchTopo, LinearTopo, SingleSwitchReversedTopo
from mininet.topolib import TreeTopo, FatTreeTopo1
>>>>>>> Stashed changes
from mininet.topolib import TreeTopo, TorusTopo, FatTreeTopo1
from mininet.util import custom, customConstructor
from mininet.util import buildTopo

Expand All @@ -52,23 +43,16 @@ TOPOS = { 'minimal': lambda: SingleSwitchTopo( k=2 ),
'reversed': SingleSwitchReversedTopo,
'single': SingleSwitchTopo,
'tree': TreeTopo,
<<<<<<< Updated upstream
'torus': TorusTopo }
=======
'fattree': FatTreeTopo1 }
>>>>>>> Stashed changes
'torus': TorusTopo,
'fattree': FatTreeTopo1 }

SWITCHDEF = 'ovsk'
SWITCHES = { 'user': UserSwitch,
'ovs': OVSSwitch,
# Keep ovsk for compatibility with 2.0
'ovsk': OVSSwitch,
'ovsl': OVSLegacyKernelSwitch,
<<<<<<< Updated upstream
'ivs': IVSSwitch,
=======
'ivs': IVSSwitch,
>>>>>>> Stashed changes
'lxbr': LinuxBridge }

HOSTDEF = 'proc'
Expand All @@ -81,11 +65,8 @@ CONTROLLERS = { 'ref': Controller,
'ovsc': OVSController,
'nox': NOX,
'remote': RemoteController,
<<<<<<< Updated upstream
'default': DefaultController,
=======
'riplpox': RiplPOX,
>>>>>>> Stashed changes
'none': lambda name: None }

LINKDEF = 'default'
Expand Down
10 changes: 5 additions & 5 deletions examples/fattree.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@

def fatTree():
"Open CLI on k = 4 fattree network with RiplPOX controller running in background"
k = 10
k = 4
fanout = 2
speed = 1.0
controller = partial(RiplPOX, cargs='--no-cli openflow.of_01 --port=%s riplpox.riplpox ' +
'--topo=fattree,' + str(k) + ',' + str(fanout) + ' --routing=random ' +
'--mode=reactive')
network = FatTreeNet( k=k, fanout=fanout, speed=speed, controller=controller)
controller = partial( RiplPOX, cargs='--no-cli openflow.of_01 --port=%s riplpox.riplpox ' +
'--topo=fattree,' + str(k) + ',' + str(fanout) +
' --routing=random --mode=reactive')
network = FatTreeNet( k=k, fanout=fanout, speed=speed, controller=controller )
network.run( CLI, network )

if __name__ == '__main__':
Expand Down
4 changes: 1 addition & 3 deletions mininet/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -1344,14 +1344,13 @@ def checkListening( self ):
warn( "Unable to contact the remote controller"
" at %s:%d\n" % ( self.ip, self.port ) )

<<<<<<< Updated upstream

def DefaultController( name, order=[ Controller, OVSController ], **kwargs ):
"find any controller that is available and run it"
for controller in order:
if controller.isAvailable():
return controller( name, **kwargs )
=======

class RiplPOX( Controller ):
"Controller to run RiplPOX application."

Expand All @@ -1372,4 +1371,3 @@ def __init__( self, name='riplpox',
cargs=cargs,
cdir=cdir,
**kwargs )
>>>>>>> Stashed changes
191 changes: 189 additions & 2 deletions mininet/topo.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,101 @@

from mininet.util import irange, natural, naturalSeq

class NodeID(object):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we change this upstream? Or maybe write a patch for this instead

'''Topo node identifier.'''
sdpidlist = []

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

@param dpid dpid
'''
# DPID-compatible hashable identifier: opaque 64-bit unsigned int
self.nodetype = nodetype
if name:
self.name = name
self.nodetype = name[0]
if self.nodetype == 'h':
self.dpid = int(name[1:]) + max(self.sdpidlist)
else:
self.dpid = int(name[1:])
elif nodetype == 's':
self.name = self.nodetype + str(dpid)
self.dpid = dpid
self.sdpidlist.append(dpid)
elif dpid not in self.sdpidlist:
self.nodetype = 'h'
self.name = self.nodetype + str(dpid - max(self.sdpidlist))
self.dpid = dpid
else:
self.nodetype = 's'
self.name = self.nodetype + str(dpid)
self.dpid = dpid

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

@return str dpid as string
'''
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))
else:
return self.nodetype + str(self.dpid)

def mac_str(self):
'''Return MAC string'''
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


class MultiGraph( object ):
"Utility class to track nodes and edges - replaces networkx.Graph"

Expand All @@ -25,10 +120,11 @@ def add_node( self, node ):

def add_edge( self, src, dest ):
"Add edge to graph"
src, dest = sorted( ( src, dest ) )
#src, dest = sorted( ( src, dest ) )
self.add_node( src )
self.add_node( dest )
self.data[ src ].append( dest )
self.data[ dest ].append( src )

def nodes( self ):
"Return list of graph nodes"
Expand All @@ -38,7 +134,8 @@ def edges( self ):
"Iterator: return graph edges"
for src in self.data.keys():
for dest in self.data[ src ]:
yield ( src, dest )
if src <= dest:
yield ( src, dest )

def __getitem__( self, node ):
"Return link dict for the given node"
Expand Down Expand Up @@ -274,3 +371,93 @@ 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
Loading