rpc.py revision f4a6899c2460fecc0cc0b72727afc9c51cb05da7
1be630eb07ddb84310fcc580acffcaa362a2dc606mbligh#
2be630eb07ddb84310fcc580acffcaa362a2dc606mbligh# Copyright 2008 Google Inc. All Rights Reserved.
3be630eb07ddb84310fcc580acffcaa362a2dc606mbligh#
4be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
5be630eb07ddb84310fcc580acffcaa362a2dc606mblighimport os, getpass
6be630eb07ddb84310fcc580acffcaa362a2dc606mblighfrom autotest_lib.frontend.afe import rpc_client_lib
7be630eb07ddb84310fcc580acffcaa362a2dc606mblighfrom autotest_lib.frontend.afe.json_rpc import proxy
8f4a6899c2460fecc0cc0b72727afc9c51cb05da7showardfrom autotest_lib.client.common_lib import global_config, utils
937eceaa2d0640edd83c4df3fc71621022433d52ambligh
1037eceaa2d0640edd83c4df3fc71621022433d52amblighGLOBAL_CONFIG = global_config.global_config
1137eceaa2d0640edd83c4df3fc71621022433d52amblighDEFAULT_SERVER = 'autotest'
12f4a6899c2460fecc0cc0b72727afc9c51cb05da7showardAFE_RPC_PATH = '/afe/server/rpc/'
13f4a6899c2460fecc0cc0b72727afc9c51cb05da7showardTKO_RPC_PATH = '/new_tko/server/rpc/'
14be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
15be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
16be630eb07ddb84310fcc580acffcaa362a2dc606mblighdef get_autotest_server(web_server=None):
17be630eb07ddb84310fcc580acffcaa362a2dc606mbligh    if not web_server:
18be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        if 'AUTOTEST_WEB' in os.environ:
19be630eb07ddb84310fcc580acffcaa362a2dc606mbligh            web_server = os.environ['AUTOTEST_WEB']
20be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        else:
2137eceaa2d0640edd83c4df3fc71621022433d52ambligh            web_server = 'http://' + GLOBAL_CONFIG.get_config_value(
2237eceaa2d0640edd83c4df3fc71621022433d52ambligh                    'SERVER', 'hostname', default=DEFAULT_SERVER)
23be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
24be630eb07ddb84310fcc580acffcaa362a2dc606mbligh    # if the name doesn't start with http://,
25be630eb07ddb84310fcc580acffcaa362a2dc606mbligh    # nonexistant hosts get an obscure error
26be630eb07ddb84310fcc580acffcaa362a2dc606mbligh    if not web_server.startswith('http://'):
27be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        web_server = 'http://' + web_server
28be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
29be630eb07ddb84310fcc580acffcaa362a2dc606mbligh    return web_server
30be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
31be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
32f4a6899c2460fecc0cc0b72727afc9c51cb05da7showarddef base_authorization_headers(username, server):
33f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard    if not username:
34f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard        if 'AUTOTEST_USER' in os.environ:
35f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard            username = os.environ['AUTOTEST_USER']
36f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard        else:
37f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard            username = getpass.getuser()
38f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard    return {'AUTHORIZATION' : username}
39f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard
40f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard
41f4a6899c2460fecc0cc0b72727afc9c51cb05da7showardauthorization_headers = utils.import_site_function(
42f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard        __file__, 'autotest_lib.cli.site_rpc', 'authorization_headers',
43f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard        base_authorization_headers)
44f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard
45f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard
46759b6d090629ac4a9d050dd5b267a4115d9c27e0mblighclass rpc_comm(object):
47759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh    """Shared AFE/TKO RPC class stuff"""
4833a8a7e0b56d6ff330f56d06e15d54576349571fmbligh    def __init__(self, web_server, rpc_path, username):
4933a8a7e0b56d6ff330f56d06e15d54576349571fmbligh        self.username = username
50be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        self.web_server = get_autotest_server(web_server)
515557957d382f35b85ebdc4c44dc05df1b3e1b787showard        self.proxy = self._connect(rpc_path)
52be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
5311efd23719fc94edb23540240f12969fa1d25367mbligh
545557957d382f35b85ebdc4c44dc05df1b3e1b787showard    def _connect(self, rpc_path):
55be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        # This does not fail even if the address is wrong.
56be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        # We need to wait for an actual RPC to fail
57f4a6899c2460fecc0cc0b72727afc9c51cb05da7showard        headers = authorization_headers(self.username, self.web_server)
585557957d382f35b85ebdc4c44dc05df1b3e1b787showard        rpc_server = self.web_server + rpc_path
59be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        return rpc_client_lib.get_proxy(rpc_server, headers=headers)
60be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
61be630eb07ddb84310fcc580acffcaa362a2dc606mbligh
625557957d382f35b85ebdc4c44dc05df1b3e1b787showard    def run(self, op, *args, **data):
63e249072ae260a3a7ed49c25e4fd9f60f6a8e5cfembligh        if 'AUTOTEST_CLI_DEBUG' in os.environ:
649196763511b2827552abcd46fd4a1b3dc471f510mbligh            print self.web_server, op, args, data
65be630eb07ddb84310fcc580acffcaa362a2dc606mbligh        function = getattr(self.proxy, op)
669196763511b2827552abcd46fd4a1b3dc471f510mbligh        result = function(*args, **data)
679196763511b2827552abcd46fd4a1b3dc471f510mbligh        if 'AUTOTEST_CLI_DEBUG' in os.environ:
689196763511b2827552abcd46fd4a1b3dc471f510mbligh            print 'result:', result
699196763511b2827552abcd46fd4a1b3dc471f510mbligh        return result
70759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh
71759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh
72759b6d090629ac4a9d050dd5b267a4115d9c27e0mblighclass afe_comm(rpc_comm):
73759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh    """Handles the AFE setup and communication through RPC"""
7433a8a7e0b56d6ff330f56d06e15d54576349571fmbligh    def __init__(self, web_server=None, rpc_path=AFE_RPC_PATH, username=None):
7533a8a7e0b56d6ff330f56d06e15d54576349571fmbligh        super(afe_comm, self).__init__(web_server, rpc_path, username)
76759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh
77759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh
78759b6d090629ac4a9d050dd5b267a4115d9c27e0mblighclass tko_comm(rpc_comm):
79759b6d090629ac4a9d050dd5b267a4115d9c27e0mbligh    """Handles the TKO setup and communication through RPC"""
8033a8a7e0b56d6ff330f56d06e15d54576349571fmbligh    def __init__(self, web_server=None, rpc_path=TKO_RPC_PATH, username=None):
8133a8a7e0b56d6ff330f56d06e15d54576349571fmbligh        super(tko_comm, self).__init__(web_server, rpc_path, username)
82