Handle ConnectionException, add change_user_password
This commit is contained in:
		
					parent
					
						
							
								8f3125d2f7
							
						
					
				
			
			
				commit
				
					
						cfaf201064
					
				
			
		
					 2 changed files with 51 additions and 45 deletions
				
			
		| 
						 | 
					@ -427,8 +427,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Create OpenNebulaManager
 | 
					            # Create OpenNebulaManager
 | 
				
			||||||
            manager = OpenNebulaManager(email=owner.email,
 | 
					            manager = OpenNebulaManager(email=owner.email,
 | 
				
			||||||
                                        password=owner.password,
 | 
					                                        password=owner.password)
 | 
				
			||||||
                                        create_user=True)
 | 
					 | 
				
			||||||
            template = manager.get_template(vm_template_id)
 | 
					            template = manager.get_template(vm_template_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Get user ssh key
 | 
					            # Get user ssh key
 | 
				
			||||||
| 
						 | 
					@ -509,8 +508,7 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, Detai
 | 
				
			||||||
        obj = self.get_object()
 | 
					        obj = self.get_object()
 | 
				
			||||||
        owner = self.request.user
 | 
					        owner = self.request.user
 | 
				
			||||||
        manager = OpenNebulaManager(email=owner.email,
 | 
					        manager = OpenNebulaManager(email=owner.email,
 | 
				
			||||||
                                    password=owner.password,
 | 
					                                    password=owner.password)
 | 
				
			||||||
                                    create_user=True)
 | 
					 | 
				
			||||||
        vm = manager.get_vm(obj.vm_id)
 | 
					        vm = manager.get_vm(obj.vm_id)
 | 
				
			||||||
        context['vm'] = VirtualMachineSerializer(vm).data
 | 
					        context['vm'] = VirtualMachineSerializer(vm).data
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
| 
						 | 
					@ -546,8 +544,7 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
 | 
				
			||||||
    def get_queryset(self):
 | 
					    def get_queryset(self):
 | 
				
			||||||
        owner = self.request.user
 | 
					        owner = self.request.user
 | 
				
			||||||
        manager = OpenNebulaManager(email=owner.email,
 | 
					        manager = OpenNebulaManager(email=owner.email,
 | 
				
			||||||
                                    password=owner.password,
 | 
					                                    password=owner.password)
 | 
				
			||||||
                                    create_user=True)
 | 
					 | 
				
			||||||
        queryset = manager.get_vms()
 | 
					        queryset = manager.get_vms()
 | 
				
			||||||
        serializer = VirtualMachineSerializer(queryset, many=True)
 | 
					        serializer = VirtualMachineSerializer(queryset, many=True)
 | 
				
			||||||
        return serializer.data
 | 
					        return serializer.data
 | 
				
			||||||
| 
						 | 
					@ -597,8 +594,7 @@ class VirtualMachineView(LoginRequiredMixin, View):
 | 
				
			||||||
        vm = None
 | 
					        vm = None
 | 
				
			||||||
        manager = OpenNebulaManager(
 | 
					        manager = OpenNebulaManager(
 | 
				
			||||||
            email=owner.email,
 | 
					            email=owner.email,
 | 
				
			||||||
            password=owner.password,
 | 
					            password=owner.password
 | 
				
			||||||
            create_user=True
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        vm_id = self.kwargs.get('pk')
 | 
					        vm_id = self.kwargs.get('pk')
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
| 
						 | 
					@ -628,8 +624,7 @@ class VirtualMachineView(LoginRequiredMixin, View):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        manager = OpenNebulaManager(
 | 
					        manager = OpenNebulaManager(
 | 
				
			||||||
            email=owner.email,
 | 
					            email=owner.email,
 | 
				
			||||||
            password=owner.password,
 | 
					            password=owner.password
 | 
				
			||||||
            create_user=True
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        terminated = manager.delete_vm(
 | 
					        terminated = manager.delete_vm(
 | 
				
			||||||
| 
						 | 
					@ -695,8 +690,7 @@ class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        owner = self.request.user
 | 
					        owner = self.request.user
 | 
				
			||||||
        manager = OpenNebulaManager(email=owner.email,
 | 
					        manager = OpenNebulaManager(email=owner.email,
 | 
				
			||||||
                                    password=owner.password,
 | 
					                                    password=owner.password)
 | 
				
			||||||
                                    create_user=True)
 | 
					 | 
				
			||||||
        # Get vms
 | 
					        # Get vms
 | 
				
			||||||
        queryset = manager.get_vms()
 | 
					        queryset = manager.get_vms()
 | 
				
			||||||
        vms = VirtualMachineSerializer(queryset, many=True).data
 | 
					        vms = VirtualMachineSerializer(queryset, many=True).data
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ logger = logging.getLogger(__name__)
 | 
				
			||||||
class OpenNebulaManager():
 | 
					class OpenNebulaManager():
 | 
				
			||||||
    """This class represents an opennebula manager."""
 | 
					    """This class represents an opennebula manager."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, email=None, password=None, create_user=True):
 | 
					    def __init__(self, email=None, password=None):
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # Get oneadmin client
 | 
					        # Get oneadmin client
 | 
				
			||||||
        self.oneadmin_client = self._get_opennebula_client(
 | 
					        self.oneadmin_client = self._get_opennebula_client(
 | 
				
			||||||
| 
						 | 
					@ -21,21 +21,19 @@ class OpenNebulaManager():
 | 
				
			||||||
            settings.OPENNEBULA_PASSWORD
 | 
					            settings.OPENNEBULA_PASSWORD
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if not create_user or email is None:
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Get or create oppenebula user using given credentials
 | 
					        # Get or create oppenebula user using given credentials
 | 
				
			||||||
        self.opennebula_user = self._get_or_create_user(
 | 
					        try:
 | 
				
			||||||
            email,
 | 
					            self.opennebula_user = self._get_or_create_user(
 | 
				
			||||||
            password
 | 
					                email,
 | 
				
			||||||
        )
 | 
					                password
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        # If opennebula user was created/obtained, get his client
 | 
					            # If opennebula user was created/obtained, get his client
 | 
				
			||||||
        if self.opennebula_user:
 | 
					 | 
				
			||||||
            self.client = self._get_opennebula_client(
 | 
					            self.client = self._get_opennebula_client(
 | 
				
			||||||
                email,
 | 
					                email,
 | 
				
			||||||
                password
 | 
					                password
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _get_opennebula_client(self, username, password):
 | 
					    def _get_opennebula_client(self, username, password):
 | 
				
			||||||
        return oca.Client("{0}:{1}".format(
 | 
					        return oca.Client("{0}:{1}".format(
 | 
				
			||||||
| 
						 | 
					@ -56,10 +54,14 @@ class OpenNebulaManager():
 | 
				
			||||||
        except WrongNameError as wrong_name_err:
 | 
					        except WrongNameError as wrong_name_err:
 | 
				
			||||||
            opennebula_user = self.oneadmin_client.call(oca.User.METHODS['allocate'], email,
 | 
					            opennebula_user = self.oneadmin_client.call(oca.User.METHODS['allocate'], email,
 | 
				
			||||||
                                                        password, 'core')
 | 
					                                                        password, 'core')
 | 
				
			||||||
 | 
					            logger.debug(
 | 
				
			||||||
 | 
					                 "User {0} does not exist. Created the user. User id = {1}",
 | 
				
			||||||
 | 
					                 email,
 | 
				
			||||||
 | 
					                 opennebula_user
 | 
				
			||||||
 | 
					             )
 | 
				
			||||||
            return opennebula_user
 | 
					            return opennebula_user
 | 
				
			||||||
        #TODO: Replace with logger
 | 
					 | 
				
			||||||
        except ConnectionRefusedError:
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
            print('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
					            logger.info('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
				
			||||||
                    host=settings.OPENNEBULA_DOMAIN,
 | 
					                    host=settings.OPENNEBULA_DOMAIN,
 | 
				
			||||||
                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
					                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
| 
						 | 
					@ -68,9 +70,8 @@ class OpenNebulaManager():
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            user_pool = oca.UserPool(self.oneadmin_client)
 | 
					            user_pool = oca.UserPool(self.oneadmin_client)
 | 
				
			||||||
            user_pool.info()
 | 
					            user_pool.info()
 | 
				
			||||||
        #TODO: Replace with logger
 | 
					 | 
				
			||||||
        except ConnectionRefusedError:
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
            print('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
					            logger.info('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
				
			||||||
                    host=settings.OPENNEBULA_DOMAIN,
 | 
					                    host=settings.OPENNEBULA_DOMAIN,
 | 
				
			||||||
                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
					                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
| 
						 | 
					@ -82,13 +83,12 @@ class OpenNebulaManager():
 | 
				
			||||||
            vm_pool = oca.VirtualMachinePool(self.client)
 | 
					            vm_pool = oca.VirtualMachinePool(self.client)
 | 
				
			||||||
            vm_pool.info()
 | 
					            vm_pool.info()
 | 
				
			||||||
        except AttributeError:
 | 
					        except AttributeError:
 | 
				
			||||||
            print('Could not connect via client, using oneadmin instead') 
 | 
					            logger.info('Could not connect via client, using oneadmin instead') 
 | 
				
			||||||
            vm_pool = oca.VirtualMachinePool(self.oneadmin_client)
 | 
					            vm_pool = oca.VirtualMachinePool(self.oneadmin_client)
 | 
				
			||||||
            vm_pool.info(filter=-2)
 | 
					            vm_pool.info(filter=-2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #TODO: Replace with logger
 | 
					 | 
				
			||||||
        except ConnectionRefusedError:
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
            print('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
					            logger.info('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
				
			||||||
                    host=settings.OPENNEBULA_DOMAIN,
 | 
					                    host=settings.OPENNEBULA_DOMAIN,
 | 
				
			||||||
                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
					                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
| 
						 | 
					@ -96,11 +96,17 @@ class OpenNebulaManager():
 | 
				
			||||||
        return vm_pool
 | 
					        return vm_pool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_vms(self):
 | 
					    def get_vms(self):
 | 
				
			||||||
        return self._get_vm_pool()
 | 
					        try:
 | 
				
			||||||
 | 
					            return self._get_vm_pool()
 | 
				
			||||||
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
 | 
					            return []
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
    def get_vm(self, vm_id):
 | 
					    def get_vm(self, vm_id):
 | 
				
			||||||
        vm_pool = self._get_vm_pool()
 | 
					        try:
 | 
				
			||||||
        return vm_pool.get_by_id(int(vm_id))
 | 
					            vm_pool = self._get_vm_pool()
 | 
				
			||||||
 | 
					            return vm_pool.get_by_id(int(vm_id))
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #TODO: get app with id 
 | 
					    #TODO: get app with id 
 | 
				
			||||||
    def create_vm(self, template_id, app_id=None, ssh_key=None):
 | 
					    def create_vm(self, template_id, app_id=None, ssh_key=None):
 | 
				
			||||||
| 
						 | 
					@ -122,7 +128,7 @@ class OpenNebulaManager():
 | 
				
			||||||
                self.opennebula_user.group_ids[0]
 | 
					                self.opennebula_user.group_ids[0]
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        except AttributeError:
 | 
					        except AttributeError:
 | 
				
			||||||
            print('Could not change owner, opennebula_user is not set.')
 | 
					            logger.info('Could not change owner for vm with id: {}.'.format(vm_id))
 | 
				
			||||||
        return vm_id
 | 
					        return vm_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def delete_vm(self, vm_id):
 | 
					    def delete_vm(self, vm_id):
 | 
				
			||||||
| 
						 | 
					@ -137,16 +143,12 @@ class OpenNebulaManager():
 | 
				
			||||||
            vm_terminated = True
 | 
					            vm_terminated = True
 | 
				
			||||||
        except socket.timeout as socket_err:
 | 
					        except socket.timeout as socket_err:
 | 
				
			||||||
            logger.info("Socket timeout error: {0}".format(socket_err))
 | 
					            logger.info("Socket timeout error: {0}".format(socket_err))
 | 
				
			||||||
            print("Socket timeout error: {0}".format(socket_err))
 | 
					 | 
				
			||||||
        except OpenNebulaException as opennebula_err:
 | 
					        except OpenNebulaException as opennebula_err:
 | 
				
			||||||
            logger.info("OpenNebulaException error: {0}".format(opennebula_err))
 | 
					            logger.info("OpenNebulaException error: {0}".format(opennebula_err))
 | 
				
			||||||
            print("OpenNebulaException error: {0}".format(opennebula_err))
 | 
					 | 
				
			||||||
        except OSError as os_err:
 | 
					        except OSError as os_err:
 | 
				
			||||||
            logger.info("OSError : {0}".format(os_err))
 | 
					            logger.info("OSError : {0}".format(os_err))
 | 
				
			||||||
            print("OSError : {0}".format(os_err))
 | 
					 | 
				
			||||||
        except ValueError as value_err:
 | 
					        except ValueError as value_err:
 | 
				
			||||||
            logger.info("ValueError : {0}".format(value_err))
 | 
					            logger.info("ValueError : {0}".format(value_err))
 | 
				
			||||||
            print("ValueError : {0}".format(value_err))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return vm_terminated
 | 
					        return vm_terminated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +158,7 @@ class OpenNebulaManager():
 | 
				
			||||||
           template_pool.info()
 | 
					           template_pool.info()
 | 
				
			||||||
        #TODO: Replace with logger
 | 
					        #TODO: Replace with logger
 | 
				
			||||||
        except ConnectionRefusedError:
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
            print('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
					            logger.info('Could not connect to host: {host} via protocol {protocol}'.format(
 | 
				
			||||||
                    host=settings.OPENNEBULA_DOMAIN,
 | 
					                    host=settings.OPENNEBULA_DOMAIN,
 | 
				
			||||||
                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
					                    protocol=settings.OPENNEBULA_PROTOCOL)
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
| 
						 | 
					@ -164,12 +166,16 @@ class OpenNebulaManager():
 | 
				
			||||||
        return template_pool
 | 
					        return template_pool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_templates(self):
 | 
					    def get_templates(self):
 | 
				
			||||||
        public_templates = [
 | 
					        try:
 | 
				
			||||||
                template 
 | 
					            public_templates = [
 | 
				
			||||||
                for template in self._get_template_pool()
 | 
					                    template 
 | 
				
			||||||
                if 'public-' in template.name 
 | 
					                    for template in self._get_template_pool()
 | 
				
			||||||
                ]
 | 
					                    if 'public-' in template.name 
 | 
				
			||||||
        return public_templates 
 | 
					                    ]
 | 
				
			||||||
 | 
					            return public_templates 
 | 
				
			||||||
 | 
					        except ConnectionRefusedError:
 | 
				
			||||||
 | 
					            return []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_template(self, template_id):
 | 
					    def get_template(self, template_id):
 | 
				
			||||||
        template_pool = self._get_template_pool()
 | 
					        template_pool = self._get_template_pool()
 | 
				
			||||||
        return template_pool.get_by_id(template_id)
 | 
					        return template_pool.get_by_id(template_id)
 | 
				
			||||||
| 
						 | 
					@ -226,3 +232,9 @@ class OpenNebulaManager():
 | 
				
			||||||
    def delete_template(self, template_id):
 | 
					    def delete_template(self, template_id):
 | 
				
			||||||
        self.oneadmin_client.call(oca.VmTemplate.METHODS['delete'], template_id, False)
 | 
					        self.oneadmin_client.call(oca.VmTemplate.METHODS['delete'], template_id, False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def change_user_password(self, new_password):
 | 
				
			||||||
 | 
					        self.oneadmin_client.call(
 | 
				
			||||||
 | 
					            oca.User.METHODS['passwd'],
 | 
				
			||||||
 | 
					            self.opennebula_user.id,
 | 
				
			||||||
 | 
					            new_password
 | 
				
			||||||
 | 
					        ) 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue