xref: /aosp_15_r20/external/autotest/site_utils/tester_feedback/service.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li"""Tester feedback backend service implementation."""
6*9c5db199SXin Li
7*9c5db199SXin Liimport SimpleXMLRPCServer
8*9c5db199SXin Liimport multiprocessing
9*9c5db199SXin Li
10*9c5db199SXin Liimport feedback_delegate
11*9c5db199SXin Liimport request_multiplexer
12*9c5db199SXin Li
13*9c5db199SXin Li# TODO(garnold) Load query delegate implementations as they become available
14*9c5db199SXin Li# (b/26769927).
15*9c5db199SXin Li# pylint: disable=unused-import
16*9c5db199SXin Liimport audio_query_delegate_impl
17*9c5db199SXin Li
18*9c5db199SXin Li
19*9c5db199SXin Liclass FeedbackService(object):
20*9c5db199SXin Li    """The feedback service main object."""
21*9c5db199SXin Li
22*9c5db199SXin Li    def __init__(self):
23*9c5db199SXin Li        self._multiplexer = None
24*9c5db199SXin Li        self._server_port = 0
25*9c5db199SXin Li        self._server_process = None
26*9c5db199SXin Li        self._running = False
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Li    @property
30*9c5db199SXin Li    def server_port(self):
31*9c5db199SXin Li        """Returns the service listening port."""
32*9c5db199SXin Li        return self._server_port
33*9c5db199SXin Li
34*9c5db199SXin Li
35*9c5db199SXin Li    def start(self):
36*9c5db199SXin Li        """Starts the feedback service."""
37*9c5db199SXin Li        if self._running:
38*9c5db199SXin Li            return
39*9c5db199SXin Li
40*9c5db199SXin Li        # Start the feedback request multiplexer.
41*9c5db199SXin Li        self._multiplexer = request_multiplexer.FeedbackRequestMultiplexer()
42*9c5db199SXin Li        self._multiplexer.start()
43*9c5db199SXin Li
44*9c5db199SXin Li        # Start the feedback delegate RPC server.
45*9c5db199SXin Li        rpc_server = SimpleXMLRPCServer.SimpleXMLRPCServer(('localhost', 0))
46*9c5db199SXin Li        rpc_server.register_instance(
47*9c5db199SXin Li                feedback_delegate.FeedbackDelegate(self._multiplexer))
48*9c5db199SXin Li        self._server_port = rpc_server.server_address[1]
49*9c5db199SXin Li        self._server_process = multiprocessing.Process(
50*9c5db199SXin Li                target=rpc_server.serve_forever)
51*9c5db199SXin Li        self._server_process.start()
52*9c5db199SXin Li
53*9c5db199SXin Li        self._running = True
54*9c5db199SXin Li
55*9c5db199SXin Li
56*9c5db199SXin Li    def stop(self):
57*9c5db199SXin Li        """Stops the feedback service."""
58*9c5db199SXin Li        if not self._running:
59*9c5db199SXin Li            return
60*9c5db199SXin Li
61*9c5db199SXin Li        # Stop the RPC server.
62*9c5db199SXin Li        self._server_process.terminate()
63*9c5db199SXin Li        self._server_process.join()
64*9c5db199SXin Li        self._server_port = 0
65*9c5db199SXin Li
66*9c5db199SXin Li        # Stop the multiplexer.
67*9c5db199SXin Li        self._multiplexer.stop()
68*9c5db199SXin Li
69*9c5db199SXin Li        self._running = False
70