Beispiel #1
0
def clear_queue(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    if request.method == 'POST':
        try:
            queue.empty()
            messages.info(
                request,
                'You have successfully cleared the queue %s' % queue.name)
        except ResponseError as e:  # pragma: no cover
            if 'EVALSHA' in e.message:
                messages.error(
                    request,
                    'This action is not supported on Redis versions < 2.6.0, please use the bulk delete command instead'
                )
            else:
                raise e
        return redirect('rq_jobs', queue_index)

    context_data = {
        'title': 'Are you sure?',
        'queue_index': queue_index,
        'queue': queue,
    }
    return render(request, 'django_rq/clear_queue.html', context_data)
Beispiel #2
0
def jobs(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    items_per_page = 100
    num_jobs = queue.count
    page = int(request.GET.get('page', 1))

    if num_jobs > 0:
        last_page = int(ceil(num_jobs / items_per_page))
        page_range = range(1, last_page + 1)
        offset = items_per_page * (page - 1)
        jobs = queue.get_jobs(offset, items_per_page)
        for job in jobs:
            job.created_at = make_aware(job.created_at, utc)
            job.enqueued_at = make_aware(job.enqueued_at, utc)
    else:
        jobs = []
        page_range = []

    context_data = {
        'title': 'Jobs in %s' % queue.name,
        'queue': queue,
        'queue_index': queue_index,
        'jobs': jobs,
        'num_jobs': num_jobs,
        'page': page,
        'page_range': page_range,
    }
    return render(request, 'django_rq/templates/jobs.html', context_data)
Beispiel #3
0
def jobs(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    items_per_page = 100
    num_jobs = queue.count
    page = int(request.GET.get('page', 1))

    if num_jobs > 0:
        last_page = int(ceil(num_jobs / items_per_page))
        page_range = range(1, last_page + 1)
        offset = items_per_page * (page - 1)
        jobs = queue.get_jobs(offset, items_per_page)
    else:
        jobs = []
        page_range = []

    ###
    # Custom logic here
    for job in jobs:
        use_actual_name(job)
    ##

    context_data = {
        'queue': queue,
        'queue_index': queue_index,
        'jobs': jobs,
        'num_jobs': num_jobs,
        'page': page,
        'page_range': page_range,
        'job_status': 'Queued',
    }
    return render(request, 'django_rq/jobs.html', context_data)
Beispiel #4
0
def actions(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    if request.method == "POST" and request.POST.get("action", False):
        # Confirmation page for selected Action
        if request.POST.get("_selected_action", False):
            context_data = {
                "title": "Are you sure?",
                "queue_index": queue_index,
                "action": request.POST["action"],
                "job_ids": request.POST.getlist("_selected_action"),
                "queue": queue,
            }
            return render(request, "django_rq/confirm_action.html", context_data)

        # Performing the actual action
        elif request.POST.get("job_ids", False):
            job_ids = request.POST.getlist("job_ids")

            if request.POST["action"] == "delete":
                for job_id in job_ids:
                    job = Job.fetch(job_id, connection=queue.connection)
                    # Remove job id from queue and delete the actual job
                    queue.connection._lrem(queue.key, 0, job.id)
                    job.delete()
                messages.info(request, "You have successfully deleted %s jobs!" % len(job_ids))
            elif request.POST["action"] == "requeue":  # pragma: no cover
                for job_id in job_ids:
                    requeue_job(job_id, connection=queue.connection)
                messages.info(request, "You have successfully requeued %d  jobs!" % len(job_ids))

    return redirect("rq_jobs", queue_index)
Beispiel #5
0
def jobs(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    items_per_page = 100
    num_jobs = queue.count
    page = int(request.GET.get("page", 1))

    if num_jobs > 0:
        last_page = int(ceil(num_jobs / items_per_page))
        page_range = range(1, last_page + 1)
        offset = items_per_page * (page - 1)
        jobs = queue.get_jobs(offset, items_per_page)
        for job in jobs:
            job.created_at = make_aware(job.created_at, utc)
            job.enqueued_at = make_aware(job.enqueued_at, utc)
    else:
        jobs = []
        page_range = []

    context_data = {
        "title": "Jobs in %s" % queue.name,
        "queue": queue,
        "queue_index": queue_index,
        "jobs": jobs,
        "num_jobs": num_jobs,
        "page": page,
        "page_range": page_range,
    }
    return render(request, "django_rq/templates/jobs.html", context_data)
Beispiel #6
0
def clear_queue(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    if request.POST:
        queue.empty()
        messages.info(request, "You have successfully cleared the queue %s" % queue.name)
        return redirect("rq_jobs", queue_index)
    context_data = {"queue_index": queue_index, "queue": queue}
    return render(request, "django_rq/clear_queue.html", context_data)
Beispiel #7
0
def job_detail(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    try:
        job = Job.fetch(job_id, connection=queue.connection)
    except NoSuchJobError:
        raise Http404("Couldn't find job with this ID: %s" % job_id)

    context_data = {"queue_index": queue_index, "job": job, "queue": queue}
    return render(request, "django_rq/job_detail.html", context_data)
Beispiel #8
0
def requeue_job_view(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)
    if request.POST:
        requeue_job(job_id, connection=queue.connection)
        messages.info(request, "You have successfully requeued %s" % job.id)
        return redirect("rq_job_detail", queue_index, job_id)

    context_data = {"queue_index": queue_index, "job": job, "queue": queue}
    return render(request, "django_rq/delete_job.html", context_data)
Beispiel #9
0
def there_are_busy_workers(worker_name_regex):

    queue_index = 0
    queue = get_queue_by_index(queue_index)
    workers = Worker.all(queue.connection)

    if worker_name_regex is not None:
        workers = [worker for worker in workers if re.match(worker_name_regex, worker.name)]

    busy_workers = [worker.name for worker in workers if worker.get_state() == 'busy']
    print('busy_workers: ', busy_workers)
    return len(busy_workers) > 0
Beispiel #10
0
def job_detail(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    try:
        job = Job.fetch(job_id, connection=queue.connection)
        job.created_at = make_aware(job.created_at, utc)
        job.enqueued_at = make_aware(job.enqueued_at, utc)
    except NoSuchJobError:
        raise Http404("Couldn't find job with this ID: %s" % job_id)

    context_data = {"title": "Job Info", "queue_index": queue_index, "job": job, "queue": queue}
    return render(request, "django_rq/templates/job_detail.html", context_data)
Beispiel #11
0
def info(request, token):
    """
    Return the HireFire json data needed to scale worker dynos
    """
    if not settings.HIREFIRE_TOKEN:
        return HttpResponseBadRequest('Hirefire not configured.  Set the HIREFIRE_TOKEN environment variable on the app to use Hirefire for dyno scaling')
    if token != settings.HIREFIRE_TOKEN:
        return HttpResponseForbidden('Invalid token')

    current_tasks = 0

    queues = []
    for index, config in enumerate(QUEUES_LIST):

        queue = get_queue_by_index(index)
        connection = queue.connection

        # Only look at the default queue
        if queue.name != 'default':
            continue

        queue_data = {
            'name': queue.name,
            'jobs': queue.count,
            'index': index,
            'connection_kwargs': connection.connection_pool.connection_kwargs
        }

        connection = get_connection(queue.name)
        all_workers = Worker.all(connection=connection)
        queue_workers = [worker for worker in all_workers if queue in worker.queues]
        queue_data['workers'] = len(queue_workers)

        finished_job_registry = FinishedJobRegistry(queue.name, connection)
        started_job_registry = StartedJobRegistry(queue.name, connection)
        deferred_job_registry = DeferredJobRegistry(queue.name, connection)
        queue_data['finished_jobs'] = len(finished_job_registry)
        queue_data['started_jobs'] = len(started_job_registry)
        queue_data['deferred_jobs'] = len(deferred_job_registry)

        current_tasks += queue_data['jobs']
        current_tasks += queue_data['started_jobs']

        queues.append(queue_data)

    payload = [{
        'quantity': current_tasks,
        'name': 'worker',
    }]

    payload = json.dumps(payload)
    return HttpResponse(payload, content_type='application/json')
Beispiel #12
0
def get_queue_index(name='default'):
    """
    Returns the position of Queue for the named queue in QUEUES_LIST
    """
    queue_index = None
    connection = get_connection(name)
    connection_kwargs = connection.connection_pool.connection_kwargs
    for i in range(0, 100):
        q = get_queue_by_index(i)
        if q.name == name and q.connection.connection_pool.connection_kwargs == connection_kwargs:
            queue_index = i
            break
    return queue_index
Beispiel #13
0
def info(request, token):
    """
    Return the HireFire json data needed to scale worker dynos
    """
    if not settings.HIREFIRE_TOKEN:
        return HttpResponseBadRequest(
            "Hirefire not configured.  Set the HIREFIRE_TOKEN environment variable on the app to use Hirefire for dyno scaling"
        )
    if token != settings.HIREFIRE_TOKEN:
        raise PermissionDenied("Invalid token")

    current_tasks = 0

    queues = []
    for index, config in enumerate(QUEUES_LIST):

        queue = get_queue_by_index(index)
        connection = queue.connection

        # Only look at the default queue
        if queue.name != "default":
            continue

        queue_data = {
            "name": queue.name,
            "jobs": queue.count,
            "index": index,
            "connection_kwargs": connection.connection_pool.connection_kwargs,
        }

        connection = get_connection(queue.name)
        all_workers = Worker.all(connection=connection)
        queue_workers = [worker for worker in all_workers if queue in worker.queues]
        queue_data["workers"] = len(queue_workers)

        finished_job_registry = FinishedJobRegistry(queue.name, connection)
        started_job_registry = StartedJobRegistry(queue.name, connection)
        deferred_job_registry = DeferredJobRegistry(queue.name, connection)
        queue_data["finished_jobs"] = len(finished_job_registry)
        queue_data["started_jobs"] = len(started_job_registry)
        queue_data["deferred_jobs"] = len(deferred_job_registry)

        current_tasks += queue_data["jobs"]
        current_tasks += queue_data["started_jobs"]

        queues.append(queue_data)

    payload = [{"quantity": current_tasks, "name": "worker"}]

    payload = json.dumps(payload)
    return HttpResponse(payload, content_type="application/json")
Beispiel #14
0
def delete_job(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)

    if request.method == "POST":
        # Remove job id from queue and delete the actual job
        queue.connection._lrem(queue.key, 0, job.id)
        job.delete()
        messages.info(request, "You have successfully deleted %s" % job.id)
        return redirect("rq_jobs", queue_index)

    context_data = {"title": "Are you sure?", "queue_index": queue_index, "job": job, "queue": queue}
    return render(request, "django_rq/delete_job.html", context_data)
Beispiel #15
0
def get_failed_queue_index(name="default"):
    """
    Returns the position of FailedQueue for the named queue in QUEUES_LIST
    """
    # Get the index of FailedQueue for 'default' Queue in QUEUES_LIST
    queue_index = None
    connection = get_connection(name)
    connection_kwargs = connection.connection_pool.connection_kwargs
    for i in range(0, 100):
        q = get_queue_by_index(i)
        if q.name == "failed" and q.connection.connection_pool.connection_kwargs == connection_kwargs:
            queue_index = i
            break

    return queue_index
Beispiel #16
0
def requeue_job_view(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)

    if request.method == "POST":
        try:  # pragma: no cover
            requeue_job(job_id, connection=queue.connection)
            messages.info(request, "You have successfully requeued %s" % job.id)
            return redirect("rq_job_detail", queue_index, job_id)
        except InvalidJobOperationError as e:
            messages.error(request, e.message)
            return redirect("rq_jobs", queue_index)

    context_data = {"title": "Are you sure?", "queue_index": queue_index, "job": job, "queue": queue}
    return render(request, "django_rq/delete_job.html", context_data)
Beispiel #17
0
def stats(request):
    queues = []
    for index, config in enumerate(QUEUES_LIST):
        queue = get_queue_by_index(index)
        queue_data = {"name": queue.name, "jobs": queue.count, "index": index}
        if queue.name == "failed":
            queue_data["workers"] = "-"
        else:
            connection = get_connection(queue.name)
            all_workers = Worker.all(connection=connection)
            queue_workers = [worker for worker in all_workers if queue in worker.queues]
            queue_data["workers"] = len(queue_workers)
        queues.append(queue_data)

    context_data = {"queues": queues}
    return render(request, "django_rq/stats.html", context_data)
Beispiel #18
0
def job_detail(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    try:
        job = Job.fetch(job_id, connection=queue.connection)
        job.created_at = make_aware(job.created_at, utc)
        job.enqueued_at = make_aware(job.enqueued_at, utc)
    except NoSuchJobError:
        raise Http404("Couldn't find job with this ID: %s" % job_id)

    context_data = {
        'title': 'Job Info',
        'queue_index': queue_index,
        'job': job,
        'queue': queue,
    }
    return render(request, 'django_rq/templates/job_detail.html', context_data)
Beispiel #19
0
def job_detail(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    try:
        job = Job.fetch(job_id, connection=queue.connection)
    except NoSuchJobError:
        raise Http404("Couldn't find job with this ID: %s" % job_id)

    ###
    # Custom logic here
    use_actual_name(job)
    ##

    context_data = {
        'queue_index': queue_index,
        'job': job,
        'queue': queue,
    }
    return render(request, 'django_rq/job_detail.html', context_data)
Beispiel #20
0
def delete_job(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)

    if request.method == 'POST':
        # Remove job id from queue and delete the actual job
        queue.connection._lrem(queue.key, 0, job.id)
        job.delete()
        messages.info(request, 'You have successfully deleted %s' % job.id)
        return redirect('rq_jobs', queue_index)

    context_data = {
        'title': 'Are you sure?',
        'queue_index': queue_index,
        'job': job,
        'queue': queue,
    }
    return render(request, 'django_rq/delete_job.html', context_data)
Beispiel #21
0
def deferred_jobs(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    registry = DeferredJobRegistry(queue.name, queue.connection)

    items_per_page = 100
    num_jobs = len(registry)
    page = int(request.GET.get('page', 1))
    jobs = []

    if num_jobs > 0:
        last_page = int(ceil(num_jobs / items_per_page))
        page_range = range(1, last_page + 1)
        offset = items_per_page * (page - 1)
        job_ids = registry.get_job_ids(offset, items_per_page)

        for job_id in job_ids:
            try:
                jobs.append(Job.fetch(job_id, connection=queue.connection))
            except NoSuchJobError:
                pass

    else:
        page_range = []

    ###
    # Custom logic here
    for job in jobs:
        use_actual_name(job)
    ##

    context_data = {
        'queue': queue,
        'queue_index': queue_index,
        'jobs': jobs,
        'num_jobs': num_jobs,
        'page': page,
        'page_range': page_range,
        'job_status': 'Deferred',
    }
    return render(request, 'django_rq/jobs.html', context_data)
Beispiel #22
0
def clear_queue(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    if request.method == "POST":
        try:
            queue.empty()
            messages.info(request, "You have successfully cleared the queue %s" % queue.name)
        except ResponseError as e:  # pragma: no cover
            if "EVALSHA" in e.message:
                messages.error(
                    request,
                    "This action is not supported on Redis versions < 2.6.0, please use the bulk delete command instead",
                )
            else:
                raise e
        return redirect("rq_jobs", queue_index)

    context_data = {"title": "Are you sure?", "queue_index": queue_index, "queue": queue}
    return render(request, "django_rq/clear_queue.html", context_data)
Beispiel #23
0
def requeue_job_view(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)

    if request.method == 'POST':
        requeue_job(job_id, connection=queue.connection)
        messages.info(request, 'You have successfully requeued %s' % job.id)
        return redirect('rq_job_detail', queue_index, job_id)

    ###
    # Custom logic here
    use_actual_name(job)
    ##

    context_data = {
        'queue_index': queue_index,
        'job': job,
        'queue': queue,
    }
    return render(request, 'django_rq/delete_job.html', context_data)
Beispiel #24
0
def requeue_all(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    jobs = queue.get_jobs()

    if request.method == 'POST':
        # Confirmation received
        for job in jobs:
            requeue_job(job.id, connection=queue.connection)

        messages.info(
            request, 'You have successfully requeued all %d jobs!' % len(jobs))
        return redirect('rq_jobs', queue_index)

    context_data = {
        'queue_index': queue_index,
        'queue': queue,
        'total_jobs': len(jobs),
    }

    return render(request, 'django_rq/requeue_all.html', context_data)
Beispiel #25
0
def stats(request):
    queues = []
    for index, config in enumerate(QUEUES_LIST):

        queue = get_queue_by_index(index)
        connection = queue.connection

        queue_data = {
            'name': queue.name,
            'jobs': queue.count,
            'index': index,
            'connection_kwargs': connection.connection_pool.connection_kwargs
        }

        if queue.name == 'failed':
            queue_data['workers'] = '-'
            queue_data['finished_jobs'] = '-'
            queue_data['started_jobs'] = '-'
            queue_data['deferred_jobs'] = '-'

        else:
            connection = get_connection(queue.name)
            all_workers = Worker.all(connection=connection)
            queue_workers = [
                worker for worker in all_workers if queue in worker.queues
            ]
            queue_data['workers'] = len(queue_workers)

            finished_job_registry = FinishedJobRegistry(queue.name, connection)
            started_job_registry = StartedJobRegistry(queue.name, connection)
            deferred_job_registry = DeferredJobRegistry(queue.name, connection)
            queue_data['finished_jobs'] = len(finished_job_registry)
            queue_data['started_jobs'] = len(started_job_registry)
            queue_data['deferred_jobs'] = len(deferred_job_registry)

        queues.append(queue_data)

    context_data = {'queues': queues}
    return render(request, 'django_rq/stats.html', context_data)
Beispiel #26
0
def queues(request):
    queues = []
    for index, config in enumerate(QUEUES_LIST):
        queue = get_queue_by_index(index)
        queue_data = {
            'name': queue.name,
            'jobs': queue.count,
            'index': index,
        }
        if queue.name == 'failed':
            queue_data['workers'] = '-'
        else:
            connection = get_connection(queue.name)
            all_workers = Worker.all(connection=connection)
            queue_workers = [
                worker for worker in all_workers if queue in worker.queues
            ]
            queue_data['workers'] = len(queue_workers)
        queues.append(queue_data)

    context_data = {'title': 'RQ Queues', 'queues': queues}
    return render(request, 'django_rq/stats.html', context_data)
Beispiel #27
0
def requeue_job_view(request, queue_index, job_id):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    job = Job.fetch(job_id, connection=queue.connection)

    if request.method == 'POST':
        try:  # pragma: no cover
            requeue_job(job_id, connection=queue.connection)
            messages.info(request,
                          'You have successfully requeued %s' % job.id)
            return redirect('rq_job_detail', queue_index, job_id)
        except InvalidJobOperationError as e:
            messages.error(request, e.message)
            return redirect('rq_jobs', queue_index)

    context_data = {
        'title': 'Are you sure?',
        'queue_index': queue_index,
        'job': job,
        'queue': queue,
    }
    return render(request, 'django_rq/delete_job.html', context_data)
Beispiel #28
0
def actions(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)

    if request.method == 'POST' and request.POST.get('action', False):
        # Confirmation page for selected Action
        if request.POST.get('_selected_action', False):
            context_data = {
                'title': 'Are you sure?',
                'queue_index': queue_index,
                'action': request.POST['action'],
                'job_ids': request.POST.getlist('_selected_action'),
                'queue': queue,
            }
            return render(request, 'django_rq/confirm_action.html',
                          context_data)

        # Performing the actual action
        elif request.POST.get('job_ids', False):
            job_ids = request.POST.getlist('job_ids')

            if request.POST['action'] == 'delete':
                for job_id in job_ids:
                    job = Job.fetch(job_id, connection=queue.connection)
                    # Remove job id from queue and delete the actual job
                    queue.connection._lrem(queue.key, 0, job.id)
                    job.delete()
                messages.info(
                    request,
                    'You have successfully deleted %s jobs!' % len(job_ids))
            elif request.POST['action'] == 'requeue':  # pragma: no cover
                for job_id in job_ids:
                    requeue_job(job_id, connection=queue.connection)
                messages.info(
                    request,
                    'You have successfully requeued %d  jobs!' % len(job_ids))

    return redirect('rq_jobs', queue_index)
Beispiel #29
0
def queues(request):
    queues = []
    for index, config in enumerate(QUEUES_LIST):
        queue = get_queue_by_index(index)
        connection = queue.connection

        queue_data = {
            "name": queue.name,
            "jobs": queue.count,
            "index": index,
            "connection_kwargs": connection.connection_pool.connection_kwargs,
        }

        if queue.name == "failed":
            queue_data["workers"] = "-"
            queue_data["finished_jobs"] = "-"
            queue_data["started_jobs"] = "-"
            queue_data["deferred_jobs"] = "-"

        else:
            connection = get_connection(queue.name)
            all_workers = Worker.all(connection=connection)
            queue_workers = [worker for worker in all_workers if queue in worker.queues]
            queue_data["workers"] = len(queue_workers)

            finished_job_registry = FinishedJobRegistry(queue.name, connection)
            started_job_registry = StartedJobRegistry(queue.name, connection)
            deferred_job_registry = DeferredJobRegistry(queue.name, connection)
            queue_data["finished_jobs"] = len(finished_job_registry)
            queue_data["started_jobs"] = len(started_job_registry)
            queue_data["deferred_jobs"] = len(deferred_job_registry)

        queues.append(queue_data)

    context_data = {"title": "RQ Queues", "queues": queues}
    return render(request, "django_rq/stats.html", context_data)
Beispiel #30
0
def jobs(request, queue_index):
    queue_index = int(queue_index)
    queue = get_queue_by_index(queue_index)
    context_data = {"queue": queue, "queue_index": queue_index, "jobs": queue.jobs}

    return render(request, "django_rq/jobs.html", context_data)