created EmulatorCompute node class. Improved rpc interface.
[osm/vim-emu.git] / emuvim / api / zerorpcapi.py
1 """
2 Distributed Cloud Emulator (dcemulator)
3 (c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
4 """
5
6 import logging
7 import threading
8 import zerorpc
9
10 logging.basicConfig(level=logging.DEBUG)
11
12
13 class ZeroRpcApiEndpoint(object):
14 """
15 Simple API endpoint that offers a zerorpc-based
16 interface. This interface will be used by the
17 default command line client.
18 It can be used as a reference to implement
19 REST interfaces providing the same semantics,
20 like e.g. OpenStack compute API.
21 """
22
23 def __init__(self, listenip, port):
24 self.dcs = {}
25 self.ip = listenip
26 self.port = port
27 logging.debug("Created API endpoint %s(%s:%d)" % (
28 self.__class__.__name__, self.ip, self.port))
29
30 def connectDatacenter(self, dc):
31 self.dcs[dc.name] = dc
32 logging.info("Connected DC(%s) to API endpoint %s(%s:%d)" % (
33 dc.name, self.__class__.__name__, self.ip, self.port))
34
35 def start(self):
36 thread = threading.Thread(target=self._api_server_thread, args=())
37 thread.daemon = True
38 thread.start()
39 logging.debug("Started API endpoint %s(%s:%d)" % (
40 self.__class__.__name__, self.ip, self.port))
41
42 def _api_server_thread(self):
43 s = zerorpc.Server(MultiDatacenterApi(self.dcs))
44 s.bind("tcp://%s:%d" % (self.ip, self.port))
45 s.run()
46
47
48 class MultiDatacenterApi(object):
49 """
50 Just pass through the corresponding request to the
51 selected data center. Do not implement provisioning
52 logic here because will will have multiple API
53 endpoint implementations at the end.
54 """
55
56 def __init__(self, dcs):
57 self.dcs = dcs
58
59 def compute_action_start(self, dc_name, compute_name):
60 # TODO what to return UUID / given name / internal name ?
61 logging.debug("RPC CALL: compute start")
62 try:
63 return self.dcs.get(dc_name).startCompute(compute_name)
64 except Exception as ex:
65 logging.exception("RPC error.")
66 return ex.message
67
68 def compute_action_stop(self, dc_name, compute_name):
69 logging.info("RPC CALL: compute stop")
70 try:
71 return self.dcs.get(dc_name).stopCompute(compute_name)
72 except Exception as ex:
73 logging.exception("RPC error.")
74 return ex.message
75
76 def compute_list(self, dc_name):
77 logging.info("RPC CALL: compute list")
78 try:
79 return [(c.name, c.IP())
80 for c in self.dcs.get(dc_name).listCompute()]
81 except Exception as ex:
82 logging.exception("RPC error.")
83 return ex.message
84
85 def compute_status(self, dc_name, compute_name):
86 logging.info("RPC CALL: compute status")
87 try:
88 return self.dcs.get(
89 dc_name).containers.get(compute_name).getStatus()
90 except Exception as ex:
91 logging.exception("RPC error.")
92 return ex.message