1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 """The registration server used to register tasks.
7 The registration server is started by the test controller and allows the tasks
8 to register themselves when they start. Authentication of the tasks controllers
9 is based on an OTP passed to the run_task binary on startup.
15 import SimpleXMLRPCServer
17 #pylint: disable=relative-import
21 class TaskRegistrationServer(object):
22 """Discovery server run on the host."""
25 self
._expected
_tasks
= {}
26 self
._rpc
_server
= None
29 def _RegisterTaskRPC(self
, otp
, ip
):
30 """The RPC used by a task to register with the registration server."""
31 assert otp
in self
._expected
_tasks
32 cb
= self
._expected
_tasks
.pop(otp
)
35 def RegisterTaskCallback(self
, otp
, callback
):
36 """Registers a callback associated with an OTP."""
37 assert callable(callback
)
38 self
._expected
_tasks
[otp
] = callback
41 """Starts the registration server."""
42 logging
.debug('Starting task registration server')
43 self
._rpc
_server
= SimpleXMLRPCServer
.SimpleXMLRPCServer(
44 (common_lib
.SERVER_ADDRESS
, common_lib
.SERVER_PORT
),
45 allow_none
=True, logRequests
=False)
46 self
._rpc
_server
.register_function(
47 self
._RegisterTaskRPC
, 'RegisterTask')
48 self
._thread
= threading
.Thread(target
=self
._rpc
_server
.serve_forever
)
52 """Shuts the discovery server down."""
53 if self
._thread
and self
._thread
.is_alive():
54 logging
.debug('Shutting down task registration server')
55 self
._rpc
_server
.shutdown()