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 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)