forked from uncloud/uncloud
		
	
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.contrib.auth import get_user_model
 | 
						|
 | 
						|
from rest_framework import serializers
 | 
						|
 | 
						|
from .models import VMHost, VMProduct, VMSnapshotProduct, VMDiskProduct, VMDiskImageProduct
 | 
						|
from uncloud_pay.models import RecurringPeriod
 | 
						|
 | 
						|
GB_SSD_PER_DAY=0.012
 | 
						|
GB_HDD_PER_DAY=0.0006
 | 
						|
 | 
						|
GB_SSD_PER_DAY=0.012
 | 
						|
GB_HDD_PER_DAY=0.0006
 | 
						|
 | 
						|
 | 
						|
class VMHostSerializer(serializers.ModelSerializer):
 | 
						|
    vms = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = VMHost
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = [ 'vms' ]
 | 
						|
 | 
						|
 | 
						|
class VMDiskProductSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = VMDiskProduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class VMDiskImageProductSerializer(serializers.ModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = VMDiskImageProduct
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
class VMProductSerializer(serializers.HyperlinkedModelSerializer):
 | 
						|
    # Custom field used at creation (= ordering) only.
 | 
						|
    recurring_period = serializers.ChoiceField(
 | 
						|
            choices=VMProduct.allowed_recurring_periods())
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = VMProduct
 | 
						|
        fields = ['uuid', 'order', 'owner', 'status', 'name', \
 | 
						|
                'cores', 'ram_in_gb', 'recurring_period']
 | 
						|
        read_only_fields = ['uuid', 'order', 'owner', 'status']
 | 
						|
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
class ManagedVMProductSerializer(serializers.ModelSerializer):
 | 
						|
    """
 | 
						|
    Managed VM serializer used in ungleich_service app.
 | 
						|
    """
 | 
						|
    class Meta:
 | 
						|
        model = VMProduct
 | 
						|
        fields = [ 'cores', 'ram_in_gb']
 | 
						|
 | 
						|
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.uuid))
 | 
						|
 | 
						|
        return value
 | 
						|
 | 
						|
    pricing = {}
 | 
						|
    pricing['per_gb_ssd'] = 0.012
 | 
						|
    pricing['per_gb_hdd'] = 0.0006
 | 
						|
    pricing['recurring_period'] = 'per_day'
 |