Exemple #1
0
    def form_valid(self, *args, **kwargs):
        try:
            form=kwargs['form']
            user=self.request.user
            ec2_pool = EC2Pool.objects.get(id=kwargs['pool_id'])
            assert ec2_pool.vpc.access_key.user == self.request.user
            ec2_tools.refresh_pool(ec2_pool)
            
            nodes_to_terminate = form.cleaned_data['nodes_to_terminate']
            instance_type = form.cleaned_data['instance_type']
            if instance_type == '-': instance_type = None
            pricing = form.cleaned_data['pricing']
            spot_price_order = form.cleaned_data['spot_price_order']
            spot_price_custom = form.cleaned_data['spot_price_custom']
            
            
            errors = ec2_tools.scale_down(ec2_pool, nodes_to_terminate, instance_type, pricing, spot_price_order, spot_price_custom)
            ec2_pool.save()
            if errors:
                self.request.session['errors'] = aws_tools.process_errors(errors)
            self.success_url = reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id})
        except Exception as e:
            self.request.session['errors'] = aws_tools.process_errors([e])
            log.exception(e)
            return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id}))

        
        
        return super(EC2PoolScaleDownView, self).form_valid(*args, **kwargs)
Exemple #2
0
 def form_valid(self, *args, **kwargs):
     try:
         form=kwargs['form']
         user=self.request.user
         ec2_pool = EC2Pool.objects.get(id=kwargs['pool_id'])
         assert ec2_pool.vpc.access_key.user == self.request.user
         ec2_tools.refresh_pool(ec2_pool)
         
         nodes_to_terminate = form.cleaned_data['nodes_to_terminate']
         instance_type = form.cleaned_data['instance_type']
         if instance_type == '-': instance_type = None
         pricing = form.cleaned_data['pricing']
         spot_price_order = form.cleaned_data['spot_price_order']
         spot_price_custom = form.cleaned_data['spot_price_custom']
         
         
         errors = ec2_tools.scale_down(ec2_pool, nodes_to_terminate, instance_type, pricing, spot_price_order, spot_price_custom)
         ec2_pool.save()
         if errors:
             self.request.session['errors'] = aws_tools.process_errors(errors)
         self.success_url = reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id})
     except Exception, e:
         self.request.session['errors'] = aws_tools.process_errors([e])
         log.exception(e)
         return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id}))
Exemple #3
0
    def form_valid(self, *args, **kwargs):
        try:
            form=kwargs['form']
            user=self.request.user
            ec2_pool = EC2Pool.objects.get(id=kwargs['pool_id'])
            assert ec2_pool.vpc.access_key.user == self.request.user
            ec2_tools.refresh_pool(ec2_pool)
            extra_nodes=form.cleaned_data['instances_to_add']
            spot_price = form.cleaned_data['pricing'] == 'spot'
            spot_bid_price = form.cleaned_data['spot_bid_price']
            instance_type = form.cleaned_data['initial_instance_type']
            
            errors = ec2_tools.scale_up(ec2_pool=ec2_pool,
                               extra_nodes=extra_nodes,
                               instance_type=instance_type,
                               spot=spot_price,
                               spot_bid_price=spot_bid_price)
            ec2_pool.save()
            self.request.session['errors'] = aws_tools.process_errors(errors)

        except Exception as e:
            self.request.session['errors'] = aws_tools.process_errors([e])
            log.exception(e)
            return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id}))

        
        self.success_url = reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id})
        return super(EC2PoolScaleUpView, self).form_valid(*args, **kwargs)
