Skip to content
Snippets Groups Projects
Commit 6b058eea authored by Anna Wilson's avatar Anna Wilson Committed by David Schmitz
Browse files

feature/split_celery: viewset for exabgp config fragment of current flows...

feature/split_celery: viewset for exabgp config fragment of current flows (taken from commit history baee85f2)
parent 6c4e5e47
Branches
No related tags found
No related merge requests found
"""Custom renderers for FoD api"""
from rest_framework import renderers
class PlainTextRenderer(renderers.BaseRenderer): # pylint: disable=too-few-public-methods
"""Return the data in plain text"""
media_type = 'text/plain'
format = 'txt'
def render(self, data, accepted_media_type=None, renderer_context=None):
return data
from django import template
from django.utils.safestring import mark_safe
from django.utils.html import conditional_escape
register = template.Library()
@register.filter
def exawrap(qset, field):
'''
Filter for flowspec config that returns:
emptystring if qset has no elements
Contents of the specified field if it has one element
A string of the form '[ a b ... z ]' if it has multiple elements
'''
if qset.count() == 0:
return ''
elif qset.count() == 1:
return getattr( qset.first(), field )
else:
return '[ ' + ' '.join([getattr(q, field) for q in qset.all()]) + ' ]'
@register.filter
def exabound(value):
'''
Filter for flowspec config that process a number of pair of numbers. Returns:
emptystring if value is empty
=value if it does not contain '-'
A string of the form '>=(left side)&<=(right side)' if it contains '-'
'''
if not value:
return ''
elif not '-' in value:
return '=' + value
else:
bound = value.split('-')
return mark_safe(f'>={conditional_escape(bound[0])}&<={conditional_escape(bound[1])}')
@register.filter
def exaratelim(value):
'''
Take input of the form "rate-limit:10000k"
and return "rate-limit 10000000"
'''
return str(value).replace(':', ' ').replace('k', '000')
......@@ -22,6 +22,8 @@ from flowspec.serializers import (
from flowspec.validators import check_if_rule_exists
from rest_framework.response import Response
from flowspec.renderers import PlainTextRenderer
from flowspec.tasks import *
import flowspec.logging_utils
......@@ -498,6 +500,25 @@ class StatsRoutesViewSet(viewsets.ViewSet):
logger.info("StatsRoutesViewSet:::retrieve(): route.name="+str(route.name))
return routestats(request, route.name)
class ExaBGPConfViewSet(viewsets.ViewSet):
"""
A simple Viewset for retrieving exabgp configs.
"""
renderer_classes = [PlainTextRenderer]
serializer_class = RouteSerializer
permission_classes = (IsAuthenticated,)
def list(self, request):
logger.info("ExaBGPConfViewSet:::retrieve()")
queryset = Route.objects.filter(status__exact='ACTIVE')
context = {
'routes': queryset
}
return Response( render_to_string(f'conf/exabgp.txt', context) )
class StatsAllRoutesViewSet(viewsets.ViewSet):
"""
A simple Vieset for retrieving statistics of all routes by
......
......@@ -15,6 +15,7 @@ from flowspec.viewsets import (
MatchProtocolViewSet,
MatchDscpViewSet,
StatsRoutesViewSet,
ExaBGPConfViewSet,
StatsAllRoutesViewSet,
StatsAllRoutesLastTSViewSet,
)
......@@ -30,6 +31,7 @@ router.register(r'fragmenttypes', FragmentTypeViewSet)
router.register(r'matchprotocol', MatchProtocolViewSet)
router.register(r'matchdscp', MatchDscpViewSet)
router.register(r'stats/routes', StatsRoutesViewSet, basename='statsroute')
router.register(r'conf/exabgp', ExaBGPConfViewSet, basename='exabgpconf')
urlpatterns = [
......
{% load router_config %}
flow {
{% for route in routes %}
{% if route.status == "ACTIVE" %}
route {
match {
{% if route.source %}source {{ route.source }};{% endif %}
{% if route.destination %}destination {{ route.destination }};{% endif %}
{% if route.sourceport %}source-port {{ route.sourceport | exabound }};{% endif %}
{% if route.destinationport %}destination-port {{ route.destinationport | exabound }};{% endif %}
{% if route.protocol.count > 0 %}protocol {{ route.protocol | exawrap:'protocol' }};{% endif %}
{% if route.fragmenttype.count > 0 %}fragment {{ route.fragmenttype | exawrap:'fragmenttype' }};{% endif %}
}
then {
{% for then in route.then.all %}{{ then | exaratelim }};
{% endfor %}
}
}
{% endif %}
{% endfor %}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment