Resources

Interfaces

interface piped.resource.IResourceProvider

Extends: twisted.plugin.IPlugin

Providers of resources whose availability depend on the runtime environment.

The resources can go up and down arbitrarily, and can be depended on by resource consumers as well as other providers.

Instantiating a resource provider should not have any side-effects. Any failures when checking if the resources can indeed be provided must be handled gracefully, but should still be reported.

add_consumer(self, resource_dependency)

Register consumption of a resource, defined by resource_dependency, allegedly provided by this provider.

Parameters:resource_dependency – An instance of resource.ResourceDependency

The resource provider can use resource_dependency.provider to access the resource path that were requested. Extra configuration options may be piped in resource_dependency.configuration.

By allegedly, we mean that the provider cannot always know when the resource will be available or if it ever will, since this can depend on the external environment.

Given the func:configure example above, the following may be used to provide the requested resource.

def add_consumer(self, resource_dependency):
    some_key, key = resource_dependency.provider.split('.')
    some_configuration = self.runtime_environment.get_configuration_value(resource_dependency.provider)

    resource = .... # get or create a resource

    # Optionally use self.runtime_environment to request
    # dependencies needed to satisfy this one.

    resource_dependency.on_resource_ready(resource)

In non-trivial cases, the resource may become available at a later time, or may change availability states. It is up to the IResourceProvider to ensure that the correct resource.ResourceDependency.on_resource_ready() or resource.ResourceDependency.on_resource_lost() events are invoked.

configure(self, runtime_environment)

Configure the provider.

Parameters:runtime_environment – The current processing.RuntimeEnvironment.

The runtime environment contains instances of a resource manager and a dependency manager. The resource provider should then register any resources it can provide, as well as request its own dependencies.

def configure(self, runtime_environment):
    self.runtime_environment = runtime_environment # store this for later use

    # Register the things I can provide.
    for key in runtime_environment.get_configuration_value('some_key', dict()):
        runtime_environment.resource_manager.register('some_key.%s'%key, provider=self)

The above implementation registers self as a provider of every resource path generated by looking for ‘some_key’ in the service configuration.

plugin_manager

Set by the plugin manager that loaded the provider.

Classes

This module contains base implementations and managers for the resource system.

class piped.resource.ResourceManager

Bases: object

Manages instances of piped.resource.IResourceProvider by having a registry of who provides what.

Providers are identified by resource paths. A consumer of a resource can request e.g. a resource with the path ‘database.foo’ and specify that it wants a “connection”. Later on, a database provider can provide that. The “database.”-part of the path is just for namespacing.

>>> r = ResourceManager()
>>> provider = object()
>>> r.register('foo.bar', provider=provider)

Registered providers are later retrieved by using get_provider_or_fail()

>>> r.get_provider_or_fail('foo.bar') is provider
True

Registering providers

Providers are registered by calling ResourceManager.register():

ResourceManager.register(resource_path, provider)

Register that the resource identified by resource_path is provided by provider.

Getting provided resources

Note

This is automatically performed by all unresolved dependencies.ResourceDependency in resolve_initial_state() when resolve_initial_states() is called.

ResourceManager.resolve(resource_dependency)

Resolve resource_dependency.

The resource dependency is resolved by looking up its provider in the list of regitered providers and calling the registered piped.resource.IResourceProviders piped.resource.IResourceProvider.add_consumer() with resource_dependency.

Parameters:resource_dependency – An unresolved ResourceDependency.
Raises :exceptions.UnprovidedResourceError if the provider does not exist.

Table Of Contents

Previous topic

Dependencies

Next topic

Processing

This Page