91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import uuid
 | 
						|
from django.db import models
 | 
						|
from django.contrib.auth import get_user_model
 | 
						|
from django.contrib.postgres.fields import JSONField
 | 
						|
 | 
						|
# ungleich specific
 | 
						|
storage_class_mapping = {
 | 
						|
    'one': 'ssd',
 | 
						|
    'ssd': 'ssd',
 | 
						|
    'hdd': 'hdd'
 | 
						|
}
 | 
						|
 | 
						|
class VM(models.Model):
 | 
						|
    vmid = models.IntegerField(primary_key=True)
 | 
						|
    owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
 | 
						|
    data = JSONField()
 | 
						|
 | 
						|
    @property
 | 
						|
    def uncloud_name(self):
 | 
						|
        return "opennebula-{}".format(self.vmid)
 | 
						|
 | 
						|
    @property
 | 
						|
    def cores(self):
 | 
						|
        return int(self.data['TEMPLATE']['VCPU'])
 | 
						|
 | 
						|
    @property
 | 
						|
    def ram_in_gb(self):
 | 
						|
        return int(self.data['TEMPLATE']['MEMORY'])/1024
 | 
						|
 | 
						|
    @property
 | 
						|
    def disks(self):
 | 
						|
        """
 | 
						|
        If there is no disk then the key DISK does not exist.
 | 
						|
 | 
						|
        If there is only one disk, we have a dictionary in the database.
 | 
						|
 | 
						|
        If there are multiple disks, we have a list of dictionaries in the database.
 | 
						|
        """
 | 
						|
 | 
						|
        disks = []
 | 
						|
 | 
						|
        if 'DISK' in self.data['TEMPLATE']:
 | 
						|
            if type(self.data['TEMPLATE']['DISK']) is dict:
 | 
						|
                disks = [self.data['TEMPLATE']['DISK']]
 | 
						|
            else:
 | 
						|
                disks = self.data['TEMPLATE']['DISK']
 | 
						|
 | 
						|
        disks = [
 | 
						|
            {
 | 
						|
                'size_in_gb': int(d['SIZE'])/1024,
 | 
						|
                'opennebula_source': d['SOURCE'],
 | 
						|
                'opennebula_name': d['IMAGE'],
 | 
						|
                'image_size_in_gb': int(d['ORIGINAL_SIZE'])/1024,
 | 
						|
                'pool_name': d['POOL_NAME'],
 | 
						|
                'image': d['IMAGE'],
 | 
						|
                'source': d['SOURCE'],
 | 
						|
                'source_type': d['TM_MAD'],
 | 
						|
                'storage_class': storage_class_mapping[d['POOL_NAME']]
 | 
						|
 | 
						|
            }
 | 
						|
            for d in disks
 | 
						|
        ]
 | 
						|
 | 
						|
        return disks
 | 
						|
 | 
						|
    @property
 | 
						|
    def last_host(self):
 | 
						|
        return ((self.data.get('HISTORY_RECORDS', {}) or {}).get('HISTORY', {}) or {}).get('HOSTNAME', None)
 | 
						|
 | 
						|
    @property
 | 
						|
    def graphics(self):
 | 
						|
        return self.data.get('TEMPLATE', {}).get('GRAPHICS', {})
 | 
						|
 | 
						|
    @property
 | 
						|
    def nics(self):
 | 
						|
        _nics = self.data.get('TEMPLATE', {}).get('NIC', {})
 | 
						|
        if isinstance(_nics, dict):
 | 
						|
            _nics = [_nics]
 | 
						|
        return _nics
 | 
						|
 | 
						|
    @property
 | 
						|
    def ips(self):
 | 
						|
        ipv4, ipv6 = [], []
 | 
						|
        for nic in self.nics:
 | 
						|
            ip = nic.get('IP')
 | 
						|
            ip6 = nic.get('IP6_GLOBAL')
 | 
						|
            if ip:
 | 
						|
                ipv4.append(ip)
 | 
						|
            if ip6:
 | 
						|
                ipv6.append(ip6)
 | 
						|
        return ipv4, ipv6
 |