Re-structured API modules. Now prepared to have different kinds of cloud APIs. Added...
authorpeusterm <manuel.peuster@uni-paderborn.de>
Tue, 8 Mar 2016 09:11:48 +0000 (10:11 +0100)
committerpeusterm <manuel.peuster@uni-paderborn.de>
Tue, 8 Mar 2016 09:11:48 +0000 (10:11 +0100)
src/emuvim/api/openstack/README.md [new file with mode: 0644]
src/emuvim/api/sonata/__init__.py [new file with mode: 0644]
src/emuvim/api/sonata/dummygatekeeper.py [new file with mode: 0644]
src/emuvim/api/zerorpc/__init__.py [new file with mode: 0644]
src/emuvim/api/zerorpc/compute.py [new file with mode: 0644]
src/emuvim/api/zerorpc/network.py [new file with mode: 0644]
src/emuvim/api/zerorpcapi.py [deleted file]
src/emuvim/api/zerorpcapi_DCNetwork.py [deleted file]
src/emuvim/examples/simple_topology.py
src/emuvim/examples/sonata_y1_demo_topology_1.py

diff --git a/src/emuvim/api/openstack/README.md b/src/emuvim/api/openstack/README.md
new file mode 100644 (file)
index 0000000..596390e
--- /dev/null
@@ -0,0 +1 @@
+This is a placeholder. This folder will contain a OpenStack/HEAT like interface to the emulator.
\ No newline at end of file
diff --git a/src/emuvim/api/sonata/__init__.py b/src/emuvim/api/sonata/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/emuvim/api/zerorpc/__init__.py b/src/emuvim/api/zerorpc/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/emuvim/api/zerorpc/compute.py b/src/emuvim/api/zerorpc/compute.py
new file mode 100644 (file)
index 0000000..59b960c
--- /dev/null
@@ -0,0 +1,128 @@
+"""
+Distributed Cloud Emulator (dcemulator)
+(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
+"""
+
+import logging
+import threading
+import zerorpc
+
+logging.basicConfig(level=logging.INFO)
+
+
+class ZeroRpcApiEndpoint(object):
+    """
+    Simple API endpoint that offers a zerorpc-based
+    interface. This interface will be used by the
+    default command line client.
+    It can be used as a reference to implement
+    REST interfaces providing the same semantics,
+    like e.g. OpenStack compute API.
+    """
+
+    def __init__(self, listenip, port):
+        self.dcs = {}
+        self.ip = listenip
+        self.port = port
+        logging.debug("Created API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def connectDatacenter(self, dc):
+        self.dcs[dc.label] = dc
+        logging.info("Connected DC(%s) to API endpoint %s(%s:%d)" % (
+            dc.label, self.__class__.__name__, self.ip, self.port))
+
+    def start(self):
+        thread = threading.Thread(target=self._api_server_thread, args=())
+        thread.daemon = True
+        thread.start()
+        logging.debug("Started API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def _api_server_thread(self):
+        s = zerorpc.Server(MultiDatacenterApi(self.dcs))
+        s.bind("tcp://%s:%d" % (self.ip, self.port))
+        s.run()
+
+
+class MultiDatacenterApi(object):
+    """
+        Just pass through the corresponding request to the
+        selected data center. Do not implement provisioning
+        logic here because will will have multiple API
+        endpoint implementations at the end.
+    """
+
+    def __init__(self, dcs):
+        self.dcs = dcs
+
+    def compute_action_start(self, dc_label, compute_name, image, command, network):
+        """
+        Start a new compute instance: A docker container
+        :param dc_label: name of the DC
+        :param compute_name: compute container name
+        :param image: image name
+        :param command: command to execute
+        :param network:
+        :return: networks list({"ip": "10.0.0.254/8"}, {"ip": "11.0.0.254/24"})
+        """
+        # TODO what to return UUID / given name / internal name ?
+        logging.debug("RPC CALL: compute start")
+        try:
+            c = self.dcs.get(dc_label).startCompute(
+                compute_name, image=image, command=command, network=network)
+            return str(c.name)
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def compute_action_stop(self, dc_label, compute_name):
+        logging.debug("RPC CALL: compute stop")
+        try:
+            return self.dcs.get(dc_label).stopCompute(compute_name)
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def compute_list(self, dc_label):
+        logging.debug("RPC CALL: compute list")
+        try:
+            if dc_label is None:
+                # return list with all compute nodes in all DCs
+                all_containers = []
+                for dc in self.dcs.itervalues():
+                    all_containers += dc.listCompute()
+                return [(c.name, c.getStatus())
+                        for c in all_containers]
+            else:
+                # return list of compute nodes for specified DC
+                return [(c.name, c.getStatus())
+                        for c in self.dcs.get(dc_label).listCompute()]
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def compute_status(self, dc_label, compute_name):
+        logging.debug("RPC CALL: compute status")
+        try:
+            return self.dcs.get(
+                dc_label).containers.get(compute_name).getStatus()
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def datacenter_list(self):
+        logging.debug("RPC CALL: datacenter list")
+        try:
+            return [d.getStatus() for d in self.dcs.itervalues()]
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def datacenter_status(self, dc_label):
+        logging.debug("RPC CALL: datacenter status")
+        try:
+                return self.dcs.get(dc_label).getStatus()
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
diff --git a/src/emuvim/api/zerorpc/network.py b/src/emuvim/api/zerorpc/network.py
new file mode 100644 (file)
index 0000000..f232166
--- /dev/null
@@ -0,0 +1,103 @@
+"""
+Distributed Cloud Emulator (dcemulator)
+"""
+
+import logging
+import threading
+import zerorpc
+
+
+logging.basicConfig(level=logging.INFO)
+
+
+class ZeroRpcApiEndpointDCNetwork(object):
+    """
+    Simple API endpoint that offers a zerorpc-based
+    interface. This interface will be used by the
+    default command line client.
+    It can be used as a reference to implement
+    REST interfaces providing the same semantics,
+    like e.g. OpenStack compute API.
+    """
+
+    def __init__(self, listenip, port, DCNetwork=None):
+        if DCNetwork :
+            self.connectDCNetwork(DCNetwork)
+        self.ip = listenip
+        self.port = port
+        logging.debug("Created monitoring API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def connectDCNetwork(self, net):
+        self.net = net
+        logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def start(self):
+        thread = threading.Thread(target=self._api_server_thread, args=())
+        thread.daemon = True
+        thread.start()
+        logging.debug("Started API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def _api_server_thread(self):
+        s = zerorpc.Server(DCNetworkApi(self.net))
+        s.bind("tcp://%s:%d" % (self.ip, self.port))
+        s.run()
+
+    def stop(self):
+        logging.info("Stop the monitoring API endpoint")
+        return
+
+
+class DCNetworkApi(object):
+    """
+        The networking and monitoring commands need the scope of the
+        whole DC network to find the requested vnf. So this API is intended
+        to work with a DCNetwork.
+        Just pass through the corresponding request to the
+        selected data center network. Do not implement provisioning
+        logic here because will will have multiple API
+        endpoint implementations at the end.
+    """
+
+    def __init__(self, net):
+        self.net = net
+
+    def network_action_start(self, vnf_src_name, vnf_dst_name):
+        # call DCNetwork method, not really datacenter specific API for now...
+        # provided dc name needs to be part of API endpoint
+        # no check if vnfs are really connected to this datacenter...
+        logging.debug("RPC CALL: network chain start")
+        try:
+            c = self.net.setChain(
+                vnf_src_name, vnf_dst_name)
+            return str(c)
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    def network_action_stop(self, vnf_src_name, vnf_dst_name):
+        # call DCNetwork method, not really datacenter specific API for now...
+        # provided dc name needs to be part of API endpoint
+        # no check if vnfs are really connected to this datacenter...
+        logging.debug("RPC CALL: network chain stop")
+        try:
+            c = self.net.setChain(
+                vnf_src_name, vnf_dst_name, cmd='del-flows')
+            return c
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+    # get egress(default) or ingress rate of a vnf
+    def monitor_get_rate(self, vnf_name, direction):
+        logging.debug("RPC CALL: get rate")
+        try:
+            c = self.net.monitor_agent.get_rate(vnf_name, direction)
+            return c
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+
diff --git a/src/emuvim/api/zerorpcapi.py b/src/emuvim/api/zerorpcapi.py
deleted file mode 100755 (executable)
index 59b960c..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-"""
-Distributed Cloud Emulator (dcemulator)
-(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
-"""
-
-import logging
-import threading
-import zerorpc
-
-logging.basicConfig(level=logging.INFO)
-
-
-class ZeroRpcApiEndpoint(object):
-    """
-    Simple API endpoint that offers a zerorpc-based
-    interface. This interface will be used by the
-    default command line client.
-    It can be used as a reference to implement
-    REST interfaces providing the same semantics,
-    like e.g. OpenStack compute API.
-    """
-
-    def __init__(self, listenip, port):
-        self.dcs = {}
-        self.ip = listenip
-        self.port = port
-        logging.debug("Created API endpoint %s(%s:%d)" % (
-            self.__class__.__name__, self.ip, self.port))
-
-    def connectDatacenter(self, dc):
-        self.dcs[dc.label] = dc
-        logging.info("Connected DC(%s) to API endpoint %s(%s:%d)" % (
-            dc.label, self.__class__.__name__, self.ip, self.port))
-
-    def start(self):
-        thread = threading.Thread(target=self._api_server_thread, args=())
-        thread.daemon = True
-        thread.start()
-        logging.debug("Started API endpoint %s(%s:%d)" % (
-            self.__class__.__name__, self.ip, self.port))
-
-    def _api_server_thread(self):
-        s = zerorpc.Server(MultiDatacenterApi(self.dcs))
-        s.bind("tcp://%s:%d" % (self.ip, self.port))
-        s.run()
-
-
-class MultiDatacenterApi(object):
-    """
-        Just pass through the corresponding request to the
-        selected data center. Do not implement provisioning
-        logic here because will will have multiple API
-        endpoint implementations at the end.
-    """
-
-    def __init__(self, dcs):
-        self.dcs = dcs
-
-    def compute_action_start(self, dc_label, compute_name, image, command, network):
-        """
-        Start a new compute instance: A docker container
-        :param dc_label: name of the DC
-        :param compute_name: compute container name
-        :param image: image name
-        :param command: command to execute
-        :param network:
-        :return: networks list({"ip": "10.0.0.254/8"}, {"ip": "11.0.0.254/24"})
-        """
-        # TODO what to return UUID / given name / internal name ?
-        logging.debug("RPC CALL: compute start")
-        try:
-            c = self.dcs.get(dc_label).startCompute(
-                compute_name, image=image, command=command, network=network)
-            return str(c.name)
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
-
-    def compute_action_stop(self, dc_label, compute_name):
-        logging.debug("RPC CALL: compute stop")
-        try:
-            return self.dcs.get(dc_label).stopCompute(compute_name)
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
-
-    def compute_list(self, dc_label):
-        logging.debug("RPC CALL: compute list")
-        try:
-            if dc_label is None:
-                # return list with all compute nodes in all DCs
-                all_containers = []
-                for dc in self.dcs.itervalues():
-                    all_containers += dc.listCompute()
-                return [(c.name, c.getStatus())
-                        for c in all_containers]
-            else:
-                # return list of compute nodes for specified DC
-                return [(c.name, c.getStatus())
-                        for c in self.dcs.get(dc_label).listCompute()]
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
-
-    def compute_status(self, dc_label, compute_name):
-        logging.debug("RPC CALL: compute status")
-        try:
-            return self.dcs.get(
-                dc_label).containers.get(compute_name).getStatus()
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
-
-    def datacenter_list(self):
-        logging.debug("RPC CALL: datacenter list")
-        try:
-            return [d.getStatus() for d in self.dcs.itervalues()]
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
-
-    def datacenter_status(self, dc_label):
-        logging.debug("RPC CALL: datacenter status")
-        try:
-                return self.dcs.get(dc_label).getStatus()
-        except Exception as ex:
-            logging.exception("RPC error.")
-            return ex.message
diff --git a/src/emuvim/api/zerorpcapi_DCNetwork.py b/src/emuvim/api/zerorpcapi_DCNetwork.py
deleted file mode 100755 (executable)
index 27527aa..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-"""\r
-Distributed Cloud Emulator (dcemulator)\r
-(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>\r
-"""\r
-\r
-import logging\r
-import threading\r
-import zerorpc\r
-\r
-\r
-logging.basicConfig(level=logging.INFO)\r
-\r
-\r
-class ZeroRpcApiEndpointDCNetwork(object):\r
-    """\r
-    Simple API endpoint that offers a zerorpc-based\r
-    interface. This interface will be used by the\r
-    default command line client.\r
-    It can be used as a reference to implement\r
-    REST interfaces providing the same semantics,\r
-    like e.g. OpenStack compute API.\r
-    """\r
-\r
-    def __init__(self, listenip, port, DCNetwork=None):\r
-        if DCNetwork :\r
-            self.connectDCNetwork(DCNetwork)\r
-        self.ip = listenip\r
-        self.port = port\r
-        logging.debug("Created monitoring API endpoint %s(%s:%d)" % (\r
-            self.__class__.__name__, self.ip, self.port))\r
-\r
-    def connectDCNetwork(self, net):\r
-        self.net = net\r
-        logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (\r
-            self.__class__.__name__, self.ip, self.port))\r
-\r
-    def start(self):\r
-        thread = threading.Thread(target=self._api_server_thread, args=())\r
-        thread.daemon = True\r
-        thread.start()\r
-        logging.debug("Started API endpoint %s(%s:%d)" % (\r
-            self.__class__.__name__, self.ip, self.port))\r
-\r
-    def _api_server_thread(self):\r
-        s = zerorpc.Server(DCNetworkApi(self.net))\r
-        s.bind("tcp://%s:%d" % (self.ip, self.port))\r
-        s.run()\r
-\r
-    def stop(self):\r
-        logging.info("Stop the monitoring API endpoint")\r
-        return\r
-\r
-\r
-class DCNetworkApi(object):\r
-    """\r
-        The networking and monitoring commands need the scope of the\r
-        whole DC network to find the requested vnf. So this API is intended\r
-        to work with a DCNetwork.\r
-        Just pass through the corresponding request to the\r
-        selected data center network. Do not implement provisioning\r
-        logic here because will will have multiple API\r
-        endpoint implementations at the end.\r
-    """\r
-\r
-    def __init__(self, net):\r
-        self.net = net\r
-\r
-    def network_action_start(self, vnf_src_name, vnf_dst_name):\r
-        # call DCNetwork method, not really datacenter specific API for now...\r
-        # provided dc name needs to be part of API endpoint\r
-        # no check if vnfs are really connected to this datacenter...\r
-        logging.debug("RPC CALL: network chain start")\r
-        try:\r
-            c = self.net.setChain(\r
-                vnf_src_name, vnf_dst_name)\r
-            return str(c)\r
-        except Exception as ex:\r
-            logging.exception("RPC error.")\r
-            return ex.message\r
-\r
-    def network_action_stop(self, vnf_src_name, vnf_dst_name):\r
-        # call DCNetwork method, not really datacenter specific API for now...\r
-        # provided dc name needs to be part of API endpoint\r
-        # no check if vnfs are really connected to this datacenter...\r
-        logging.debug("RPC CALL: network chain stop")\r
-        try:\r
-            c = self.net.setChain(\r
-                vnf_src_name, vnf_dst_name, cmd='del-flows')\r
-            return c\r
-        except Exception as ex:\r
-            logging.exception("RPC error.")\r
-            return ex.message\r
-\r
-    # get egress(default) or ingress rate of a vnf\r
-    def monitor_get_rate(self, vnf_name, direction):\r
-        logging.debug("RPC CALL: get rate")\r
-        try:\r
-            c = self.net.monitor_agent.get_rate(vnf_name, direction)\r
-            return c\r
-        except Exception as ex:\r
-            logging.exception("RPC error.")\r
-            return ex.message\r
-\r
-\r
index 8f14b69..eb52cb1 100755 (executable)
@@ -19,8 +19,8 @@ script.
 import logging
 from mininet.log import setLogLevel
 from emuvim.dcemulator.net import DCNetwork
-from emuvim.api.zerorpcapi import ZeroRpcApiEndpoint
-from emuvim.api.zerorpcapi_DCNetwork import ZeroRpcApiEndpointDCNetwork
+from emuvim.api.zerorpc.compute import ZeroRpcApiEndpoint
+from emuvim.api.zerorpc.network import ZeroRpcApiEndpointDCNetwork
 
 logging.basicConfig(level=logging.INFO)
 
index 1588190..5145543 100644 (file)
@@ -7,7 +7,7 @@ A simple topology with two PoPs for the y1 demo story board.
 import logging
 from mininet.log import setLogLevel
 from emuvim.dcemulator.net import DCNetwork
-from emuvim.api.zerorpcapi import ZeroRpcApiEndpoint
+from emuvim.api.zerorpc.compute import ZeroRpcApiEndpoint
 
 logging.basicConfig(level=logging.INFO)