Skip to content
Snippets Groups Projects
Commit c4ed283f authored by Sybren A. Stüvel's avatar Sybren A. Stüvel
Browse files

Server: validate job settings before accepting POST

parent 6d92fba7
No related branches found
No related tags found
No related merge requests found
...@@ -23,7 +23,30 @@ from . import sleep, blender_render, blender_render_progressive ...@@ -23,7 +23,30 @@ from . import sleep, blender_render, blender_render_progressive
def compile_job(job): def compile_job(job):
"""Creates tasks from the given job.""" """Creates tasks from the given job."""
compiler = construct_job_compiler(job)
compiler.compile(job)
def validate_job(job):
"""Validates job settings.
:raises flamenco.exceptions.JobSettingError if the settings are bad.
"""
compiler = construct_job_compiler(job)
compiler.validate_job_settings(job)
def construct_job_compiler(job):
from flamenco import current_flamenco from flamenco import current_flamenco
compiler_class = find_job_compiler(job)
compiler = compiler_class(task_manager=current_flamenco.task_manager)
return compiler
def find_job_compiler(job):
from .abstract_compiler import AbstractJobCompiler from .abstract_compiler import AbstractJobCompiler
# Get the compiler class for the job type. # Get the compiler class for the job type.
...@@ -35,6 +58,4 @@ def compile_job(job): ...@@ -35,6 +58,4 @@ def compile_job(job):
raise KeyError('No compiler for job type %r' % job_type) raise KeyError('No compiler for job type %r' % job_type)
assert issubclass(compiler_class, AbstractJobCompiler) assert issubclass(compiler_class, AbstractJobCompiler)
return compiler_class
compiler = compiler_class(task_manager=current_flamenco.task_manager)
compiler.compile(job)
...@@ -34,5 +34,13 @@ class AbstractJobCompiler(object): ...@@ -34,5 +34,13 @@ class AbstractJobCompiler(object):
return return
from flamenco import exceptions from flamenco import exceptions
job_id = job.get(u'_id', u'')
if job_id:
job_id = u' ' + job_id
if len(missing) == 1:
setting = u'setting'
else:
setting = u'settings'
raise exceptions.JobSettingError( raise exceptions.JobSettingError(
u'Job %s is missing required settings: %s' % (job[u'_id'], u', '.join(missing))) u'Job%s is missing required %s: %s' % (job_id, setting, u', '.join(missing)))
...@@ -10,6 +10,17 @@ from flamenco import current_flamenco, ROLES_REQUIRED_TO_VIEW_ITEMS ...@@ -10,6 +10,17 @@ from flamenco import current_flamenco, ROLES_REQUIRED_TO_VIEW_ITEMS
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def before_inserting_jobs(jobs):
from flamenco import job_compilers, exceptions
for job in jobs:
try:
job_compilers.validate_job(job)
except exceptions.JobSettingError as ex:
# We generally only submit one job at a time anyway.
raise wz_exceptions.BadRequest('Invalid job: %s' % ex)
def after_inserting_jobs(jobs): def after_inserting_jobs(jobs):
from flamenco import job_compilers from flamenco import job_compilers
...@@ -107,7 +118,8 @@ def handle_job_status_update(job_doc, original_doc): ...@@ -107,7 +118,8 @@ def handle_job_status_update(job_doc, original_doc):
def setup_app(app): def setup_app(app):
app.on_inserted_flamenco_jobs = after_inserting_jobs app.on_insert_flamenco_jobs += before_inserting_jobs
app.on_inserted_flamenco_jobs += after_inserting_jobs
app.on_fetched_item_flamenco_jobs += check_job_permission_fetch app.on_fetched_item_flamenco_jobs += check_job_permission_fetch
app.on_fetched_resource_flamenco_jobs += check_job_permission_fetch_resource app.on_fetched_resource_flamenco_jobs += check_job_permission_fetch_resource
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment