f554f0c505b7b4f21bcb44386af109325e068210
[osm/vim-emu.git] / src / emuvim / api / openstack / openstack_api_endpoint.py
1 from manage import OpenstackManage
2 from openstack_dummies import *
3 import logging
4 import threading
5 import compute
6 import requests
7 import socket
8 import time
9
10
11 class OpenstackApiEndpoint():
12 """
13 Base class for an OpenStack datacenter.
14 It holds information about all connected endpoints.
15 """
16 dc_apis = []
17
18 def __init__(self, listenip, port):
19 self.ip = listenip
20 self.port = port
21 self.compute = compute.OpenstackCompute()
22 self.openstack_endpoints = dict()
23 self.openstack_endpoints['keystone'] = KeystoneDummyApi(self.ip, self.port)
24 self.openstack_endpoints['neutron'] = NeutronDummyApi(self.ip, self.port + 4696, self.compute)
25 self.openstack_endpoints['nova'] = NovaDummyApi(self.ip, self.port + 3774, self.compute)
26 self.openstack_endpoints['heat'] = HeatDummyApi(self.ip, self.port + 3004, self.compute)
27 self.openstack_endpoints['glance'] = GlanceDummyApi(self.ip, self.port + 4242, self.compute)
28
29 self.rest_threads = list()
30 self.manage = OpenstackManage()
31 self.manage.add_endpoint(self)
32 OpenstackApiEndpoint.dc_apis.append(self)
33
34 def connect_datacenter(self, dc):
35 """
36 Connect a datacenter to this endpoint.
37 An endpoint can only be connected to a single datacenter.
38
39 :param dc: Datacenter object
40 :type dc: :class:`dc`
41 """
42 self.compute.dc = dc
43 for ep in self.openstack_endpoints.values():
44 ep.manage = self.manage
45 logging.info \
46 ("Connected DC(%s) to API endpoint %s(%s:%d)" % (dc.label, self.__class__.__name__, self.ip, self.port))
47
48 def connect_dc_network(self, dc_network):
49 """
50 Connect the datacenter network to the endpoint.
51
52 :param dc_network: Datacenter network reference
53 :type dc_network: :class:`.net`
54 """
55 self.manage.net = dc_network
56 self.compute.nets[self.manage.floating_network.id] = self.manage.floating_network
57 logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (
58 self.__class__.__name__, self.ip, self.port))
59
60 def start(self, wait_for_port=False):
61 """
62 Start all connected OpenStack endpoints that are connected to this API endpoint.
63 """
64 for component in self.openstack_endpoints.values():
65 component.compute = self.compute
66 component.manage = self.manage
67 thread = threading.Thread(target=component._start_flask, args=())
68 thread.daemon = True
69 thread.name = component.__class__
70 thread.start()
71 if wait_for_port:
72 self._wait_for_port(component.ip, component.port)
73
74
75 def stop(self):
76 """
77 Stop all connected OpenStack endpoints that are connected to this API endpoint.
78 """
79 for component in self.openstack_endpoints.values():
80 url = "http://" + component.ip + ":" + str(component.port) + "/shutdown"
81 try:
82 requests.get(url)
83 except:
84 # seems to be stopped
85 pass
86
87 def _wait_for_port(self, ip, port):
88 for i in range(0, 10):
89 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
90 s.settimeout(1) # 1 Second Timeout
91 r = s.connect_ex((ip, port))
92 if r == 0:
93 break # port is open proceed
94 else:
95 logging.warning("Waiting for {}:{} ... ({}/10)".format(ip, port, i + 1))
96 time.sleep(1)