tavrida package

Submodules

tavrida.client module

class tavrida.client.RPCClient(config, discovery, source='', context=None, headers=None)

Bases: object

Client to make RPC calls to remove service. Calls are executed via service proxies.

>>> from tavrida import config
>>> credentials = config.Credentials("username", "password")
>>> config = config.ConnectionConfig("localhost", credentials)
>>> disc = discovery.LocalDiscovery()
>>> disc.register_remote_service("service_name", "service_exchange")
>>> headers = {"header": "value"}
>>> cli = RPCClient(config, disc, source="some_client", headers=headers)
>>> cli.some_method(some_parameter="1234").cast()

tavrida.config module

class tavrida.config.ConnectionConfig(host, credentials, port=5672, virtual_host='/', channel_max=None, frame_max=None, heartbeat_interval=None, ssl=None, ssl_options=None, connection_attempts=3, retry_delay=1.0, socket_timeout=3.0, locale=None, backpressure_detection=None, reconnect_attempts=-1, async_engine=False)

Bases: object

Config to connect to RabbitMQ. Most of the parameters are passed to pika client as is.

to_dict()

Returns dictionary of parameters :return: dict of params :rtype: dict

to_pika_params()

Returns pika connection parameters :return: pika connection paraneters :rtype: pika.ConnectionParameters

class tavrida.config.Credentials(username, password)

Bases: object

Credentials (username, password) to connect to RabbitMQ.

tavrida.controller module

class tavrida.controller.AbstractController

Bases: object

Abstract controller should be used to implement arbitrary controllers in the chain of actions on some object

process(*args, **kwargs)
class tavrida.controller.AbstractMessageController

Bases: tavrida.controller.AbstractController

Abstract controller should be used to implement arbitrary controllers in the chain of actions on message

process(message)
Parameters:message – Message of arbitrary type
Returns:Any result, mainly message

tavrida.discovery module

class tavrida.discovery.AbstractDiscovery

Bases: object

Abstract discovery service Discovery service should be able to discover remote services (map service name to exchange name), remote publishers (map publisher service name to exchange name) and local publishers (map local publisher service name to exchange name)

get_all_exchanges()

Gets all exchanges

Returns:dictionary of {‘remote’: .., ‘remote_publisher’: .. ‘local_publisher’: ..}
Return type:dictionary
get_local_publisher(service_name)

Gets local publisher service

Parameters:service_name (string) – local service name
Returns:exchange name
Return type:string
get_remote(service_name)

Gets remote service

Parameters:service_name (string) – remote service name
Returns:exchange name
Return type:string
get_remote_publisher(service_name)

Gets remote publisher service

Parameters:service_name (string) – remote service name
Returns:exchange name
Return type:string
register_local_publisher(service_name, exchange_name)

Registers remote publisher service

Parameters:
  • service_name (string) – remote publisher service name
  • exchange_name (string) – remote service publication exchange
register_remote_publisher(service_name, exchange_name)

Registers local publisher service

Parameters:
  • service_name (string) – local publisher service name
  • exchange_name (string) – local service publication exchange
register_remote_service(service_name, exchange_name)

Registers remote service

Parameters:
  • service_name (string) – remote service name
  • exchange_name (string) – remote service RPC exchange
class tavrida.discovery.DiscoveryFactory(path=None)

Bases: object

Discovery factory creates discovery service instances depending on the path/url to the discovery service

get_discovery_service(service_name=None, subscriptions=None)

Returns appropriate discovery service instance

Parameters:
  • service_name (string) – local service name
  • subscriptions (list of strings) – list of services’ names to subscribe to
Returns:

appropriate discovery service instance

Return type:

AbstractDiscovery

get_file_ds(service_name, subscriptions)

Returns file based discovery instance

Parameters:
  • service_name (string) – local service name
  • subscriptions (list of strings) – list of services’ names to subscribe to
Returns:

file based discovery instance

Return type:

FileBasedDiscoveryService

get_local_ds()

Returns local discovery instance

Returns:local discovery instance
Return type:LocalDiscovery
class tavrida.discovery.FileBasedDiscoveryService(ds_filename, service_name, subscriptions=None)

Bases: tavrida.discovery.LocalDiscovery

Discovery service gets own configuration from DSFile

How to use:

disc = discovery.FileBasedDiscoveryService(
“ds.ini”, “service2”, subsriptions=[“service1”])
ds.ini:

[service1] exchange=service1_exchange notifications=service1_notifications

[service2] exchange=service2_exchange

service_exchange
service_name
class tavrida.discovery.LocalDiscovery

Bases: tavrida.discovery.AbstractDiscovery

get_all_exchanges()
get_local_publisher(service_name)
get_remote(service_name)
get_remote_publisher(service_name)
unregister_local_publisher(service_name)
unregister_remote_publisher(service_name)
unregister_remote_service(service_name)

