merged opnnebula api changes
This commit is contained in:
		
				commit
				
					
						8980f6b2fc
					
				
			
		
					 19 changed files with 458 additions and 888 deletions
				
			
		|  | @ -3,91 +3,117 @@ import oca | |||
| from rest_framework import serializers | ||||
| 
 | ||||
| from oca import OpenNebulaException | ||||
| from oca.template import VmTemplate | ||||
| 
 | ||||
| from .models import VirtualMachine, VirtualMachineTemplate, OpenNebulaManager | ||||
| from .models import OpenNebulaManager | ||||
| 
 | ||||
| class VirtualMachineTemplateSerializer(serializers.ModelSerializer): | ||||
| class VirtualMachineTemplateSerializer(serializers.Serializer): | ||||
|     """Serializer to map the virtual machine template instance into JSON format.""" | ||||
|     cores       = serializers.IntegerField(source='get_cores')  | ||||
|     name        = serializers.CharField(source='get_name') | ||||
|     disk_size   = serializers.IntegerField(source='get_disk_size') | ||||
|     memory      = serializers.IntegerField(source='get_memory') | ||||
|     id          = serializers.IntegerField(read_only=True) | ||||
|     name        = serializers.CharField() | ||||
|     cores       = serializers.IntegerField(source='template.vcpu')  | ||||
|     disk        = serializers.IntegerField(write_only=True) | ||||
|     disk_size   = serializers.SerializerMethodField() | ||||
|     memory      = serializers.SerializerMethodField() | ||||
|     core_price  = serializers.FloatField(source='template.cpu_cost') | ||||
|     disk_size_price  = serializers.FloatField(source='template.disk_cost') | ||||
|     memory_price  = serializers.FloatField(source='template.memory_cost') | ||||
|     price       = serializers.SerializerMethodField() | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = VirtualMachineTemplate | ||||
|         fields = ('id', 'name', 'cores', 'memory', 'disk_size', 'base_price',  | ||||
|                   'core_price', 'memory_price', 'disk_size_price', 'opennebula_id') | ||||
|         read_only_fields = ('opennebula_id', ) | ||||
| 
 | ||||
|     def validate(self, data): | ||||
|         # Create the opennebula model | ||||
|         cores   = data.pop('get_cores') | ||||
|         name    = data.pop('get_name') | ||||
|         disk_size = data.pop('get_disk_size') | ||||
|         memory  = data.pop('get_memory') | ||||
|     def create(self, validated_data): | ||||
|         data = validated_data | ||||
|         template = data.pop('template') | ||||
| 
 | ||||
|         cores = template.pop('vcpu') | ||||
|         name    = data.pop('name') | ||||
|         disk_size = data.pop('disk')  | ||||
|         memory  = template.pop('memory') | ||||
|         core_price = template.pop('cpu_cost')  | ||||
|         memory_price = template.pop('memory_cost')  | ||||
|         disk_size_price = template.pop('disk_cost') | ||||
|         manager = OpenNebulaManager(create_user = False) | ||||
|          | ||||
|         try: | ||||
|             opennebula_id = manager.create_template(name=name, cores=cores, | ||||
|                                                     memory=memory, | ||||
|                                                     disk_size=disk_size) | ||||
|             data.update({'opennebula_id':opennebula_id}) | ||||
|                                                     disk_size=disk_size, | ||||
|                                                     core_price=core_price, | ||||
|                                                     disk_size_price=disk_size_price, | ||||
|                                                     memory_price=memory_price) | ||||
|         except OpenNebulaException as err: | ||||
|             raise serializers.ValidationError("OpenNebulaException occured. {0}".format(err)) | ||||
|          | ||||
|         return data | ||||
|         return manager.get_template(template_id=opennebula_id) | ||||
| 
 | ||||
|     def create(self, validated_data): | ||||
|         return VirtualMachineTemplate.objects.create(**validated_data) | ||||
|     def get_disk_size(self, obj): | ||||
|         template = obj.template | ||||
|         disk_size = 0 | ||||
|         for disk in template.disks: | ||||
|             disk_size += int(disk.size) | ||||
|         return disk_size / 1024  | ||||
| 
 | ||||
| class TemplatePrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): | ||||
|     def display_value(self, instance): | ||||
|         return 'Template: {}'.format(instance.get_name()) | ||||
|     def get_price(self, obj): | ||||
|         template = obj.template | ||||
|         price = float(template.cpu) * float(template.cpu_cost) | ||||
|         price += (int(template.memory)/1024 * float(template.memory_cost)) | ||||
|         for disk in template.disks: | ||||
|             price += int(disk.size)/1024 * float(template.disk_cost) | ||||
|         return price | ||||
| 
 | ||||
