swagger: "2.0" info: description: "Capability service for the SSA Workspaces project" version: "1.0.0" title: "Capability Service" contact: email: "dms-ssa@nrao.edu" host: "ws-dev.nrao.edu" tags: - name: "capabilities" description: "Access capabilities and create requests" - name: "requests" description: "Access and submit capability requests" - name: "workflows" description: "Access and submit workflow requests" schemes: - "https" paths: /capabilities: get: tags: - "capabilities" summary: "View enabled capabilities" description: "" operationId: "view_enabled_capabilities" consumes: - "application/json" produces: - "application/json" responses: "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityList" /capabilities/available_qa_staff: get: tags: - "capabilities" summary: "View available QA staff" description: "" operationId: "retrieve_available_qa_staff_in_group" consumes: - "application/json" produces: - "application/json" parameters: - in: query name: "group" description: "" required: true type: "string" responses: "200": description: "successful operation" schema: $ref: "#/definitions/QaStaffList" "404": description: "no staff found" /capabilities/analyst_email: get: tags: - "capabilities" summary: "Get workspaces analyst email address" description: "" operationId: "get_analyst_email" consumes: - "application/json" produces: - "application/json" responses: "200": description: "successful operation" schema: $ref: "#/definitions/AnalystEmail" "404": description: "No email address found" /capability/create: post: tags: - "capabilities" summary: "Create a new capability" description: "" operationId: "create_capability" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid name supplied" "200": description: "successful operation" schema: $ref: "#/definitions/Capability" /capability/{name}: parameters: - $ref: "#/parameters/capability-name" get: tags: - "capabilities" summary: "View the named capability" description: "" operationId: "view_capability" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" "200": description: "successful operation" schema: $ref: "#/definitions/Capability" post: tags: - "capabilities" summary: "Update an existing capability" description: "" operationId: "edit_capability" consumes: - "application/json" produces: - "application/json" parameters: - in: "body" name: "body" description: "Capability object that needs to be added to the system" required: true schema: $ref: "#/definitions/Capability" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" "200": description: "successful operation" schema: $ref: "#/definitions/Capability" /capability/{name}/enable: post: tags: - "capabilities" summary: "Enable a capability" operationId: "enable_capability" consumes: - "application/json" produces: - "application/json" parameters: - $ref: "#/parameters/capability-name" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" /capability/{name}/disable: post: tags: - "capabilities" summary: "Disable a capability" operationId: "disable_capability" consumes: - "application/json" produces: - "application/json" parameters: - $ref: "#/parameters/capability-name" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" /capability/{name}/request: parameters: - $ref: "#/parameters/capability-name" get: tags: - "requests" summary: "View the active capability requests" description: "" operationId: "view_active_capability_requests" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/{name}/request/create: parameters: - $ref: "#/parameters/capability-name" post: tags: - "requests" summary: "Create a capability request" description: "" operationId: "create_capability_request" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/request/{id}/followon/{followon_type}: parameters: - $ref: "#/parameters/capability-request-id" - in: path name: "followon_type" description: "name of capability for follow-on" required: true type: "string" post: tags: - "requests" summary: "Create a follow-on capability request" description: "" operationId: "create_followon_capability_request" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/{name}/created-requests: parameters: - $ref: "#/parameters/capability-name" get: tags: - "requests" summary: "View the created capability requests" description: "" operationId: "view_created_capability_requests" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/request/{id}: parameters: - $ref: "#/parameters/capability-request-id" get: tags: - "requests" summary: "View the identified capability request" description: "" operationId: "view_capability_request" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" post: tags: - "requests" summary: "Update an existing capability request" description: "" operationId: "edit_capability_request" consumes: - "application/json" produces: - "application/json" parameters: - in: "body" name: "body" description: "Capability object that needs to be added to the system" required: true schema: $ref: "#/definitions/Capability" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" delete: tags: - "requests" summary: "Delete a capability request" description: "" operationId: "delete_capability_request" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid name supplied" "403": description: "Permission denied; capability request already executed" "404": description: "Capability not found" /capability/request/{id}/submit: post: tags: - "requests" summary: "Submit a capability request for execution" description: "" operationId: "submit_capability_request" consumes: - "application/json" produces: - "application/json" parameters: - $ref: "#/parameters/capability-request-id" responses: "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityExecution" "400": description: "Invalid name supplied" "404": description: "Capability not found" /capability/request/{id}/create-and-submit: post: tags: - "requests" summary: "Create and submit a capability request for execution in one step" description: "Mirror image of the workflow functionality of the same name." operationId: "create_and_submit_capability_request" consumes: - "application/json" produces: - "application/json" parameters: - $ref: "#/parameters/capability-request-id" responses: "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityExecution" "400": description: "Invalid name supplied" "404": description: "Capability not found" /capability/request/{id}/close: post: tags: - "requests" summary: "Close a failed capability request." description: "Sets a capability request to sealed." operationId: "close_capability_request" consumes: - "application/json" produces: - "application/json" parameters: - $ref: '#/parameters/capability-request-id' responses: "404": description: "Capability request not found" "200": description: "successful operation" schema: type: string /capability/request/{id}/cancel: post: tags: - "requests" summary: "Cancel a capability request" description: "" operationId: "cancel_capability_request" consumes: - "application/json" produces: - "application/json" parameters: - $ref: "#/parameters/capability-request-id" responses: "400": description: "Invalid name supplied" "404": description: "Capability not found" /capability/request/{id}/version/latest: parameters: - $ref: "#/parameters/capability-request-id" get: tags: - "requests" summary: "View the latest version of this capability request" description: "" operationId: "view_latest_version" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/request/{id}/version/create: parameters: - $ref: "#/parameters/capability-request-id" post: tags: - "requests" summary: "Create a new version of this capability request" description: "" operationId: "create_capability_version" consumes: - "application/json" produces: - "application/json" responses: "400": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityRequest" /capability/request/{id}/version/{version_id}/internal_notes: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/capability-version-id" get: tags: - "requests" summary: "Update the data analyst notes for this version" description: "" operationId: "view_internal_notes" consumes: - "application/json" produces: - "application/json" responses: "412": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: $ref: "#/definitions/Notes" post: tags: - "requests" summary: "Update the data analyst notes for this version" description: "" operationId: "update_internal_notes" consumes: - "application/json" produces: - "application/json" responses: "412": description: "Invalid capability name or request ID supplied" "404": description: "Capability request not found" "200": description: "successful operation" schema: type: string /capability/request/{id}/version/{version_id}/workflow_metadata: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/capability-version-id" get: tags: - "requests" summary: "Get the workflow metadata for this version" description: "" operationId: "view_version_metadata" consumes: - "application/json" produces: - "application/json" responses: "200": description: "successful operation" "404": description: "Capability request not found" post: tags: - "requests" summary: "Edit the workflow metadata for this version" description: "" operationId: "edit_version_metadata" consumes: - "application/json" produces: - "application/json" responses: "200": description: "successful operation" "404": description: "Capability request not found" /capability/request/{id}/version/srdp_compatible: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/capability-version-id" post: tags: - "requests" summary: "Set the SRDP compatibility flag" description: "" operationId: "change_srdp_compatibility_version_metadata" consumes: - "application/json" produces: - "application/json" responses: "200": description: "successful operation" "404": description: "Capability request not found" "500": description: "Unable to update" "400": description: "No metadata associated with this capability request version" /capability/request/{id}/version/latest/files/{filename}: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/filename" put: tags: - "requests" summary: "Files in the latest version of this capability request" description: "" operationId: "update_file_for_latest" responses: "200": description: "successful operation" schema: $ref: "#/definitions/CapabilityVersionFile" "412": description: "No versions exist for this capability request" "404": description: "Capability request not found" /capability/request/execution/{request_id}: parameters: - $ref: "#/parameters/workflow-request-id" get: tags: - "requests" summary: "Get the execution for this workflow request ID" description: "" operationId: "get_execution_from_workflow_id" responses: 412: description: "No capability exists for this workflow ID" 200: description: "successful operation" schema: $ref: "#/definitions/CapabilityExecution" /capability/request/{id}/version/{version_id}/execution: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/capability-version-id" get: tags: - "requests" summary: "Get the execution under this request and version" description: "" operationId: "get_execution_by_version" responses: 412: description: "No capability exists for this workflow ID" 200: description: "successful operation" schema: $ref: "#/definitions/CapabilityExecution" /capability/request/execution/{request_id}/create_version: parameters: - $ref: "#/parameters/workflow-request-id" post: tags: - "requests" summary: "Create a new capability version based on the supplied workflow request ID" description: "" operationId: "create_version_from_previous_execution_script" responses: 412: description: "No capability exists for this workflow ID" 200: description: "successful operation" schema: type: integer /workflows: get: tags: - "workflows" summary: "View the list of workflows" description: "" operationId: "Workflows.list_workflows" produces: - "application/json" responses: "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowList" /workflows/{name}: get: tags: - "workflows" summary: "View the named workflow" description: "" operationId: "Workflows.get_workflow" parameters: - $ref: '#/parameters/workflow-name' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow not found" "200": description: "successful operation" schema: $ref: "#/definitions/Workflow" /workflows/{name}/requests/create: post: tags: - "workflows" summary: "Create a workflow request" description: "" operationId: "WorkflowRequestRestService.create_workflow_request" parameters: - $ref: '#/parameters/workflow-name' - name: "body" in: "body" description: "Argument to the workflow" schema: type: "object" consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/create-and-submit: post: tags: - "workflows" summary: "Create and submit a workflow request" description: "" operationId: "WorkflowRequestRestService.create_and_submit_workflow_request" parameters: - $ref: '#/parameters/workflow-name' - name: "body" in: "body" description: "Argument to the workflow" schema: type: "object" consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/{request_id}: get: tags: - "workflows" summary: "View the workflow request with this ID" description: "" operationId: "WorkflowRequestRestService.get_workflow_request" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/{request_id}/dir/{*paths}: get: tags: - "workflows" summary: "View files in the working directory for the workflow request with this ID" description: "" operationId: "WorkflowWorkingDirRestService.show_workdir_content" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' - name: "*paths" in: "path" description: "path to the file under this workflow request" required: true type: "string" consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/{request_id}/weblog: get: tags: - "workflows" summary: "View the weblog under this workflow request" description: "" operationId: "WorkflowWorkingDirRestService.serve_weblog" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/{request_id}/qa_notes: get: tags: - "workflows" summary: "View the QA notes under this workflow request" description: "" operationId: "WorkflowWorkingDirRestService.get_qa_notes" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/Notes" post: tags: - "workflows" summary: "Save the QA notes for this workflow request" description: "" operationId: "WorkflowWorkingDirRestService.save_qa_notes" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/Notes" /workflows/{name}/requests/{request_id}/html: get: tags: - "workflows" summary: "Access a CARTA instance" description: "" operationId: "WorkflowWorkingDirRestService.serve_carta_wrapper" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' produces: - "text/html" responses: 200: description: "successful operation" /workflows/{name}/requests/{request_id}/htcondor_id: get: tags: - "workflows" summary: "Get the HTCondor ID for this request" description: "" operationId: "WorkflowRequestRestService.get_request_htcondor_id" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: 200: description: "successful operation" schema: $ref: "#/definitions/HtCondorId" /workflows/requests/stale/{days}: get: tags: - "workflows" summary: "Get a list of stale requests" description: "" operationId: "WorkflowRequestRestService.get_stale_requests" parameters: - in: path name: days type: integer required: true description: "days back to look" consumes: - "application/json" produces: - "application/json" responses: 200: description: "successful operation" schema: $ref: "#/definitions/StaleDirectories" /workflows/{name}/requests/{request_id}/files: get: tags: - "workflows" summary: "See the files under this workflow request" description: "" operationId: "WorkflowFilesRestService.get_file" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/octet-stream" produces: - "application/json" responses: "400": description: "File already exists" "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequestFile" /workflows/{name}/requests/{request_id}/files/{filename}: put: tags: - "workflows" summary: "Add a file to this workflow request" description: "" operationId: "WorkflowFilesRestService.add_file" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' - name: "filename" in: "path" description: "filename to add" type: "string" required: true consumes: - "application/octet-stream" produces: - "application/json" responses: "400": description: "File already exists" "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequestFile" /workflows/{name}/requests/{request_id}/submit: post: tags: - "workflows" summary: "Submit the workflow request for execution" description: "" operationId: "WorkflowRequestRestService.submit_workflow" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/{name}/requests/{request_id}/ingest: post: tags: - "workflows" summary: "Ingest the result of this workflow" description: "" operationId: "WorkflowRequestRestService.ingest" parameters: - $ref: '#/parameters/workflow-name' - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: $ref: "#/definitions/WorkflowRequest" /workflows/requests/{request_id}/abort: post: tags: - "workflows" summary: "Abort the execution of this running workflow" description: "" operationId: "WorkflowRequestRestService.abort" parameters: - $ref: '#/parameters/workflow-request-id' consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" schema: type: string /workflows/requests/vlass_ingest/{vlass_type}: post: tags: - "workflows" summary: "Ingest the result of this workflow using a VLASS ingest workflow" description: "" operationId: "WorkflowRequestRestService.ingest_vlass_products" parameters: - in: path name: vlass_type description: "type of VLASS product to ingest" required: true type: string consumes: - "application/json" produces: - "application/json" responses: "404": description: "Workflow request not found" "200": description: "successful operation" /workflows/requests/message-archive/{msg_type}: post: tags: - "workflows" summary: "Send a message to the archive" description: "" operationId: "WorkflowRequestRestService.message_archive" parameters: - in: path name: msg_type description: "the message type to send" required: true type: string - name: request_id in: body description: "the workflow request ID to use" schema: $ref: "#/definitions/ArchiveMessage" consumes: - "application/json" produces: - "application/json" responses: 200: description: "successful operation" schema: type: string /workflows/carta/requests/{request_id}/send-url-to-aat: post: tags: - "workflows" summary: "Send the CARTA URL to the AAT" description: "" operationId: "WorkflowRequestRestService.send_carta_url_to_aat" parameters: - $ref: "#/parameters/workflow-request-id" - in: body name: carta_url description: "The URL to the CARTA instance which is running" schema: type: string produces: - "application/json" responses: 200: description: "successful operation" schema: type: string /workflows/carta/requests/{request_id}/url: post: tags: - "workflows" summary: "Send the CARTA URL... somewhere else..." description: "" operationId: "WorkflowRequestRestService.send_carta_url" parameters: - $ref: "#/parameters/workflow-request-id" - in: body name: carta_url description: "The URL to the CARTA instance which is running" schema: type: string produces: - "application/json" responses: 200: description: "successful operation" schema: type: string /workflows/{name}/requests/{request_id}/fail: post: tags: - "workflows" summary: "Force fail a workflow" description: "" operationId: "WorkflowRequestRestService.send_force_fail" parameters: - $ref: "#/parameters/workflow-name" - $ref: "#/parameters/workflow-request-id" responses: 200: description: "successful operation" /workflows/{name}/requests/{request_id}/qa_fail: post: tags: - "workflows" summary: "Fail the quality assurance for a workflow" description: "" operationId: "WorkflowRequestRestService.qa_fail" parameters: - $ref: "#/parameters/workflow-name" - $ref: "#/parameters/workflow-request-id" responses: 200: description: "successful operation" /workflows/requests/{request_id}/qa/{msg_type}: post: tags: - "workflows" summary: "Force fail a workflow" description: "" operationId: "WorkflowRequestRestService.announce_qa" parameters: - $ref: "#/parameters/workflow-request-id" - in: path name: msg_type description: "The message type to send" required: true type: string - in: body name: version description: "The capability version to send this QA announcement for" required: true schema: $ref: "#/definitions/CapabilityVersion" responses: 200: description: "successful operation" /workflows/requests/cleaned: put: tags: - "workflows" summary: "Mark when a request was last cleaned" description: "" operationId: "WorkflowRequestRestService.set_request_cleaned" parameters: - in: body name: clean_parameters schema: $ref: "#/definitions/CleanRequest" required: true responses: 200: description: "successful operation" schema: type: string /healthcheck: get: tags: - "workflows" summary: "Returns a success value if the service is healthy" description: "" operationId: "WorkflowWorkingDirRestService.get_healthcheck" responses: 200: description: "successful operation" definitions: CapabilityList: type: "array" items: $ref: "#/definitions/Capability" Capability: type: "object" properties: name: type: "string" steps: type: "string" max_jobs: type: "integer" format: "int64" CapabilityExecution: type: "object" properties: type: type: "string" id: type: "integer" state_name: type: "string" queue_state: type: "string" capability_request_id: type: "integer" version_number: type: "integer" current_workflow_request_id: type: "integer" delivery_url: type: "string" created_at: type: "string" updated_at: type: "string" CapabilityRequest: type: "object" properties: body: type: "object" CapabilityVersion: type: "object" properties: type: type: "string" capability_request_id: type: "integer" version_number: type: "integer" current_execution: type: "string" state: type: "string" parameters: type: "object" workflow_metadata: type: "object" sealed: type: "boolean" files: type: "array" items: $ref: "#/definitions/CapabilityVersionFile" capability_name: type: "string" status_url: type: "string" internal_notes: type: "string" CapabilityVersionFile: type: "object" properties: type: type: "string" capability_request_id: type: "integer" version_number: type: "integer" filename: type: "string" content: type: "string" CleanRequest: type: "object" properties: directory: type: string update_to: type: string HtCondorId: type: "object" properties: htcondor_job_id: type: integer Notes: type: "object" properties: resp: type: "string" QaStaff: type: "object" properties: user_name: type: "string" group: type: "string" available: type: "boolean" email: type: "string" QaStaffList: type: "array" items: $ref: "#/definitions/QaStaff" AnalystEmail: type: "object" properties: resp: type: "string" StaleDirectories: type: "object" properties: stale_dirs: type: "string" ArchiveMessage: type: "object" properties: request_id: type: integer project_code: type: string WorkflowList: type: "array" items: $ref: "#/definitions/Workflow" Workflow: type: "object" properties: name: type: "string" WorkflowRequest: type: "object" properties: workflow_request_id: type: "integer" format: "int64" workflow_name: type: "string" argument: type: "object" state: type: "string" results_dir: type: "string" WorkflowRequestFile: type: "object" properties: workflow_request_id: type: "integer" format: "int64" filename: type: "string" content: type: "string" parameters: capability-name: name: "name" in: "path" description: "name of capability to view" required: true type: "string" capability-request-id: name: "id" in: "path" description: "ID of capability request" required: true type: "integer" format: "int64" capability-version-id: name: "version_id" in: "path" description: "ID of capability version" required: true type: "integer" format: "int64" filename: name: "filename" in: "path" description: "Filename" required: true type: "string" format: "string" workflow-name: name: "name" in: "path" description: "name of workflow this request belongs to" required: true type: "string" workflow-request-id: name: "request_id" in: "path" description: "ID of the request" type: "integer" required: true externalDocs: description: "More about the capability service" url: "http://builder.aoc.nrao.edu/ssa/architecture/workspaces"