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