Manually added OpenStack API code
[osm/vim-emu.git] / src / emuvim / api / openstack / openstack_api_endpoint.py
diff --git a/src/emuvim/api/openstack/openstack_api_endpoint.py b/src/emuvim/api/openstack/openstack_api_endpoint.py
new file mode 100644 (file)
index 0000000..0235a24
--- /dev/null
@@ -0,0 +1,76 @@
+from manage import OpenstackManage
+from openstack_dummies import *
+import logging
+import threading
+import compute
+import requests
+
+
+class OpenstackApiEndpoint():
+    """
+    Base class for an OpenStack datacenter.
+    It holds information about all connected endpoints.
+    """
+    dc_apis = []
+
+    def __init__(self, listenip, port):
+        self.ip = listenip
+        self.port = port
+        self.compute = compute.OpenstackCompute()
+        self.openstack_endpoints = dict()
+        self.openstack_endpoints['keystone'] = KeystoneDummyApi(self.ip, self.port)
+        self.openstack_endpoints['neutron'] = NeutronDummyApi(self.ip, self.port + 4696, self.compute)
+        self.openstack_endpoints['nova'] = NovaDummyApi(self.ip, self.port + 3774, self.compute)
+        self.openstack_endpoints['heat'] = HeatDummyApi(self.ip, self.port + 3004, self.compute)
+        self.openstack_endpoints['glance'] = GlanceDummyApi(self.ip, self.port + 4242, self.compute)
+
+        self.rest_threads = list()
+        self.manage = OpenstackManage()
+        self.manage.add_endpoint(self)
+        OpenstackApiEndpoint.dc_apis.append(self)
+
+    def connect_datacenter(self, dc):
+        """
+        Connect a datacenter to this endpoint.
+        An endpoint can only be connected to a single datacenter.
+
+        :param dc: Datacenter object
+        :type dc: :class:`dc`
+        """
+        self.compute.dc = dc
+        for ep in self.openstack_endpoints.values():
+            ep.manage = self.manage
+        logging.info \
+            ("Connected DC(%s) to API endpoint %s(%s:%d)" % (dc.label, self.__class__.__name__, self.ip, self.port))
+
+    def connect_dc_network(self, dc_network):
+        """
+        Connect the datacenter network to the endpoint.
+
+        :param dc_network: Datacenter network reference
+        :type dc_network: :class:`.net`
+        """
+        self.manage.net = dc_network
+        self.compute.nets[self.manage.floating_network.id] = self.manage.floating_network
+        logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (
+            self.__class__.__name__, self.ip, self.port))
+
+    def start(self):
+        """
+        Start all connected OpenStack endpoints that are connected to this API endpoint.
+        """
+        for component in self.openstack_endpoints.values():
+            component.compute = self.compute
+            component.manage = self.manage
+            thread = threading.Thread(target=component._start_flask, args=())
+            thread.daemon = True
+            thread.name = component.__class__
+            thread.start()
+
+    def stop(self):
+        """
+        Stop all connected OpenStack endpoints that are connected to this API endpoint.
+        """
+        for component in self.openstack_endpoints.values():
+            url = "http://" + component.ip + ":" + str(component.port) + "/shutdown"
+            requests.get(url)