initial version of osb
This commit is contained in:
parent
7143234e22
commit
022f0ad60f
14 changed files with 281 additions and 22 deletions
113
hub/servicebroker/views.py
Normal file
113
hub/servicebroker/views.py
Normal 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)
|
Loading…
Add table
Add a link
Reference in a new issue