root / branches / 1.1 / src / haizea / core / rpcserver.py @ 847
1 |
# -------------------------------------------------------------------------- #
|
---|---|
2 |
# Copyright 2006-2009, University of Chicago #
|
3 |
# Copyright 2008-2009, Distributed Systems Architecture Group, Universidad #
|
4 |
# 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
|