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