diff --git a/.github/workflows/swagger-validation.yml b/.github/workflows/swagger-validation.yml new file mode 100644 index 0000000000..6ea4f37e89 --- /dev/null +++ b/.github/workflows/swagger-validation.yml @@ -0,0 +1,55 @@ +name: Swagger Validation + +on: + pull_request: + branches: + - main + +jobs: + ensure-up-to-date: + name: Ensure Up-to-date + runs-on: ubuntu-latest + + steps: + # Checkout the repository + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + # Detect Go version from go.mod + - name: Detect Go version from go.mod + id: detect-go-version + run: | + go_version=$(grep '^go ' go.mod | awk '{print $2}') + echo "Go version detected: $go_version" + echo "golang-version=$go_version" >> $GITHUB_ENV + + # Setup Go using the detected version + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.golang-version }} + cache: true + + # Install swag (Swagger generator) + - name: Install Swag + run: | + go install github.com/swaggo/swag/cmd/swag@latest + + # Verify swag installation + - name: Verify Swag Installation + run: | + if ! command -v swag &> /dev/null; then + echo "Swag is not installed. Please ensure Go is properly configured and Swag is installed." + exit 1 + fi + + # Generate the swagger.json + - name: Generate Swagger file + run: make generate-swagger + + # Compare the newly generated swagger.json with the committed swagger.json + - name: Check for Swagger differences + run: | + git diff --exit-code pkg/swagger/swagger.json || (echo "Swagger is outdated. Please regenerate it with 'make generate-swagger' and commit the changes." && exit 1) diff --git a/Makefile b/Makefile index 54da79acc6..d1c41e134a 100644 --- a/Makefile +++ b/Makefile @@ -99,12 +99,15 @@ endif # it is missing. ################################################################################ .PHONY: precommit -precommit: +precommit: check-precommit @mkdir -p webui/build && touch webui/build/stub ${PRECOMMIT} run --all @rm webui/build/stub cd python && ${MAKE} pre-commit +# Check if pre-commit is installed only for precommit target +.PHONY: check-precommit +check-precommit: PRECOMMIT_HOOKS_INSTALLED ?= $(shell grep -R "pre-commit.com" .git/hooks) ifeq ($(PRECOMMIT_HOOKS_INSTALLED),) $(warning "Pre-commit is not installed in .git/hooks/pre-commit. Please run 'make install-pre-commit' to install it.") @@ -471,3 +474,7 @@ release: build-bacalhau .PHONY: spellcheck-code spellcheck-code: cspell lint -c cspell.yaml --quiet "**/*.{go,js,ts,jsx,tsx,md,yml,yaml,json}" + +.PHONY: generate-swagger +generate-swagger: + ./scripts/generate_swagger.sh \ No newline at end of file diff --git a/docs/swagger.json b/docs/swagger.json deleted file mode 100644 index f87dda4ee1..0000000000 --- a/docs/swagger.json +++ /dev/null @@ -1,2938 +0,0 @@ -{ - "schemes": [ - "http" - ], - "swagger": "2.0", - "info": { - "description": "This page is the reference of the Bacalhau REST API. Project docs are available at https://docs.bacalhau.org/. Find more information about Bacalhau at https://github.com/bacalhau-project/bacalhau.", - "title": "Bacalhau API", - "contact": { - "name": "Bacalhau Team", - "url": "https://github.com/bacalhau-project/bacalhau", - "email": "team@bacalhau.org" - }, - "license": { - "name": "Apache 2.0", - "url": "https://github.com/bacalhau-project/bacalhau/blob/main/LICENSE" - } - }, - "host": "localhost:1234", - "basePath": "/", - "paths": { - "/": { - "get": { - "produces": [ - "text/plain" - ], - "tags": [ - "Utils" - ], - "operationId": "home", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/agent/alive": { - "get": { - "produces": [ - "text/plain" - ], - "tags": [ - "Ops" - ], - "operationId": "agent/alive", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.IsAliveResponse" - } - } - } - } - }, - "/api/v1/agent/config": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Ops" - ], - "summary": "Returns the current configuration of the node.", - "operationId": "agent/config", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/types.Bacalhau" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/agent/debug": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Ops" - ], - "summary": "Returns debug information on what the current node is doing.", - "operationId": "agent/debug", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.DebugInfo" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/agent/node": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Ops" - ], - "summary": "Returns the info of the node.", - "operationId": "agent/node", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.NodeInfo" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/agent/version": { - "get": { - "description": "See https://github.com/bacalhau-project/bacalhau/releases for a complete list of `gitversion` tags.", - "produces": [ - "application/json" - ], - "tags": [ - "Ops" - ], - "summary": "Returns the build version running on the server.", - "operationId": "agent/version", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.GetVersionResponse" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/compute/debug": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Compute Node" - ], - "summary": "Returns debug information on what the current node is doing.", - "operationId": "apiServer/debug", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/healthz": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Utils" - ], - "operationId": "healthz", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/types.HealthInfo" - } - } - } - } - }, - "/api/v1/id": { - "get": { - "produces": [ - "text/plain" - ], - "tags": [ - "Utils" - ], - "summary": "Returns the id of the host node.", - "operationId": "id", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/livez": { - "get": { - "produces": [ - "text/plain" - ], - "tags": [ - "Utils" - ], - "operationId": "livez", - "responses": { - "200": { - "description": "TODO", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/node_info": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Utils" - ], - "summary": "Returns the info of the node.", - "operationId": "nodeInfo", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.NodeInfo" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs": { - "get": { - "description": "Returns a list of jobs.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns a list of jobs.", - "operationId": "orchestrator/listJobs", - "parameters": [ - { - "type": "string", - "description": "Namespace to get the jobs for", - "name": "namespace", - "in": "query" - }, - { - "type": "integer", - "description": "Limit the number of jobs returned", - "name": "limit", - "in": "query" - }, - { - "type": "string", - "description": "Token to get the next page of jobs", - "name": "next_token", - "in": "query" - }, - { - "type": "boolean", - "description": "Reverse the order of the jobs", - "name": "reverse", - "in": "query" - }, - { - "type": "string", - "description": "Order the jobs by the given field", - "name": "order_by", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.ListJobsResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "put": { - "description": "Submits a job to the orchestrator.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Submits a job to the orchestrator.", - "operationId": "orchestrator/putJob", - "parameters": [ - { - "description": "Job to submit", - "name": "putJobRequest", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/apimodels.PutJobRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.PutJobResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs/{id}": { - "get": { - "description": "Returns a job.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns a job.", - "operationId": "orchestrator/getJob", - "parameters": [ - { - "type": "string", - "description": "ID to get the job for", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Takes history and executions as options. If empty will not include anything else.", - "name": "include", - "in": "query" - }, - { - "type": "integer", - "description": "Number of history or executions to fetch. Should be used in conjugation with include", - "name": "limit", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.GetJobResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Stops a job.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Stops a job.", - "operationId": "orchestrator/stopJob", - "parameters": [ - { - "type": "string", - "description": "ID to stop the job for", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Reason for stopping the job", - "name": "reason", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.StopJobResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs/{id}/executions": { - "get": { - "description": "Returns the executions of a job.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns the executions of a job.", - "operationId": "orchestrator/jobExecutions", - "parameters": [ - { - "type": "string", - "description": "ID to get the job executions for", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Namespace to get the jobs for", - "name": "namespace", - "in": "query" - }, - { - "type": "integer", - "description": "Limit the number of executions returned", - "name": "limit", - "in": "query" - }, - { - "type": "string", - "description": "Token to get the next page of executions", - "name": "next_token", - "in": "query" - }, - { - "type": "boolean", - "description": "Reverse the order of the executions", - "name": "reverse", - "in": "query" - }, - { - "type": "string", - "description": "Order the executions by the given field", - "name": "order_by", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.ListJobExecutionsResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs/{id}/history": { - "get": { - "description": "Returns the history of a job.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns the history of a job.", - "operationId": "orchestrator/listHistory", - "parameters": [ - { - "type": "string", - "description": "ID to get the job history for", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Only return history since this time", - "name": "since", - "in": "query" - }, - { - "type": "string", - "description": "Only return history of this event type", - "name": "event_type", - "in": "query" - }, - { - "type": "string", - "description": "Only return history of this execution ID", - "name": "execution_id", - "in": "query" - }, - { - "type": "string", - "description": "Token to get the next page of the history events", - "name": "next_token", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.ListJobHistoryResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs/{id}/logs": { - "get": { - "description": "Establishes a WebSocket connection to stream output from the job specified by `id`\nThe stream will continue until either the client disconnects or the execution completes", - "consumes": [ - "application/json" - ], - "produces": [ - "application/octet-stream" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Streams the logs for a current job/execution via WebSocket", - "operationId": "orchestrator/logs", - "parameters": [ - { - "type": "string", - "description": "ID of the job to stream logs for", - "name": "id", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Fetch logs for a specific execution", - "name": "execution_id", - "in": "query" - }, - { - "type": "boolean", - "description": "Fetch historical logs", - "name": "tail", - "in": "query" - }, - { - "type": "boolean", - "description": "Follow the logs", - "name": "follow", - "in": "query" - } - ], - "responses": { - "101": { - "description": "Switching Protocols to WebSocket", - "schema": { - "$ref": "#/definitions/models.ExecutionLog" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/jobs/{id}/results": { - "get": { - "description": "Returns the results of a job.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns the results of a job.", - "operationId": "orchestrator/jobResults", - "parameters": [ - { - "type": "string", - "description": "ID to get the job results for", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.ListJobResultsResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/nodes": { - "get": { - "description": "Returns a list of orchestrator nodes.", - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Returns a list of orchestrator nodes.", - "operationId": "orchestrator/listNodes", - "parameters": [ - { - "type": "integer", - "description": "Limit the number of node returned", - "name": "limit", - "in": "query" - }, - { - "type": "string", - "description": "Token to get the next page of nodes", - "name": "next_token", - "in": "query" - }, - { - "type": "boolean", - "description": "Reverse the order of the nodes", - "name": "reverse", - "in": "query" - }, - { - "type": "string", - "description": "Order the nodes by given field", - "name": "order_by", - "in": "query" - }, - { - "type": "string", - "description": "Filter Approval", - "name": "filter_approval", - "in": "query" - }, - { - "type": "string", - "description": "Filter Status", - "name": "filter-status", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.ListNodesResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "Update an orchestrator node.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Update an orchestrator node.", - "operationId": "orchestrator/updateNode", - "parameters": [ - { - "type": "string", - "description": "ID of the orchestrator node.", - "name": "id", - "in": "path", - "required": true - }, - { - "description": "Put Node Request", - "name": "putNodeRequest", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/apimodels.PutNodeRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.PutNodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/orchestrator/nodes/{id}": { - "get": { - "description": "Get an orchestrator node", - "produces": [ - "application/json" - ], - "tags": [ - "Orchestrator" - ], - "summary": "Get an orchestrator node", - "operationId": "orchestrator/getNode", - "parameters": [ - { - "type": "string", - "description": "ID of the orchestrator node to fetch for.", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/apimodels.GetNodeResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/api/v1/version": { - "post": { - "description": "See https://github.com/bacalhau-project/bacalhau/releases for a complete list of `gitversion` tags.", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Misc" - ], - "summary": "Returns the build version running on the server.", - "operationId": "apiServer/version", - "parameters": [ - { - "description": "Request must specify a `client_id`. To retrieve your `client_id`, you can do the following: (1) submit a dummy job to Bacalhau (or use one you created before), (2) run `bacalhau describe \u003cjob-id\u003e` and fetch the `ClientID` field.", - "name": "VersionRequest", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/shared.VersionRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/shared.VersionResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - } - }, - "definitions": { - "apimodels.GetJobResponse": { - "type": "object", - "properties": { - "Executions": { - "$ref": "#/definitions/apimodels.ListJobExecutionsResponse" - }, - "History": { - "$ref": "#/definitions/apimodels.ListJobHistoryResponse" - }, - "Job": { - "$ref": "#/definitions/models.Job" - } - } - }, - "apimodels.GetNodeResponse": { - "type": "object", - "properties": { - "Node": { - "$ref": "#/definitions/models.NodeState" - } - } - }, - "apimodels.GetVersionResponse": { - "type": "object", - "properties": { - "BuildDate": { - "type": "string", - "example": "2022-11-16T14:03:31Z" - }, - "GOARCH": { - "type": "string", - "example": "amd64" - }, - "GOOS": { - "type": "string", - "example": "linux" - }, - "GitCommit": { - "type": "string", - "example": "d612b63108f2b5ce1ab2b9e02444eb1dac1d922d" - }, - "GitVersion": { - "type": "string", - "example": "v0.3.12" - }, - "Major": { - "type": "string", - "example": "0" - }, - "Minor": { - "type": "string", - "example": "3" - } - } - }, - "apimodels.HTTPCredential": { - "type": "object", - "properties": { - "params": { - "description": "For authorization schemes that provide multiple values, a map of names to\nvalues providing the credential", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "scheme": { - "description": "An HTTP authorization scheme, such as one registered with IANA\nhttps://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml", - "type": "string" - }, - "value": { - "description": "For authorization schemes that only provide a single value, such as\nBasic, the single string value providing the credential", - "type": "string" - } - } - }, - "apimodels.IsAliveResponse": { - "type": "object", - "properties": { - "Status": { - "type": "string" - } - } - }, - "apimodels.ListJobExecutionsResponse": { - "type": "object", - "properties": { - "Items": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Execution" - } - }, - "NextToken": { - "type": "string" - } - } - }, - "apimodels.ListJobHistoryResponse": { - "type": "object", - "properties": { - "Items": { - "type": "array", - "items": { - "$ref": "#/definitions/models.JobHistory" - } - }, - "NextToken": { - "type": "string" - } - } - }, - "apimodels.ListJobResultsResponse": { - "type": "object", - "properties": { - "Items": { - "type": "array", - "items": { - "$ref": "#/definitions/models.SpecConfig" - } - }, - "NextToken": { - "type": "string" - } - } - }, - "apimodels.ListJobsResponse": { - "type": "object", - "properties": { - "Items": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Job" - } - }, - "NextToken": { - "type": "string" - } - } - }, - "apimodels.ListNodesResponse": { - "type": "object", - "properties": { - "NextToken": { - "type": "string" - }, - "Nodes": { - "type": "array", - "items": { - "$ref": "#/definitions/models.NodeState" - } - } - } - }, - "apimodels.PutJobRequest": { - "type": "object", - "properties": { - "Job": { - "$ref": "#/definitions/models.Job" - }, - "credential": { - "$ref": "#/definitions/apimodels.HTTPCredential" - }, - "idempotencyToken": { - "type": "string" - }, - "namespace": { - "type": "string" - } - } - }, - "apimodels.PutJobResponse": { - "type": "object", - "properties": { - "EvaluationID": { - "type": "string" - }, - "JobID": { - "type": "string" - }, - "Warnings": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "apimodels.PutNodeRequest": { - "type": "object", - "properties": { - "Action": { - "type": "string" - }, - "Message": { - "type": "string" - }, - "NodeID": { - "type": "string" - }, - "credential": { - "$ref": "#/definitions/apimodels.HTTPCredential" - }, - "idempotencyToken": { - "type": "string" - }, - "namespace": { - "type": "string" - } - } - }, - "apimodels.PutNodeResponse": { - "type": "object", - "properties": { - "Error": { - "type": "string" - }, - "Success": { - "type": "boolean" - } - } - }, - "apimodels.StopJobResponse": { - "type": "object", - "properties": { - "EvaluationID": { - "type": "string" - } - } - }, - "models.AllocatedResources": { - "type": "object", - "properties": { - "Tasks": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/models.Resources" - } - } - } - }, - "models.BuildVersionInfo": { - "type": "object", - "properties": { - "BuildDate": { - "type": "string", - "example": "2022-11-16T14:03:31Z" - }, - "GOARCH": { - "type": "string", - "example": "amd64" - }, - "GOOS": { - "type": "string", - "example": "linux" - }, - "GitCommit": { - "type": "string", - "example": "d612b63108f2b5ce1ab2b9e02444eb1dac1d922d" - }, - "GitVersion": { - "type": "string", - "example": "v0.3.12" - }, - "Major": { - "type": "string", - "example": "0" - }, - "Minor": { - "type": "string", - "example": "3" - } - } - }, - "models.ComputeNodeInfo": { - "type": "object", - "properties": { - "AvailableCapacity": { - "$ref": "#/definitions/models.Resources" - }, - "EnqueuedExecutions": { - "type": "integer" - }, - "ExecutionEngines": { - "type": "array", - "items": { - "type": "string" - } - }, - "MaxCapacity": { - "$ref": "#/definitions/models.Resources" - }, - "MaxJobRequirements": { - "$ref": "#/definitions/models.Resources" - }, - "Publishers": { - "type": "array", - "items": { - "type": "string" - } - }, - "QueueCapacity": { - "$ref": "#/definitions/models.Resources" - }, - "RunningExecutions": { - "type": "integer" - }, - "StorageSources": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "models.DebugInfo": { - "type": "object", - "properties": { - "component": { - "type": "string" - }, - "info": {} - } - }, - "models.Event": { - "type": "object", - "properties": { - "Details": { - "description": "Any additional metadata that the system or user may need to know about\nthe event in order to handle it properly.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Message": { - "description": "A human-readable string giving the user all the information they need to\nunderstand and respond to an Event, if a response is required.", - "type": "string" - }, - "Timestamp": { - "description": "The moment the event occurred, which may be different to the moment it\nwas recorded.", - "type": "string" - }, - "Topic": { - "description": "The topic of the event. See the documentation on EventTopic.", - "type": "string" - } - } - }, - "models.Execution": { - "type": "object", - "properties": { - "AllocatedResources": { - "description": "AllocatedResources is the total resources allocated for the execution tasks.", - "allOf": [ - { - "$ref": "#/definitions/models.AllocatedResources" - } - ] - }, - "ComputeState": { - "description": "ComputeState observed state of the execution on the compute node", - "allOf": [ - { - "$ref": "#/definitions/models.State-models_ExecutionStateType" - } - ] - }, - "CreateTime": { - "description": "CreateTime is the time the execution has finished scheduling and been\nverified by the plan applier.", - "type": "integer" - }, - "DesiredState": { - "description": "DesiredState of the execution on the compute node", - "allOf": [ - { - "$ref": "#/definitions/models.State-models_ExecutionDesiredStateType" - } - ] - }, - "EvalID": { - "description": "ID of the evaluation that generated this execution", - "type": "string" - }, - "FollowupEvalID": { - "description": "FollowupEvalID captures a follow up evaluation created to handle a failed execution\nthat can be rescheduled in the future", - "type": "string" - }, - "ID": { - "description": "ID of the execution (UUID)", - "type": "string" - }, - "Job": { - "description": "TODO: evaluate using a copy of the job instead of a pointer", - "allOf": [ - { - "$ref": "#/definitions/models.Job" - } - ] - }, - "JobID": { - "description": "Job is the parent job of the task being allocated.\nThis is copied at execution time to avoid issues if the job\ndefinition is updated.", - "type": "string" - }, - "ModifyTime": { - "description": "ModifyTime is the time the execution was last updated.", - "type": "integer" - }, - "Name": { - "description": "Name is a logical name of the execution.", - "type": "string" - }, - "Namespace": { - "description": "Namespace is the namespace the execution is created in", - "type": "string" - }, - "NextExecution": { - "description": "NextExecution is the execution that this execution is being replaced by", - "type": "string" - }, - "NodeID": { - "description": "NodeID is the node this is being placed on", - "type": "string" - }, - "PreviousExecution": { - "description": "PreviousExecution is the execution that this execution is replacing", - "type": "string" - }, - "PublishedResult": { - "description": "the published results for this execution", - "allOf": [ - { - "$ref": "#/definitions/models.SpecConfig" - } - ] - }, - "Revision": { - "description": "Revision is increment each time the execution is updated.", - "type": "integer" - }, - "RunOutput": { - "description": "RunOutput is the output of the run command\nTODO: evaluate removing this from execution spec in favour of calling `bacalhau job logs`", - "allOf": [ - { - "$ref": "#/definitions/models.RunCommandResult" - } - ] - } - } - }, - "models.ExecutionDesiredStateType": { - "type": "integer", - "enum": [ - 0, - 1, - 2 - ], - "x-enum-varnames": [ - "ExecutionDesiredStatePending", - "ExecutionDesiredStateRunning", - "ExecutionDesiredStateStopped" - ] - }, - "models.ExecutionLog": { - "type": "object", - "properties": { - "line": { - "type": "string" - }, - "type": { - "$ref": "#/definitions/models.ExecutionLogType" - } - } - }, - "models.ExecutionLogType": { - "type": "integer", - "enum": [ - 0, - 1, - 2 - ], - "x-enum-varnames": [ - "executionLogTypeUnknown", - "ExecutionLogTypeSTDOUT", - "ExecutionLogTypeSTDERR" - ] - }, - "models.ExecutionStateType": { - "type": "integer", - "enum": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9 - ], - "x-enum-comments": { - "ExecutionStateBidAccepted": "aka running" - }, - "x-enum-varnames": [ - "ExecutionStateUndefined", - "ExecutionStateNew", - "ExecutionStateAskForBid", - "ExecutionStateAskForBidAccepted", - "ExecutionStateAskForBidRejected", - "ExecutionStateBidAccepted", - "ExecutionStateBidRejected", - "ExecutionStateCompleted", - "ExecutionStateFailed", - "ExecutionStateCancelled" - ] - }, - "models.GPU": { - "type": "object", - "properties": { - "index": { - "description": "Self-reported index of the device in the system", - "type": "integer" - }, - "memory": { - "description": "Total GPU memory in mebibytes (MiB)", - "type": "integer" - }, - "name": { - "description": "Model name of the GPU e.g. Tesla T4", - "type": "string" - }, - "pciaddress": { - "description": "PCI address of the device, in the format AAAA:BB:CC.C\nUsed to discover the correct device rendering cards", - "type": "string" - }, - "vendor": { - "description": "Maker of the GPU, e.g. NVidia, AMD, Intel", - "allOf": [ - { - "$ref": "#/definitions/models.GPUVendor" - } - ] - } - } - }, - "models.GPUVendor": { - "type": "string", - "enum": [ - "NVIDIA", - "AMD/ATI", - "Intel" - ], - "x-enum-varnames": [ - "GPUVendorNvidia", - "GPUVendorAMDATI", - "GPUVendorIntel" - ] - }, - "models.InputSource": { - "type": "object", - "properties": { - "Alias": { - "description": "Alias is an optional reference to this input source that can be used for\ndynamic linking to this input. (e.g. dynamic import in wasm by alias)", - "type": "string" - }, - "Source": { - "description": "Source is the source of the artifact to be downloaded, e.g a URL, S3 bucket, etc.", - "allOf": [ - { - "$ref": "#/definitions/models.SpecConfig" - } - ] - }, - "Target": { - "description": "Target is the path where the artifact should be mounted on", - "type": "string" - } - } - }, - "models.Job": { - "type": "object", - "properties": { - "Constraints": { - "description": "Constraints is a selector which must be true for the compute node to run this job.", - "type": "array", - "items": { - "$ref": "#/definitions/models.LabelSelectorRequirement" - } - }, - "Count": { - "description": "Count is the number of replicas that should be scheduled.", - "type": "integer" - }, - "CreateTime": { - "type": "integer" - }, - "ID": { - "description": "ID is a unique identifier assigned to this job.\nIt helps to distinguish jobs with the same name after they have been deleted and re-created.\nThe ID is generated by the server and should not be set directly by the client.", - "type": "string" - }, - "Labels": { - "description": "Labels is used to associate arbitrary labels with this job, which can be used\nfor filtering.\nkey=value", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Meta": { - "description": "Meta is used to associate arbitrary metadata with this job.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "ModifyTime": { - "type": "integer" - }, - "Name": { - "description": "Name is the logical name of the job used to refer to it.\nSubmitting a job with the same name as an existing job will result in an\nupdate to the existing job.", - "type": "string" - }, - "Namespace": { - "description": "Namespace is the namespace this job is running in.", - "type": "string" - }, - "Priority": { - "description": "Priority defines the scheduling priority of this job.", - "type": "integer" - }, - "Revision": { - "description": "Revision is a per-job monotonically increasing revision number that is incremented\non each update to the job's state or specification", - "type": "integer" - }, - "State": { - "description": "State is the current state of the job.", - "allOf": [ - { - "$ref": "#/definitions/models.State-models_JobStateType" - } - ] - }, - "Tasks": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Task" - } - }, - "Type": { - "description": "Type is the type of job this is, e.g. \"daemon\" or \"batch\".", - "type": "string" - }, - "Version": { - "description": "Version is a per-job monotonically increasing version number that is incremented\non each job specification update.", - "type": "integer" - } - } - }, - "models.JobHistory": { - "type": "object", - "properties": { - "Event": { - "$ref": "#/definitions/models.Event" - }, - "ExecutionID": { - "type": "string" - }, - "ExecutionState": { - "description": "Deprecated: Left for backward compatibility with v1.4.x clients", - "allOf": [ - { - "$ref": "#/definitions/models.StateChange-models_ExecutionStateType" - } - ] - }, - "JobID": { - "type": "string" - }, - "JobState": { - "description": "TODO: remove with v1.5\nDeprecated: Left for backward compatibility with v1.4.x clients", - "allOf": [ - { - "$ref": "#/definitions/models.StateChange-models_JobStateType" - } - ] - }, - "SeqNum": { - "type": "integer" - }, - "Time": { - "type": "string" - }, - "Type": { - "$ref": "#/definitions/models.JobHistoryType" - } - } - }, - "models.JobHistoryType": { - "type": "integer", - "enum": [ - 0, - 1, - 2 - ], - "x-enum-varnames": [ - "JobHistoryTypeUndefined", - "JobHistoryTypeJobLevel", - "JobHistoryTypeExecutionLevel" - ] - }, - "models.JobSelectionDataLocality": { - "type": "integer", - "enum": [ - 0, - 1 - ], - "x-enum-comments": { - "Anywhere": "anywhere", - "Local": "local" - }, - "x-enum-varnames": [ - "Local", - "Anywhere" - ] - }, - "models.JobStateType": { - "type": "integer", - "enum": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6 - ], - "x-enum-varnames": [ - "JobStateTypeUndefined", - "JobStateTypePending", - "JobStateTypeQueued", - "JobStateTypeRunning", - "JobStateTypeCompleted", - "JobStateTypeFailed", - "JobStateTypeStopped" - ] - }, - "models.LabelSelectorRequirement": { - "type": "object", - "properties": { - "Key": { - "description": "key is the label key that the selector applies to.", - "type": "string" - }, - "Operator": { - "description": "operator represents a key's relationship to a set of values.\nValid operators are In, NotIn, Exists and KeyNotInImap.", - "allOf": [ - { - "$ref": "#/definitions/selection.Operator" - } - ] - }, - "Values": { - "description": "values is an array of string values. If the operator is In or NotIn,\nthe values array must be non-empty. If the operator is Exists or KeyNotInImap,\nthe values array must be empty. This array is replaced during a strategic", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "models.Network": { - "type": "integer", - "enum": [ - 0, - 1, - 2 - ], - "x-enum-varnames": [ - "NetworkNone", - "NetworkFull", - "NetworkHTTP" - ] - }, - "models.NetworkConfig": { - "type": "object", - "properties": { - "Domains": { - "type": "array", - "items": { - "type": "string" - } - }, - "Type": { - "$ref": "#/definitions/models.Network" - } - } - }, - "models.NodeConnectionState": { - "type": "object", - "properties": { - "connection": { - "type": "integer", - "enum": [ - 0, - 1 - ], - "x-enum-varnames": [ - "connected", - "disconnected" - ] - } - } - }, - "models.NodeInfo": { - "type": "object", - "properties": { - "BacalhauVersion": { - "$ref": "#/definitions/models.BuildVersionInfo" - }, - "ComputeNodeInfo": { - "$ref": "#/definitions/models.ComputeNodeInfo" - }, - "Labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "NodeID": { - "description": "TODO replace all access on this field with the `ID()` method", - "type": "string" - }, - "NodeType": { - "$ref": "#/definitions/models.NodeType" - } - } - }, - "models.NodeMembershipState": { - "type": "object", - "properties": { - "membership": { - "type": "integer", - "enum": [ - 0, - 1, - 2, - 3 - ], - "x-enum-varnames": [ - "unknown", - "pending", - "approved", - "rejected" - ] - } - } - }, - "models.NodeState": { - "type": "object", - "properties": { - "Connection": { - "$ref": "#/definitions/models.NodeConnectionState" - }, - "Info": { - "$ref": "#/definitions/models.NodeInfo" - }, - "Membership": { - "$ref": "#/definitions/models.NodeMembershipState" - } - } - }, - "models.NodeType": { - "type": "integer", - "enum": [ - 0, - 1, - 2 - ], - "x-enum-varnames": [ - "nodeTypeUndefined", - "NodeTypeRequester", - "NodeTypeCompute" - ] - }, - "models.Resources": { - "type": "object", - "properties": { - "CPU": { - "description": "CPU units", - "type": "number" - }, - "Disk": { - "description": "Disk in bytes", - "type": "integer" - }, - "GPU": { - "description": "GPU units", - "type": "integer" - }, - "GPUs": { - "description": "GPU details", - "type": "array", - "items": { - "$ref": "#/definitions/models.GPU" - } - }, - "Memory": { - "description": "Memory in bytes", - "type": "integer" - } - } - }, - "models.ResourcesConfig": { - "type": "object", - "properties": { - "CPU": { - "description": "CPU https://github.com/BTBurke/k8sresource string", - "type": "string" - }, - "Disk": { - "description": "Memory github.com/dustin/go-humanize string", - "type": "string" - }, - "GPU": { - "type": "string" - }, - "Memory": { - "description": "Memory github.com/dustin/go-humanize string", - "type": "string" - } - } - }, - "models.ResultPath": { - "type": "object", - "properties": { - "Name": { - "description": "Name", - "type": "string" - }, - "Path": { - "description": "The path to the file/dir", - "type": "string" - } - } - }, - "models.RunCommandResult": { - "type": "object", - "properties": { - "ErrorMsg": { - "description": "Runner error", - "type": "string" - }, - "ExitCode": { - "description": "exit code of the run.", - "type": "integer" - }, - "StderrTruncated": { - "description": "bool describing if stderr was truncated", - "type": "boolean" - }, - "Stdout": { - "description": "stdout of the run. Yaml provided for `describe` output", - "type": "string" - }, - "StdoutTruncated": { - "description": "bool describing if stdout was truncated", - "type": "boolean" - }, - "stderr": { - "description": "stderr of the run.", - "type": "string" - } - } - }, - "models.SpecConfig": { - "type": "object", - "properties": { - "Params": { - "description": "Params is a map of the config params", - "type": "object", - "additionalProperties": true - }, - "Type": { - "description": "Type of the config", - "type": "string" - } - } - }, - "models.State-models_ExecutionDesiredStateType": { - "type": "object", - "properties": { - "Details": { - "description": "Details is a map of additional details about the state.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Message": { - "description": "Message is a human readable message describing the state.", - "type": "string" - }, - "StateType": { - "description": "StateType is the current state of the object.", - "allOf": [ - { - "$ref": "#/definitions/models.ExecutionDesiredStateType" - } - ] - } - } - }, - "models.State-models_ExecutionStateType": { - "type": "object", - "properties": { - "Details": { - "description": "Details is a map of additional details about the state.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Message": { - "description": "Message is a human readable message describing the state.", - "type": "string" - }, - "StateType": { - "description": "StateType is the current state of the object.", - "allOf": [ - { - "$ref": "#/definitions/models.ExecutionStateType" - } - ] - } - } - }, - "models.State-models_JobStateType": { - "type": "object", - "properties": { - "Details": { - "description": "Details is a map of additional details about the state.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Message": { - "description": "Message is a human readable message describing the state.", - "type": "string" - }, - "StateType": { - "description": "StateType is the current state of the object.", - "allOf": [ - { - "$ref": "#/definitions/models.JobStateType" - } - ] - } - } - }, - "models.StateChange-models_ExecutionStateType": { - "type": "object", - "properties": { - "New": { - "$ref": "#/definitions/models.ExecutionStateType" - }, - "Previous": { - "$ref": "#/definitions/models.ExecutionStateType" - } - } - }, - "models.StateChange-models_JobStateType": { - "type": "object", - "properties": { - "New": { - "$ref": "#/definitions/models.JobStateType" - }, - "Previous": { - "$ref": "#/definitions/models.JobStateType" - } - } - }, - "models.Task": { - "type": "object", - "properties": { - "Engine": { - "$ref": "#/definitions/models.SpecConfig" - }, - "Env": { - "description": "Map of environment variables to be used by the driver", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "InputSources": { - "description": "InputSources is a list of remote artifacts to be downloaded before running the task\nand mounted into the task.", - "type": "array", - "items": { - "$ref": "#/definitions/models.InputSource" - } - }, - "Meta": { - "description": "Meta is used to associate arbitrary metadata with this task.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Name": { - "description": "Name of the task", - "type": "string" - }, - "Network": { - "$ref": "#/definitions/models.NetworkConfig" - }, - "Publisher": { - "$ref": "#/definitions/models.SpecConfig" - }, - "Resources": { - "description": "ResourcesConfig is the resources needed by this task", - "allOf": [ - { - "$ref": "#/definitions/models.ResourcesConfig" - } - ] - }, - "ResultPaths": { - "description": "ResultPaths is a list of task volumes to be included in the task's published result", - "type": "array", - "items": { - "$ref": "#/definitions/models.ResultPath" - } - }, - "Timeouts": { - "$ref": "#/definitions/models.TimeoutConfig" - } - } - }, - "models.TimeoutConfig": { - "type": "object", - "properties": { - "ExecutionTimeout": { - "description": "ExecutionTimeout is the maximum amount of time a task is allowed to run in seconds.\nZero means no timeout, such as for a daemon task.", - "type": "integer" - }, - "QueueTimeout": { - "description": "QueueTimeout is the maximum amount of time a task is allowed to wait in the orchestrator\nqueue in seconds before being scheduled. Zero means no timeout.", - "type": "integer" - }, - "TotalTimeout": { - "description": "TotalTimeout is the maximum amount of time a task is allowed to complete in seconds.\nThis includes the time spent in the queue, the time spent executing and the time spent retrying.\nZero means no timeout.", - "type": "integer" - } - } - }, - "selection.Operator": { - "type": "string", - "enum": [ - "!", - "=", - "==", - "in", - "!=", - "notin", - "exists", - "gt", - "lt" - ], - "x-enum-varnames": [ - "DoesNotExist", - "Equals", - "DoubleEquals", - "In", - "NotEquals", - "NotIn", - "Exists", - "GreaterThan", - "LessThan" - ] - }, - "shared.VersionRequest": { - "type": "object", - "properties": { - "client_id": { - "type": "string", - "example": "ac13188e93c97a9c2e7cf8e86c7313156a73436036f30da1ececc2ce79f9ea51" - } - } - }, - "shared.VersionResponse": { - "type": "object", - "properties": { - "build_version_info": { - "$ref": "#/definitions/models.BuildVersionInfo" - } - } - }, - "types.API": { - "type": "object", - "properties": { - "Auth": { - "$ref": "#/definitions/types.AuthConfig" - }, - "Host": { - "description": "Host specifies the hostname or IP address on which the API server listens or the client connects.", - "type": "string" - }, - "Port": { - "description": "Port specifies the port number on which the API server listens or the client connects.", - "type": "integer" - }, - "TLS": { - "$ref": "#/definitions/types.TLS" - } - } - }, - "types.AuthConfig": { - "type": "object", - "properties": { - "AccessPolicyPath": { - "description": "AccessPolicyPath is the path to a file or directory that will be loaded as\nthe policy to apply to all inbound API requests. If unspecified, a policy\nthat permits access to all API endpoints to both authenticated and\nunauthenticated users (the default as of v1.2.0) will be used.", - "type": "string" - }, - "Methods": { - "description": "Methods maps \"method names\" to authenticator implementations. A method\nname is a human-readable string chosen by the person configuring the\nsystem that is shown to users to help them pick the authentication method\nthey want to use. There can be multiple usages of the same Authenticator\n*type* but with different configs and parameters, each identified with a\nunique method name.\n\nFor example, if an implementation wants to allow users to log in with\nGithub or Bitbucket, they might both use an authenticator implementation\nof type \"oidc\", and each would appear once on this provider with key /\nmethod name \"github\" and \"bitbucket\".\n\nBy default, only a single authentication method that accepts\nauthentication via client keys will be enabled.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/types.AuthenticatorConfig" - } - } - } - }, - "types.AuthenticatorConfig": { - "type": "object", - "properties": { - "PolicyPath": { - "type": "string" - }, - "Type": { - "type": "string" - } - } - }, - "types.Bacalhau": { - "type": "object", - "properties": { - "API": { - "$ref": "#/definitions/types.API" - }, - "Compute": { - "$ref": "#/definitions/types.Compute" - }, - "DataDir": { - "description": "DataDir specifies a location on disk where the bacalhau node will maintain state.", - "type": "string" - }, - "DisableAnalytics": { - "type": "boolean" - }, - "Engines": { - "$ref": "#/definitions/types.EngineConfig" - }, - "FeatureFlags": { - "$ref": "#/definitions/types.FeatureFlags" - }, - "InputSources": { - "$ref": "#/definitions/types.InputSourcesConfig" - }, - "JobAdmissionControl": { - "$ref": "#/definitions/types.JobAdmissionControl" - }, - "JobDefaults": { - "$ref": "#/definitions/types.JobDefaults" - }, - "Labels": { - "description": "Labels are key-value pairs used to describe and categorize the nodes.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Logging": { - "$ref": "#/definitions/types.Logging" - }, - "NameProvider": { - "description": "NameProvider specifies the method used to generate names for the node. One of: hostname, aws, gcp, uuid, puuid.", - "type": "string" - }, - "Orchestrator": { - "$ref": "#/definitions/types.Orchestrator" - }, - "Publishers": { - "$ref": "#/definitions/types.PublishersConfig" - }, - "ResultDownloaders": { - "$ref": "#/definitions/types.ResultDownloaders" - }, - "StrictVersionMatch": { - "description": "StrictVersionMatch indicates whether to enforce strict version matching.", - "type": "boolean" - }, - "UpdateConfig": { - "$ref": "#/definitions/types.UpdateConfig" - }, - "WebUI": { - "$ref": "#/definitions/types.WebUI" - } - } - }, - "types.BatchJobDefaultsConfig": { - "type": "object", - "properties": { - "Priority": { - "description": "Priority specifies the default priority allocated to a batch or ops job.\nThis value is used when the job hasn't explicitly set its priority requirement.", - "type": "integer" - }, - "Task": { - "$ref": "#/definitions/types.BatchTaskDefaultConfig" - } - } - }, - "types.BatchTaskDefaultConfig": { - "type": "object", - "properties": { - "Resources": { - "$ref": "#/definitions/types.ResourcesConfig" - }, - "Timeouts": { - "$ref": "#/definitions/types.TaskTimeoutConfig" - }, - "publisher": { - "$ref": "#/definitions/models.SpecConfig" - } - } - }, - "types.Cluster": { - "type": "object", - "properties": { - "Advertise": { - "description": "Advertise specifies the address to advertise to other cluster members.", - "type": "string" - }, - "Host": { - "description": "Host specifies the hostname or IP address for cluster communication.", - "type": "string" - }, - "Name": { - "description": "Name specifies the unique identifier for this orchestrator cluster.", - "type": "string" - }, - "Peers": { - "description": "Peers is a list of other cluster members to connect to on startup.", - "type": "array", - "items": { - "type": "string" - } - }, - "Port": { - "description": "Port specifies the port number for cluster communication.", - "type": "integer" - } - } - }, - "types.Compute": { - "type": "object", - "properties": { - "AllocatedCapacity": { - "$ref": "#/definitions/types.ResourceScaler" - }, - "AllowListedLocalPaths": { - "description": "AllowListedLocalPaths specifies a list of local file system paths that the compute node is allowed to access.", - "type": "array", - "items": { - "type": "string" - } - }, - "Auth": { - "description": "Auth specifies the authentication configuration for compute nodes to connect to the orchestrator.", - "allOf": [ - { - "$ref": "#/definitions/types.ComputeAuth" - } - ] - }, - "Enabled": { - "description": "Enabled indicates whether the compute node is active and available for job execution.", - "type": "boolean" - }, - "Heartbeat": { - "$ref": "#/definitions/types.Heartbeat" - }, - "Orchestrators": { - "description": "Orchestrators specifies a list of orchestrator endpoints that this compute node connects to.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "types.ComputeAuth": { - "type": "object", - "properties": { - "Token": { - "description": "Token specifies the key for compute nodes to be able to access the orchestrator.", - "type": "string" - } - } - }, - "types.Docker": { - "type": "object", - "properties": { - "ManifestCache": { - "description": "ManifestCache specifies the settings for the Docker manifest cache.", - "allOf": [ - { - "$ref": "#/definitions/types.DockerManifestCache" - } - ] - } - } - }, - "types.DockerManifestCache": { - "type": "object", - "properties": { - "Refresh": { - "description": "Refresh specifies the refresh interval for cache entries.", - "type": "integer" - }, - "Size": { - "description": "Size specifies the size of the Docker manifest cache.", - "type": "integer" - }, - "TTL": { - "description": "TTL specifies the time-to-live duration for cache entries.", - "type": "integer" - } - } - }, - "types.EngineConfig": { - "type": "object", - "properties": { - "Disabled": { - "description": "Disabled specifies a list of engines that are disabled.", - "type": "array", - "items": { - "type": "string" - } - }, - "Types": { - "$ref": "#/definitions/types.EngineConfigTypes" - } - } - }, - "types.EngineConfigTypes": { - "type": "object", - "properties": { - "Docker": { - "$ref": "#/definitions/types.Docker" - }, - "WASM": { - "$ref": "#/definitions/types.WASM" - } - } - }, - "types.EvaluationBroker": { - "type": "object", - "properties": { - "MaxRetryCount": { - "description": "MaxRetryCount specifies the maximum number of times an evaluation can be retried before being marked as failed.", - "type": "integer" - }, - "VisibilityTimeout": { - "description": "VisibilityTimeout specifies how long an evaluation can be claimed before it's returned to the queue.", - "type": "integer" - } - } - }, - "types.FeatureFlags": { - "type": "object", - "properties": { - "ExecTranslation": { - "description": "ExecTranslation enables the execution translation feature.", - "type": "boolean" - } - } - }, - "types.FreeSpace": { - "type": "object", - "properties": { - "root": { - "$ref": "#/definitions/types.MountStatus" - }, - "tmp": { - "$ref": "#/definitions/types.MountStatus" - } - } - }, - "types.HealthInfo": { - "type": "object", - "properties": { - "FreeSpace": { - "$ref": "#/definitions/types.FreeSpace" - } - } - }, - "types.Heartbeat": { - "type": "object", - "properties": { - "InfoUpdateInterval": { - "description": "InfoUpdateInterval specifies the time between updates of non-resource information to the orchestrator.", - "type": "integer" - }, - "Interval": { - "description": "Interval specifies the time between heartbeat signals sent to the orchestrator.", - "type": "integer" - }, - "ResourceUpdateInterval": { - "description": "ResourceUpdateInterval specifies the time between updates of resource information to the orchestrator.", - "type": "integer" - } - } - }, - "types.IPFSPublisher": { - "type": "object", - "properties": { - "Endpoint": { - "description": "Endpoint specifies the multi-address to connect to for IPFS. e.g /ip4/127.0.0.1/tcp/5001", - "type": "string" - } - } - }, - "types.IPFSStorage": { - "type": "object", - "properties": { - "Endpoint": { - "description": "Endpoint specifies the multi-address to connect to for IPFS. e.g /ip4/127.0.0.1/tcp/5001", - "type": "string" - } - } - }, - "types.InputSourcesConfig": { - "type": "object", - "properties": { - "Disabled": { - "description": "Disabled specifies a list of storages that are disabled.", - "type": "array", - "items": { - "type": "string" - } - }, - "MaxRetryCount": { - "description": "ReadTimeout specifies the maximum number of attempts for reading from a storage.", - "type": "integer" - }, - "ReadTimeout": { - "description": "ReadTimeout specifies the maximum time allowed for reading from a storage.", - "type": "integer" - }, - "Types": { - "$ref": "#/definitions/types.InputSourcesTypes" - } - } - }, - "types.InputSourcesTypes": { - "type": "object", - "properties": { - "IPFS": { - "$ref": "#/definitions/types.IPFSStorage" - } - } - }, - "types.IpfsDownloader": { - "type": "object", - "properties": { - "Endpoint": { - "description": "Endpoint specifies the multi-address to connect to for IPFS. e.g /ip4/127.0.0.1/tcp/5001", - "type": "string" - } - } - }, - "types.JobAdmissionControl": { - "type": "object", - "properties": { - "AcceptNetworkedJobs": { - "description": "AcceptNetworkedJobs indicates whether to accept jobs that require network access.", - "type": "boolean" - }, - "Locality": { - "description": "Locality specifies the locality of the job input data.", - "allOf": [ - { - "$ref": "#/definitions/models.JobSelectionDataLocality" - } - ] - }, - "ProbeExec": { - "description": "ProbeExec specifies the command to execute for probing job submission.", - "type": "string" - }, - "ProbeHTTP": { - "description": "ProbeHTTP specifies the HTTP endpoint for probing job submission.", - "type": "string" - }, - "RejectStatelessJobs": { - "description": "RejectStatelessJobs indicates whether to reject stateless jobs, i.e. jobs without inputs.", - "type": "boolean" - } - } - }, - "types.JobDefaults": { - "type": "object", - "properties": { - "Batch": { - "$ref": "#/definitions/types.BatchJobDefaultsConfig" - }, - "Daemon": { - "$ref": "#/definitions/types.LongRunningJobDefaultsConfig" - }, - "Ops": { - "$ref": "#/definitions/types.BatchJobDefaultsConfig" - }, - "Service": { - "$ref": "#/definitions/types.LongRunningJobDefaultsConfig" - } - } - }, - "types.LocalPublisher": { - "type": "object", - "properties": { - "Address": { - "description": "Address specifies the endpoint the publisher serves on.", - "type": "string" - }, - "Port": { - "description": "Port specifies the port the publisher serves on.", - "type": "integer" - } - } - }, - "types.Logging": { - "type": "object", - "properties": { - "Level": { - "description": "Level sets the logging level. One of: trace, debug, info, warn, error, fatal, panic.", - "type": "string" - }, - "LogDebugInfoInterval": { - "description": "LogDebugInfoInterval specifies the interval for logging debug information.", - "type": "integer" - }, - "Mode": { - "description": "Mode specifies the logging mode. One of: default, json.", - "type": "string" - } - } - }, - "types.LongRunningJobDefaultsConfig": { - "type": "object", - "properties": { - "Priority": { - "description": "Priority specifies the default priority allocated to a service or daemon job.\nThis value is used when the job hasn't explicitly set its priority requirement.", - "type": "integer" - }, - "Task": { - "$ref": "#/definitions/types.LongRunningTaskDefaultConfig" - } - } - }, - "types.LongRunningTaskDefaultConfig": { - "type": "object", - "properties": { - "Resources": { - "$ref": "#/definitions/types.ResourcesConfig" - } - } - }, - "types.MountStatus": { - "type": "object", - "properties": { - "All": { - "type": "integer" - }, - "Free": { - "type": "integer" - }, - "Used": { - "type": "integer" - } - } - }, - "types.NodeManager": { - "type": "object", - "properties": { - "DisconnectTimeout": { - "description": "DisconnectTimeout specifies how long to wait before considering a node disconnected.", - "type": "integer" - }, - "ManualApproval": { - "description": "ManualApproval, if true, requires manual approval for new compute nodes joining the cluster.", - "type": "boolean" - } - } - }, - "types.Orchestrator": { - "type": "object", - "properties": { - "Advertise": { - "description": "Advertise specifies URL to advertise to other servers.", - "type": "string" - }, - "Auth": { - "description": "Auth specifies the authentication configuration for compute nodes to connect to the orchestrator.", - "allOf": [ - { - "$ref": "#/definitions/types.OrchestratorAuth" - } - ] - }, - "Cluster": { - "$ref": "#/definitions/types.Cluster" - }, - "Enabled": { - "description": "Enabled indicates whether the orchestrator node is active and available for job submission.", - "type": "boolean" - }, - "EvaluationBroker": { - "$ref": "#/definitions/types.EvaluationBroker" - }, - "Host": { - "description": "Host specifies the hostname or IP address on which the Orchestrator server listens for compute node connections.", - "type": "string" - }, - "NodeManager": { - "$ref": "#/definitions/types.NodeManager" - }, - "Port": { - "description": "Host specifies the port number on which the Orchestrator server listens for compute node connections.", - "type": "integer" - }, - "Scheduler": { - "$ref": "#/definitions/types.Scheduler" - } - } - }, - "types.OrchestratorAuth": { - "type": "object", - "properties": { - "Token": { - "description": "Token specifies the key for compute nodes to be able to access the orchestrator", - "type": "string" - } - } - }, - "types.PublisherTypes": { - "type": "object", - "properties": { - "IPFS": { - "$ref": "#/definitions/types.IPFSPublisher" - }, - "Local": { - "$ref": "#/definitions/types.LocalPublisher" - }, - "S3": { - "$ref": "#/definitions/types.S3Publisher" - } - } - }, - "types.PublishersConfig": { - "type": "object", - "properties": { - "Disabled": { - "description": "Disabled specifies a list of publishers that are disabled.", - "type": "array", - "items": { - "type": "string" - } - }, - "Types": { - "$ref": "#/definitions/types.PublisherTypes" - } - } - }, - "types.ResourceScaler": { - "type": "object", - "properties": { - "CPU": { - "description": "CPU specifies the amount of CPU a compute node allocates for running jobs.\nIt can be expressed as a percentage (e.g., \"85%\") or a Kubernetes resource string (e.g., \"100m\").", - "type": "string" - }, - "Disk": { - "description": "Disk specifies the amount of Disk space a compute node allocates for running jobs.\nIt can be expressed as a percentage (e.g., \"85%\") or a Kubernetes resource string (e.g., \"10Gi\").", - "type": "string" - }, - "GPU": { - "description": "GPU specifies the amount of GPU a compute node allocates for running jobs.\nIt can be expressed as a percentage (e.g., \"85%\") or a Kubernetes resource string (e.g., \"1\").\nNote: When using percentages, the result is always rounded up to the nearest whole GPU.", - "type": "string" - }, - "Memory": { - "description": "Memory specifies the amount of Memory a compute node allocates for running jobs.\nIt can be expressed as a percentage (e.g., \"85%\") or a Kubernetes resource string (e.g., \"1Gi\").", - "type": "string" - } - } - }, - "types.ResourcesConfig": { - "type": "object", - "properties": { - "CPU": { - "description": "CPU specifies the default amount of CPU allocated to a task.\nIt uses Kubernetes resource string format (e.g., \"100m\" for 0.1 CPU cores).\nThis value is used when the task hasn't explicitly set its CPU requirement.", - "type": "string" - }, - "Disk": { - "description": "Disk specifies the default amount of disk space allocated to a task.\nIt uses Kubernetes resource string format (e.g., \"1Gi\" for 1 gibibyte).\nThis value is used when the task hasn't explicitly set its disk space requirement.", - "type": "string" - }, - "GPU": { - "description": "GPU specifies the default number of GPUs allocated to a task.\nIt uses Kubernetes resource string format (e.g., \"1\" for 1 GPU).\nThis value is used when the task hasn't explicitly set its GPU requirement.", - "type": "string" - }, - "Memory": { - "description": "Memory specifies the default amount of memory allocated to a task.\nIt uses Kubernetes resource string format (e.g., \"256Mi\" for 256 mebibytes).\nThis value is used when the task hasn't explicitly set its memory requirement.", - "type": "string" - } - } - }, - "types.ResultDownloaders": { - "type": "object", - "properties": { - "Disabled": { - "description": "Disabled is a list of downloaders that are disabled.", - "type": "array", - "items": { - "type": "string" - } - }, - "Timeout": { - "description": "Timeout specifies the maximum time allowed for a download operation.", - "type": "integer" - }, - "Types": { - "$ref": "#/definitions/types.ResultDownloadersTypes" - } - } - }, - "types.ResultDownloadersTypes": { - "type": "object", - "properties": { - "IPFS": { - "$ref": "#/definitions/types.IpfsDownloader" - } - } - }, - "types.S3Publisher": { - "type": "object", - "properties": { - "PreSignedURLDisabled": { - "description": "PreSignedURLDisabled specifies whether pre-signed URLs are enabled for the S3 provider.", - "type": "boolean" - }, - "PreSignedURLExpiration": { - "description": "PreSignedURLExpiration specifies the duration before a pre-signed URL expires.", - "type": "integer" - } - } - }, - "types.Scheduler": { - "type": "object", - "properties": { - "HousekeepingInterval": { - "description": "HousekeepingInterval specifies how often to run housekeeping tasks.", - "type": "integer" - }, - "HousekeepingTimeout": { - "description": "HousekeepingTimeout specifies the maximum time allowed for a single housekeeping run.", - "type": "integer" - }, - "QueueBackoff": { - "description": "QueueBackoff specifies the time to wait before retrying a failed job.", - "type": "integer" - }, - "WorkerCount": { - "description": "WorkerCount specifies the number of concurrent workers for job scheduling.", - "type": "integer" - } - } - }, - "types.TLS": { - "type": "object", - "properties": { - "AutoCert": { - "description": "AutoCert specifies the domain for automatic certificate generation.", - "type": "string" - }, - "AutoCertCachePath": { - "description": "AutoCertCachePath specifies the directory to cache auto-generated certificates.", - "type": "string" - }, - "CAFile": { - "description": "CAFile specifies the path to the Certificate Authority file.", - "type": "string" - }, - "CertFile": { - "description": "CertFile specifies the path to the TLS certificate file.", - "type": "string" - }, - "Insecure": { - "description": "Insecure allows insecure TLS connections (e.g., self-signed certificates).", - "type": "boolean" - }, - "KeyFile": { - "description": "KeyFile specifies the path to the TLS private key file.", - "type": "string" - }, - "SelfSigned": { - "description": "SelfSigned indicates whether to use a self-signed certificate.", - "type": "boolean" - }, - "UseTLS": { - "description": "UseTLS indicates whether to use TLS for client connections.", - "type": "boolean" - } - } - }, - "types.TaskTimeoutConfig": { - "type": "object", - "properties": { - "ExecutionTimeout": { - "description": "ExecutionTimeout is the maximum time allowed for task execution", - "type": "integer" - }, - "TotalTimeout": { - "description": "TotalTimeout is the maximum total time allowed for a task", - "type": "integer" - } - } - }, - "types.UpdateConfig": { - "type": "object", - "properties": { - "Interval": { - "description": "Interval specifies the time between update checks, when set to 0 update checks are not performed.", - "type": "integer" - } - } - }, - "types.WASM": { - "type": "object" - }, - "types.WebUI": { - "type": "object", - "properties": { - "Backend": { - "description": "Backend specifies the address and port of the backend API server.\nIf empty, the Web UI will use the same address and port as the API server.", - "type": "string" - }, - "Enabled": { - "description": "Enabled indicates whether the Web UI is enabled.", - "type": "boolean" - }, - "Listen": { - "description": "Listen specifies the address and port on which the Web UI listens.", - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/pkg/swagger/docs.go b/pkg/swagger/docs.go index 8e243cd8f2..520cf73c4b 100644 --- a/pkg/swagger/docs.go +++ b/pkg/swagger/docs.go @@ -2297,14 +2297,14 @@ const docTemplate = `{ "types.BatchTaskDefaultConfig": { "type": "object", "properties": { + "Publisher": { + "$ref": "#/definitions/types.DefaultPublisherConfig" + }, "Resources": { "$ref": "#/definitions/types.ResourcesConfig" }, "Timeouts": { "$ref": "#/definitions/types.TaskTimeoutConfig" - }, - "publisher": { - "$ref": "#/definitions/models.SpecConfig" } } }, @@ -2382,6 +2382,22 @@ const docTemplate = `{ } } }, + "types.DefaultPublisherConfig": { + "type": "object", + "properties": { + "Params": { + "description": "Params specifies the publisher configuration data.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "Type": { + "description": "Type specifies the publisher type. e.g. \"s3\", \"local\", \"ipfs\", etc.", + "type": "string" + } + } + }, "types.Docker": { "type": "object", "properties": { diff --git a/pkg/swagger/swagger.json b/pkg/swagger/swagger.json index f87dda4ee1..5fe7a0b319 100644 --- a/pkg/swagger/swagger.json +++ b/pkg/swagger/swagger.json @@ -2293,14 +2293,14 @@ "types.BatchTaskDefaultConfig": { "type": "object", "properties": { + "Publisher": { + "$ref": "#/definitions/types.DefaultPublisherConfig" + }, "Resources": { "$ref": "#/definitions/types.ResourcesConfig" }, "Timeouts": { "$ref": "#/definitions/types.TaskTimeoutConfig" - }, - "publisher": { - "$ref": "#/definitions/models.SpecConfig" } } }, @@ -2378,6 +2378,22 @@ } } }, + "types.DefaultPublisherConfig": { + "type": "object", + "properties": { + "Params": { + "description": "Params specifies the publisher configuration data.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "Type": { + "description": "Type specifies the publisher type. e.g. \"s3\", \"local\", \"ipfs\", etc.", + "type": "string" + } + } + }, "types.Docker": { "type": "object", "properties": { diff --git a/scripts/generate_swagger.sh b/scripts/generate_swagger.sh index ff6aa97ebc..f24be6fbc3 100755 --- a/scripts/generate_swagger.sh +++ b/scripts/generate_swagger.sh @@ -2,7 +2,6 @@ PATH_TO_PROJECT_ROOT=$(git rev-parse --show-toplevel) SWAGGER_DIR="${PATH_TO_PROJECT_ROOT}/pkg/swagger" WEBUI_PATH="${PATH_TO_PROJECT_ROOT}/webui/lib/api/schema" -DOCS_PATH="${PATH_TO_PROJECT_ROOT}/docs" cd "${PATH_TO_PROJECT_ROOT}" || exit echo "Currently executing in ${PWD}" @@ -22,7 +21,5 @@ if [[ ! -d "${WEBUI_PATH}" ]]; then mkdir -p "${WEBUI_PATH}" fi cp "${SWAGGER_DIR}/swagger.json" "${WEBUI_PATH}" -cp "${WEBUI_PATH}/swagger.json" "${DOCS_PATH}" echo "swagger.json copied to ${WEBUI_PATH}/swagger.json" -echo "swagger.json copied to ${DOCS_PATH}/swagger.json" diff --git a/webui/lib/api/generated/types.gen.ts b/webui/lib/api/generated/types.gen.ts index 8007f1986a..b2ddb394cb 100644 --- a/webui/lib/api/generated/types.gen.ts +++ b/webui/lib/api/generated/types.gen.ts @@ -796,9 +796,9 @@ export type types_BatchJobDefaultsConfig = { }; export type types_BatchTaskDefaultConfig = { + Publisher?: types_DefaultPublisherConfig; Resources?: types_ResourcesConfig; Timeouts?: types_TaskTimeoutConfig; - publisher?: models_SpecConfig; }; export type types_Cluster = { @@ -852,6 +852,19 @@ export type types_ComputeAuth = { Token?: string; }; +export type types_DefaultPublisherConfig = { + /** + * Params specifies the publisher configuration data. + */ + Params?: { + [key: string]: (string); + }; + /** + * Type specifies the publisher type. e.g. "s3", "local", "ipfs", etc. + */ + Type?: string; +}; + export type types_Docker = { /** * ManifestCache specifies the settings for the Docker manifest cache. diff --git a/webui/lib/api/schema/swagger.json b/webui/lib/api/schema/swagger.json index f87dda4ee1..5fe7a0b319 100644 --- a/webui/lib/api/schema/swagger.json +++ b/webui/lib/api/schema/swagger.json @@ -2293,14 +2293,14 @@ "types.BatchTaskDefaultConfig": { "type": "object", "properties": { + "Publisher": { + "$ref": "#/definitions/types.DefaultPublisherConfig" + }, "Resources": { "$ref": "#/definitions/types.ResourcesConfig" }, "Timeouts": { "$ref": "#/definitions/types.TaskTimeoutConfig" - }, - "publisher": { - "$ref": "#/definitions/models.SpecConfig" } } }, @@ -2378,6 +2378,22 @@ } } }, + "types.DefaultPublisherConfig": { + "type": "object", + "properties": { + "Params": { + "description": "Params specifies the publisher configuration data.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "Type": { + "description": "Type specifies the publisher type. e.g. \"s3\", \"local\", \"ipfs\", etc.", + "type": "string" + } + } + }, "types.Docker": { "type": "object", "properties": {