Source code for gordon_janitor.interfaces
# -*- coding: utf-8 -*-
#
# Copyright 2017 Spotify AB
#
# 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.
"""Interface definitions for Gordon Janitor Plugins.
Please see :doc:`plugins` for more information on writing a plugin for
the Gordon Janitor service.
"""
from zope.interface import Interface
[docs]class IGenericPlugin(Interface):
"""**Do not** implement this interface directly.
Use :py:class:`IAuthority`, :py:class:`IReconciler`, or
:py:class:`IPublisher` instead.
Args:
config (dict): Plugin-specific configuration.
plugin_kwargs (dict): Plugin-specific keyword arguments. See
specific interface declarations.
"""
def __init__(config, **plugin_kwargs):
"""Initialize a Janitor Plugin client."""
async def run():
"""Start plugin in the main event loop.
Once required work is all processed, :py:meth:`cleanup` needs to
be called.
"""
async def cleanup():
"""Cleanup once plugin-specific work is cleanup.
Cleanup work might include allowing outstanding asynchronous
Python tasks to finish, cancelling them if they extend beyond a
desired timeout, and/or closing HTTP sessions.
"""
[docs]class IAuthority(IGenericPlugin):
"""Scan source of truth(s) of hosts and emit messages to Reconciler.
The purpose of this client is to consult a source of truth, for
example, the list instances APIs in Google Compute Engine or AWS
EC2, or consulting one's own database of hosts. A message per DNS
zone with every instance record (per service owner's own
requirements) will then be put onto the ``rrset_channel`` queue for
a Reconciler to - you guessed it - reconcile.
Args:
config (dict): Authority-specific configuration.
rrset_channel (asyncio.Queue): queue to put record set messages
for later validation.
metrics (obj): Optional object to emit Authority-specific
metrics.
"""
def __init__(config, rrset_channel, metrics=None):
"""Initialize an Authority Plugin client."""
[docs]class IReconciler(IGenericPlugin):
"""Validate current records in DNS against desired Authority.
Clients that implement :py:class:`IReconciler` will create a change
message for the configured :py:class:`IPublisher` client plugin to
consume if there is a discrepancy between records in DNS and the
desired state.
Once validation is done, the :py:class:`IReconciler` client will
need to emit a ``None`` message to the :py:attr:`changes_channel`
queue, signalling to an :py:class:`IPublisher` client to publish the
message to a pub/sub to which `Gordon
<https://github.com/spotify/gordon>`_ subscribes.
Args:
config (dict): Reconciler-specific configuration.
rrset_channel (asyncio.Queue): queue from which to consume
record set messages to validate.
changes_channel (asyncio.Queue): queue to publish corrective
messages to be published.
metrics (obj): Optional object to emit Reconciler-specific
metrics.
"""
def __init__(config, rrset_channel, changes_channel, metrics=None):
"""Initialize a Reconciler Plugin client."""
[docs]class IPublisher(IGenericPlugin):
"""Publish change messages to the pub/sub Gordon consumes.
Clients that implement :py:class:`IPublisher` will consume from the
:py:attr:`changes_channel` queue and publish the message to the
configured pub/sub for which `Gordon
<https://github.com/spotify/gordon>`_ subscribes.
Args:
config (dict): Publisher-specific configuration.
changes_channel (asyncio.Queue): queue to consume the
corrective messages needing to be published.
metrics (obj): Optional object to emit Publisher-specific
metrics.
"""
def __init__(config, changes_channel, metrics=None):
"""Initialize a Publisher Plugin client."""