blob: 0725ac12972f860838b1b08fcc46a7e56eb1c280 [file] [log] [blame]
"""
Distributed Cloud Emulator (dcemulator)
(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
"""
import logging
from mininet.net import Dockernet
from mininet.node import Controller, OVSKernelSwitch, Switch, Docker, Host
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
from node import Datacenter, EmulatorCompute
class DCNetwork(Dockernet):
"""
Wraps the original Mininet/Dockernet class and provides
methods to add data centers, switches, etc.
This class is used by topology definition scripts.
"""
def __init__(self, **kwargs):
self.dcs = {}
# create a Mininet/Dockernet network
setLogLevel('info') # set Mininet loglevel
# call original Docker.__init__ and setup default controller
Dockernet.__init__(
self, controller=Controller, switch=OVSKernelSwitch, **kwargs)
self.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 addLink(self, node1, node2, **params):
"""
Able to handle Datacenter objects as link
end points.
"""
assert node1 is not None
assert node2 is not None
logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2)))
# ensure type of node1
if isinstance( node1, basestring ):
if node1 in self.dcs:
node1 = self.dcs[node1].switch
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
if isinstance( node2, Datacenter ):
node2 = node2.switch
# try to give containers a default IP
if isinstance( node1, Docker ):
if not "params1" in params:
params["params1"] = {}
if not "ip" in params["params1"]:
params["params1"]["ip"] = self.getNextIp()
if isinstance( node2, Docker ):
if not "params2" in params:
params["params2"] = {}
if not "ip" in params["params2"]:
params["params2"]["ip"] = self.getNextIp()
return Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
def addDocker( self, name, **params ):
"""
Wrapper for addDocker method to use custom container class.
"""
return Dockernet.addDocker(self, name, cls=EmulatorCompute, **params)
def getAllContainers(self):
"""
Returns a list with all containers within all data centers.
"""
all_containers = []
for dc in self.dcs.itervalues():
all_containers += dc.listCompute()
return all_containers
def start(self):
# start
for dc in self.dcs.itervalues():
dc.start()
Dockernet.start(self)
def stop(self):
Dockernet.stop(self)
def CLI(self):
CLI(self)