X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3a342f5de4da4b155d551e54aeeab51eed9f8d68..4f1085f353d44600643a8e9dd6b43a39131e7946:/sdk/python/arvados/api.py diff --git a/sdk/python/arvados/api.py b/sdk/python/arvados/api.py index cc019a1e91..699c319651 100644 --- a/sdk/python/arvados/api.py +++ b/sdk/python/arvados/api.py @@ -7,18 +7,22 @@ import types import apiclient import apiclient.discovery +import config +import errors import util -config = None services = {} class CredentialsFromEnv(object): @staticmethod def http_request(self, uri, **kwargs): - global config from httplib import BadStatusLine if 'headers' not in kwargs: kwargs['headers'] = {} + + if config.get("ARVADOS_EXTERNAL_CLIENT", "") == "true": + kwargs['headers']['X-External-Client'] = '1' + kwargs['headers']['Authorization'] = 'OAuth2 %s' % config.get('ARVADOS_API_TOKEN', 'ARVADOS_API_TOKEN_not_set') try: return self.orig_http_request(uri, **kwargs) @@ -35,21 +39,6 @@ class CredentialsFromEnv(object): http.request = types.MethodType(self.http_request, http) return http -# Arvados configuration settings are taken from $HOME/.config/arvados. -# Environment variables override settings in the config file. -# -class ArvadosConfig(dict): - def __init__(self, config_file): - dict.__init__(self) - if os.path.exists(config_file): - with open(config_file, "r") as f: - for config_line in f: - var, val = config_line.rstrip().split('=', 2) - self[var] = val - for var in os.environ: - if var.startswith('ARVADOS_'): - self[var] = os.environ[var] - # Monkey patch discovery._cast() so objects and arrays get serialized # with json.dumps() instead of str(). _cast_orig = apiclient.discovery._cast @@ -70,25 +59,23 @@ def http_cache(data_type): path = None return path -def api(version=None): - global services, config +def api(version=None, cache=True): + global services - if not config: - config = ArvadosConfig(os.environ['HOME'] + '/.config/arvados/settings.conf') - if 'ARVADOS_DEBUG' in config: - logging.basicConfig(level=logging.DEBUG) + if 'ARVADOS_DEBUG' in config.settings(): + logging.basicConfig(level=logging.DEBUG) - if not services.get(version): + if not cache or not services.get(version): apiVersion = version if not version: apiVersion = 'v1' logging.info("Using default API version. " + "Call arvados.api('%s') instead." % apiVersion) - if 'ARVADOS_API_HOST' not in config: + if 'ARVADOS_API_HOST' not in config.settings(): raise Exception("ARVADOS_API_HOST is not set. Aborting.") url = ('https://%s/discovery/v1/apis/{api}/{apiVersion}/rest' % - config['ARVADOS_API_HOST']) + config.get('ARVADOS_API_HOST')) credentials = CredentialsFromEnv() # Use system's CA certificates (if we find them) instead of httplib2's @@ -97,12 +84,12 @@ def api(version=None): ca_certs = None # use httplib2 default http = httplib2.Http(ca_certs=ca_certs, - cache=http_cache('discovery')) + cache=(http_cache('discovery') if cache else None)) http = credentials.authorize(http) if re.match(r'(?i)^(true|1|yes)$', config.get('ARVADOS_API_HOST_INSECURE', 'no')): http.disable_ssl_certificate_validation=True services[version] = apiclient.discovery.build( 'arvados', apiVersion, http=http, discoveryServiceUrl=url) + http.cache = None return services[version] -