blob: 586b1e8421f5f269b54925297107a890d20d8d7b [file] [log] [blame]
"""
Distributed Cloud Emulator (dcemulator)
(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
"""
import logging
from mininet.net import Mininet
from mininet.node import Controller, OVSKernelSwitch, Switch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
from node import Datacenter
class DCNetwork(object):
def __init__(self):
self.dcs = {}
self.switches = {}
self.links = []
# create a Mininet/Dockernet network
setLogLevel('info') # set Mininet loglevel
self.mnet = Mininet(controller=Controller, switch=OVSKernelSwitch)
self.mnet.addController('c0')
def addDatacenter(self, name):
"""
Create and add a logical cloud data center to the network.
"""
if name in self.dcs:
raise Exception("Data center name already exists: %s" % name)
dc = Datacenter(name)
dc.net = self # set reference to network
self.dcs[name] = dc
dc.create() # finally create the data center in our Mininet instance
logging.info("added data center: %s" % name)
return dc
def addSwitch(self, name):
"""
We can also add additional SDN switches between data centers.
"""
s = self.mnet.addSwitch(name)
self.switches[name] = s
logging.info("added switch: %s" % name)
return s
def addLink(self, node1, node2):
assert node1 is not None
assert node2 is not None
# ensure type of node1
if isinstance( node1, basestring ):
if node1 in self.dcs:
node1 = self.dcs[node1].switch
elif node1 in self.switches:
node1 = self.switches[node1]
if isinstance( node1, Datacenter ):
node1 = node1.switch
# ensure type of node2
if isinstance( node2, basestring ):
if node2 in self.dcs:
node2 = self.dcs[node2].switch
elif node2 in self.switches:
node2 = self.switches[node2]
if isinstance( node2, Datacenter ):
node2 = node2.switch
# create link if everything is correct
if (node1 is not None and isinstance(node1, OVSKernelSwitch)
and node2 is not None and isinstance(node2, OVSKernelSwitch)):
self.mnet.addLink(node1, node2) # TODO we need TCLinks with user defined performance here
else:
raise Exception(
"one of the given nodes is not a Mininet switch or None")
def start(self):
# start
for dc in self.dcs.itervalues():
dc.start()
self.mnet.start()
def stop(self):
self.mnet.stop()
def CLI(self):
CLI(self.mnet)