import logging from oca.pool import WrongIdError from hosting.models import UserHostingKey, VMDetail from opennebula_api.serializers import VirtualMachineSerializer logger = logging.getLogger(__name__) def get_all_public_keys(customer): """ Returns all the public keys of the user :param customer: The customer whose public keys are needed :return: A list of public keys """ return UserHostingKey.objects.filter(user_id=customer.id).values_list( "public_key", flat=True) def get_or_create_vm_detail(user, manager, vm_id): """ Returns VMDetail object related to given vm_id. Creates the object if it does not exist :param vm_id: The ID of the VM which should be greater than 0. :param user: The CustomUser object that owns this VM :param manager: The OpenNebulaManager object :return: The VMDetail object. None if vm_id is less than or equal to 0. Also, for the cases where the VMDetail does not exist and we can not fetch data about the VM from OpenNebula, the function returns None """ if vm_id <= 0: return None try: vm_detail_obj = VMDetail.objects.get(vm_id=vm_id) except VMDetail.DoesNotExist: try: vm_obj = manager.get_vm(vm_id) except (WrongIdError, ConnectionRefusedError) as e: logger.error(str(e)) return None vm = VirtualMachineSerializer(vm_obj).data vm_detail_obj = VMDetail.objects.create( user=user, vm_id=vm_id, disk_size=vm['disk_size'], cores=vm['cores'], memory=vm['memory'], configuration=vm['configuration'], ipv4=vm['ipv4'], ipv6=vm['ipv6'] ) return vm_detail_obj