Add service supervisor
This patch set adds supervisor mechanism for Watcher services to get ability to track states. Partially-Implements: blueprint watcher-service-list Change-Id: Iab1cefb971c79ed27b22b6a5d1bed8698e35f9a4
This commit is contained in:
@@ -715,3 +715,89 @@ class BaseConnection(object):
|
||||
:raises: :py:class:`~.ScoringEngineNotFound`
|
||||
:raises: :py:class:`~.Invalid`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_service_list(self, context, filters=None, limit=None,
|
||||
marker=None, sort_key=None, sort_dir=None):
|
||||
"""Get specific columns for matching services.
|
||||
|
||||
Return a list of the specified columns for all services that
|
||||
match the specified filters.
|
||||
|
||||
:param context: The security context
|
||||
:param filters: Filters to apply. Defaults to None.
|
||||
|
||||
:param limit: Maximum number of services to return.
|
||||
:param marker: The last item of the previous page; we return the next
|
||||
result set.
|
||||
:param sort_key: Attribute by which results should be sorted.
|
||||
:param sort_dir: Direction in which results should be sorted.
|
||||
(asc, desc)
|
||||
:returns: A list of tuples of the specified columns.
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def create_service(self, values):
|
||||
"""Create a new service.
|
||||
|
||||
:param values: A dict containing items used to identify
|
||||
and track the service. For example:
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
'id': 1,
|
||||
'name': 'watcher-api',
|
||||
'status': 'ACTIVE',
|
||||
'host': 'controller'
|
||||
}
|
||||
:returns: A service
|
||||
:raises: :py:class:`~.ServiceAlreadyExists`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_service_by_id(self, context, service_id):
|
||||
"""Return a service given its ID.
|
||||
|
||||
:param context: The security context
|
||||
:param service_id: The ID of a service
|
||||
:returns: A service
|
||||
:raises: :py:class:`~.ServiceNotFound`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_service_by_name(self, context, service_name):
|
||||
"""Return a service given its name.
|
||||
|
||||
:param context: The security context
|
||||
:param service_name: The name of a service
|
||||
:returns: A service
|
||||
:raises: :py:class:`~.ServiceNotFound`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def destroy_service(self, service_id):
|
||||
"""Destroy a service.
|
||||
|
||||
:param service_id: The ID of a service
|
||||
:raises: :py:class:`~.ServiceNotFound`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def update_service(self, service_id, values):
|
||||
"""Update properties of a service.
|
||||
|
||||
:param service_id: The ID of a service
|
||||
:returns: A service
|
||||
:raises: :py:class:`~.ServiceyNotFound`
|
||||
:raises: :py:class:`~.Invalid`
|
||||
"""
|
||||
|
||||
@abc.abstractmethod
|
||||
def soft_delete_service(self, service_id):
|
||||
"""Soft delete a service.
|
||||
|
||||
:param service_id: The id of a service.
|
||||
:returns: A service.
|
||||
:raises: :py:class:`~.ServiceNotFound`
|
||||
"""
|
||||
|
||||
@@ -1065,3 +1065,65 @@ class Connection(api.BaseConnection):
|
||||
except exception.ResourceNotFound:
|
||||
raise exception.ScoringEngineNotFound(
|
||||
scoring_engine=scoring_engine_id)
|
||||
|
||||
# ### SERVICES ### #
|
||||
|
||||
def _add_services_filters(self, query, filters):
|
||||
if not filters:
|
||||
filters = {}
|
||||
|
||||
plain_fields = ['id', 'name', 'host']
|
||||
|
||||
return self._add_filters(
|
||||
query=query, model=models.Service, filters=filters,
|
||||
plain_fields=plain_fields)
|
||||
|
||||
def get_service_list(self, context, filters=None, limit=None,
|
||||
marker=None, sort_key=None, sort_dir=None):
|
||||
query = model_query(models.Service)
|
||||
query = self._add_services_filters(query, filters)
|
||||
if not context.show_deleted:
|
||||
query = query.filter_by(deleted_at=None)
|
||||
return _paginate_query(models.Service, limit, marker,
|
||||
sort_key, sort_dir, query)
|
||||
|
||||
def create_service(self, values):
|
||||
service = models.Service()
|
||||
service.update(values)
|
||||
try:
|
||||
service.save()
|
||||
except db_exc.DBDuplicateEntry:
|
||||
raise exception.ServiceAlreadyExists(name=values['name'],
|
||||
host=values['host'])
|
||||
return service
|
||||
|
||||
def _get_service(self, context, fieldname, value):
|
||||
try:
|
||||
return self._get(context, model=models.Service,
|
||||
fieldname=fieldname, value=value)
|
||||
except exception.ResourceNotFound:
|
||||
raise exception.ServiceNotFound(service=value)
|
||||
|
||||
def get_service_by_id(self, context, service_id):
|
||||
return self._get_service(context, fieldname="id", value=service_id)
|
||||
|
||||
def get_service_by_name(self, context, service_name):
|
||||
return self._get_service(context, fieldname="name", value=service_name)
|
||||
|
||||
def destroy_service(self, service_id):
|
||||
try:
|
||||
return self._destroy(models.Service, service_id)
|
||||
except exception.ResourceNotFound:
|
||||
raise exception.ServiceNotFound(service=service_id)
|
||||
|
||||
def update_service(self, service_id, values):
|
||||
try:
|
||||
return self._update(models.Service, service_id, values)
|
||||
except exception.ResourceNotFound:
|
||||
raise exception.ServiceNotFound(service=service_id)
|
||||
|
||||
def soft_delete_service(self, service_id):
|
||||
try:
|
||||
self._soft_delete(models.Service, service_id)
|
||||
except exception.ResourceNotFound:
|
||||
raise exception.ServiceNotFound(service=service_id)
|
||||
|
||||
@@ -255,3 +255,18 @@ class ScoringEngine(Base):
|
||||
# The format might vary between different models (e.g. be JSON, XML or
|
||||
# even some custom format), the blob type should cover all scenarios.
|
||||
metainfo = Column(Text, nullable=True)
|
||||
|
||||
|
||||
class Service(Base):
|
||||
"""Represents a service entity"""
|
||||
|
||||
__tablename__ = 'services'
|
||||
__table_args__ = (
|
||||
UniqueConstraint('host', 'name', 'deleted',
|
||||
name="uniq_services0host0name0deleted"),
|
||||
table_args()
|
||||
)
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(255), nullable=False)
|
||||
host = Column(String(255), nullable=False)
|
||||
last_seen_up = Column(DateTime, nullable=True)
|
||||
|
||||
Reference in New Issue
Block a user