initial version of osb

This commit is contained in:
Tobias Brunner 2025-01-27 17:42:40 +01:00
parent 7143234e22
commit 022f0ad60f
No known key found for this signature in database
14 changed files with 281 additions and 22 deletions

113
hub/servicebroker/views.py Normal file
View file

@ -0,0 +1,113 @@
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, ServiceLevel
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", "service_level", "categories"
)
for service in marketplace_services:
plans = []
service_levels = ServiceLevel.objects.all()
for level in service_levels:
plan = {
"id": f"plan-{service.id}-{level.id}",
"name": level.name,
"description": level.description,
"metadata": {
"costs": [{"amount": float(service.price), "unit": "MONTHLY"}],
"bullets": [level.description],
},
"free": False,
}
plans.append(plan)
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)