tavrida package¶
Subpackages¶
Submodules¶
tavrida.client module¶
-
class
tavrida.client.RPCClient(config, discovery, source='', context=None, headers=None)¶ Bases:
objectClient 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:
objectConfig 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:
objectCredentials (username, password) to connect to RabbitMQ.
tavrida.controller module¶
-
class
tavrida.controller.AbstractController¶ Bases:
objectAbstract 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.AbstractControllerAbstract 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:
objectAbstract 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:
objectDiscovery 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:
-
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:
-
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.LocalDiscoveryDiscovery 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.AbstractControllerDispatches 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)¶
-
class
tavrida.entry_point.EntryPoint(service_name, method_name)¶ Bases:
objectDescribes 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)¶
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.ExceptionBase 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.BaseExceptionRaises from FileBasedDiscoveryService.
If service try to subscribe to unknown service
-
exception
tavrida.exceptions.ConfigFileIsNotDefined(**kwargs)¶
-
exception
tavrida.exceptions.DuplicatedEntryPointRegistration(**kwargs)¶
-
exception
tavrida.exceptions.DuplicatedMethodRegistration(**kwargs)¶
-
exception
tavrida.exceptions.DuplicatedServiceRegistration(**kwargs)¶
-
exception
tavrida.exceptions.FieldMustExist(**kwargs)¶
-
exception
tavrida.exceptions.FieldMustFullyDefined(**kwargs)¶
-
exception
tavrida.exceptions.ForbiddenHeaders(**kwargs)¶
-
exception
tavrida.exceptions.HandlerNotFound(**kwargs)¶
-
exception
tavrida.exceptions.IncorrectAMQPConfig(**kwargs)¶
-
exception
tavrida.exceptions.IncorrectAMQPLibrary(**kwargs)¶
-
exception
tavrida.exceptions.IncorrectMessage(**kwargs)¶
-
exception
tavrida.exceptions.IncorrectOutgoingMessage(**kwargs)¶
-
class
tavrida.exceptions.NackableException¶ Bases:
object
-
exception
tavrida.exceptions.NeedToBeController(**kwargs)¶
-
exception
tavrida.exceptions.PublisherEndpointNotFound(**kwargs)¶
-
exception
tavrida.exceptions.ServiceIsNotRegister(**kwargs)¶
-
exception
tavrida.exceptions.ServiceNotFound(**kwargs)¶
-
exception
tavrida.exceptions.SubscriptionHandlerNotFound(**kwargs)¶
-
exception
tavrida.exceptions.UnableToDiscover(**kwargs)¶
-
exception
tavrida.exceptions.UnknownService(**kwargs)¶
-
exception
tavrida.exceptions.UnsuitableFieldValue(**kwargs)¶
-
exception
tavrida.exceptions.WrongEntryPointFormat(**kwargs)¶
-
exception
tavrida.exceptions.WrongResponse(**kwargs)¶
tavrida.messages module¶
-
class
tavrida.messages.AMQPMessage(body, headers)¶ Bases:
objectContainer 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.MessageBase error message
-
class
tavrida.messages.BaseResponse(headers, context, payload)¶ Bases:
tavrida.messages.MessageBase response object
-
class
tavrida.messages.Error(headers, context, exception)¶ Bases:
tavrida.messages.BaseError,tavrida.messages.OutgoingOutgoing error message
-
classmethod
create_by_request(request, exception)¶ Create error to request
Parameters: - request (messages.IncomingRequest) – request
- exception (Exception) – exception to send
Returns: response object
Return type:
-
classmethod
-
class
tavrida.messages.Incoming¶ Bases:
object
-
class
tavrida.messages.IncomingError(headers, context, payload)¶ Bases:
tavrida.messages.BaseError,tavrida.messages.IncomingIncoming error message
-
class
tavrida.messages.IncomingMessageFactory¶ Bases:
objectFactory 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:
-
get_class(message_type, reply_to)¶ Return correct message class
Parameters: - message_type (string) – Message type
- reply_to (entry_point.EntryPoint) – entry point to reply
Returns: class of matching message type
Return type:
-
-
class
tavrida.messages.IncomingNotification(headers, context, payload)¶ Bases:
tavrida.messages.Message,tavrida.messages.IncomingIncoming notification message
-
class
tavrida.messages.IncomingRequest(headers, context, payload)¶ Bases:
tavrida.messages.Message,tavrida.messages.IncomingIncoming request object
-
class
tavrida.messages.IncomingRequestCall(headers, context, payload)¶ Bases:
tavrida.messages.IncomingRequestIncoming 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.IncomingRequestIncoming cast request object
-
class
tavrida.messages.IncomingResponse(headers, context, payload)¶ Bases:
tavrida.messages.BaseResponse,tavrida.messages.IncomingIncoming response object
-
class
tavrida.messages.Message(headers, context, payload)¶ Bases:
objectBase 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.OutgoingOutgoing notification message
-
class
tavrida.messages.Outgoing¶ Bases:
object
-
class
tavrida.messages.Request(headers, context, payload)¶ Bases:
tavrida.messages.Message,tavrida.messages.OutgoingOutgoing request object
-
classmethod
create_transfer(headers, context, **payload)¶
-
classmethod
-
class
tavrida.messages.Response(headers, context, payload)¶ Bases:
tavrida.messages.BaseResponse,tavrida.messages.OutgoingOutgoing response object
-
classmethod
create_by_request(request, payload)¶ Create response to request
Parameters: - request (messages.IncomingRequest) – request
- payload (dict) – params and values
Returns: response object
Return type:
-
classmethod
tavrida.middleware module¶
-
class
tavrida.middleware.Middleware¶ Bases:
tavrida.controller.AbstractMessageControllerBase 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.AbstractControllerProcesses 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.AbstractControllerPreprocesses 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:
objectProxy 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.AbstractControllerBase 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: - method (string) – handler method name
- message (messages.Message) – incoming message
- proxy (proxies.RPCProxy) – proxy to make calls to remote services
-
send_heartbeat()¶
-
classmethod
set_discovery(discovery)¶
-
tavrida.steps module¶
-
class
tavrida.steps.CreateAMQPMiddleware¶ Bases:
tavrida.controller.AbstractControllerCreates intermediate AMQP message
-
process(message)¶
-
-
class
tavrida.steps.CreateMessageMiddleware¶ Bases:
tavrida.controller.AbstractControllerCreates message from raw RabbitMQ message
-
process(message_body)¶
-
-
class
tavrida.steps.LogIncomingAMQPMessageMiddleware¶ Bases:
tavrida.steps.LoggingMiddlewareWrites 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.LoggingMiddlewareWrites 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.AbstractControllerController contains method to hide sensitive headers.
-
SENSITIVE_HEADERS= ('authorization', 'proxy-authorization')¶
-
-
class
tavrida.steps.ValidateMessageMiddleware¶ Bases:
tavrida.controller.AbstractControllerValidates message headers
-
process(ampq_message)¶
-
tavrida.utils module¶
-
class
tavrida.utils.Singleton¶ Bases:
objectFor 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.