add get and patch operations

This commit is contained in:
Tobias Brunner 2025-01-31 16:35:33 +01:00
parent 7c7f315e52
commit a4850683c9
No known key found for this signature in database
3 changed files with 72 additions and 2 deletions

View file

@ -127,3 +127,20 @@ class ServiceOfferingSerializer(serializers.ModelSerializer):
class CatalogSerializer(serializers.Serializer): class CatalogSerializer(serializers.Serializer):
services = ServiceOfferingSerializer(many=True) services = ServiceOfferingSerializer(many=True)
class ServiceInstanceUpdateSerializer(serializers.Serializer):
plan_id = serializers.CharField()
def validate_plan_id(self, value):
try:
plan = Plan.objects.get(pk=value)
# Get instance from context
instance = self.context.get("instance")
if str(plan.offering.id) != str(instance.offering.id):
raise serializers.ValidationError(
"Plan does not belong to the current offering"
)
return plan
except Plan.DoesNotExist:
raise serializers.ValidationError("Invalid plan_id")

View file

@ -9,9 +9,13 @@ class ServiceBrokerRouter(DefaultRouter):
def get_method_map(self, viewset, method_map): def get_method_map(self, viewset, method_map):
result = super().get_method_map(viewset, method_map) result = super().get_method_map(viewset, method_map)
# Add PUT method for provision_instance # Add methods for service instance operations
if hasattr(viewset, "provision_instance"): if hasattr(viewset, "provision_instance"):
result.update({"put": "provision_instance"}) result.update({"put": "provision_instance"})
if hasattr(viewset, "get_instance"):
result.update({"get": "get_instance"})
if hasattr(viewset, "update_instance"):
result.update({"patch": "update_instance"})
return result return result

View file

@ -8,7 +8,11 @@ from django.shortcuts import get_object_or_404
from hub.services.models import Lead from hub.services.models import Lead
from hub.services.odoo import OdooAPI from hub.services.odoo import OdooAPI
from .models import ServiceInstance, ServiceBrokerUser from .models import ServiceInstance, ServiceBrokerUser
from .serializers import ServiceInstanceProvisioningSerializer, CatalogSerializer from .serializers import (
ServiceInstanceProvisioningSerializer,
CatalogSerializer,
ServiceInstanceUpdateSerializer,
)
from .authentication import ServiceBrokerAuthentication from .authentication import ServiceBrokerAuthentication
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -137,3 +141,48 @@ class ServiceBrokerViewSet(viewsets.ViewSet):
instance = get_object_or_404(ServiceInstance, instance_id=instance_id) instance = get_object_or_404(ServiceInstance, instance_id=instance_id)
instance.delete() instance.delete()
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
@action(
detail=False,
methods=["get"],
url_path="service_instances/(?P<instance_id>[^/.]+)",
)
def get_instance(self, request, instance_id):
instance = get_object_or_404(ServiceInstance, instance_id=instance_id)
return Response(
{
"service_id": str(instance.offering.id),
"plan_id": str(instance.plan.id),
"dashboard_url": settings.WEBSITE_URL
+ reverse(
"services:offering_detail", kwargs={"slug": instance.offering.slug}
),
}
)
@action(
detail=False,
methods=["patch"],
url_path="service_instances/(?P<instance_id>[^/.]+)",
)
def update_instance(self, request, instance_id):
instance = get_object_or_404(ServiceInstance, instance_id=instance_id)
serializer = ServiceInstanceUpdateSerializer(
data=request.data, context={"instance": instance}
)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
instance.plan = serializer.validated_data["plan_id"]
instance.save()
return Response(
{
"operation": "update",
"dashboard_url": settings.WEBSITE_URL
+ reverse(
"services:offering_detail", kwargs={"slug": instance.offering.slug}
),
}
)