X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=emuvim%2Fdcemulator%2Fnet.py;h=83ac619e3676925496b6ff2528833075ed8ad957;hb=bd44f4aedca9d48d150939cd76d7cefe7e386aa2;hp=8ea41a7169e9fb606e2f06ec983a95de7885f126;hpb=cbcd4c2d984a354e88febdaa368d53a3e6881c72;p=osm%2Fvim-emu.git diff --git a/emuvim/dcemulator/net.py b/emuvim/dcemulator/net.py index 8ea41a7..83ac619 100644 --- a/emuvim/dcemulator/net.py +++ b/emuvim/dcemulator/net.py @@ -4,16 +4,22 @@ Distributed Cloud Emulator (dcemulator) """ import logging -from mininet.net import Mininet -from mininet.node import Controller, OVSKernelSwitch, Switch +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 +from node import Datacenter, EmulatorCompute class DCNetwork(object): + """ + Wraps the original Mininet class and provides + methods to add data centers, switches, etc. + + This class is used by topology definition scripts. + """ def __init__(self): self.dcs = {} @@ -22,7 +28,7 @@ class DCNetwork(object): # create a Mininet/Dockernet network setLogLevel('info') # set Mininet loglevel - self.mnet = Mininet(controller=Controller, switch=OVSKernelSwitch) + self.mnet = Dockernet(controller=Controller, switch=OVSKernelSwitch) self.mnet.addController('c0') def addDatacenter(self, name): @@ -47,9 +53,14 @@ class DCNetwork(object): logging.info("added switch: %s" % name) return s - def addLink(self, node1, node2): + 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: @@ -66,13 +77,51 @@ class DCNetwork(object): 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 her - else: - raise Exception( - "one of the given nodes is not a Mininet switch or None") + # 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 self.mnet.addLink(node1, node2, **params) # TODO we need TCLinks with user defined performance here + + def removeLink(self, link=None, node1=None, node2=None): + """ + Removes a link. Can either be specified by link object, + or the nodes the link connects. Wraps Dockernet method. + """ + logging.debug("removeLink: n1=%s n2=%s" % (str(node1), str(node2))) + return self.mnet.removeLink(link=link, node1=node1, node2=node2) + + def addDocker( self, name, **params ): + """ + Wrapper for addDocker method provided by Dockernet. + """ + return self.mnet.addDocker( name, cls=EmulatorCompute, **params) + + def removeDocker( self, name, **params): + """ + Wrapper for removeHost. Just to be complete. + """ + return self.mnet.removeDocker(name, **params) + + def getNextIp(self): + return self.mnet.getNextIp() + + 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 @@ -85,4 +134,3 @@ class DCNetwork(object): def CLI(self): CLI(self.mnet) -