示例#1
0
    def post(self, task_id: str, token: AccessToken.Payload):
        """ create a task from a requested_task_id """

        requested_task = RequestedTasks().find_one({"_id": task_id})
        if requested_task is None:
            raise TaskNotFound()

        request_args = TaskCreateSchema().load(request.args.to_dict())

        document = {}
        document.update(requested_task)

        try:
            Tasks().insert_one(requested_task)
        except pymongo.errors.DuplicateKeyError as exc:
            logger.exception(exc)
            response = jsonify({})
            response.status_code = 423  # Locked
            return response
        except Exception as exc:
            logger.exception(exc)
            raise exc

        payload = {"worker": request_args["worker_name"]}
        try:
            task_event_handler(task_id, TaskStatus.reserved, payload)
        except Exception as exc:
            logger.exception(exc)
            logger.error("unable to create task. reverting.")
            try:
                Tasks().delete_one({"_id": task_id})
            except Exception:
                logger.debug(f"unable to revert deletion of task {task_id}")
            raise exc

        try:
            RequestedTasks().delete_one({"_id": task_id})
        except Exception as exc:
            logger.exception(exc)  # and pass

        BROADCASTER.broadcast_updated_task(task_id, TaskStatus.reserved,
                                           payload)

        return make_response(jsonify(Tasks().find_one({"_id": task_id})),
                             HTTPStatus.CREATED)
示例#2
0
    def post(self, token: AccessToken.Payload):
        """ Create requested task from a list of schedule_names """

        try:
            request_json = NewRequestedTaskSchema().load(request.get_json())
        except ValidationError as e:
            raise InvalidRequestJSON(e.messages)

        schedule_names = request_json["schedule_names"]
        priority = request_json.get("priority", 0)
        worker = request_json.get("worker")

        # raise 404 if nothing to schedule
        if not Schedules().count_documents({
                "name": {
                    "$in": schedule_names
                },
                "enabled": True
        }):
            raise NotFound()

        requested_tasks = []
        for schedule_name in schedule_names:

            rq_task = request_a_schedule(schedule_name, token.username, worker,
                                         priority)
            if rq_task is None:
                continue

            requested_tasks.append(rq_task)

        if len(requested_tasks) > 1:
            BROADCASTER.broadcast_requested_tasks(requested_tasks)
        elif len(requested_tasks) == 1:
            BROADCASTER.broadcast_requested_task(requested_tasks[0])

        # trigger event handler
        for task in requested_tasks:
            task_event_handler(ObjectId(task["_id"]), "requested", {})

        return make_response(
            jsonify({"requested": [rt["_id"] for rt in requested_tasks]}),
            HTTPStatus.CREATED,
        )
示例#3
0
    def post(self, task_id: str, token: AccessToken.Payload):

        task = Tasks().find_one(
            {
                "status": {
                    "$in": TaskStatus.incomplete()
                },
                "_id": task_id
            }, {"_id": 1})
        if task is None:
            raise TaskNotFound()

        task_event_handler(task["_id"], TaskStatus.cancel_requested,
                           {"canceled_by": token.username})

        # broadcast cancel-request to worker
        BROADCASTER.broadcast_cancel_task(task_id)

        return Response(status=HTTPStatus.NO_CONTENT)
示例#4
0
    def patch(self, task_id: str, token: AccessToken.Payload):

        task = Tasks().find_one({"_id": task_id}, {"_id": 1})
        if task is None:
            raise TaskNotFound()

        try:
            request_json = TasKUpdateSchema().load(request.get_json())
            # empty dict passes the validator but troubles mongo
            if not request.get_json():
                raise ValidationError("Update can't be empty")
        except ValidationError as e:
            raise InvalidRequestJSON(e.messages)

        task_event_handler(task["_id"], request_json["event"],
                           request_json["payload"])

        BROADCASTER.broadcast_updated_task(task_id, request_json["event"],
                                           request_json["payload"])

        return Response(status=HTTPStatus.NO_CONTENT)