improved CLI
[osm/vim-emu.git] / emuvim / dcemulator / net.py
index 0efcafa..83ac619 100644 (file)
@@ -4,13 +4,13 @@ Distributed Cloud Emulator (dcemulator)
 """
 import logging
 
 """
 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 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):
 
 
 class DCNetwork(object):
@@ -28,7 +28,7 @@ class DCNetwork(object):
 
         # create a Mininet/Dockernet network
         setLogLevel('info')  # set Mininet loglevel
 
         # 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):
         self.mnet.addController('c0')
 
     def addDatacenter(self, name):
@@ -53,13 +53,14 @@ class DCNetwork(object):
         logging.info("added switch: %s" % name)
         return s
 
         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
         """
         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:
         # ensure type of node1
         if isinstance( node1, basestring ):
             if node1 in self.dcs:
@@ -76,19 +77,33 @@ class DCNetwork(object):
                 node2 = self.switches[node2]
         if isinstance( node2, Datacenter ):
             node2 = node2.switch
                 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.
         """
 
     def addDocker( self, name, **params ):
         """
         Wrapper for addDocker method provided by Dockernet.
         """
-        return self.mnet.addDocker( name, **params)
+        return self.mnet.addDocker( name, cls=EmulatorCompute, **params)
 
     def removeDocker( self, name, **params):
         """
 
     def removeDocker( self, name, **params):
         """
@@ -96,6 +111,18 @@ class DCNetwork(object):
         """
         return self.mnet.removeDocker(name, **params)
 
         """
         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
         for dc in self.dcs.itervalues():
     def start(self):
         # start
         for dc in self.dcs.itervalues():