improved CLI
[osm/vim-emu.git] / emuvim / dcemulator / net.py
index e0f41e2..83ac619 100644 (file)
@@ -4,13 +4,13 @@ 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):
@@ -28,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):
@@ -53,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:
@@ -72,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 here
-        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