tavrida package¶
Subpackages¶
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:
-
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.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)¶
-
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)¶
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)¶
-
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:
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: - 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.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:
-
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.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)¶
-
classmethod
-
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: - 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.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: - 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.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.