2015-07-11 02:06:57 +02:00
|
|
|
"""
|
|
|
|
.. module: lemur.destinations.service
|
|
|
|
:platform: Unix
|
2018-05-29 19:18:16 +02:00
|
|
|
:copyright: (c) 2018 by Netflix Inc., see AUTHORS for more
|
2015-07-11 02:06:57 +02:00
|
|
|
:license: Apache, see LICENSE for more details.
|
|
|
|
.. moduleauthor:: Kevin Glisson <kglisson@netflix.com>
|
|
|
|
"""
|
2015-08-02 18:14:27 +02:00
|
|
|
from sqlalchemy import func
|
2019-02-05 00:36:39 +01:00
|
|
|
from flask import current_app
|
2015-08-02 18:14:27 +02:00
|
|
|
|
2015-07-11 02:06:57 +02:00
|
|
|
from lemur import database
|
2015-10-06 18:43:31 +02:00
|
|
|
from lemur.models import certificate_destination_associations
|
2015-07-11 02:06:57 +02:00
|
|
|
from lemur.destinations.models import Destination
|
|
|
|
from lemur.certificates.models import Certificate
|
2019-04-12 01:39:47 +02:00
|
|
|
from lemur.sources.service import add_aws_destination_to_sources
|
2015-07-11 02:06:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
def create(label, plugin_name, options, description=None):
|
|
|
|
"""
|
|
|
|
Creates a new destination, that can then be used as a destination for certificates.
|
|
|
|
|
|
|
|
:param label: Destination common name
|
|
|
|
:param description:
|
|
|
|
:rtype : Destination
|
|
|
|
:return: New destination
|
|
|
|
"""
|
2017-06-26 21:03:24 +02:00
|
|
|
# remove any sub-plugin objects before try to save the json options
|
|
|
|
for option in options:
|
|
|
|
if 'plugin' in option['type']:
|
|
|
|
del option['value']['plugin_object']
|
|
|
|
|
2015-07-11 02:06:57 +02:00
|
|
|
destination = Destination(label=label, options=options, plugin_name=plugin_name, description=description)
|
2019-02-05 00:36:39 +01:00
|
|
|
current_app.logger.info("Destination: %s created", label)
|
|
|
|
|
|
|
|
# add the destination as source, to avoid new destinations that are not in source, as long as an AWS destination
|
2019-04-12 01:39:47 +02:00
|
|
|
if add_aws_destination_to_sources(destination):
|
2019-02-05 00:36:39 +01:00
|
|
|
current_app.logger.info("Source: %s created", label)
|
|
|
|
|
2015-07-11 02:06:57 +02:00
|
|
|
return database.create(destination)
|
|
|
|
|
|
|
|
|
|
|
|
def update(destination_id, label, options, description):
|
|
|
|
"""
|
|
|
|
Updates an existing destination.
|
|
|
|
|
|
|
|
:param destination_id: Lemur assigned ID
|
|
|
|
:param label: Destination common name
|
2015-08-02 18:14:27 +02:00
|
|
|
:param description:
|
2015-07-11 02:06:57 +02:00
|
|
|
:rtype : Destination
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
destination = get(destination_id)
|
|
|
|
|
|
|
|
destination.label = label
|
2015-07-22 19:51:55 +02:00
|
|
|
destination.options = options
|
2015-07-11 02:06:57 +02:00
|
|
|
destination.description = description
|
|
|
|
|
|
|
|
return database.update(destination)
|
|
|
|
|
|
|
|
|
|
|
|
def delete(destination_id):
|
|
|
|
"""
|
|
|
|
Deletes an destination.
|
|
|
|
|
|
|
|
:param destination_id: Lemur assigned ID
|
|
|
|
"""
|
|
|
|
database.delete(get(destination_id))
|
|
|
|
|
|
|
|
|
|
|
|
def get(destination_id):
|
|
|
|
"""
|
2016-12-14 18:29:04 +01:00
|
|
|
Retrieves an destination by its lemur assigned ID.
|
2015-07-11 02:06:57 +02:00
|
|
|
|
|
|
|
:param destination_id: Lemur assigned ID
|
|
|
|
:rtype : Destination
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
return database.get(Destination, destination_id)
|
|
|
|
|
|
|
|
|
|
|
|
def get_by_label(label):
|
|
|
|
"""
|
2016-12-14 18:29:04 +01:00
|
|
|
Retrieves a destination by its label
|
2015-07-11 02:06:57 +02:00
|
|
|
|
|
|
|
:param label:
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
return database.get(Destination, label, field='label')
|
|
|
|
|
|
|
|
|
|
|
|
def get_all():
|
|
|
|
"""
|
|
|
|
Retrieves all destination currently known by Lemur.
|
|
|
|
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
query = database.session_query(Destination)
|
|
|
|
return database.find_all(query, Destination, {}).all()
|
|
|
|
|
|
|
|
|
|
|
|
def render(args):
|
|
|
|
filt = args.pop('filter')
|
|
|
|
certificate_id = args.pop('certificate_id', None)
|
|
|
|
|
|
|
|
if certificate_id:
|
|
|
|
query = database.session_query(Destination).join(Certificate, Destination.certificate)
|
|
|
|
query = query.filter(Certificate.id == certificate_id)
|
|
|
|
else:
|
|
|
|
query = database.session_query(Destination)
|
|
|
|
|
|
|
|
if filt:
|
|
|
|
terms = filt.split(';')
|
|
|
|
query = database.filter(query, Destination, terms)
|
|
|
|
|
2016-05-10 22:43:26 +02:00
|
|
|
return database.sort_and_page(query, Destination, args)
|
2015-08-02 18:14:27 +02:00
|
|
|
|
|
|
|
|
|
|
|
def stats(**kwargs):
|
|
|
|
"""
|
|
|
|
Helper that defines some useful statistics about destinations.
|
|
|
|
|
|
|
|
:param kwargs:
|
|
|
|
:return:
|
|
|
|
"""
|
2015-10-06 18:43:31 +02:00
|
|
|
items = database.db.session.query(Destination.label, func.count(certificate_destination_associations.c.certificate_id))\
|
|
|
|
.join(certificate_destination_associations)\
|
|
|
|
.group_by(Destination.label).all()
|
2015-08-02 18:14:27 +02:00
|
|
|
|
|
|
|
keys = []
|
|
|
|
values = []
|
|
|
|
for key, count in items:
|
|
|
|
keys.append(key)
|
|
|
|
values.append(count)
|
|
|
|
|
|
|
|
return {'labels': keys, 'values': values}
|