X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a7b16675337995c65b909a7519178efed98a3089..210878bd23b49384963592e94b6434cf98e5c881:/sdk/python/arvados/safeapi.py diff --git a/sdk/python/arvados/safeapi.py b/sdk/python/arvados/safeapi.py index d38763c023..c6e17cae0b 100644 --- a/sdk/python/arvados/safeapi.py +++ b/sdk/python/arvados/safeapi.py @@ -1,32 +1,47 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import absolute_import + +from builtins import object +import copy import threading -import api -import keep -import config - -class SafeApi(object): - """Threadsafe wrapper for API object. This stores and returns a different api - object per thread, because httplib2 which underlies apiclient is not - threadsafe. + +import arvados +import arvados.keep as keep +import arvados.config as config + +class ThreadSafeApiCache(object): + """Threadsafe wrapper for API objects. + + This stores and returns a different api object per thread, because httplib2 + which underlies apiclient is not threadsafe. + """ - def __init__(self, apiconfig=None, keep_params={}): - if not apiconfig: - apiconfig = config - self.host = apiconfig.get('ARVADOS_API_HOST') - self.api_token = apiconfig.get('ARVADOS_API_TOKEN') - self.insecure = apiconfig.flag_is_true('ARVADOS_API_HOST_INSECURE') + def __init__(self, apiconfig=None, keep_params={}, api_params={}): + if apiconfig is None: + apiconfig = config.settings() + self.apiconfig = copy.copy(apiconfig) + self.api_params = api_params self.local = threading.local() + + # Initialize an API object for this thread before creating + # KeepClient, this will report if ARVADOS_API_HOST or + # ARVADOS_API_TOKEN are missing. + self.localapi() + self.keep = keep.KeepClient(api_client=self, **keep_params) def localapi(self): if 'api' not in self.local.__dict__: - self.local.api = api.api('v1', False, self.host, - self.api_token, self.insecure) + self.local.api = arvados.api_from_config('v1', apiconfig=self.apiconfig, + **self.api_params) return self.local.api def __getattr__(self, name): # Proxy nonexistent attributes to the thread-local API client. - try: - return getattr(self.localapi(), name) - except AttributeError: - return super(SafeApi, self).__getattr__(name) + if name == "api_token": + return self.apiconfig['ARVADOS_API_TOKEN'] + return getattr(self.localapi(), name)