diff --git a/hosting/views.py b/hosting/views.py index cd6aa4f3..4c6ea04d 100644 --- a/hosting/views.py +++ b/hosting/views.py @@ -26,11 +26,11 @@ from django.views.generic import ( View, CreateView, FormView, ListView, DetailView, DeleteView, TemplateView, UpdateView ) -from rest_framework.views import APIView -from rest_framework.response import Response -from rest_framework.renderers import JSONRenderer from guardian.mixins import PermissionRequiredMixin from oca.pool import WrongIdError +from rest_framework.renderers import JSONRenderer +from rest_framework.response import Response +from rest_framework.views import APIView from stored_messages.api import mark_read from stored_messages.models import Message from stored_messages.settings import stored_messages_settings @@ -1778,13 +1778,22 @@ class CheckUserVM(APIView): response = check_otp(user, realm, token) if response != 200: return Response('Invalid token', 403) - uservms = VMDetail.objects.filter(user__email=email) - if len(uservms) > 0: - for i in range(len(uservms)): - if uservms[i].ipv4 == ip or uservms[i].ipv6 == ip: - return Response('success', 200) - return Response('No VM found matching the ip address provided', 404) - else: - return Response('No VM found with the given email address', 404) + manager = OpenNebulaManager() + # not the best way to lookup vms by ip + # TODO: make this optimal + vms = manager.get_vms() + users_vms = [vm for vm in vms if vm.uname == email] + if len(users_vms) == 0: + return Response('No VM found with the given email address', + 404) + for vm in users_vms: + for nic in vm.template.nics: + if hasattr(nic, 'ip6_global'): + if nic.ip6_global == ip: + return Response('success', 200) + elif hasattr(nic, 'ip'): + if nic.ip == ip: + return Response('success', 200) + return Response('No VM found matching the ip address provided', 404) except KeyError: return Response('Not enough data provided', 400) diff --git a/opennebula_api/models.py b/opennebula_api/models.py index a333aa23..a951349e 100644 --- a/opennebula_api/models.py +++ b/opennebula_api/models.py @@ -212,7 +212,13 @@ class OpenNebulaManager(): 'Could not connect via client, using oneadmin instead') try: vm_pool = oca.VirtualMachinePool(self.oneadmin_client) - vm_pool.info(filter=-2) + if infoextended: + vm_pool.infoextended( + filter=-1, # User's resources and any of his groups + vm_state=-1 # Look for VMs in any state, except DONE + ) + else: + vm_pool.info(filter=-2) return vm_pool except: raise ConnectionRefusedError