Source code for oioioi.workers.views

import json
from operator import itemgetter  # pylint: disable=E0611

import xmlrpc.client
from django.conf import settings
from django.http import JsonResponse
from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from oioioi.base.admin import system_admin_menu_registry
from oioioi.base.permissions import enforce_condition, is_superuser

[docs]server = xmlrpc.client.ServerProxy(settings.SIOWORKERSD_URL, allow_none=True)
[docs]def get_info_about_workers(): return server.get_workers()
[docs]def get_all_names(): return [i['name'] for i in get_info_about_workers()]
[docs]def del_worker(l): for i in l: server.forget_worker(i)
@enforce_condition(is_superuser)
[docs]def show_info_about_workers(request): readonly = False announce = None warning = None delete = False if request.method == 'POST': if request.POST.get('delete'): readonly = True announce = _( """You are about to delete the selected workers. Please confirm""" ) delete = True if request.POST.get('confirm'): selected = [x for x in get_all_names() if request.POST.get("work-%s" % x)] del_worker(selected) announce = _("Successfully deleted selected workers") workers_info = get_info_about_workers() def transform_dict(d): select = request.POST.get('work-' + d['name']) info = d['info'] result = { 'name': d['name'], 'ram': info.get('available_ram_mb', '<unknown>'), 'concurrency': info['concurrency'], 'can_run_cpu_exec': info['can_run_cpu_exec'], 'select': select, } return result workers_info = list(map(transform_dict, workers_info)) if ( not any(map(itemgetter('can_run_cpu_exec'), workers_info)) and not settings.USE_UNSAFE_EXEC ): warning = _("There aren't any workers allowed to run cpu-exec jobs.") context = { 'workers': workers_info, 'readonly': readonly, 'announce': announce, 'warning': warning, 'delete': delete, } return render(request, 'workers/list_workers.html', context)
@enforce_condition(is_superuser)
[docs]def get_load_json(request): data = get_info_about_workers() capacity = 0 load = 0 for i in data: concurrency = int(i['info']['concurrency']) capacity += concurrency if bool(i['is_running_cpu_exec']): load += concurrency else: load += len(i['tasks']) return JsonResponse({'capacity': capacity, 'load': load})
system_admin_menu_registry.register( 'workers_management_admin', _("Manage workers"), lambda request: reverse('show_workers'), order=100, )