Project

General

Profile

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