Shared function is a decorator, that enable a function once called to store the results to storage, any ulterior call from the same or other processes will return the stored results, which make the shared function results persistent.

Note: Shared function store it’s data as json. The results of the decorated

function must be json compatible.


from robottelo.decorators.func_shared.shared import shared

def module_level_shared(*args, **kwargs):
    # do some
    # the result of a shared function must be json compatible
    return any_data

class SomeTestCase1(TestCase):

    def _shared_function(cls):

        org = make_org()
        # upload manifest
        repo = make_repository()
        return dict(org=org, repo=repo}

    def setUpClass(cls):

        data = cls._shared_function()
        other_data = module_level_shared() = data['org']
        cls.repo = data['repo']

# the shared function can be called an other time to be able to initiate
# specific data

class SomeTestCase2(TestCase):

    @shared(inject=True, injected_kw='_injected')
    def setUpClass(cls, org=None, repo=None, _injected=False):

        if _injected:
   = org
            cls.repo = repo
            # create the org
   = make_org()
            # upload manifest
            cls.repo = make_repository()

        # create a virtual machine

        # shared function with injected=True, must return a dict
        # the resulting dictionary will be injected in other calls as
        # kwargs, an added bool kw argument by default named _injected
        # should be added to the function kwargs, to be able to be notified
        # that the kwargs are injected from already stored result
        return dict(, repo=cls.repo}

    # in case we do not want the injected key word in kwargs
    # simply , declare injected_kw=None
    @shared(inject=True, injected_kw=None)
    def shared_class_method(cls, org=None, repo=None):
         if org is not None:
   = org
            # create the org
   = make_org()
            # upload manifest
         if repo_id is not None:
            cls.repo = repo
            cls.repo = make_repository()

        # create a virtual machine

        return dict(, repo=cls.repo}

Module Contents



Internal class helper that is created each time the shared function is





force and override settings, by setting the global use shared data


Set the default namespace scope


Return the shared function default scope


Return the storage handler instance


Create an md5 hexdigest from kwargs

_get_scope_name(scope=None, scope_kwargs=None, scope_context=None)

_get_function_name(function, class_name=None, kwargs=None)

Return a string representation of the function as

_get_function_name_key(function_name, scope=None, scope_kwargs=None, scope_context=None)

shared(function_=None, scope=_get_default_scope, scope_context=None, scope_kwargs=None, timeout=SHARE_DEFAULT_TIMEOUT, retries=DEFAULT_CALL_RETRIES, function_kw=None, inject=False, injected_kw='_injected')

Generic function sharing, share the results of any decorated function.
















robottelo.decorators.func_shared.shared.DEFAULT_STORAGE_HANDLER = file
robottelo.decorators.func_shared.shared.ENABLED = False
robottelo.decorators.func_shared.shared.SHARE_DEFAULT_TIMEOUT = 86400
robottelo.decorators.func_shared.shared.DEFAULT_CALL_RETRIES = 2
robottelo.decorators.func_shared.shared._configured = False
robottelo.decorators.func_shared.shared._NAMESPACE_SCOPE_KEY_TYPE = shared_function
robottelo.decorators.func_shared.shared._DEFAULT_CLASS_NAME_DEPTH = 3
robottelo.decorators.func_shared.shared._STATE_READY = READY
robottelo.decorators.func_shared.shared._STATE_FAILED = FAILED
robottelo.decorators.func_shared.shared._DATETIME_FORMAT = %Y-%m-%dT%H:%M:%S

force and override settings, by setting the global use shared data attribute


Set the default namespace scope :type value: str or callable


Return the shared function default scope


Return the storage handler instance

exception robottelo.decorators.func_shared.shared.SharedFunctionError

Bases: Exception

Shared function related exception

exception robottelo.decorators.func_shared.shared.SharedFunctionException

Bases: Exception

Shared function call exception when not able to restore the original exception

class robottelo.decorators.func_shared.shared._SharedFunction(function_key, function, args=None, kwargs=None, retries=DEFAULT_CALL_RETRIES, storage_handler=None, timeout=SHARE_DEFAULT_TIMEOUT, inject=False, injected_kw='_inject')

Internal class helper that is created each time the shared function is launched and group all the necessary functionality

property storage(self)
property key(self)
property transaction(self)
_encode_result_kwargs(self, kwargs)

look for some special kwargs and convert them

_has_result_expired(self, creation_datetime)

Create an md5 hexdigest from kwargs

robottelo.decorators.func_shared.shared._get_scope_name(scope=None, scope_kwargs=None, scope_context=None)
robottelo.decorators.func_shared.shared._get_function_name(function, class_name=None, kwargs=None)

Return a string representation of the function as module_path.Class_name.function_name

note: the class name is the first parent class

robottelo.decorators.func_shared.shared._get_function_name_key(function_name, scope=None, scope_kwargs=None, scope_context=None)
robottelo.decorators.func_shared.shared.shared(function_=None, scope=_get_default_scope, scope_context=None, scope_kwargs=None, timeout=SHARE_DEFAULT_TIMEOUT, retries=DEFAULT_CALL_RETRIES, function_kw=None, inject=False, injected_kw='_injected')

Generic function sharing, share the results of any decorated function. Any parallel pytest xdist worker will wait for this function to finish

  • function (callable) – the function that is intended to be shared

  • scope (str or callable) – this parameter will define the namespace of data sharing

  • scope_context (str) – an added context string if applicable, of a concrete sharing in combination with scope and function.

  • scope_kwargs (dict) – kwargs to be passed to scope if is a callable

  • timeout (int) – the time in seconds to wait for waiting the shared function

  • retries (int) – if the shared function call fail, how much time should retry before setting the call with in failure state

  • function_kw (list) – The function kwargs to use as an additional scope, an md5 hexdigest of that kwargs will be created and added to the storage scope, that way we should have diffrent stored values for diffrent kw values.

  • inject (bool) – whether to recall the function with injecting the result as **kwargs

  • injected_kw (str) – the kw arg to set to True to inform the function that the kwargs was injected from a saved storage