diff --git a/beat/web/backend/templates/backend/scheduler.html b/beat/web/backend/templates/backend/scheduler.html index dbcedb9989cbbdbe7aa5f4abb4f90d91a184c042..14ff20fcf0a7297987e3bb2ea9940ee074e160a5 100644 --- a/beat/web/backend/templates/backend/scheduler.html +++ b/beat/web/backend/templates/backend/scheduler.html @@ -39,6 +39,7 @@ <div class="alert alert-success" role="alert" style="text-align: center;"> <i class="fa fa-clock-o fa-2x vertical-center"></i> Updated: {% now "H:i O, jS F Y" %} <div class="pull-right action-buttons"> + <a id="update-workers-button" class="btn btn-default btn-info" data-toggle="tooltip" data-placement="bottom" title="Force all workers to update their state" href="{% url 'backend:update-workers' %}"><i class="fa fa-times"></i> Update Workers</a> <a id="cancel-experiments-button" class="btn btn-default btn-delete" data-toggle="tooltip" data-placement="bottom" title="Cancel all running experiments" href="{% url 'backend:cancel-experiments' %}"><i class="fa fa-times"></i> Cancel Experiments</a> </div> </div> diff --git a/beat/web/backend/urls.py b/beat/web/backend/urls.py index 33c58bc66f3b8695e3d2ac437825667a95a5e066..e09f3f99036173ff494088275ccd84a8a297e8a2 100644 --- a/beat/web/backend/urls.py +++ b/beat/web/backend/urls.py @@ -42,6 +42,12 @@ urlpatterns = [ name='cancel-experiments', ), + url( + r'^update-workers/$', + views.update_workers, + name='update-workers', + ), + url( r'^environments/(?P<name>[-\.\w\s]+)/(?P<version>[-\.\w]+)/$', views.environment, diff --git a/beat/web/backend/views.py b/beat/web/backend/views.py index 0e408d3937ac0846da6726aefe4154c8cd4fe4de..8c51ca58d0e21ce5c80a375b78152828e2b6ac9e 100644 --- a/beat/web/backend/views.py +++ b/beat/web/backend/views.py @@ -78,6 +78,7 @@ def scheduler(request): queues=Queue.objects.order_by('memory_limit', 'max_slots_per_user'), cache_chart_data=simplejson.dumps(cache_chart_data), cache_gb=cache_gb, + helper_panel=getattr(settings, 'SCHEDULING_PANEL', False), ), context_instance=RequestContext(request)) @@ -129,7 +130,28 @@ def cancel_all_experiments(request): if not(request.user.is_superuser): return HttpResponseForbidden() - for q in Experiment.objects.filter(status__in=(Experiment.RUNNING, Experiment.SCHEDULED)): - q.cancel() + qs = Experiment.objects.filter(status__in=(Experiment.RUNNING, Experiment.SCHEDULED)) + counter = qs.count() + + for xp in qs: xp.cancel() + + messages.success(request, "Successfuly cancelled %d experiments" % counter) + + return HttpResponseRedirect(reverse('backend:scheduler')) + + +#---------------------------------------------------------- + + +@login_required +def update_workers(request): + + if not(request.user.is_superuser): return HttpResponseForbidden() + + qs = Worker.objects.all() + counter = qs.count() + qs.update(update=True) + + messages.success(request, "Requested %d workers for updates" % counter) return HttpResponseRedirect(reverse('backend:scheduler'))