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)
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, )
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)
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)