tavrida.dispatcher module

class tavrida.dispatcher.Dispatcher

Bases: tavrida.controller.AbstractController

Dispatches incoming requests to the handler method in class. Dispatcher is the class property for each service controller. In that class ii find handler method to handle request.

get_handler(entry_point, message_type)

Return handler that defined for given entry_point and message_type

Parameters:
  • entry_point (EntryPoint) – some Entry point
  • message_type (string) – type of incoming message

:return:name of handler method :rtype: string

get_publishers()

Generates entry points for notifications

Returns:generator of EntryPoints
get_request_entry_services()

Generates entry points for requests

Returns:generator of EntryPoints
handlers
process(message, service_instance)

Finds method to handle request and call service’s ‘process’ method with method name, message and RPC proxy

Parameters:
  • message (message.Message) – incoming message
  • service_instance (services.ServiceController) – service
Returns:

service’s response

Return type:

messages.Message, dict, None

register(entry_point, message_type, handler_method_name)

Registers for given message type and entry_point a handler

Parameters:
  • entry_point (EntryPoint) – some Entry point
  • message_type (string) – type of incoming message
  • handler_method_name (string) – name of handler method
subscriptions
tavrida.dispatcher.rpc_error_method(service, method)

Decorator that registers method as PRC error handler in service controller

Parameters:method (string) – Name of entry point method to handle (remote method)
Returns:decorator
Return type:function
tavrida.dispatcher.rpc_method(service, method)

Decorator that registers method as PRC handler in service controller

Parameters:method (string) – Name of entry point method to handle
Returns:decorator
Return type:function
tavrida.dispatcher.rpc_response_method(service, method)

Decorator that registers method as PRC response handler in service controller

Parameters:method (string) – Name of entry point method to handle (remote method)
Returns:decorator
Return type:function
tavrida.dispatcher.rpc_service(service_name)

Decorator that registers service in dispatcher, router and subscription (the last - for notifications only)

Parameters:service_name (string) – name of service
Returns:service class wrapper
Return type:function
tavrida.dispatcher.subscription_method(service, method)

Decorator that registers method as subscription handler in service controller

Parameters:
  • service (string) – Name of remote service to subscribe
  • method (string) – Name of event (remote method name)
Returns:

decorator

Return type:

function

tavrida.entry_point module

class tavrida.entry_point.Destination(service_name, method_name)

Bases: tavrida.entry_point.EntryPoint

class tavrida.entry_point.EntryPoint(service_name, method_name)

Bases: object

Describes service entry point. Stores service_name and method_name

copy()
method
service
to_routing_key()
class tavrida.entry_point.EntryPointFactory

Bases: object

create(value, source=False, destination=False)
class tavrida.entry_point.NullEntryPoint

Bases: tavrida.entry_point.EntryPoint

to_routing_key()
class tavrida.entry_point.ServiceEntryPoint(service_name)

Bases: tavrida.entry_point.EntryPoint

copy()
class tavrida.entry_point.Source(service_name, method_name)

Bases: tavrida.entry_point.EntryPoint

tavrida.exceptions module

class tavrida.exceptions.AckableException

Bases: object

exception tavrida.exceptions.BaseAckableException(**kwargs)

Bases: tavrida.exceptions.BaseException, tavrida.exceptions.AckableException

exception tavrida.exceptions.BaseException(**kwargs)

Bases: exceptions.Exception

Base Tavrida exception

code
kwargs
message_template
exception tavrida.exceptions.BaseNackableException(**kwargs)

Bases: tavrida.exceptions.BaseException, tavrida.exceptions.NackableException

exception tavrida.exceptions.CantRegisterRemotePublisher(**kwargs)

Bases: tavrida.exceptions.BaseException

Raises from FileBasedDiscoveryService.

If service try to subscribe to unknown service

