website/hub/servicebroker/views.py

99 lines
3.5 KiB
Python

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.conf import settings
from .authentication import ServiceBrokerAuthentication
from .serializers import (
CatalogSerializer,
ProvisionRequestSerializer,
ProvisionResponseSerializer,
BindingRequestSerializer,
BindingResponseSerializer,
)
from hub.services.models import Service
class ServiceBrokerView(APIView):
authentication_classes = [ServiceBrokerAuthentication]
def get_broker_version(self, request):
return request.META.get("HTTP_X_BROKER_API_VERSION", "2.14")
class CatalogView(ServiceBrokerView):
def get(self, request):
services = []
marketplace_services = Service.objects.all().prefetch_related(
"cloud_provider", "categories"
)
for service in marketplace_services:
plans = []
service_data = {
"id": f"service-{service.id}",
"name": service.name,
"description": service.description,
"bindable": True,
"plans": plans,
"metadata": {
"displayName": service.name,
"provider": service.cloud_provider.name,
"imageUrl": service.logo.url if service.logo else None,
"categories": [cat.name for cat in service.categories.all()],
},
"tags": [cat.name for cat in service.categories.all()],
}
services.append(service_data)
catalog = {"services": services}
serializer = CatalogSerializer(data=catalog)
serializer.is_valid(raise_exception=True)
return Response(serializer.data)
class ProvisioningView(ServiceBrokerView):
def put(self, request, instance_id):
serializer = ProvisionRequestSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
service_id = serializer.validated_data["service_id"]
marketplace_service_id = service_id.replace("service-", "")
service = Service.objects.get(id=marketplace_service_id)
response_data = {
"dashboard_url": f"{settings.BASE_URL}/service/{service.slug}/",
"operation": None,
}
response_serializer = ProvisionResponseSerializer(data=response_data)
response_serializer.is_valid(raise_exception=True)
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
def delete(self, request, instance_id):
return Response(status=status.HTTP_200_OK)
class BindingView(ServiceBrokerView):
def put(self, request, instance_id, binding_id):
serializer = BindingRequestSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
service_id = serializer.validated_data["service_id"]
marketplace_service_id = service_id.replace("service-", "")
service = Service.objects.get(id=marketplace_service_id)
credentials = {
"service_name": service.name,
"provider": service.cloud_provider.name,
"service_url": f"{settings.BASE_URL}/service/{service.slug}/",
}
response_data = {"credentials": credentials}
response_serializer = BindingResponseSerializer(data=response_data)
response_serializer.is_valid(raise_exception=True)
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
def delete(self, request, instance_id, binding_id):
return Response(status=status.HTTP_200_OK)