99 lines
3.5 KiB
Python
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)
|