from django.contrib.auth import get_user_model from rest_framework import serializers from .models import * from uncloud_pay.models import RecurringPeriod, BillingAddress # XXX: does not seem to be used? GB_SSD_PER_DAY=0.012 GB_HDD_PER_DAY=0.0006 GB_SSD_PER_DAY=0.012 GB_HDD_PER_DAY=0.0006 ### # Admin views. class VMHostSerializer(serializers.HyperlinkedModelSerializer): vms = serializers.PrimaryKeyRelatedField(many=True, read_only=True) class Meta: model = VMHost fields = '__all__' read_only_fields = [ 'vms' ] class VMClusterSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = VMCluster fields = '__all__' ### # Disks. class VMDiskProductSerializer(serializers.ModelSerializer): class Meta: model = VMDiskProduct fields = '__all__' class CreateVMDiskProductSerializer(serializers.ModelSerializer): class Meta: model = VMDiskProduct fields = ['size_in_gb', 'image'] class CreateManagedVMDiskProductSerializer(serializers.ModelSerializer): class Meta: model = VMDiskProduct fields = ['size_in_gb'] class VMDiskImageProductSerializer(serializers.ModelSerializer): class Meta: model = VMDiskImageProduct fields = '__all__' class VMSnapshotProductSerializer(serializers.ModelSerializer): class Meta: model = VMSnapshotProduct fields = '__all__' # verify that vm.owner == user.request def validate_vm(self, value): if not value.owner == self.context['request'].user: raise serializers.ValidationError("VM {} not found for owner {}.".format(value, self.context['request'].user)) disks = VMDiskProduct.objects.filter(vm=value) if len(disks) == 0: raise serializers.ValidationError("VM {} does not have any disks, cannot snapshot".format(value.id)) return value pricing = {} pricing['per_gb_ssd'] = 0.012 pricing['per_gb_hdd'] = 0.0006 pricing['recurring_period'] = 'per_day' ### # VMs # Helper used in uncloud_service for services allocating VM. class ManagedVMProductSerializer(serializers.ModelSerializer): """ Managed VM serializer used in ungleich_service app. """ primary_disk = CreateManagedVMDiskProductSerializer() class Meta: model = VMWithOSProduct fields = [ 'cores', 'ram_in_gb', 'primary_disk'] class VMProductSerializer(serializers.ModelSerializer): primary_disk = CreateVMDiskProductSerializer() snapshots = VMSnapshotProductSerializer(many=True, read_only=True) disks = VMDiskProductSerializer(many=True, read_only=True) class Meta: model = VMWithOSProduct fields = ['order', 'owner', 'status', 'name', 'cores', 'ram_in_gb', 'primary_disk', 'snapshots', 'disks', 'extra_data'] read_only_fields = ['order', 'owner', 'status'] class OrderVMProductSerializer(VMProductSerializer): # recurring_period = serializers.ChoiceField( # choices=VMWithOSProduct.allowed_recurring_periods()) def __init__(self, *args, **kwargs): super(VMProductSerializer, self).__init__(*args, **kwargs) class Meta: model = VMProductSerializer.Meta.model fields = VMProductSerializer.Meta.fields + [ 'recurring_period' ] read_only_fields = VMProductSerializer.Meta.read_only_fields # Nico's playground. class NicoVMProductSerializer(serializers.ModelSerializer): snapshots = VMSnapshotProductSerializer(many=True, read_only=True) order = serializers.StringRelatedField() class Meta: model = VMProduct read_only_fields = ['order', 'owner', 'status', 'vmhost', 'vmcluster', 'snapshots', 'extra_data' ] fields = read_only_fields + [ 'name', 'cores', 'ram_in_gb' ] class DCLVMProductSerializer(serializers.HyperlinkedModelSerializer): """ Create an interface similar to standard DCL """ # Custom field used at creation (= ordering) only. # recurring_period = serializers.ChoiceField( # choices=VMProduct.allowed_recurring_periods()) os_disk_uuid = serializers.UUIDField() # os_disk_size = class Meta: model = VMProduct