From abc63150c2542bc521304f6d11814fd07d0c3fba Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Fri, 16 Nov 2018 20:56:34 +0100 Subject: [PATCH] cache health checks results (#26836) --- hobo/rest/models.py | 21 +++++++++++++++++++++ hobo/rest/serializers.py | 8 +++----- hobo/rest/views.py | 33 +++++++++------------------------ 3 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 hobo/rest/models.py diff --git a/hobo/rest/models.py b/hobo/rest/models.py new file mode 100644 index 0000000..5d4eaa7 --- /dev/null +++ b/hobo/rest/models.py @@ -0,0 +1,21 @@ +from django.core.cache import cache + + +class ServiceBaseStatus(object): + + def __init__(self, service): + self.service = service + self.base_url = service.base_url + self.is_resolvable = self.cache(service.is_resolvable, 120) + self.has_certificate = self.cache(service.has_valid_certificate, 3600) + self.is_running = self.cache(service.is_running, 60) + self.is_operational = self.cache(service.is_operational, 60) + self.slug = service.slug + + def cache(self, fn, sec): + idx = '%s_%s' % (self.service.__class__.__name__, fn.__name__) + val = cache.get(idx) + if not val: + val = fn() + cache.set(idx, val, sec) + return(val) diff --git a/hobo/rest/serializers.py b/hobo/rest/serializers.py index 06b11f7..30c3c09 100644 --- a/hobo/rest/serializers.py +++ b/hobo/rest/serializers.py @@ -17,11 +17,9 @@ from rest_framework import serializers -class HealthBaseSerializer(serializers.Serializer): - title = serializers.CharField() +class StatusSerializer(serializers.Serializer): slug = serializers.SlugField() - base_url = serializers.CharField() + has_certificate = serializers.BooleanField() + is_operational = serializers.BooleanField() is_resolvable = serializers.BooleanField() - has_valid_certificate = serializers.BooleanField() is_running = serializers.BooleanField() - is_operational = serializers.BooleanField() diff --git a/hobo/rest/views.py b/hobo/rest/views.py index 4cf716f..1f7521f 100644 --- a/hobo/rest/views.py +++ b/hobo/rest/views.py @@ -14,33 +14,18 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, see . -from rest_framework import generics -from rest_framework import permissions -from rest_framework.response import Response +from django.http import JsonResponse +from django.views.generic import View from hobo.environment.utils import get_installed_services -from hobo.rest.serializers import HealthBaseSerializer +from hobo.rest.serializers import StatusSerializer +from hobo.rest.models import ServiceBaseStatus -class HealthList(generics.ListAPIView): - serializer_class = HealthBaseSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - def get_queryset(self): - return [x for x in get_installed_services() if not x.secondary] - - def list(self, request, *args, **kwargs): - """ - Custom dictionnary object - """ - self.object_list = self.filter_queryset(self.get_queryset()) - - # Switch between paginated or standard style responses - page = self.paginate_queryset(self.object_list) - if page is not None: - serializer = self.get_pagination_serializer(page) - else: - serializer = self.get_serializer(self.object_list, many=True) +class HealthList(View): + def get(self, request, *args, **kwargs): + qs = [ServiceBaseStatus(x) for x in get_installed_services() if not x.secondary] + serializer = StatusSerializer(qs, many=True) response = {d['slug']: d for d in serializer.data} - return Response(response) + return JsonResponse(response) -- 2.19.1