
We are not responsible for marconi.openstack.common code so it will be excluded from our Coverage report. Also excluding NotImplementedErrors as there's obviously no implementation in that case to be tested. Change-Id: Ie1e2cf4b858afef56ffed7ee225a0f8c29dcaef8
298 lines
7.9 KiB
Python
298 lines
7.9 KiB
Python
# Copyright (c) 2013 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Implements the DriverBase abstract class for Marconi storage drivers."""
|
|
|
|
import abc
|
|
|
|
# Seconds
|
|
MIN_TTL = 60
|
|
|
|
# Seconds (14 days)
|
|
MAX_TTL = 1209600
|
|
|
|
|
|
class DriverBase:
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
@abc.abstractproperty
|
|
def queue_controller(self):
|
|
"""
|
|
Returns storage's queues controller
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractproperty
|
|
def message_controller(self):
|
|
"""
|
|
Returns storage's messages controller
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractproperty
|
|
def claim_controller(self):
|
|
"""
|
|
Returns storage's claims controller
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
|
|
class ControllerBase(object):
|
|
"""
|
|
Top level class for controllers.
|
|
|
|
:param driver: Instance of the driver
|
|
instantiating this controller.
|
|
"""
|
|
|
|
def __init__(self, driver):
|
|
self.driver = driver
|
|
|
|
|
|
class QueueBase(ControllerBase):
|
|
"""
|
|
This class is responsible of managing
|
|
queues which means handling their CRUD
|
|
operations, monitoring and interactions.
|
|
|
|
Storages' implementations of this class
|
|
should be capable of handling high work
|
|
loads and huge number of queues.
|
|
"""
|
|
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
@abc.abstractmethod
|
|
def list(self, tenant=None):
|
|
"""
|
|
Base method for listing queues.
|
|
|
|
:param tenant: Tenant id
|
|
|
|
:returns: List of queues
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def get(self, name, tenant=None):
|
|
"""
|
|
Base method for queue retrieval.
|
|
|
|
:param name: The queue name
|
|
:param tenant: Tenant id
|
|
|
|
:returns: Dictionary containing queue metadata
|
|
:raises: DoesNotExist
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def upsert(self, name, metadata, tenant=None):
|
|
"""
|
|
This methods handles both creates and updates
|
|
operations for queues.
|
|
|
|
:param name: The queue name
|
|
:param metadata: Arbitrary metadata
|
|
:param tenant: Tenant id
|
|
:returns: True if a queue was created and False
|
|
if it was updated.
|
|
"""
|
|
msg = _("Metadata should be an instance of dict")
|
|
assert isinstance(metadata, dict), msg
|
|
|
|
@abc.abstractmethod
|
|
def delete(self, name, tenant=None):
|
|
"""
|
|
Base method for queue deletion.
|
|
|
|
:param name: The queue name
|
|
:param tenant: Tenant id
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def stats(self, name, tenant=None):
|
|
"""
|
|
Base method for queue stats.
|
|
|
|
:param name: The queue name
|
|
:param tenant: Tenant id
|
|
:returns: Dictionary with the
|
|
queue stats
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def actions(self, name, tenant=None, marker=None, limit=10):
|
|
"""
|
|
Base method for queue actions.
|
|
|
|
:param name: Queue name
|
|
:param tenant: Tenant id
|
|
:param marker: Tail identifier
|
|
:param limit: (Default 10) Max number
|
|
of messages to retrieve.
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
|
|
class MessageBase(ControllerBase):
|
|
"""
|
|
This class is responsible for managing
|
|
messages CRUD.
|
|
"""
|
|
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
@abc.abstractmethod
|
|
def get(self, queue, tenant=None, message_id=None,
|
|
marker=None, echo=False, client_uuid=None):
|
|
"""
|
|
Base message get method
|
|
|
|
This method is responsible for querying messages
|
|
and should be capable of retrieving a single
|
|
message based on message_id or multiple messages
|
|
based on the other parameters being passed.
|
|
|
|
:param queue: Name of the queue to get the
|
|
message from.
|
|
:param tenant: Tenant id
|
|
:param message: Message ID
|
|
:param marker: Tail identifier
|
|
:param echo: (Default False) Boolean expressing whether
|
|
or not this client should receive its own messages.
|
|
:param client_uuid: Client's unique identifier. This param
|
|
is required when echo=False.
|
|
|
|
:returns: List of messages
|
|
:raises: DoesNotExist
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def post(self, queue, messages, tenant=None):
|
|
"""
|
|
Base message post method
|
|
|
|
Implementations of this method should guarantee
|
|
and preserve the order, in the returned list, of
|
|
incoming messages.
|
|
|
|
:param queue: Name of the queue to post message to.
|
|
:param messages: Messages to post to queue,
|
|
it can be a list of 1 or more elements.
|
|
:param tenant: Tenant id
|
|
|
|
:returns: List of message ids
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def delete(self, queue, message_id, tenant=None, claim=None):
|
|
"""
|
|
Base message delete method
|
|
|
|
:param queue: Name of the queue to post
|
|
message to.
|
|
:param message_id: Message to be deleted
|
|
:param tenant: Tenant id
|
|
:param claim: Claim this message
|
|
belongs to. When specified, claim must
|
|
be valid and message_id must belong to
|
|
it.
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
|
|
class ClaimBase(ControllerBase):
|
|
|
|
__metaclass__ = abc.ABCMeta
|
|
|
|
@abc.abstractmethod
|
|
def get(self, queue, claim_id, tenant=None):
|
|
"""
|
|
Base claim get method
|
|
|
|
:param queue: Name of the queue this
|
|
claim belongs to.
|
|
:param claim_id: The claim id
|
|
:param tenant: Tenant id
|
|
|
|
:returns: Dictionary containing claim's
|
|
metadata and claimed messages.
|
|
:raises: DoesNotExist
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def create(self, queue, tenant=None, ttl=MIN_TTL, limit=10):
|
|
"""
|
|
Base claim create method
|
|
|
|
:param queue: Name of the queue this
|
|
claim belongs to.
|
|
:param tenant: Tenant id
|
|
:param ttl: Number of seconds the server
|
|
will keep this claim in this queue.
|
|
:param limit: (Default 10) Max number
|
|
of messages to claim.
|
|
|
|
:returns: Dictionary containing claim's
|
|
metadata and claimed messages.
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def update(self, queue, claim_id, tenant=None, **metadata):
|
|
"""
|
|
Base claim update method
|
|
|
|
:param queue: Name of the queue this
|
|
claim belongs to.
|
|
:param claim_id: Claim to be updated
|
|
:param tenant: Tenant id
|
|
:param metadata: Claim's parameters
|
|
to be updated.
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def delete(self, queue, claim_id, tenant=None):
|
|
"""
|
|
Base claim delete method
|
|
|
|
:param queue: Name of the queue this
|
|
claim belongs to.
|
|
:param claim_id: Claim to be deleted
|
|
:param tenant: Tenant id
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
@abc.abstractmethod
|
|
def stats(self, queue, claim_id, tenant=None):
|
|
"""
|
|
Base method for claim stats.
|
|
|
|
:param queue: Name of the queue this
|
|
claim belongs to.
|
|
:param claim_id: Claim to be deleted
|
|
:param tenant: Tenant id
|
|
:returns: Dictionary with the
|
|
queue stats
|
|
"""
|
|
raise NotImplementedError
|