| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  | import oca | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from rest_framework import serializers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from oca import OpenNebulaException | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | from oca.template import VmTemplate | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | from .models import OpenNebulaManager | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | class VirtualMachineTemplateSerializer(serializers.Serializer): | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  |     """Serializer to map the virtual machine template instance into JSON format.""" | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     id          = serializers.IntegerField(read_only=True) | 
					
						
							| 
									
										
										
										
											2017-05-13 17:32:55 +02:00
										 |  |  |     set_name    = serializers.CharField(read_only=True, label='Name') | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |     name        = serializers.SerializerMethodField() | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     cores       = serializers.IntegerField(source='template.vcpu')  | 
					
						
							|  |  |  |     disk        = serializers.IntegerField(write_only=True) | 
					
						
							|  |  |  |     disk_size   = serializers.SerializerMethodField() | 
					
						
							| 
									
										
										
										
											2017-05-13 17:32:55 +02:00
										 |  |  |     set_memory      = serializers.IntegerField(write_only=True, label='Memory') | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     memory      = serializers.SerializerMethodField() | 
					
						
							|  |  |  |     price       = serializers.SerializerMethodField() | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     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') | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  |         manager = OpenNebulaManager() | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  |          | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             opennebula_id = manager.create_template(name=name, cores=cores, | 
					
						
							|  |  |  |                                                     memory=memory, | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |                                                     disk_size=disk_size, | 
					
						
							|  |  |  |                                                     core_price=core_price, | 
					
						
							|  |  |  |                                                     disk_size_price=disk_size_price, | 
					
						
							|  |  |  |                                                     memory_price=memory_price) | 
					
						
							| 
									
										
										
										
											2017-05-11 04:05:58 +02:00
										 |  |  |         except OpenNebulaException as err: | 
					
						
							|  |  |  |             raise serializers.ValidationError("OpenNebulaException occured. {0}".format(err)) | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         return manager.get_template(template_id=opennebula_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_disk_size(self, obj): | 
					
						
							|  |  |  |         template = obj.template | 
					
						
							|  |  |  |         disk_size = 0 | 
					
						
							| 
									
										
										
										
											2017-05-14 01:02:22 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             for disk in template.disks: | 
					
						
							|  |  |  |                 disk_size += int(disk.size) | 
					
						
							|  |  |  |             return disk_size / 1024  | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             return 0 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-14 01:21:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     def get_price(self, obj): | 
					
						
							|  |  |  |         template = obj.template | 
					
						
							| 
									
										
										
										
											2017-05-14 01:21:10 +02:00
										 |  |  |         price = float(template.cpu) * 5.0 | 
					
						
							|  |  |  |         price += (int(template.memory)/1024 * 2.0) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             for disk in template.disks: | 
					
						
							|  |  |  |                 price += int(disk.size)/1024 * 0.6 | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         return price | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_memory(self, obj): | 
					
						
							|  |  |  |         return int(obj.template.memory)/1024 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |     def get_name(self, obj): | 
					
						
							| 
									
										
										
										
											2017-05-13 17:32:55 +02:00
										 |  |  |         # TODO: Filter public- away | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |         return obj.name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | class VirtualMachineSerializer(serializers.Serializer): | 
					
						
							| 
									
										
										
										
											2017-05-11 05:51:30 +02:00
										 |  |  |     """Serializer to map the virtual machine instance into JSON format.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     name        = serializers.CharField(read_only=True) | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |     cores       = serializers.IntegerField(source='template.vcpu')  | 
					
						
							|  |  |  |     disk        = serializers.IntegerField(write_only=True) | 
					
						
							| 
									
										
										
										
											2017-05-13 17:32:55 +02:00
										 |  |  |     set_memory      = serializers.IntegerField(write_only=True, label='Memory') | 
					
						
							|  |  |  |     memory      = serializers.SerializerMethodField() | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     disk_size   = 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() | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |     ssh_key     = serializers.CharField(write_only=True) | 
					
						
							| 
									
										
										
										
											2017-05-14 03:41:30 +02:00
										 |  |  |     configuration = serializers.SerializerMethodField() | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     template_id = serializers.ChoiceField( | 
					
						
							|  |  |  |                 choices=[(key.id, key.name) for key in | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |                         OpenNebulaManager().try_get_templates() | 
					
						
							|  |  |  |                         ], | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |                 source='template.template_id', | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |                 write_only=True, | 
					
						
							|  |  |  |                 default=[] | 
					
						
							| 
									
										
										
										
											2017-05-11 05:51:30 +02:00
										 |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     def create(self, validated_data): | 
					
						
							|  |  |  |         owner = validated_data['owner'] | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |         ssh_key = validated_data['ssh_key'] | 
					
						
							|  |  |  |         cores = validated_data['template']['vcpu'] | 
					
						
							| 
									
										
										
										
											2017-05-13 17:32:55 +02:00
										 |  |  |         memory = validated_data['set_memory'] | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |         disk = validated_data['disk'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         template_id = validated_data['template']['template_id'] | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |         specs = { | 
					
						
							|  |  |  |                     'cpu' : cores, | 
					
						
							|  |  |  |                     'disk_size' : disk, | 
					
						
							|  |  |  |                     'memory' : memory, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 05:51:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-05-11 12:45:09 +02:00
										 |  |  |             manager = OpenNebulaManager(email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |                                         password=owner.password, | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  |                                         ) | 
					
						
							| 
									
										
										
										
											2017-05-13 15:50:00 +02:00
										 |  |  |             opennebula_id = manager.create_vm(template_id=template_id, | 
					
						
							|  |  |  |                                               ssh_key=ssh_key, | 
					
						
							|  |  |  |                                               specs=specs) | 
					
						
							| 
									
										
										
										
											2017-05-11 05:51:30 +02:00
										 |  |  |         except OpenNebulaException as err: | 
					
						
							|  |  |  |             raise serializers.ValidationError("OpenNebulaException occured. {0}".format(err)) | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         return manager.get_vm(opennebula_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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 | 
					
						
							| 
									
										
										
										
											2017-05-14 02:17:48 +02:00
										 |  |  |         price = float(template.vcpu) * 5.0 | 
					
						
							| 
									
										
										
										
											2017-05-14 01:21:10 +02:00
										 |  |  |         price += (int(template.memory)/1024 * 2.0) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         for disk in template.disks: | 
					
						
							| 
									
										
										
										
											2017-05-14 01:21:10 +02:00
										 |  |  |             price += int(disk.size)/1024 * 0.6 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         return price | 
					
						
							| 
									
										
										
										
											2017-05-14 03:41:30 +02:00
										 |  |  |     def get_configuration(self, obj): | 
					
						
							|  |  |  |         template_id = obj.template.template_id | 
					
						
							|  |  |  |         template = OpenNebulaManager().get_template(template_id) | 
					
						
							|  |  |  |         return template.name |