From bd20bf47a15ad80b9d7c599cc165ce93ffd5fb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= <sybren@stuvel.eu> Date: Tue, 31 Jan 2017 09:23:29 +0100 Subject: [PATCH] Server: some job setting validation --- packages/flamenco/flamenco/exceptions.py | 9 ++++++++ .../job_compilers/abstract_compiler.py | 23 +++++++++++++++++++ .../flamenco/job_compilers/blender_render.py | 6 +++++ 3 files changed, 38 insertions(+) create mode 100644 packages/flamenco/flamenco/exceptions.py diff --git a/packages/flamenco/flamenco/exceptions.py b/packages/flamenco/flamenco/exceptions.py new file mode 100644 index 00000000..9e88b117 --- /dev/null +++ b/packages/flamenco/flamenco/exceptions.py @@ -0,0 +1,9 @@ +"""Flamenco-specific exceptions.""" + + +class FlamencoException(Exception): + """Base exception for all Flamenco-specific exceptions.""" + + +class JobSettingError(FlamencoException): + """Raised when a job's settings contains errors.""" diff --git a/packages/flamenco/flamenco/job_compilers/abstract_compiler.py b/packages/flamenco/flamenco/job_compilers/abstract_compiler.py index 1215b083..42326ccf 100644 --- a/packages/flamenco/flamenco/job_compilers/abstract_compiler.py +++ b/packages/flamenco/flamenco/job_compilers/abstract_compiler.py @@ -7,9 +7,32 @@ class AbstractJobCompiler(object): task_manager = attr.ib(cmp=False, hash=False) _log = attrs_extra.log('%s.AbstractJobType' % __name__) + REQUIRED_SETTINGS = [] + def compile(self, job): """Compiles the job into a list of tasks. Calls self.task_manager.create_task(...) to create the task in the database. """ raise NotImplementedError() + + def validate_job_settings(self, job): + """Raises an exception if required settings are missing. + + :raises: flamenco.exceptions.JobSettingError + """ + from pillarsdk import Resource + + job_settings = job['settings'] + if isinstance(job_settings, Resource): + job_settings = job_settings.to_dict() + + missing = [key for key in self.REQUIRED_SETTINGS + if key not in job_settings] + + if not missing: + return + + from flamenco import exceptions + raise exceptions.JobSettingError( + u'Job %s is missing required settings: %s' % (job[u'_id'], u', '.join(missing))) diff --git a/packages/flamenco/flamenco/job_compilers/blender_render.py b/packages/flamenco/flamenco/job_compilers/blender_render.py index 65a464d4..ffc34468 100644 --- a/packages/flamenco/flamenco/job_compilers/blender_render.py +++ b/packages/flamenco/flamenco/job_compilers/blender_render.py @@ -1,3 +1,5 @@ +from pillar import attrs_extra + from .abstract_compiler import AbstractJobCompiler from . import commands, register_compiler @@ -5,9 +7,13 @@ from . import commands, register_compiler @register_compiler('blender-render') class BlenderRender(AbstractJobCompiler): """Basic Blender render job.""" + _log = attrs_extra.log('%s.BlenderRender' % __name__) + + REQUIRED_SETTINGS = ('blender_cmd', 'filepath', 'render_output', 'frames', 'chunk_size') def compile(self, job): self._log.info('Compiling job %s', job['_id']) + self.validate_job_settings(job) move_existing_task_id = self._make_move_out_of_way_task(job) task_count = 1 + self._make_render_tasks(job, move_existing_task_id) -- GitLab