[opennebula] refresh formula, cleanup vm import/migration to uncloud
This commit is contained in:
		
					parent
					
						
							
								9f4b927c74
							
						
					
				
			
			
				commit
				
					
						5d840de55c
					
				
			
		
					 4 changed files with 29 additions and 46 deletions
				
			
		| 
						 | 
					@ -21,9 +21,8 @@ def convert_mac_to_int(mac_address: str):
 | 
				
			||||||
    return mac_address
 | 
					    return mac_address
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_vm_price(core, ram, storage, n_of_ipv4, n_of_ipv6):
 | 
					def get_vm_price(core, ram, ssd_size, hdd_size, n_of_ipv4, n_of_ipv6):
 | 
				
			||||||
    storage = storage / 10  # Division by 10 because our base storage unit is 10 GB
 | 
					    total = 3 * core + 4 * ram + (3.5 * ssd_size/10.) + (1.5 * hdd_size/100.) + 8 * n_of_ipv4 + 0 * n_of_ipv6
 | 
				
			||||||
    total = 3 * core + 4 * ram + 3.5 * storage + 8 * n_of_ipv4 + 0 * n_of_ipv6
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: Find some reason about the following magical subtraction.
 | 
					    # TODO: Find some reason about the following magical subtraction.
 | 
				
			||||||
    total -= 8
 | 
					    total -= 8
 | 
				
			||||||