Exemple #4
0
 def form_valid(self, *args, **kwargs):
     form=kwargs['form']
     
     spot = (form.cleaned_data['pricing'] == 'spot')
     
     try:
         pool = EC2Pool(name = form.cleaned_data['name'],
                        vpc = form.cleaned_data['vpc'],
                        initial_instance_type = form.cleaned_data['initial_instance_type'],
                        size=form.cleaned_data['size'],
                        auto_terminate=form.cleaned_data['auto_terminate'],
                        smart_terminate=form.cleaned_data['smart_terminate'],
                        user = form.cleaned_data['vpc'].access_key.user,
                        spot_request=spot,
                        spot_price = form.cleaned_data['spot_bid_price']
                        )
         pool.save()
         
         key_pair=ec2_tools.create_key_pair(pool)
         pool.key_pair = key_pair
     except Exception as e:
         log.exception(e)
         self.request.session['errors'] = aws_tools.process_errors([e])
         return HttpResponseRedirect(reverse_lazy('ec2_pool_add'))
     pool.save()
     
     #Launch the pool
     try:
         errors = ec2_tools.launch_pool(pool)
         pool.save()
     
         #Connect to Bosco
         condor_tools.add_ec2_pool(pool)
     except Exception as e:
         log.exception(e)
         self.request.session['errors'] = aws_tools.process_errors([e])
         return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':pool.id}))
     
     if errors != []:
         self.request.session['errors'] = aws_tools.process_errors(errors)
         return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id': pool.id}))
     self.success_url = reverse_lazy('pool_test', kwargs={'pool_id':pool.id})
     
     return super(EC2PoolAddView, self).form_valid(*args, **kwargs)
Exemple #5
0
    def form_valid(self, *args, **kwargs):
        try:
            form=kwargs['form']
            user=self.request.user
            ec2_pool = EC2Pool.objects.get(id=kwargs['pool_id'])
            assert ec2_pool.vpc.access_key.user == self.request.user
            ec2_tools.refresh_pool(ec2_pool)
            extra_nodes=form.cleaned_data['instances_to_add']
            spot_price = form.cleaned_data['pricing'] == 'spot'
            spot_bid_price = form.cleaned_data['spot_bid_price']
            instance_type = form.cleaned_data['initial_instance_type']
            
            errors = ec2_tools.scale_up(ec2_pool=ec2_pool,
                               extra_nodes=extra_nodes,
                               instance_type=instance_type,
                               spot=spot_price,
                               spot_bid_price=spot_bid_price)
            ec2_pool.save()
            self.request.session['errors'] = aws_tools.process_errors(errors)

        except Exception, e:
            self.request.session['errors'] = aws_tools.process_errors([e])
            log.exception(e)
            return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':ec2_pool.id}))
Exemple #6
0
 def form_valid(self, *args, **kwargs):
     
     form = kwargs['form']
     auto_terminate = form.cleaned_data['auto_terminate']
     smart_terminate = form.cleaned_data['smart_terminate']
     
     pool = EC2Pool.objects.get(id=kwargs['pool_id'])
     assert pool.user == self.request.user 
     
     if pool.smart_terminate ==True and smart_terminate == False:
         #In this case we have to remove instance alarms
         errors = ec2_tools.remove_instances_alarms(pool)
         
         if errors != []:
             self.request.session['errors'] = aws_tools.process_errors([errors])
     
     pool.auto_terminate = auto_terminate
     pool.smart_terminate = smart_terminate
     
     pool.save()
     self.success_url = reverse_lazy('pool_details', kwargs={'pool_id': kwargs['pool_id']})
     return super(EC2PoolTerminationSettingsView, self).form_valid(*args, **kwargs)
Exemple #7
0
 def form_valid(self, *args, **kwargs):
     
     form = kwargs['form']
     auto_terminate = form.cleaned_data['auto_terminate']
     smart_terminate = form.cleaned_data['smart_terminate']
     
     pool = EC2Pool.objects.get(id=kwargs['pool_id'])
     assert pool.user == self.request.user 
     
     if pool.smart_terminate ==True and smart_terminate == False:
         #In this case we have to remove instance alarms
         errors = ec2_tools.remove_instances_alarms(pool)
         
         if errors != []:
             self.request.session['errors'] = aws_tools.process_errors([errors])
     
     pool.auto_terminate = auto_terminate
     pool.smart_terminate = smart_terminate
     
     pool.save()
     self.success_url = reverse_lazy('pool_details', kwargs={'pool_id': kwargs['pool_id']})
     return super(EC2PoolTerminationSettingsView, self).form_valid(*args, **kwargs)
