forked from uncloud/uncloud
Rename ungleich_service into uncloud_service
This commit is contained in:
parent
e67bd03997
commit
1a58508f8b
14 changed files with 8 additions and 61 deletions
0
uncloud_django_based/uncloud/uncloud_service/__init__.py
Normal file
0
uncloud_django_based/uncloud/uncloud_service/__init__.py
Normal file
3
uncloud_django_based/uncloud/uncloud_service/admin.py
Normal file
3
uncloud_django_based/uncloud/uncloud_service/admin.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
uncloud_django_based/uncloud/uncloud_service/apps.py
Normal file
5
uncloud_django_based/uncloud/uncloud_service/apps.py
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class UngleichServiceConfig(AppConfig):
|
||||
name = 'ungleich_service'
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
# Generated by Django 3.0.5 on 2020-04-13 09:38
|
||||
|
||||
from django.conf import settings
|
||||
import django.contrib.postgres.fields.jsonb
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import uuid
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('uncloud_pay', '0005_auto_20200413_0924'),
|
||||
('uncloud_vm', '0010_auto_20200413_0924'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='MatrixServiceProduct',
|
||||
fields=[
|
||||
('extra_data', django.contrib.postgres.fields.jsonb.JSONField(blank=True, editable=False, null=True)),
|
||||
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
|
||||
('status', models.CharField(choices=[('PENDING', 'Pending'), ('AWAITING_PAYMENT', 'Awaiting payment'), ('BEING_CREATED', 'Being created'), ('SCHEDULED', 'Scheduled'), ('ACTIVE', 'Active'), ('MODIFYING', 'Modifying'), ('DELETED', 'Deleted'), ('DISABLED', 'Disabled'), ('UNUSABLE', 'Unusable')], default='PENDING', max_length=32)),
|
||||
('domain', models.CharField(default='domain.tld', max_length=255)),
|
||||
('order', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.Order')),
|
||||
('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
('vm', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_vm.VMProduct')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
37
uncloud_django_based/uncloud/uncloud_service/models.py
Normal file
37
uncloud_django_based/uncloud/uncloud_service/models.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from uncloud_pay.models import Product, RecurringPeriod
|
||||
from uncloud_vm.models import VMProduct, VMDiskImageProduct
|
||||
|
||||
class MatrixServiceProduct(Product):
|
||||
monthly_managment_fee = 20
|
||||
|
||||
description = "Managed Matrix HomeServer"
|
||||
|
||||
# Specific to Matrix-as-a-Service
|
||||
vm = models.ForeignKey(
|
||||
VMProduct, on_delete=models.CASCADE
|
||||
)
|
||||
domain = models.CharField(max_length=255, default='domain.tld')
|
||||
|
||||
def recurring_price(self, recurring_period=RecurringPeriod.PER_MONTH):
|
||||
if recurring_period == RecurringPeriod.PER_MONTH:
|
||||
return self.monthly_managment_fee
|
||||
else:
|
||||
raise Exception('Invalid recurring period for VM Product pricing.')
|
||||
|
||||
@staticmethod
|
||||
def base_image():
|
||||
# TODO: find a way to safely reference debian 10 image.
|
||||
return VMDiskImageProduct.objects.get(uuid="93e564c5-adb3-4741-941f-718f76075f02")
|
||||
|
||||
@staticmethod
|
||||
def allowed_recurring_periods():
|
||||
return list(filter(
|
||||
lambda pair: pair[0] in [RecurringPeriod.PER_MONTH],
|
||||
RecurringPeriod.choices))
|
||||
|
||||
@property
|
||||
def one_time_price(self):
|
||||
return 30
|
||||
17
uncloud_django_based/uncloud/uncloud_service/serializers.py
Normal file
17
uncloud_django_based/uncloud/uncloud_service/serializers.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
from rest_framework import serializers
|
||||
from .models import MatrixServiceProduct
|
||||
from uncloud_vm.serializers import ManagedVMProductSerializer
|
||||
from uncloud_vm.models import VMProduct
|
||||
from uncloud_pay.models import RecurringPeriod
|
||||
|
||||
class MatrixServiceProductSerializer(serializers.ModelSerializer):
|
||||
vm = ManagedVMProductSerializer()
|
||||
|
||||
# Custom field used at creation (= ordering) only.
|
||||
recurring_period = serializers.ChoiceField(
|
||||
choices=MatrixServiceProduct.allowed_recurring_periods())
|
||||
|
||||
class Meta:
|
||||
model = MatrixServiceProduct
|
||||
fields = ['uuid', 'order', 'owner', 'status', 'vm', 'domain', 'recurring_period']
|
||||
read_only_fields = ['uuid', 'order', 'owner', 'status']
|
||||
3
uncloud_django_based/uncloud/uncloud_service/tests.py
Normal file
3
uncloud_django_based/uncloud/uncloud_service/tests.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
67
uncloud_django_based/uncloud/uncloud_service/views.py
Normal file
67
uncloud_django_based/uncloud/uncloud_service/views.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue