Module arvados.safeapi
Expand source code
# 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 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={}, 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 = 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.
if name == "api_token":
return self.apiconfig['ARVADOS_API_TOKEN']
return getattr(self.localapi(), name)
Classes
class ThreadSafeApiCache (apiconfig=None, keep_params={}, api_params={})
-
Threadsafe wrapper for API objects.
This stores and returns a different api object per thread, because httplib2 which underlies apiclient is not threadsafe.
Expand source code
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={}, 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 = 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. if name == "api_token": return self.apiconfig['ARVADOS_API_TOKEN'] return getattr(self.localapi(), name)
Methods
def localapi(self)
-
Expand source code
def localapi(self): if 'api' not in self.local.__dict__: self.local.api = arvados.api_from_config('v1', apiconfig=self.apiconfig, **self.api_params) return self.local.api