Exemple #8
0
 def form_valid(self, *args, **kwargs):
     form=kwargs['form']
     
     spot = (form.cleaned_data['pricing'] == 'spot')
     
     try:
         pool = EC2Pool(name = form.cleaned_data['name'],
                        vpc = form.cleaned_data['vpc'],
                        initial_instance_type = form.cleaned_data['initial_instance_type'],
                        size=form.cleaned_data['size'],
                        auto_terminate=form.cleaned_data['auto_terminate'],
                        smart_terminate=form.cleaned_data['smart_terminate'],
                        user = form.cleaned_data['vpc'].access_key.user,
                        spot_request=spot,
                        spot_price = form.cleaned_data['spot_bid_price']
                        )
         pool.save()
         
         key_pair=ec2_tools.create_key_pair(pool)
         pool.key_pair = key_pair
     except Exception, e:
         log.exception(e)
         self.request.session['errors'] = aws_tools.process_errors([e])
         return HttpResponseRedirect(reverse_lazy('ec2_pool_add'))
Exemple #9
0
    def dispatch(self, request, *args, **kwargs):
        
        key_id = self.kwargs['key_id']
        key = AWSAccessKey.objects.get(id=key_id)
        kwargs['key'] = key
        assert key.user == request.user
        
        kwargs['show_loading_screen'] = True
        kwargs['loading_title'] = 'Removing key and associated VPC'
        kwargs['loading_description'] = 'Please be patient and do not navigate away from this page.'

        
        
        #Is this an original key or is it a copy
        if key.copy_of == None:
            original = True
        else:
            original = False
        
        if original:
            #Build a list of any pools and running jobs that will be terminated when this pool is terminated
            try:
                pools = EC2Pool.objects.filter(vpc__vpc_id = key.vpc.vpc_id)
            except:
                pools = []
            shared_keys = AWSAccessKey.objects.filter(copy_of=key)
            shared_user_ids = [shared_key.user.id for shared_key in shared_keys]
            kwargs['shared_users'] = User.objects.filter(id__in=shared_user_ids)

        

        else:
            #A copy of a key. If so, we'll not be deleting the real vpc, adn so
            try:
                pools = EC2Pool.objects.filter(vpc__id=key.vpc.id)
            except:
                pools = []
            
        kwargs['pools'] = pools
        errors=[]

        
        
        if kwargs['confirmed']:
            
            #Go through and terminate each of the running pools
            for pool in pools:
                #First, remove any running tasks
                running_tasks = pool.get_running_tasks()
                for task in running_tasks:
                    for subtask in task.subtask_set.all():
                        condor_tools.remove_task(subtask)
                    task.delete()
                
                other_tasks = Task.objects.filter(condor_pool=pool).exclude(pk__in=running_tasks)       
                #Then 'prune' the remaining tasks to remove the pool as a foreignkey
                for task in other_tasks:
                    task.condor_pool = None
                    task.set_custom_field('condor_pool_name', pool.name)
                    task.save()
    
                
                ec2_tools.terminate_pool(pool)
                
            if original:
                #We also need to delete the vpc (and any associated)
                try:
                    related = AWSAccessKey.objects.filter(copy_of=key)
                    for related_key in related:
                        related_key.delete()
                    
                    if key.vpc != None:
                        vpc_connection, ec2_connection = aws_tools.create_connections(key)
                            
                        errors += (vpc_tools.delete_vpc(key.vpc, vpc_connection, ec2_connection))
                        
                        if errors != []:
                            log.exception(errors)
                            request.session['errors'] = aws_tools.process_errors(errors)
                except Exception, e:
                    log.exception(e)
                #And delete the key
                key.delete()
            else:
                #Just delete the key object and the vpc
                key.delete()
                
            return HttpResponseRedirect(reverse_lazy('my_account_keys'))
