Source code for pyfarm.master.user_interface.jobqueues

# No shebang line, this module is meant to be imported
#
# Copyright 2014 Ambient Entertainment GmbH & Co. KG
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

try:
    from httplib import SEE_OTHER, NOT_FOUND
except ImportError:  # pragma: no cover
    from http.client import SEE_OTHER, NOT_FOUND

from flask import render_template, request, redirect, url_for, flash
from sqlalchemy import or_

from pyfarm.core.logger import getLogger
from pyfarm.core.enums import WorkState
from pyfarm.master.application import db
from pyfarm.models.jobqueue import JobQueue
from pyfarm.models.job import Job

logger = getLogger("ui.jobqueues")

[docs]def jobqueues(): jobqueues = JobQueue.query.filter_by(parent_jobqueue_id=None).all() jobqueues = sorted(jobqueues, key=lambda x: x.num_assigned_agents(), reverse=True) top_level_jobs_query = Job.query.filter_by(queue=None) filters = {} if ("state_paused" not in request.args and "state_queued" not in request.args and "state_running" not in request.args and "state_done" not in request.args and "state_failed" not in request.args): filters["state_paused"] = False filters["state_queued"] = False filters["state_running"] = True filters["state_done"] = False filters["state_failed"] = False else: filters["state_paused"] = ("state_paused" in request.args and request.args["state_paused"].lower() == "true") filters["state_queued"] = ("state_queued" in request.args and request.args["state_queued"].lower() == "true") filters["state_running"] = ("state_running" in request.args and request.args["state_running"].lower() == "true") filters["state_done"] = ("state_done" in request.args and request.args["state_done"].lower() == "true") filters["state_failed"] = ("state_failed" in request.args and request.args["state_failed"].lower() == "true") wanted_states = [] if filters["state_paused"]: wanted_states.append(WorkState.PAUSED) if filters["state_running"]: wanted_states.append(WorkState.RUNNING) if filters["state_done"]: wanted_states.append(WorkState.DONE) if filters["state_failed"]: wanted_states.append(WorkState.FAILED) if filters["state_queued"]: top_level_jobs_query = top_level_jobs_query.filter(or_( Job.state == None, Job.state.in_(wanted_states))) else: top_level_jobs_query = top_level_jobs_query.filter( Job.state.in_(wanted_states)) top_level_jobs = sorted(top_level_jobs_query.all(), key=lambda x: x.num_assigned_agents(), reverse=True) return render_template("pyfarm/user_interface/jobqueues.html", jobqueues=jobqueues, top_level_jobs=top_level_jobs, WorkState=WorkState, filters=filters)
[docs]def jobqueue_create(): if request.method == 'POST': jobqueue = JobQueue() jobqueue.name = request.form["name"] if request.form["parent"] != "": jobqueue.parent_jobqueue_id = request.form["parent"] if request.form["minimum_agents"] != "": jobqueue.minimum_agents = request.form["minimum_agents"] if request.form["maximum_agents"] != "": jobqueue.maximum_agents = request.form["maximum_agents"] if request.form["priority"] != "": jobqueue.priority = request.form["priority"] if request.form["weight"] != "": jobqueue.weight = request.form["weight"] db.session.add(jobqueue) db.session.flush() jobqueue.fullpath = jobqueue.path() db.session.add(jobqueue) db.session.commit() flash("Created new jobqueue \"%s\"." % jobqueue.name) return redirect(url_for("jobqueues_index_ui"), SEE_OTHER) else: jobqueues = JobQueue.query parent = request.args.get("parent", None) if parent: parent = int(parent) return render_template("pyfarm/user_interface/jobqueue_create.html", parent=parent, jobqueues=jobqueues)
[docs]def jobqueue(queue_id): queue = JobQueue.query.filter_by(id=queue_id).first() if not queue: return (render_template( "pyfarm/error.html", error="Jobqueue %s not found" % queue_id), NOT_FOUND) if request.method == 'POST': if request.form["minimum_agents"] != "": queue.minimum_agents = request.form["minimum_agents"] else: queue.minimum_agents = None if request.form["maximum_agents"] != "": queue.maximum_agents = request.form.get("maximum_agents", None) else: queue.maximum_agents = None queue.priority = request.form["priority"] queue.weight = request.form["weight"] db.session.add(queue) db.session.commit() flash("Jobqueue %s has been updated." % queue.name) return redirect(url_for("single_jobqueue_ui", queue_id=queue_id), SEE_OTHER) else: return render_template("pyfarm/user_interface/jobqueue.html", queue=queue)
[docs]def delete_jobqueue(queue_id): with db.session.no_autoflush: queue = JobQueue.query.filter_by(id=queue_id).first() if not queue: return (render_template( "pyfarm/error.html", error="Jobqueue %s not found" % queue_id), NOT_FOUND) for subqueue in queue.children: delete_subqueue(subqueue) for job in queue.jobs: job.queue = queue.parent db.session.add(job) logger.info("Deleting jobqueue %s", queue.path()) db.session.delete(queue) db.session.commit() return redirect(url_for("jobqueues_index_ui"), SEE_OTHER)
[docs]def delete_subqueue(queue): for subqueue in queue.children: delete_subqueue(subqueue) for job in queue.jobs: job.queue = queue.parent db.session.add(job) logger.info("Deleting jobqueue %s", queue.path()) db.session.delete(queue) db.session.flush()