Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
    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
Beispiel #4
0
    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))
Beispiel #5
0
    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))