def dequeue(request): if request.method == 'POST': if not request.user.is_authenticated(): return HttpResponseForbidden() #TODO: Check that user can get tasks tasks = list() params = json.loads(str(request.read(), request.encoding or 'utf-8')) concurency = params.get('concurency', 1) limits = KolejkaLimits() limits.load(params.get('limits', dict())) tags = set(params.get('tags', list())) resources = KolejkaLimits() resources.update(limits) available_tasks = Task.objects.filter( assignee=None).order_by('time_create')[0:100] for t in available_tasks: if len(tasks) > concurency: break tt = t.task() if len(tasks) > 0 and tt.exclusive: continue if not set(tt.requires).issubset(tags): continue if resources.cpus is not None and ( tt.limits.cpus is None or tt.limits.cpus > resources.cpus): continue if resources.memory is not None and ( tt.limits.memory is None or tt.limits.memory > resources.memory): continue if resources.pids is not None and ( tt.limits.pids is None or tt.limits.pids > resources.pids): continue if resources.storage is not None and ( tt.limits.storage is None or tt.limits.storage > resources.storage): continue if resources.network is not None and (tt.limits.network is None or tt.limits.network and not resources.network): continue if resources.time is not None and ( tt.limits.time is None or tt.limits.time > resources.time): continue tasks.append(tt.dump()) t.assignee = request.user t.save() if resources.cpus is not None: resources.cpus -= tt.limits.cpus if resources.memory is not None: resources.memory -= tt.limits.memory if resources.pids is not None: resources.pids -= tt.limits.pids if resources.storage is not None: resources.storage -= tt.limits.storage if tt.exclusive: break response = dict() response['tasks'] = tasks return JsonResponse(response) return HttpResponseNotAllowed(['POST'])
class std_params: def __init__(self, params): self.session_id = params.get('session_id', None) self.secret = params.get('secret', None) self.limits = KolejkaLimits() self.limits.load(params.get('limits', {}))
def dequeue(request): if not request.user.has_perm('task.process_task'): return HttpResponseForbidden() if request.method != 'POST': return HttpResponseNotAllowed(['POST']) content_type = ContentType.objects.get_for_model(Task) tasks = list() params = json.loads(str(request.read(), request.encoding or 'utf-8')) concurency = params.get('concurency', 1) limits = KolejkaLimits() limits.load(params.get('limits', dict())) tags = set(params.get('tags', list())) resources = KolejkaLimits() resources.update(limits) image_usage = dict() available_tasks = Task.objects.filter(assignee__isnull=True).order_by('time_create')[0:100] for t in available_tasks: if len(tasks) > concurency: break tt = t.task() if len(tasks) > 0 and tt.exclusive: print('At exclusive') continue if not set(tt.requires).issubset(tags): continue if resources.cpus is not None and (tt.limits.cpus is None or tt.limits.cpus > resources.cpus): continue if tt.limits.gpus is not None and tt.limits.gpus > 0: if resources.gpus is not None and (tt.limits.gpus is None or tt.limits.gpus > resources.gpus): continue if resources.memory is not None and (tt.limits.memory is None or tt.limits.memory > resources.memory): continue if resources.swap is not None and (tt.limits.swap is None or tt.limits.swap > resources.swap): continue if resources.pids is not None and (tt.limits.pids is None or tt.limits.pids > resources.pids): continue if resources.storage is not None and (tt.limits.storage is None or tt.limits.storage > resources.storage): continue if resources.image is not None: if tt.limits.image is None: continue image_usage_add = max(image_usage.get(tt.image, 0), tt.limits.image) - image_usage.get(tt.image, 0) if image_usage_add > resources.image: continue if resources.workspace is not None and (tt.limits.workspace is None or tt.limits.workspace > resources.workspace): continue if resources.network is not None and (tt.limits.network is None or tt.limits.network and not resources.network): continue if resources.time is not None and (tt.limits.time is None or tt.limits.time > resources.time): continue tasks.append(tt.dump()) t.assignee = request.user t.time_assign = django.utils.timezone.now() t.save() if resources.cpus is not None: resources.cpus -= tt.limits.cpus if resources.gpus is not None: resources.gpus -= tt.limits.gpus if resources.memory is not None: resources.memory -= tt.limits.memory if resources.swap is not None: resources.swap -= tt.limits.swap if resources.pids is not None: resources.pids -= tt.limits.pids if resources.storage is not None: resources.storage -= tt.limits.storage if resources.image is not None: resources.image -= image_usage_add image_usage[tt.image] = max(image_usage.get(tt.image, 0), tt.limits.image) if resources.workspace is not None: resources.workspace -= tt.limits.workspace if tt.exclusive: break response = dict() response['tasks'] = tasks return OKResponse(response)