populated compute API
[osm/vim-emu.git] / emuvim / dcemulator / net.py
index 8ea41a7..13df531 100644 (file)
@@ -5,7 +5,7 @@ Distributed Cloud Emulator (dcemulator)
 import logging
 
 from mininet.net import Mininet
 import logging
 
 from mininet.net import Mininet
-from mininet.node import Controller, OVSKernelSwitch, Switch
+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
@@ -14,6 +14,12 @@ from node import Datacenter
 
 
 class DCNetwork(object):
 
 
 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 = {}
 
     def __init__(self):
         self.dcs = {}
@@ -47,9 +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
         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:
@@ -66,13 +77,42 @@ 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 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, **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 start(self):
         # start
 
     def start(self):
         # start
@@ -85,4 +125,3 @@ class DCNetwork(object):
 
     def CLI(self):
         CLI(self.mnet)
 
     def CLI(self):
         CLI(self.mnet)
-