| 
						 | 
					@ -82,17 +81,18 @@ class Command(BaseCommand):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def handle(self, *args, **options):
 | 
					    def handle(self, *args, **options):
 | 
				
			||||||
        for one_vm in VMModel.objects.all():
 | 
					        for one_vm in VMModel.objects.all():
 | 
				
			||||||
            # Host on which the VM is currently residing
 | 
					 | 
				
			||||||
            #host = VMHost.objects.filter(vms__icontains=one_vm.vmid).first()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # VCPU, RAM, Owner, Status
 | 
					            vmhost = VMHost.objects.get(hostname=one_vm.last_host)
 | 
				
			||||||
            # TODO: Set actual status instead of hard coded 'active'
 | 
					            cores = one_vm.cores
 | 
				
			||||||
            vm_id, cores, ram_in_gb = one_vm.vmid, one_vm.cores, one_vm.ram_in_gb
 | 
					            ram_in_gb = one_vm.ram_in_gb
 | 
				
			||||||
            owner, status = one_vm.owner, 'active'
 | 
					            owner = one_vm.owner
 | 
				
			||||||
 | 
					            status = 'active'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Total Amount of SSD Storage
 | 
					            # Total Amount of SSD Storage
 | 
				
			||||||
            # TODO: What would happen if the attached storage is not SSD but HDD?
 | 
					            # TODO: What would happen if the attached storage is not SSD but HDD?
 | 
				
			||||||
            total_storage_in_gb = sum([disk['size_in_gb'] for disk in one_vm.disks])
 | 
					
 | 
				
			||||||
 | 
					            ssd_size = sum([ disk['size_in_gb'] for disk in one.disks if disk['pool_name'] in ['ssd', 'one'] ])
 | 
				
			||||||
 | 
					            hdd_size = sum([ disk['size_in_gb'] for disk in one.disks if disk['pool_name'] in ['hdd'] ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # List of IPv4 addresses and Global IPv6 addresses
 | 
					            # List of IPv4 addresses and Global IPv6 addresses
 | 
				
			||||||
            ipv4, ipv6 = one_vm.ips
 | 
					            ipv4, ipv6 = one_vm.ips
 | 
				
			||||||
| 
						 | 
					@ -101,18 +101,18 @@ class Command(BaseCommand):
 | 
				
			||||||
            #       instead of pseudo one we are putting currently
 | 
					            #       instead of pseudo one we are putting currently
 | 
				
			||||||
            creation_date = starting_date = ending_date = datetime.now(tz=timezone.utc)
 | 
					            creation_date = starting_date = ending_date = datetime.now(tz=timezone.utc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Price calculation
 | 
					            # Price calculation based on datacenterlight.ch
 | 
				
			||||||
 | 
					 | 
				
			||||||
            # TODO: Make the following non-hardcoded
 | 
					 | 
				
			||||||
            one_time_price = 0
 | 
					            one_time_price = 0
 | 
				
			||||||
            recurring_period = 'per_month'
 | 
					            recurring_period = 'per_month'
 | 
				
			||||||
 | 
					            recurring_price = get_vm_price(cores, ram_in_gb,
 | 
				
			||||||
 | 
					                                           ssd_size, hdd_size,
 | 
				
			||||||
 | 
					                                           len(ipv4), len(ipv6))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            recurring_price = get_vm_price(cores, ram_in_gb, total_storage_in_gb, len(ipv4), len(ipv6))
 | 
					 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                vm_product = VMProduct.objects.get(vmid=vm_id)
 | 
					                vm_product = VMProduct.objects.get(name=one_vm.uncloud_name)
 | 
				
			||||||
            except VMProduct.DoesNotExist:
 | 
					            except VMProduct.DoesNotExist:
 | 
				
			||||||
                order = Order.objects.create(
 | 
					                order = Order.objects.create(
 | 
				
			||||||
                    owner=one_vm.owner,
 | 
					                    owner=owner,
 | 
				
			||||||
                    creation_date=creation_date,
 | 
					                    creation_date=creation_date,
 | 
				
			||||||
                    starting_date=starting_date,
 | 
					                    starting_date=starting_date,
 | 
				
			||||||
                    ending_date=ending_date,
 | 
					                    ending_date=ending_date,
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,7 @@ class Command(BaseCommand):
 | 
				
			||||||
                    recurring_period=recurring_period
 | 
					                    recurring_period=recurring_period
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                vm_product, _ = VMProduct.objects.update_or_create(
 | 
					                vm_product, _ = VMProduct.objects.update_or_create(
 | 
				
			||||||
                    vmid=vm_id,
 | 
					                    name=
 | 
				
			||||||
                    defaults={
 | 
					                    defaults={
 | 
				
			||||||
                        'cores': cores,
 | 
					                        'cores': cores,
 | 
				
			||||||
                        'ram_in_gb': ram_in_gb,
 | 
					                        'ram_in_gb': ram_in_gb,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,9 @@ class VM(models.Model):
 | 
				
			||||||
    owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
 | 
					    owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
 | 
				
			||||||
    data = JSONField()
 | 
					    data = JSONField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self, *args, **kwargs):
 | 
					    @property
 | 
				
			||||||
        self.id = 'opennebula' + str(self.data.get("ID"))
 | 
					    def uncloud_name(self):
 | 
				
			||||||
        super().save(*args, **kwargs)
 | 
					        return "opennebula-{}".format(self.vmid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def cores(self):
 | 
					    def cores(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,6 @@ from rest_framework import serializers
 | 
				
			||||||
from opennebula.models import VM
 | 
					from opennebula.models import VM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VMSerializer(serializers.HyperlinkedModelSerializer):
 | 
					 | 
				
			||||||
    class Meta:
 | 
					 | 
				
			||||||
        model = VM
 | 
					 | 
				
			||||||
        fields = '__all__'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class OpenNebulaVMSerializer(serializers.HyperlinkedModelSerializer):
 | 
					class OpenNebulaVMSerializer(serializers.HyperlinkedModelSerializer):
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        model = VM
 | 
					        model = VM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +1,16 @@
 | 
				
			||||||
from rest_framework import viewsets, permissions
 | 
					from rest_framework import viewsets, permissions
 | 
				
			||||||
from rest_framework.response import Response
 | 
					 | 
				
			||||||
from django.shortcuts import get_object_or_404
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .models import VM
 | 
					from .models import VM
 | 
				
			||||||
from .serializers import VMSerializer, OpenNebulaVMSerializer
 | 
					from .serializers import OpenNebulaVMSerializer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VMViewSet(viewsets.ModelViewSet):
 | 
				
			||||||
class RawVMViewSet(viewsets.ModelViewSet):
 | 
					 | 
				
			||||||
    queryset = VM.objects.all()
 | 
					 | 
				
			||||||
    serializer_class = VMSerializer
 | 
					 | 
				
			||||||
    permission_classes = [permissions.IsAdminUser]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VMViewSet(viewsets.ViewSet):
 | 
					 | 
				
			||||||
    permission_classes = [permissions.IsAuthenticated]
 | 
					    permission_classes = [permissions.IsAuthenticated]
 | 
				
			||||||
 | 
					    serializer_class = OpenNebulaVMSerializer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def list(self, request):
 | 
					    def get_queryset(self):
 | 
				
			||||||
        queryset = VM.objects.filter(owner=request.user)
 | 
					        if self.request.user.is_superuser:
 | 
				
			||||||
        serializer = OpenNebulaVMSerializer(queryset, many=True, context={'request': request})
 | 
					            obj = VM.objects.all()
 | 
				
			||||||
        return Response(serializer.data)
 | 
					        else:
 | 
				
			||||||
 | 
					            obj = VM.objects.filter(owner=self.request.user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def retrieve(self, request, pk=None):
 | 
					        return obj
 | 
				
			||||||
        queryset = VM.objects.filter(owner=request.user)
 | 
					 | 
				
			||||||
        vm = get_object_or_404(queryset, pk=pk)
 | 
					 | 
				
			||||||
        serializer = OpenNebulaVMSerializer(vm, context={'request': request})
 | 
					 | 
				
			||||||
        return Response(serializer.data)
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue