Merge pull request #1 from mpeuster/master
[osm/vim-emu.git] / emuvim / dcemulator / node.py
index aeac665..0e6eae8 100644 (file)
@@ -21,6 +21,7 @@ class EmulatorCompute(Docker):
     def __init__(
             self, name, dimage, **kwargs):
         logging.debug("Create EmulatorCompute instance: %s" % name)
     def __init__(
             self, name, dimage, **kwargs):
         logging.debug("Create EmulatorCompute instance: %s" % name)
+        self.datacenter = None  # pointer to current DC
 
         # call original Docker.__init__
         Docker.__init__(self, name, dimage, **kwargs)
 
         # call original Docker.__init__
         Docker.__init__(self, name, dimage, **kwargs)
@@ -30,13 +31,29 @@ class EmulatorCompute(Docker):
         Helper method to receive information about the virtual networks
         this compute instance is connected to.
         """
         Helper method to receive information about the virtual networks
         this compute instance is connected to.
         """
-        return None
+        # format list of tuples (name, Ip, MAC, isUp, status)
+        return [(str(i), i.IP(), i.MAC(), i.isUp(), i.status())
+                for i in self.intfList()]
 
     def getStatus(self):
         """
         Helper method to receive information about this compute instance.
         """
 
     def getStatus(self):
         """
         Helper method to receive information about this compute instance.
         """
-        return None
+        status = {}
+        status["name"] = self.name
+        status["network"] = self.getNetworkStatus()
+        status["image"] = self.dimage
+        status["cpu_quota"] = self.cpu_quota
+        status["cpu_period"] = self.cpu_period
+        status["cpu_shares"] = self.cpu_shares
+        status["cpuset"] = self.cpuset
+        status["mem_limit"] = self.mem_limit
+        status["memswap_limit"] = self.memswap_limit
+        status["state"] = self.dcli.inspect_container(self.dc)["State"]
+        status["id"] = self.dcli.inspect_container(self.dc)["Id"]
+        status["datacenter"] = (None if self.datacenter is None
+                                else self.datacenter.name)
+        return status
 
 
 class Datacenter(object):
 
 
 class Datacenter(object):
@@ -66,7 +83,7 @@ class Datacenter(object):
         TODO: This will be changed in the future to support multiple networks
         per data center
         """
         TODO: This will be changed in the future to support multiple networks
         per data center
         """
-        self.switch = self.net.mnet.addSwitch(
+        self.switch = self.net.addSwitch(
             "%s.s1" % self.name, dpid=hex(self._get_next_dc_dpid())[2:])
         logging.debug("created data center switch: %s" % str(self.switch))
 
             "%s.s1" % self.name, dpid=hex(self._get_next_dc_dpid())[2:])
         logging.debug("created data center switch: %s" % str(self.switch))
 
@@ -82,6 +99,9 @@ class Datacenter(object):
         a single container can be connected.
         """
         assert name is not None
         a single container can be connected.
         """
         assert name is not None
+        # no duplications
+        if name in [c.name for c in self.net.getAllContainers()]:
+            raise Exception("Container with name %s already exists." % name)
         # set default parameter
         if image is None:
             image = "ubuntu"
         # set default parameter
         if image is None:
             image = "ubuntu"
@@ -90,14 +110,18 @@ class Datacenter(object):
         # create the container and connect it to the given network
         d = self.net.addDocker("%s" % (name), dimage=image)
         self.net.addLink(d, self.switch, params1=network)
         # create the container and connect it to the given network
         d = self.net.addDocker("%s" % (name), dimage=image)
         self.net.addLink(d, self.switch, params1=network)
+        # do bookkeeping
         self.containers[name] = d
         self.containers[name] = d
-        return name  # we might use UUIDs for naming later on
+        d.datacenter = self
+        return d  # we might use UUIDs for naming later on
 
     def stopCompute(self, name):
         """
         Stop and remove a container from this data center.
         """
 
     def stopCompute(self, name):
         """
         Stop and remove a container from this data center.
         """
-        assert name in self.containers
+        assert name is not None
+        if name not in self.containers:
+            raise Exception("Container with name %s not found." % name)
         self.net.removeLink(
             link=None, node1=self.containers[name], node2=self.switch)
         self.net.removeDocker("%s" % (name))
         self.net.removeLink(
             link=None, node1=self.containers[name], node2=self.switch)
         self.net.removeDocker("%s" % (name))
@@ -109,4 +133,4 @@ class Datacenter(object):
         Return a list of all running containers assigned to this
         data center.
         """
         Return a list of all running containers assigned to this
         data center.
         """
-        return self.containers.itervalues()
+        return list(self.containers.itervalues())