from rest_framework import viewsets, permissions from rest_framework.response import Response from django.db import transaction from .models import MatrixServiceProduct from .serializers import MatrixServiceProductSerializer from uncloud_pay.helpers import ProductViewSet from uncloud_pay.models import Order from uncloud_vm.models import VMProduct, VMDiskProduct def create_managed_vm(cores, ram, disk_size, image, order): # Create VM disk = VMDiskProduct( owner=order.owner, order=order, size_in_gb=disk_size, image=image) vm = VMProduct( name="Managed Service Host", owner=order.owner, cores=cores, ram_in_gb=ram, primary_disk=disk) disk.vm = vm vm.save() disk.save() return vm class MatrixServiceProductViewSet(ProductViewSet): permission_classes = [permissions.IsAuthenticated] serializer_class = MatrixServiceProductSerializer def get_queryset(self): return MatrixServiceProduct.objects.filter(owner=self.request.user) @transaction.atomic def create(self, request): # Extract serializer data. serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) order_recurring_period = serializer.validated_data.pop("recurring_period") # Create base order.) order = Order.objects.create( recurring_period=order_recurring_period, owner=request.user) # Create unerderlying VM. data = serializer.validated_data.pop('vm') vm = create_managed_vm( order=order, cores=data['cores'], ram=data['ram_in_gb'], disk_size=data['primary_disk']['size_in_gb'], image=MatrixServiceProduct.base_image()) # Create service. service = serializer.save( order=order, owner=request.user, vm=vm) return Response(serializer.data)