def get_workflow_logs(workflow_id_or_name): # noqa r"""Get workflow logs from a workflow engine. --- get: summary: Returns logs of a specific workflow from a workflow engine. description: >- This resource is expecting a workflow UUID and a filename to return its outputs. operationId: get_workflow_logs produces: - application/json parameters: - name: user in: query description: Required. UUID of workflow owner. required: true type: string - name: workflow_id_or_name in: path description: Required. Workflow UUID or name. required: true type: string - name: steps in: body description: Steps of a workflow. required: false schema: type: array description: List of step names to get logs for. items: type: string description: Step name. responses: 200: description: >- Request succeeded. Info about workflow, including the status is returned. schema: type: object properties: workflow_id: type: string workflow_name: type: string logs: type: string user: type: string examples: application/json: { "workflow_id": "256b25f4-4cfb-4684-b7a8-73872ef455a1", "workflow_name": "mytest-1", "logs": "{'workflow_logs': string, 'job_logs': { '256b25f4-4cfb-4684-b7a8-73872ef455a2': string, '256b25f4-4cfb-4684-b7a8-73872ef455a3': string, }, 'engine_specific': object, }", "user": "******" } 400: description: >- Request failed. The incoming data specification seems malformed. 404: description: >- Request failed. User does not exist. examples: application/json: { "message": "User 00000000-0000-0000-0000-000000000000 does not exist" } 500: description: >- Request failed. Internal controller error. examples: application/json: { "message": "Internal workflow controller error." } """ try: user_uuid = request.args["user"] workflow = _get_workflow_with_uuid_or_name(workflow_id_or_name, user_uuid) if not str(workflow.owner_id) == user_uuid: return ( jsonify({ "message": "User {} is not allowed to access workflow {}".format( user_uuid, workflow_id_or_name) }), 403, ) steps = None if request.json: steps = request.json if steps: workflow_logs = { "workflow_logs": None, "job_logs": build_workflow_logs(workflow, steps), "engine_specific": None, } else: workflow_logs = { "workflow_logs": workflow.logs, "job_logs": build_workflow_logs(workflow), "engine_specific": workflow.engine_specific, } return ( jsonify({ "workflow_id": workflow.id_, "workflow_name": get_workflow_name(workflow), "logs": json.dumps(workflow_logs), "user": user_uuid, }), 200, ) except ValueError: return ( jsonify({ "message": "REANA_WORKON is set to {0}, but " "that workflow does not exist. " "Please set your REANA_WORKON environment " "variable appropriately.".format(workflow_id_or_name) }), 404, ) except KeyError as e: return jsonify({"message": str(e)}), 400 except Exception as e: return jsonify({"message": str(e)}), 500
def get_workflow_status(workflow_id_or_name): # noqa r"""Get workflow status. --- get: summary: Get workflow status. description: >- This resource reports the status of workflow. operationId: get_workflow_status produces: - application/json parameters: - name: user in: query description: Required. UUID of workflow owner. required: true type: string - name: workflow_id_or_name in: path description: Required. Workflow UUID or name. required: true type: string responses: 200: description: >- Request succeeded. Info about workflow, including the status is returned. schema: type: object properties: id: type: string name: type: string created: type: string status: type: string user: type: string logs: type: string progress: type: object examples: application/json: { "id": "256b25f4-4cfb-4684-b7a8-73872ef455a1", "name": "mytest-1", "created": "2018-06-13T09:47:35.66097", "status": "running", "user": "******" } 400: description: >- Request failed. The incoming data specification seems malformed. examples: application/json: { "message": "Malformed request." } 403: description: >- Request failed. User is not allowed to access workflow. examples: application/json: { "message": "User 00000000-0000-0000-0000-000000000000 is not allowed to access workflow 256b25f4-4cfb-4684-b7a8-73872ef455a1" } 404: description: >- Request failed. Either User or Workflow does not exist. examples: application/json: { "message": "User 00000000-0000-0000-0000-000000000000 does not exist" } application/json: { "message": "Workflow 256b25f4-4cfb-4684-b7a8-73872ef455a1 does not exist" } 500: description: >- Request failed. Internal controller error. """ try: user_uuid = request.args["user"] workflow = _get_workflow_with_uuid_or_name(workflow_id_or_name, user_uuid) workflow_logs = build_workflow_logs(workflow) if not str(workflow.owner_id) == user_uuid: return ( jsonify({ "message": "User {} is not allowed to access workflow {}".format( user_uuid, workflow_id_or_name) }), 403, ) return ( jsonify({ "id": workflow.id_, "name": get_workflow_name(workflow), "created": workflow.created.strftime(WORKFLOW_TIME_FORMAT), "status": workflow.status.name, "progress": get_workflow_progress(workflow), "user": user_uuid, "logs": json.dumps(workflow_logs), }), 200, ) except ValueError: return ( jsonify({ "message": "REANA_WORKON is set to {0}, but " "that workflow does not exist. " "Please set your REANA_WORKON environment " "variable appropriately.".format(workflow_id_or_name) }), 404, ) except KeyError as e: return jsonify({"message": str(e)}), 400 except Exception as e: return jsonify({"message": str(e)}), 500