root / branches / 1.1 / src / haizea / core / rpcserver.py @ 847
1 | 632 | borja | # -------------------------------------------------------------------------- #
|
---|---|---|---|
2 | 641 | borja | # Copyright 2006-2009, University of Chicago #
|
3 | # Copyright 2008-2009, Distributed Systems Architecture Group, Universidad #
|
||
4 | 632 | borja | # Complutense de Madrid (dsa-research.org) #
|
5 | # #
|
||
6 | # Licensed under the Apache License, Version 2.0 (the "License"); you may #
|
||
7 | # not use this file except in compliance with the License. You may obtain #
|
||
8 | # a copy of the License at #
|
||
9 | # #
|
||
10 | # http://www.apache.org/licenses/LICENSE-2.0 #
|
||
11 | # #
|
||
12 | # Unless required by applicable law or agreed to in writing, software #
|
||
13 | # distributed under the License is distributed on an "AS IS" BASIS, #
|
||
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
||
15 | # See the License for the specific language governing permissions and #
|
||
16 | # limitations under the License. #
|
||
17 | # -------------------------------------------------------------------------- #
|
||
18 | |||
19 | import threading |
||
20 | import logging |
||
21 | from SimpleXMLRPCServer import SimpleXMLRPCServer |
||
22 | |||
23 | DEFAULT_HAIZEA_PORT = 42493
|
||
24 | |||
25 | class StoppableSimpleXMLRPCServer(SimpleXMLRPCServer): |
||
26 | allow_reuse_address = True
|
||
27 | |||
28 | def serve_forever(self): |
||
29 | self.run = True |
||
30 | self.socket.settimeout(1) |
||
31 | while self.run: |
||
32 | self.handle_request()
|
||
33 | |||
34 | def stop(self): |
||
35 | self.run = False |
||
36 | self.socket.close()
|
||
37 | |||
38 | class RPCServer(object): |
||
39 | def __init__(self, manager): |
||
40 | self.manager = manager
|
||
41 | self.logger = logging.getLogger("RPCSERVER") |
||
42 | self.port = DEFAULT_HAIZEA_PORT
|
||
43 | self.server = StoppableSimpleXMLRPCServer(("localhost", self.port), allow_none=True) |
||
44 | self.server_thread = None |
||
45 | self.register_rpc(self.test_func) |
||
46 | self.register_rpc(self.cancel_lease) |
||
47 | self.register_rpc(self.get_leases) |
||
48 | self.register_rpc(self.get_lease) |
||
49 | self.register_rpc(self.get_queue) |
||
50 | self.register_rpc(self.get_hosts) |
||
51 | self.register_rpc(self.notify_event) |
||
52 | |||
53 | def start(self): |
||
54 | # Start the XML-RPC server
|
||
55 | self.server_thread = threading.Thread( target = self.serve ) |
||
56 | self.server_thread.start()
|
||
57 | |||
58 | def stop(self): |
||
59 | self.server.stop()
|
||
60 | self.server_thread.join()
|
||
61 | |||
62 | def register_rpc(self, func): |
||
63 | self.server.register_function(func)
|
||
64 | |||
65 | def serve(self): |
||
66 | self.logger.info("RPC server started on port %i" % self.port) |
||
67 | self.server.serve_forever()
|
||
68 | |||
69 | def test_func(self): |
||
70 | self.logger.info("Test RPC function called") |
||
71 | return 0 |
||
72 | |||
73 | def cancel_lease(self, lease_id): |
||
74 | self.manager.cancel_lease(lease_id)
|
||
75 | return 0 |
||
76 | |||
77 | def get_leases(self): |
||
78 | return [l.to_xml_string() for l in self.manager.scheduler.leases.get_leases()] |
||
79 | |||
80 | def get_lease(self, lease_id): |
||
81 | return 0 |
||
82 | |||
83 | def get_queue(self): |
||
84 | return [l.to_xml_string() for l in self.manager.scheduler.queue] |
||
85 | |||
86 | def get_hosts(self): |
||
87 | return [h.xmlrpc_marshall() for h in self.manager.scheduler.vm_scheduler.resourcepool.nodes.values()] |
||
88 | |||
89 | def notify_event(self, lease_id, enactment_id, event): |
||
90 | pass |