Exemple #10
0
    def dispatch(self, request, *args, **kwargs):
        
        key_id = self.kwargs['key_id']
        key = AWSAccessKey.objects.get(id=key_id)
        kwargs['key'] = key
        assert key.user == request.user
        
        kwargs['show_loading_screen'] = True
        kwargs['loading_title'] = 'Removing key and associated VPC'
        kwargs['loading_description'] = 'Please be patient and do not navigate away from this page.'

        
        
        #Is this an original key or is it a copy
        if key.copy_of == None:
            original = True
        else:
            original = False
        
        if original:
            #Build a list of any pools and running jobs that will be terminated when this pool is terminated
            try:
                pools = EC2Pool.objects.filter(vpc__vpc_id = key.vpc.vpc_id)
            except:
                pools = []
            shared_keys = AWSAccessKey.objects.filter(copy_of=key)
            shared_user_ids = [shared_key.user.id for shared_key in shared_keys]
            kwargs['shared_users'] = User.objects.filter(id__in=shared_user_ids)

        

        else:
            #A copy of a key. If so, we'll not be deleting the real vpc, adn so
            try:
                pools = EC2Pool.objects.filter(vpc__id=key.vpc.id)
            except:
                pools = []
            
        kwargs['pools'] = pools
        errors=[]

        
        
        if kwargs['confirmed']:
            
            #Go through and terminate each of the running pools
            for pool in pools:
                #First, remove any running tasks
                running_tasks = pool.get_running_tasks()
                for task in running_tasks:
                    for subtask in task.subtask_set.all():
                        condor_tools.remove_task(subtask)
                    task.delete()
                
                other_tasks = Task.objects.filter(condor_pool=pool).exclude(pk__in=running_tasks)       
                #Then 'prune' the remaining tasks to remove the pool as a foreignkey
                for task in other_tasks:
                    task.condor_pool = None
                    task.set_custom_field('condor_pool_name', pool.name)
                    task.save()
    
                
                ec2_tools.terminate_pool(pool)
                
            if original:
                #We also need to delete the vpc (and any associated)
                try:
                    related = AWSAccessKey.objects.filter(copy_of=key)
                    for related_key in related:
                        related_key.delete()
                    
                    if key.vpc != None:
                        vpc_connection, ec2_connection = aws_tools.create_connections(key)
                            
                        errors += (vpc_tools.delete_vpc(key.vpc, vpc_connection, ec2_connection))
                        
                        if errors != []:
                            log.exception(errors)
                            request.session['errors'] = aws_tools.process_errors(errors)
                except Exception as e:
                    log.exception(e)
                #And delete the key
                key.delete()
            else:
                #Just delete the key object and the vpc
                key.delete()
                
            return HttpResponseRedirect(reverse_lazy('my_account_keys'))
        
        return super(KeysDeleteView, self).dispatch(request, *args, **kwargs)
Exemple #11
0
        pool.save()
        
        #Launch the pool
        try:
            errors = ec2_tools.launch_pool(pool)
            pool.save()
        
            #Connect to Bosco
            condor_tools.add_ec2_pool(pool)
        except Exception, e:
            log.exception(e)
            self.request.session['errors'] = aws_tools.process_errors([e])
            return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id':pool.id}))
        
        if errors != []:
            self.request.session['errors'] = aws_tools.process_errors(errors)
            return HttpResponseRedirect(reverse_lazy('pool_details', kwargs={'pool_id': pool.id}))
        self.success_url = reverse_lazy('pool_test', kwargs={'pool_id':pool.id})
        
        return super(EC2PoolAddView, self).form_valid(*args, **kwargs)

    def dispatch(self, request, *args, **kwargs):
        kwargs['show_loading_screen'] = True
        kwargs['loading_title'] = 'Launching pool'
        kwargs['loading_description'] = 'Please be patient and do not navigate away from this page. Launching a pool can take several minutes'
        
        #Get an aws key for this user. For the time being, just use the first one in the list
        user = request.user
        keys = AWSAccessKey.objects.filter(user=user)
        if keys.count() > 0:
            kwargs['key_id'] = keys[0].id