def validate_call(self, args, schema): errors = [] if type(args) is dict: val = validator.create_validator( validator.schema_to_dict(schema), resolver=self.get_schema_resolver(schema)) if self.strict_validation: val.fail_read_only = True else: val.remove_read_only = True errors += val.iter_errors(args) elif type(args) is list: val = validator.create_validator( validator.schema_to_list(schema), resolver=self.get_schema_resolver(schema)) if self.strict_validation: val.fail_read_only = True else: val.remove_read_only = True errors += val.iter_errors(args) else: raise RpcException(errno.EINVAL, "Function parameters should be passed as dictionary or array") if len(errors) > 0: errors = list(validator.serialize_errors(errors)) raise RpcException( errno.EINVAL, "One or more passed arguments failed schema verification", extra=errors)
def validate_call(self, args, schema): errors = [] if type(args) is dict: val = validator.DefaultDraft4Validator( validator.schema_to_dict(schema), resolver=self.get_schema_resolver(schema)) if self.strict_validation: val.fail_read_only = True else: val.remove_read_only = True errors += val.iter_errors(args) elif type(args) is list: val = validator.DefaultDraft4Validator( validator.schema_to_list(schema), resolver=self.get_schema_resolver(schema)) if self.strict_validation: val.fail_read_only = True else: val.remove_read_only = True errors += val.iter_errors(args) else: raise RpcException(errno.EINVAL, "Function parameters should be passed as dictionary or array") if len(errors) > 0: errors = list(validator.serialize_errors(errors)) raise RpcException( errno.EINVAL, "One or more passed arguments failed schema verification", extra=errors)
def submit(self, name, args, sender): if name not in self.dispatcher.tasks: self.logger.warning("Cannot submit task: unknown task type %s", name) raise RpcException(errno.EINVAL, "Unknown task type {0}".format(name)) errors = self.verify_schema(self.dispatcher.tasks[name], args) if len(errors) > 0: errors = list(validator.serialize_errors(errors)) self.logger.warning( "Cannot submit task {0}: schema verification failed with errors {1}".format(name, errors) ) raise RpcException(errno.EINVAL, "Schema verification failed", extra=errors) task = Task(self.dispatcher, name) task.user = sender.user.name task.session_id = sender.session_id task.created_at = datetime.now() task.clazz = self.dispatcher.tasks[name] task.args = copy.deepcopy(args) if self.debugger: for m in self.debugged_tasks: if fnmatch.fnmatch(name, m): task.debugger = self.debugger task.id = self.dispatcher.datastore.insert("tasks", task) task.set_state(TaskState.CREATED) self.task_queue.put(task) self.logger.info("Task %d submitted (type: %s, class: %s)", task.id, name, task.clazz) return task.id
def distribution_thread(self): while True: self.task_queue.peek() self.distribution_lock.acquire() task = self.task_queue.get() try: self.logger.debug("Picked up task %d: %s with args %s", task.id, task.name, task.args) errors = self.verify_schema(self.dispatcher.tasks[task.name], task.args, task.strict_verify) if len(errors) > 0: errors = list(validator.serialize_errors(errors)) self.logger.warning( "Cannot submit task {0}: schema verification failed with errors {1}" .format(task.name, errors)) raise ValidationException(extra=errors) task.instance = task.clazz(self.dispatcher, self.dispatcher.datastore) task.resources = task.instance.verify(*task.args) task.description = task.instance.describe(*task.args) if type(task.resources) is not list: raise ValueError( "verify() returned something else than resource list") except Exception as err: self.logger.warning("Cannot verify task %d: %s", task.id, err) task.set_state(TaskState.FAILED, TaskStatus(0), serialize_error(err)) task.ended.set() self.distribution_lock.release() if not isinstance(err, VerifyException): self.dispatcher.report_error( 'Task {0} verify() method raised invalid exception'. format(err), err) continue task.set_state(TaskState.WAITING) self.task_list.append(task) self.distribution_lock.release() self.schedule_tasks() if task.resources: self.logger.debug("Task %d assigned to resources %s", task.id, ','.join(task.resources))
def distribution_thread(self): while True: self.task_queue.peek() self.distribution_lock.acquire() task = self.task_queue.get() try: self.logger.debug("Picked up task %d: %s with args %s", task.id, task.name, task.args) errors = self.verify_schema(self.dispatcher.tasks[task.name], task.args, task.strict_verify) if len(errors) > 0: errors = list(validator.serialize_errors(errors)) self.logger.warning("Cannot submit task {0}: schema verification failed with errors {1}".format( task.name, errors )) raise ValidationException(extra=errors) task.instance = task.clazz(self.dispatcher, self.dispatcher.datastore) task.resources = task.instance.verify(*task.args) task.description = task.instance.describe(*task.args) if type(task.resources) is not list: raise ValueError("verify() returned something else than resource list") except Exception as err: self.logger.warning("Cannot verify task %d: %s", task.id, err) task.set_state(TaskState.FAILED, TaskStatus(0), serialize_error(err)) task.ended.set() self.distribution_lock.release() if not isinstance(err, VerifyException): self.dispatcher.report_error('Task {0} verify() method raised invalid exception'.format(err), err) continue task.set_state(TaskState.WAITING) self.task_list.append(task) self.distribution_lock.release() self.schedule_tasks() if task.resources: self.logger.debug("Task %d assigned to resources %s", task.id, ','.join(task.resources))