exception tavrida.exceptions.ConfigFileIsNotDefined(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.DuplicatedEntryPointRegistration(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.DuplicatedMethodRegistration(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.DuplicatedServiceRegistration(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.FieldMustExist(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.FieldMustFullyDefined(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.ForbiddenHeaders(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.HandlerNotFound(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.IncorrectAMQPConfig(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.IncorrectAMQPLibrary(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.IncorrectMessage(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.IncorrectOutgoingMessage(**kwargs)

Bases: tavrida.exceptions.BaseException

class tavrida.exceptions.NackableException

Bases: object

exception tavrida.exceptions.NeedToBeController(**kwargs)

Bases: tavrida.exceptions.BaseException

exception tavrida.exceptions.PublisherEndpointNotFound(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.ServiceIsNotRegister(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.ServiceNotFound(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.SubscriptionHandlerNotFound(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.UnableToDiscover(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.UnknownService(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.UnsuitableFieldValue(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.WrongEntryPointFormat(**kwargs)

Bases: tavrida.exceptions.BaseAckableException

exception tavrida.exceptions.WrongResponse(**kwargs)

Bases: tavrida.exceptions.BaseException

tavrida.messages module

class tavrida.messages.AMQPMessage(body, headers)

Bases: object

Container for raw AMQP message Stored raw body as string and headers as dict This class is used in AMQP drivers to send AMQP Message to preprocessor

MESSAGE_TYPE = ['request', 'response', 'notification', 'error']
REQUIRED_HEADERS = ['correlation_id', 'message_id', 'request_id', 'message_type', 'source', 'destination']
body_deserialize()

Deserializes raw JSON message to dict

Returns:deserialized body
Type:dict
classmethod create_from_message(message)

Create AMQP message from Message. Method is used in postprocessor

Parameters:message (message.Message) – Message (Response, Error, Notifications, etc)
Returns:AMQPMessage object
Type:AMQPMessage
validate()
class tavrida.messages.BaseError(headers, context, payload)

Bases: tavrida.messages.Message

Base error message

class tavrida.messages.BaseResponse(headers, context, payload)

Bases: tavrida.messages.Message

Base response object

class tavrida.messages.Error(headers, context, exception)

Bases: tavrida.messages.BaseError, tavrida.messages.Outgoing

Outgoing error message

classmethod create_by_request(request, exception)

Create error to request

Parameters:
Returns:

response object

Return type:

messages.Response

class tavrida.messages.Incoming

Bases: object

class tavrida.messages.IncomingError(headers, context, payload)

Bases: tavrida.messages.BaseError, tavrida.messages.Incoming

Incoming error message

class tavrida.messages.IncomingMessageFactory

Bases: object

Factory creates incoming messages by AMQP message

create(amqp_message)

Create corresponding message object by AMQP message

Parameters:amqp_message (messages.AMQPMessage) – AMQP message
Returns:message object
Return type:messages.Message
create_notification(headers, context, payload)

Creates incoming notification call object

Parameters:
  • headers (dict) – headers
  • context (dict) – headers
  • payload (dict) – message payload
Returns:

incoming notification object

Return type:

IncomingNotification

get_class(message_type, reply_to)

Return correct message class

Parameters:
Returns:

class of matching message type

Return type:

Message

class tavrida.messages.IncomingNotification(headers, context, payload)

Bases: tavrida.messages.Message, tavrida.messages.Incoming

Incoming notification message

class tavrida.messages.IncomingRequest(headers, context, payload)

Bases: tavrida.messages.Message, tavrida.messages.Incoming

Incoming request object

class tavrida.messages.IncomingRequestCall(headers, context, payload)

Bases: tavrida.messages.IncomingRequest

Incoming call request object

make_response(**payload)

Create response to request

Parameters:payload (dict) – params and values
Returns:response object
Return type:messages.Response
class tavrida.messages.IncomingRequestCast(headers, context, payload)

Bases: tavrida.messages.IncomingRequest

Incoming cast request object

class tavrida.messages.IncomingResponse(headers, context, payload)

Bases: tavrida.messages.BaseResponse, tavrida.messages.Incoming

Incoming response object

class tavrida.messages.Message(headers, context, payload)

Bases: object

Base message class. Parent class for all messages

body
body_serialize()

Serializes message to JSON

Returns:JSON representation
Return type:string
context
headers
payload
type
update_context(context)
class tavrida.messages.Notification(headers, context, payload)

Bases: tavrida.messages.Message, tavrida.messages.Outgoing

Outgoing notification message

class tavrida.messages.Outgoing

Bases: object

class tavrida.messages.Request(headers, context, payload)

Bases: tavrida.messages.Message, tavrida.messages.Outgoing

Outgoing request object

classmethod create_transfer(headers, context, **payload)
class tavrida.messages.Response(headers, context, payload)

Bases: tavrida.messages.BaseResponse, tavrida.messages.Outgoing

Outgoing response object

classmethod create_by_request(request, payload)

Create response to request

Parameters:
Returns:

response object

Return type:

messages.Response

tavrida.middleware module

class tavrida.middleware.Middleware

Bases: tavrida.controller.AbstractMessageController

Base middleware class. Any middleware should be inherited from this class. Middlewares could be added for processing message before and after the handler call.

process(message)

Processes message. This method should be redefined.

Parameters:message (messages.Message) – incoming/outgoing message
Returns:modified or new message
Return type:message.Message

tavrida.postprocessor module

class tavrida.postprocessor.PostProcessor(driver, discovery)

Bases: tavrida.controller.AbstractController

Processes outgoing messages. This class is responsible for message transfer to writer

discovery_service
driver
process(message_obj)

Processes outgoing message

Parameters:message_obj (messages.Message) – message
set_discovery(discovery)

tavrida.preprocessor module

class tavrida.preprocessor.PreProcessor(router, service_list)

Bases: tavrida.controller.AbstractController

Preprocesses incoming messages. This class is responsible for message transfer to processor

process(amqp_message)

PreProcesses incoming message

Parameters:amqp_message (messages.AMQPMEssage) – AMPQ message
Returns:response object ot None
Return type:Response, Error or None

tavrida.proxies module

class tavrida.proxies.RCPCallProxy(postprocessor, service_name, method_name, source, context, correlation_id, headers, kwargs)

Bases: object

Proxy class for method call

call(correlation_id='', context='', reply_to='', source='')

Executes

Parameters:
  • reply_to
  • source
Returns:

cast(correlation_id='', context='', source='')
transfer(request, context='', reply_to='', source='')
class tavrida.proxies.RPCMethodProxy(postprocessor, service_name, method_name, source, context='', correlation_id='', headers='')

Bases: object

class tavrida.proxies.RPCProxy(postprocessor, source, context=None, correlation_id='', headers=None)

Bases: object

add_headers(headers)
publish(correlation_id='', **kwargs)
class tavrida.proxies.RPCServiceProxy(postprocessor, name, source, context=None, correlation_id='', headers=None)

Bases: object

tavrida.router module

class tavrida.router.Router

Bases: tavrida.utils.Singleton, tavrida.controller.AbstractController

get_rpc_service_cls(message)

Returns list of classes that are registered as handlers for message

Parameters:message (message.Message) – incoming message
Returns:service class
Return type:service.ServiceController
Raises:DuplicatedServiceRegistration, ServiceNotFound
get_subscription_cls(message)

Returns list of classes that have subscriptions for message source

Parameters:message (message.Message) – incoming message
Returns:list of service classes
Return type:list
process(message, service_list)

Processes message for some service from service list to corresponding dispatcher

Parameters:
  • message (message.Message) – incoming message
  • service_list (list) – list of services.ServiceController objects
Returns:

messages.Message, dict, None

register(service_name, service_cls)

Registers Service class for given service name

Parameters:
  • service_name (string) – name if service
  • class (service) –
Returns:

reverse_lookup(service_cls)

Returns name of entry point service for which given class is registered

Parameters:service_cls – service handler class
Type:service.ServiceController
Returns:name of service
Return type:string
services

tavrida.server module

tavrida.service module

class tavrida.service.ServiceController(postprocessor)

Bases: tavrida.controller.AbstractController

Base service controller. All service controllers should be inherited from this class. This class is responsible for final message processing: calls incoming middlewares, calls handler method, after handling calls outgoing middlewares and finally sends result to postprocessor.

add_incoming_middleware(middleware)

Append middleware controller

Parameters:middleware (middleware.Middleware) – middleware object
add_outgoing_middleware(middleware)

Append middleware controller

Parameters:middleware (middleware.Middleware) – middleware object
classmethod get_discovery()
classmethod get_dispatcher()
process(method, message, proxy)

Processes message to corresponding handler. Before handler call message is transfered to all middlewares.

Parameters:
send_heartbeat()
classmethod set_discovery(discovery)

tavrida.steps module

class tavrida.steps.CreateAMQPMiddleware

Bases: tavrida.controller.AbstractController

Creates intermediate AMQP message

process(message)
class tavrida.steps.CreateMessageMiddleware

Bases: tavrida.controller.AbstractController

Creates message from raw RabbitMQ message

process(message_body)
class tavrida.steps.LogIncomingAMQPMessageMiddleware

Bases: tavrida.steps.LoggingMiddleware

Writes AMQP headers and body to log with level DEBUG.

Hides values of SENSITIVE_HEADERS.

Returns unmodified input message.

process(message)
class tavrida.steps.LogOutgoingAMQPMessageMiddleware

Bases: tavrida.steps.LoggingMiddleware

Writes AMQP headers and body to log with level DEBUG.

Hides values of SENSITIVE_HEADERS.

Returns unmodified input message.

process(message)
class tavrida.steps.LoggingMiddleware

Bases: tavrida.controller.AbstractController

Controller contains method to hide sensitive headers.

SENSITIVE_HEADERS = ('authorization', 'proxy-authorization')
class tavrida.steps.ValidateMessageMiddleware

Bases: tavrida.controller.AbstractController

Validates message headers

process(ampq_message)

tavrida.utils module

class tavrida.utils.Singleton

Bases: object

For example:

>>> class ConcreteSingleton(Singleton):
...     pass
tavrida.utils.get_fqcn(obj)

Get %(module_path)s.%(class_name)s of an object.

FQCN stands for Fully Qualified Class Name.

Module contents