| class VirtualMachineSerializer(serializers.ModelSerializer): | ||||
|     def get_memory(self, obj): | ||||
|         return int(obj.template.memory)/1024 | ||||
| 
 | ||||
| class VirtualMachineSerializer(serializers.Serializer): | ||||
|     """Serializer to map the virtual machine instance into JSON format.""" | ||||
| 
 | ||||
|     #TODO: Maybe we can change to template.get_cores | ||||
|     cores       = serializers.IntegerField(read_only=True, source='get_cores')  | ||||
|     name        = serializers.CharField(read_only=True, source='get_name') | ||||
|     disk_size   = serializers.IntegerField(read_only=True, source='get_disk_size') | ||||
|     memory      = serializers.IntegerField(read_only=True, source='get_memory') | ||||
|     #TODO: See if we can change to IPAddressField | ||||
|     ip          = serializers.CharField(read_only=True, source='get_ip') | ||||
|     deploy_id   = serializers.IntegerField(read_only=True, source='get_deploy_id') | ||||
|     vm_id          = serializers.IntegerField(read_only=True, source='get_vm_id') | ||||
|     state       = serializers.CharField(read_only=True, source='get_state') | ||||
|     price       = serializers.FloatField(read_only=True, source='get_price') | ||||
|     name        = serializers.CharField(read_only=True) | ||||
|     cores       = serializers.IntegerField(read_only=True, source='template.vcpu')  | ||||
| 
 | ||||
|     vm_template = VirtualMachineTemplateSerializer(read_only=True) | ||||
|     disk_size   = serializers.SerializerMethodField() | ||||
|     memory      = serializers.SerializerMethodField() | ||||
|     ip          = serializers.CharField(read_only=True, | ||||
|                                         source='user_template.ungleich_public_ip', | ||||
|                                         default='-') | ||||
|     vm_id       = serializers.IntegerField(read_only=True, source='id') | ||||
|     state       = serializers.CharField(read_only=True, source='str_state') | ||||
|     price       = serializers.SerializerMethodField() | ||||
| 
 | ||||
|     vm_template_id = TemplatePrimaryKeyRelatedField( | ||||
|                 queryset=VirtualMachineTemplate.objects.all(), | ||||
|                 source='vm_template' | ||||
|     template_id = serializers.ChoiceField( | ||||
|                 choices=[(key.id, key.name) for key in | ||||
|                     OpenNebulaManager().get_templates()], | ||||
|                 source='template.template_id', | ||||
|                 write_only=True | ||||
|             ) | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = VirtualMachine | ||||
|         fields = ('id', 'opennebula_id', 'vm_template', 'vm_template_id', 'cores', 'name', | ||||
|                 'disk_size', 'memory', 'ip', 'deploy_id', 'state', 'vm_id', | ||||
|                 'price') | ||||
|         read_only_fields = ('opennebula_id', ) | ||||
|     def create(self, validated_data): | ||||
|         owner = validated_data['owner'] | ||||
|         template_id = validated_data['template']['template_id'] | ||||
| 
 | ||||
|     def validate(self, data): | ||||
|         # Create the opennebula model | ||||
|         manager = OpenNebulaManager(create_user = False) | ||||
|          | ||||
|         try: | ||||
|             template_id = data['vm_template'].opennebula_id | ||||
|             manager = OpenNebulaManager(email=owner.email, | ||||
|                                         password=owner.password, | ||||
|                                         create_user = True) | ||||
|             opennebula_id = manager.create_vm(template_id) | ||||
|             data.update({'opennebula_id':opennebula_id}) | ||||
|         except OpenNebulaException as err: | ||||
|             raise serializers.ValidationError("OpenNebulaException occured. {0}".format(err)) | ||||
|          | ||||
|         return data | ||||
|         return manager.get_vm(opennebula_id) | ||||
| 
 | ||||
|     def create(self, validated_data): | ||||
|         return VirtualMachine.objects.create(**validated_data) | ||||
|     def get_memory(self, obj): | ||||
|         return int(obj.template.memory)/1024 | ||||
| 
 | ||||
|     def get_disk_size(self, obj): | ||||
|         template = obj.template | ||||
|         disk_size = 0 | ||||
|         for disk in template.disks: | ||||
|             disk_size += int(disk.size) | ||||
|         return disk_size / 1024 | ||||
| 
 | ||||
|     def get_price(self, obj): | ||||
|         template = obj.template | ||||
|         price = float(template.cpu) * float(template.cpu_cost) | ||||
|         price += (int(template.memory)/1024 * float(template.memory_cost)) | ||||
|         for disk in template.disks: | ||||
|             price += int(disk.size)/1024 * float(template.disk_cost) | ||||
|         return price | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue