def __init__(self, configuration=None): """Creates a job configuration from the given JSON dict :param configuration: The JSON dictionary :type configuration: dict :raises :class:`job.configuration.configuration.exceptions.InvalidJobConfiguration`: If the JSON is invalid """ if not configuration: configuration = {'job_task': {'docker_params': []}} self._configuration = configuration self._pre_task_workspace_names = set() self._job_task_workspace_names = set() self._post_task_workspace_names = set() try: validate(configuration, JOB_CONFIGURATION_SCHEMA) except ValidationError as validation_error: raise InvalidJobConfiguration(validation_error) self._populate_default_values() if self._configuration['version'] != CURRENT_VERSION: raise InvalidJobConfiguration('%s is an unsupported version number' % self._configuration['version']) self._validate_workspace_names()
def _validate_workspace_names(self): """Ensures that no tasks have duplicate workspace names :raises :class:`job.configuration.configuration.exceptions.InvalidJobConfiguration`: If there is a duplicate workspace name """ for workspace_dict in self._configuration['pre_task']['workspaces']: name = workspace_dict['name'] if name in self._pre_task_workspace_names: raise InvalidJobConfiguration( 'Duplicate workspace %s in pre task' % name) self._pre_task_workspace_names.add(name) for workspace_dict in self._configuration['job_task']['workspaces']: name = workspace_dict['name'] if name in self._job_task_workspace_names: raise InvalidJobConfiguration( 'Duplicate workspace %s in job task' % name) self._job_task_workspace_names.add(name) for workspace_dict in self._configuration['post_task']['workspaces']: name = workspace_dict['name'] if name in self._post_task_workspace_names: raise InvalidJobConfiguration( 'Duplicate workspace %s in post task' % name) self._post_task_workspace_names.add(name)
def add_pre_task_workspace(self, name, mode): """Adds a needed workspace to this job's pre task :param name: The name of the workspace :type name: string :param mode: The mode of the workspace, either MODE_RO or MODE_RW :type mode: string """ if mode not in [MODE_RO, MODE_RW]: raise Exception('%s is not a valid mode' % mode) if name in self._pre_task_workspace_names: raise InvalidJobConfiguration('Duplicate workspace %s in pre task' % name) self._configuration['pre_task']['workspaces'].append({'name': name, 'mode': mode})