diff --git a/packages/flamenco/flamenco/job_compilers/__init__.py b/packages/flamenco/flamenco/job_compilers/__init__.py index fbd22c9ae5fc93b2d88244cefade9637de824ad8..0c2dd26379d17b5af1da3ea91bbd697d01307d46 100644 --- a/packages/flamenco/flamenco/job_compilers/__init__.py +++ b/packages/flamenco/flamenco/job_compilers/__init__.py @@ -23,7 +23,30 @@ from . import sleep, blender_render, blender_render_progressive def compile_job(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 + + 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 # Get the compiler class for the job type. @@ -35,6 +58,4 @@ def compile_job(job): raise KeyError('No compiler for job type %r' % job_type) assert issubclass(compiler_class, AbstractJobCompiler) - - compiler = compiler_class(task_manager=current_flamenco.task_manager) - compiler.compile(job) + return compiler_class diff --git a/packages/flamenco/flamenco/job_compilers/abstract_compiler.py b/packages/flamenco/flamenco/job_compilers/abstract_compiler.py index 42326ccf157a0e49e171e77b06ca2b6e620f34d6..e8f9f9b6241191c09414e30fa2572f4753df282c 100644 --- a/packages/flamenco/flamenco/job_compilers/abstract_compiler.py +++ b/packages/flamenco/flamenco/job_compilers/abstract_compiler.py @@ -34,5 +34,13 @@ class AbstractJobCompiler(object): return 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( - 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))) diff --git a/packages/flamenco/flamenco/jobs/eve_hooks.py b/packages/flamenco/flamenco/jobs/eve_hooks.py index 01adbd79c1f3ea2d148dc36053c19d67c914652d..69836844a86888e17fa27283ed46b11ca6abb553 100644 --- a/packages/flamenco/flamenco/jobs/eve_hooks.py +++ b/packages/flamenco/flamenco/jobs/eve_hooks.py @@ -10,6 +10,17 @@ from flamenco import current_flamenco, ROLES_REQUIRED_TO_VIEW_ITEMS 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): from flamenco import job_compilers @@ -107,7 +118,8 @@ def handle_job_status_update(job_doc, original_doc): 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_resource_flamenco_jobs += check_job_permission_fetch_resource