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