From 2d68532beee48d3a8d30ced5df9bfd99f615df92 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Fri, 29 Nov 2024 08:32:32 +0100 Subject: [PATCH 01/79] ensure price and meta endpoints are backwards compatible --- .../src/simcore_service_api_server/api/routes/credits.py | 4 ++-- .../src/simcore_service_api_server/models/schemas/meta.py | 6 +++++- .../src/simcore_service_api_server/services/webserver.py | 8 +++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/services/api-server/src/simcore_service_api_server/api/routes/credits.py b/services/api-server/src/simcore_service_api_server/api/routes/credits.py index 5370e6dd72d..27a82eea787 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/credits.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/credits.py @@ -1,8 +1,8 @@ from typing import Annotated from fastapi import APIRouter, Depends, status -from models_library.api_schemas_webserver.product import GetCreditPrice +from ...models.schemas.backwards_compatibility import GetCreditPriceApiServer from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION @@ -12,7 +12,7 @@ @router.get( "/price", status_code=status.HTTP_200_OK, - response_model=GetCreditPrice, + response_model=GetCreditPriceApiServer, description=FMSG_CHANGELOG_NEW_IN_VERSION.format("0.6.0"), ) async def get_credits_price( diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/meta.py b/services/api-server/src/simcore_service_api_server/models/schemas/meta.py index 6332d5ae1d5..455f03fcc01 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/meta.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/meta.py @@ -1,12 +1,16 @@ from typing import Annotated from models_library.api_schemas__common.meta import BaseMeta -from pydantic import AnyHttpUrl, ConfigDict, StringConstraints +from models_library.basic_types import VersionStr +from pydantic import AnyHttpUrl, ConfigDict, Field, StringConstraints class Meta(BaseMeta): docs_url: Annotated[AnyHttpUrl, StringConstraints(max_length=65536)] docs_dev_url: Annotated[AnyHttpUrl, StringConstraints(max_length=65536)] + released: dict[str, VersionStr] = Field( + default=None, description="Maps every route's path tag with a released version" + ) model_config = ConfigDict( json_schema_extra={ "example": { diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index ac0437dbc7d..33e37ca0060 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -13,7 +13,6 @@ from models_library.api_schemas_api_server.pricing_plans import ServicePricingPlanGet from models_library.api_schemas_long_running_tasks.tasks import TaskGet from models_library.api_schemas_webserver.computations import ComputationStart -from models_library.api_schemas_webserver.product import GetCreditPrice from models_library.api_schemas_webserver.projects import ( ProjectCreateNew, ProjectGet, @@ -64,6 +63,9 @@ SolverOutputNotFoundError, WalletNotFoundError, ) +from simcore_service_api_server.models.schemas.backwards_compatibility import ( + GetCreditPriceApiServer, +) from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying from tenacity.before_sleep import before_sleep_log @@ -573,13 +575,13 @@ async def get_project_wallet(self, *, project_id: ProjectID) -> WalletGet: # PRODUCTS ------------------------------------------------- @_exception_mapper({status.HTTP_404_NOT_FOUND: ProductPriceNotFoundError}) - async def get_product_price(self) -> GetCreditPrice: + async def get_product_price(self) -> GetCreditPriceApiServer: response = await self.client.get( "/credits-price", cookies=self.session_cookies, ) response.raise_for_status() - data = Envelope[GetCreditPrice].model_validate_json(response.text).data + data = Envelope[GetCreditPriceApiServer].model_validate_json(response.text).data assert data is not None # nosec return data From ad235fe2817de72726abf4d6aadedbca4ed03fdf Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Fri, 29 Nov 2024 09:14:37 +0100 Subject: [PATCH 02/79] ensure backwards compatibility of credits price --- .../models/schemas/backwards_compatibility.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py new file mode 100644 index 00000000000..1dde6ff63cf --- /dev/null +++ b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py @@ -0,0 +1,18 @@ +# Models added here "cover" models from within the deployment in order to restore backwards compatibility + +from typing import Annotated + +from models_library.api_schemas_webserver.product import GetCreditPrice +from models_library.basic_types import NonNegativeDecimal +from pydantic import Field, NonNegativeFloat, PlainSerializer + + +class GetCreditPriceApiServer(GetCreditPrice): + usd_per_credit: Annotated[ + NonNegativeDecimal, + PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"), + ] | None = Field( + ..., + description="Price of a credit in USD. " + "If None, then this product's price is UNDEFINED", + ) From c72f500ccfd813b2c5d5b3850db0b591b978b3ed Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Fri, 29 Nov 2024 10:32:38 +0100 Subject: [PATCH 03/79] updated openapi.json --- services/api-server/openapi.json | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 5b23b44603d..29d7dda206b 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -5332,7 +5332,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GetCreditPrice" + "$ref": "#/components/schemas/GetCreditPriceApiServer" } } } @@ -5563,7 +5563,7 @@ ], "title": "FileUploadData" }, - "GetCreditPrice": { + "GetCreditPriceApiServer": { "properties": { "productName": { "type": "string", @@ -5602,7 +5602,7 @@ "usdPerCredit", "minPaymentAmountUsd" ], - "title": "GetCreditPrice" + "title": "GetCreditPriceApiServer" }, "Groups": { "properties": { @@ -6184,18 +6184,11 @@ "title": "Version" }, "released": { - "anyOf": [ - { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object" - }, - { - "type": "null" - } - ], + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object", "title": "Released", "description": "Maps every route's path tag with a released version" }, @@ -6891,7 +6884,7 @@ "type": "integer", "x_unit": "second" }, - "key": "input_2", + "key": "f763658f-a89a-4a90-ace4-c44631290f12", "kind": "input" } }, @@ -7099,7 +7092,9 @@ "required": [ "walletId", "name", + "description", "owner", + "thumbnail", "status", "created", "modified", From 29c7a410fe1f8844db3247ec2509772ffe4e4185 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Fri, 29 Nov 2024 13:52:08 +0100 Subject: [PATCH 04/79] add github workflow to check backwards compatibility of api-server --- .github/workflows/ci-testing-deploy.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index d1a3ec75078..f9bbff891cf 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2864,3 +2864,27 @@ jobs: env: TAG_PREFIX: hotfix-staging-github run: ./ci/deploy/dockerhub-deploy.bash -n + + api-server-api-spec-backwards-compatible: + timeout-minutes: 5 + name: "api-server-backwards-compatibility" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: setup python environment + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: install uv + uses: astral-sh/setup-uv@v4 + with: + version: "0.4.x" + enable-cache: false + cache-dependency-glob: "**/service-library/requirements/ci*.txt" + - name: setup python .venv + run: | + python -m venv .venv + source .venv/bin/activate + cd services/api-server + make install-dev + make openapi-diff.md OPENAPI_JSON_BASE_URL=https://raw.githubusercontent.com/{{ github.repository }}/refs/heads/{{ github.event.pull_request.base.ref }}/services/api-server/openapi.json From efcae2a7494c92fc5ee4e91a9e708c01a59cdb2e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 06:46:13 +0100 Subject: [PATCH 05/79] add github workflow for checking api server backwards compatibility --- .github/workflows/ci-testing-deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index f9bbff891cf..fdb29cb67ae 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2866,6 +2866,7 @@ jobs: run: ./ci/deploy/dockerhub-deploy.bash -n api-server-api-spec-backwards-compatible: + if: github.event_name == 'push' timeout-minutes: 5 name: "api-server-backwards-compatibility" runs-on: ubuntu-latest @@ -2887,4 +2888,4 @@ jobs: source .venv/bin/activate cd services/api-server make install-dev - make openapi-diff.md OPENAPI_JSON_BASE_URL=https://raw.githubusercontent.com/{{ github.repository }}/refs/heads/{{ github.event.pull_request.base.ref }}/services/api-server/openapi.json + make openapi-diff.md OPENAPI_JSON_BASE_URL=https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json From 1b8e35a20fdbf4ec3802b3b81e0f88ffc7a91fd3 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 06:55:57 +0100 Subject: [PATCH 06/79] make sure github wf always runs --- .github/workflows/ci-testing-deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index fdb29cb67ae..42992cfebca 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2866,7 +2866,8 @@ jobs: run: ./ci/deploy/dockerhub-deploy.bash -n api-server-api-spec-backwards-compatible: - if: github.event_name == 'push' + needs: [changes] + if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} timeout-minutes: 5 name: "api-server-backwards-compatibility" runs-on: ubuntu-latest From 90e6fd602eb83987046c56941bceafa52c89d211 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 13:30:23 +0100 Subject: [PATCH 07/79] begin adding make target for updating all openapi-specs --- Makefile | 5 ++--- scripts/openapi-specs.bash | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 scripts/openapi-specs.bash diff --git a/Makefile b/Makefile index 9dbdf84c9f4..4903ed515cd 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ export SWARM_STACK_NAME_NO_HYPHEN = $(subst -,_,$(SWARM_STACK_NAME)) export DOCKER_IMAGE_TAG ?= latest export DOCKER_REGISTRY ?= itisfoundation - +MAKEFILES_WITH_OPENAPI_SPECS := $(shell find . -type f -name 'Makefile' -not -path '*/.*' -exec dirname {} \;) get_my_ip := $(shell (hostname --all-ip-addresses || hostname -i) 2>/dev/null | cut --delimiter=" " --fields=1) @@ -574,8 +574,7 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an .PHONY: openapi-specs openapi-specs: ## bundles and validates openapi specifications and schemas of ALL service's API - @$(MAKE_C) services/web/server $@ - @$(MAKE_C) services/storage $@ + $(foreach directory, $(MAKEFILES_WITH_OPENAPI_SPECS), $(shell ./scripts/openapi-specs.bash $(directory))) .PHONY: settings-schema.json diff --git a/scripts/openapi-specs.bash b/scripts/openapi-specs.bash new file mode 100644 index 00000000000..17efa23ff68 --- /dev/null +++ b/scripts/openapi-specs.bash @@ -0,0 +1,4 @@ + + +directory=$1 +echo "${directory}" From a1686473f4ef1a947d8feb117c56d4dd0255eda3 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:09:25 +0100 Subject: [PATCH 08/79] add make target for generating openapi-specs --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4903ed515cd..3a833134239 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ export SWARM_STACK_NAME_NO_HYPHEN = $(subst -,_,$(SWARM_STACK_NAME)) export DOCKER_IMAGE_TAG ?= latest export DOCKER_REGISTRY ?= itisfoundation -MAKEFILES_WITH_OPENAPI_SPECS := $(shell find . -type f -name 'Makefile' -not -path '*/.*' -exec dirname {} \;) +MAKEFILES_WITH_OPENAPI_SPECS := $(shell find . -mindepth 2 -type f -name 'Makefile' -not -path '*/.*' -exec grep -l '^openapi-specs:' {} \; | xargs realpath) get_my_ip := $(shell (hostname --all-ip-addresses || hostname -i) 2>/dev/null | cut --delimiter=" " --fields=1) @@ -574,7 +574,11 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an .PHONY: openapi-specs openapi-specs: ## bundles and validates openapi specifications and schemas of ALL service's API - $(foreach directory, $(MAKEFILES_WITH_OPENAPI_SPECS), $(shell ./scripts/openapi-specs.bash $(directory))) + echo "$(MAKEFILES_WITH_OPENAPI_SPECS)" + for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ + $(MAKE_C) $$(dirname $${makefile}) install-dev; \ + $(MAKE_C) $$(dirname $${makefile}) openapi-specs; \ + done .PHONY: settings-schema.json From aaafe9d0c7608316b16c8aa77fc555717818713d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:33:45 +0100 Subject: [PATCH 09/79] add make target --- Makefile | 12 +++++++++--- .../src/simcore_service_director/api/Makefile | 6 ------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 3a833134239..e46e94f8479 100644 --- a/Makefile +++ b/Makefile @@ -132,6 +132,12 @@ test_python_version: ## Check Python version, throw error if compilation would f @.venv/bin/python ./scripts/test_python_version.py +.PHONY: _check_venv_active +_check_venv_active: + # Checking whether virtual environment was activated + @python3 -c "import sys; assert sys.base_prefix!=sys.prefix" + + ## DOCKER BUILD ------------------------------- # # - all builds are immediatly tagged as 'local/{service}:${BUILD_TARGET}' where BUILD_TARGET='development', 'production', 'cache' @@ -573,9 +579,9 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an .PHONY: openapi-specs -openapi-specs: ## bundles and validates openapi specifications and schemas of ALL service's API - echo "$(MAKEFILES_WITH_OPENAPI_SPECS)" - for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ +openapi-specs: .env _check_venv_active ## bundles and validates openapi specifications and schemas of ALL service's API + @for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ + echo "Generating openapi-specs using $${makefile}"; \ $(MAKE_C) $$(dirname $${makefile}) install-dev; \ $(MAKE_C) $$(dirname $${makefile}) openapi-specs; \ done diff --git a/services/director/src/simcore_service_director/api/Makefile b/services/director/src/simcore_service_director/api/Makefile index f3e3c172ddc..b9eb75b95b0 100644 --- a/services/director/src/simcore_service_director/api/Makefile +++ b/services/director/src/simcore_service_director/api/Makefile @@ -32,9 +32,3 @@ ${OAS_TARGET}: ${OAS_SOURCES} .update-schemas --outfile $@ \ --type yaml \ "${API_SPECS_DIR}/${APP_NAME}/openapi.yaml" - - -.PHONY: openapi-specs -openapi-specs: ${OAS_TARGET} ## creates and validates OpenAPI specs - # Validating bundled '${OAS_TARGET}' - @swagger-cli validate $< From 8c49ab7f314f75f0ae6199b3d3a015a7012f9752 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:37:34 +0100 Subject: [PATCH 10/79] @matusdrobuliak66 update openapi-specs make target --- services/resource-usage-tracker/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/resource-usage-tracker/Makefile b/services/resource-usage-tracker/Makefile index 5f61740d7ce..d6d8745bc13 100644 --- a/services/resource-usage-tracker/Makefile +++ b/services/resource-usage-tracker/Makefile @@ -10,4 +10,4 @@ include ../../scripts/common-service.Makefile openapi-specs: openapi.json openapi.json: ## produces openapi.json # generating openapi specs file (need to have the environment set for this) - @python3 -c "import json; from $(APP_PACKAGE_NAME).web_main import *; print( json.dumps(the_app.openapi(), indent=2) )" > $@ + @python3 -c "import json; from $(APP_PACKAGE_NAME).main import *; print( json.dumps(the_app.openapi(), indent=2) )" > $@ From 33631098f0c7763d51550a59fd708e704d90898a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:42:04 +0100 Subject: [PATCH 11/79] start removing openapi specs (artifacts) --- services/catalog/openapi.json | 4177 ----- services/director-v2/openapi.json | 4062 ----- services/dynamic-scheduler/openapi.json | 85 - .../api/v0/openapi.yaml | 14987 ---------------- 4 files changed, 23311 deletions(-) delete mode 100644 services/catalog/openapi.json delete mode 100644 services/director-v2/openapi.json delete mode 100644 services/dynamic-scheduler/openapi.json delete mode 100644 services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml diff --git a/services/catalog/openapi.json b/services/catalog/openapi.json deleted file mode 100644 index c5663631059..00000000000 --- a/services/catalog/openapi.json +++ /dev/null @@ -1,4177 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-catalog", - "description": "Manages and maintains a catalog of all published components (e.g. macro-algorithms, scripts, etc)", - "version": "0.5.0" - }, - "paths": { - "/": { - "get": { - "summary": "Check Service Health", - "operationId": "check_service_health__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/v0/": { - "get": { - "tags": [ - "diagnostics" - ], - "summary": "Check Service Health", - "operationId": "check_service_health_v0__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - } - } - } - }, - "/v0/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_v0_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BaseMeta" - } - } - } - } - } - } - }, - "/v0/services/{service_key}/{service_version}/resources": { - "get": { - "tags": [ - "services" - ], - "summary": "Get Service Resources", - "operationId": "get_service_resources_v0_services__service_key___service_version__resources_get", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "description": "if passed, and that user has custom resources, they will be merged with default resources and returned.", - "title": "User Id" - }, - "description": "if passed, and that user has custom resources, they will be merged with default resources and returned." - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "object", - "title": "Response Get Service Resources V0 Services Service Key Service Version Resources Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/services/{service_key}/{service_version}/specifications": { - "get": { - "tags": [ - "services" - ], - "summary": "Get Service Specifications", - "operationId": "get_service_specifications_v0_services__service_key___service_version__specifications_get", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - } - }, - { - "name": "strict", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "description": "if True only the version specs will be retrieved, if False the latest version will be used instead", - "default": false, - "title": "Strict" - }, - "description": "if True only the version specs will be retrieved, if False the latest version will be used instead" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceSpecificationsGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/services/{service_key}/{service_version}/ports": { - "get": { - "tags": [ - "services" - ], - "summary": "List Service Ports", - "description": "Returns a list of service ports starting with inputs and followed by outputs", - "operationId": "list_service_ports_v0_services__service_key___service_version__ports_get", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "User Id" - } - }, - { - "name": "x-simcore-products-name", - "in": "header", - "required": false, - "schema": { - "type": "string", - "title": "X-Simcore-Products-Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ServicePortGet" - }, - "title": "Response List Service Ports V0 Services Service Key Service Version Ports Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/services/{service_key}/{service_version}/accessRights": { - "get": { - "tags": [ - "services" - ], - "summary": "Get Service Access Rights", - "description": "Returns access rights information for provided service and product", - "operationId": "get_service_access_rights_v0_services__service_key___service_version__accessRights_get", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "User Id" - } - }, - { - "name": "x-simcore-products-name", - "in": "header", - "required": true, - "schema": { - "type": "string", - "title": "X-Simcore-Products-Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccessRightsGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/services": { - "get": { - "tags": [ - "services" - ], - "summary": "List Services", - "operationId": "list_services_v0_services_get", - "parameters": [ - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - } - }, - { - "name": "details", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": true, - "title": "Details" - } - }, - { - "name": "x-simcore-products-name", - "in": "header", - "required": true, - "schema": { - "type": "string", - "title": "X-Simcore-Products-Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ServiceGet" - }, - "title": "Response List Services V0 Services Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/services/{service_key}/{service_version}": { - "get": { - "tags": [ - "services" - ], - "summary": "Get Service", - "operationId": "get_service_v0_services__service_key___service_version__get", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "User Id" - } - }, - { - "name": "x-simcore-products-name", - "in": "header", - "required": false, - "schema": { - "type": "string", - "title": "X-Simcore-Products-Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "patch": { - "tags": [ - "services" - ], - "summary": "Update Service", - "operationId": "update_service_v0_services__service_key___service_version__patch", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "title": "User Id" - } - }, - { - "name": "x-simcore-products-name", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Products-Name" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceUpdate" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Author": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the author" - }, - "email": { - "type": "string", - "format": "email", - "title": "Email", - "description": "Email address" - }, - "affiliation": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Affiliation" - } - }, - "type": "object", - "required": [ - "name", - "email" - ], - "title": "Author" - }, - "Badge": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Name of the subject" - }, - "image": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Image", - "description": "Url to the badge" - }, - "url": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Url", - "description": "Link to the status" - } - }, - "type": "object", - "required": [ - "name", - "image", - "url" - ], - "title": "Badge", - "example": { - "image": "https://img.shields.io/website-up-down-green-red/https/itisfoundation.github.io.svg?label=documentation", - "name": "osparc.io", - "url": "https://itisfoundation.github.io/" - } - }, - "BaseMeta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "released": { - "anyOf": [ - { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Released", - "description": "Maps every route's path tag with a released version" - } - }, - "type": "object", - "required": [ - "name", - "version" - ], - "title": "BaseMeta", - "example": { - "name": "simcore_service_foo", - "released": { - "v1": "1.3.4", - "v2": "2.4.45" - }, - "version": "2.4.45" - } - }, - "BindOptions": { - "properties": { - "Propagation": { - "anyOf": [ - { - "$ref": "#/components/schemas/Propagation" - }, - { - "type": "null" - } - ], - "description": "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." - }, - "NonRecursive": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Nonrecursive", - "description": "Disable recursive bind mount.", - "default": false - } - }, - "type": "object", - "title": "BindOptions", - "description": "Optional configuration for the `bind` type." - }, - "BootChoice": { - "properties": { - "label": { - "type": "string", - "title": "Label" - }, - "description": { - "type": "string", - "title": "Description" - } - }, - "type": "object", - "required": [ - "label", - "description" - ], - "title": "BootChoice" - }, - "BootMode": { - "type": "string", - "enum": [ - "CPU", - "GPU", - "MPI" - ], - "title": "BootMode" - }, - "BootOption": { - "properties": { - "label": { - "type": "string", - "title": "Label" - }, - "description": { - "type": "string", - "title": "Description" - }, - "default": { - "type": "string", - "title": "Default" - }, - "items": { - "additionalProperties": { - "$ref": "#/components/schemas/BootChoice" - }, - "type": "object", - "title": "Items" - } - }, - "type": "object", - "required": [ - "label", - "description", - "default", - "items" - ], - "title": "BootOption" - }, - "Condition": { - "type": "string", - "enum": [ - "none", - "on-failure", - "any" - ], - "title": "Condition", - "description": "Condition for restart." - }, - "Config1": { - "properties": { - "File": { - "anyOf": [ - { - "$ref": "#/components/schemas/File1" - }, - { - "type": "null" - } - ], - "description": "File represents a specific target that is backed by a file.\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive\n" - }, - "Runtime": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Runtime", - "description": "Runtime represents a target that is not mounted into the\ncontainer but is used by the task\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually\n> exclusive\n" - }, - "ConfigID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Configid", - "description": "ConfigID represents the ID of the specific config that we're\nreferencing.\n" - }, - "ConfigName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Configname", - "description": "ConfigName is the name of the config that this references,\nbut this is just provided for lookup/display purposes. The\nconfig in the reference will be identified by its ID.\n" - } - }, - "type": "object", - "title": "Config1" - }, - "ContainerSpec": { - "properties": { - "Image": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Image", - "description": "The image name to use for the container" - }, - "Labels": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Labels", - "description": "User-defined key/value data." - }, - "Command": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Command", - "description": "The command to be run in the image." - }, - "Args": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Args", - "description": "Arguments to the command." - }, - "Hostname": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Hostname", - "description": "The hostname to use for the container, as a valid\n[RFC 1123](https://tools.ietf.org/html/rfc1123) hostname.\n" - }, - "Env": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Env", - "description": "A list of environment variables in the form `VAR=value`.\n" - }, - "Dir": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Dir", - "description": "The working directory for commands to run in." - }, - "User": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User", - "description": "The user inside the container." - }, - "Groups": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Groups", - "description": "A list of additional groups that the container process will run as.\n" - }, - "Privileges": { - "anyOf": [ - { - "$ref": "#/components/schemas/Privileges" - }, - { - "type": "null" - } - ], - "description": "Security options for the container" - }, - "TTY": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Tty", - "description": "Whether a pseudo-TTY should be allocated." - }, - "OpenStdin": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Openstdin", - "description": "Open `stdin`" - }, - "ReadOnly": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Readonly", - "description": "Mount the container's root filesystem as read only." - }, - "Mounts": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Mount" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Mounts", - "description": "Specification for mounts to be added to containers created as part\nof the service.\n" - }, - "StopSignal": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Stopsignal", - "description": "Signal to stop the container." - }, - "StopGracePeriod": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Stopgraceperiod", - "description": "Amount of time to wait for the container to terminate before\nforcefully killing it.\n" - }, - "HealthCheck": { - "anyOf": [ - { - "$ref": "#/components/schemas/HealthConfig" - }, - { - "type": "null" - } - ] - }, - "Hosts": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Hosts", - "description": "A list of hostname/IP mappings to add to the container's `hosts`\nfile. The format of extra hosts is specified in the\n[hosts(5)](http://man7.org/linux/man-pages/man5/hosts.5.html)\nman page:\n\n IP_address canonical_hostname [aliases...]\n" - }, - "DNSConfig": { - "anyOf": [ - { - "$ref": "#/components/schemas/DnsConfig" - }, - { - "type": "null" - } - ], - "description": "Specification for DNS related configurations in resolver configuration\nfile (`resolv.conf`).\n" - }, - "Secrets": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Secret" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Secrets", - "description": "Secrets contains references to zero or more secrets that will be\nexposed to the service.\n" - }, - "Configs": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Config1" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Configs", - "description": "Configs contains references to zero or more configs that will be\nexposed to the service.\n" - }, - "Isolation": { - "anyOf": [ - { - "$ref": "#/components/schemas/Isolation1" - }, - { - "type": "null" - } - ], - "description": "Isolation technology of the containers running the service.\n(Windows only)\n" - }, - "Init": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Init", - "description": "Run an init inside the container that forwards signals and reaps\nprocesses. This field is omitted if empty, and the default (as\nconfigured on the daemon) is used.\n" - }, - "Sysctls": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Sysctls", - "description": "Set kernel namedspaced parameters (sysctls) in the container.\nThe Sysctls option on services accepts the same sysctls as the\nare supported on containers. Note that while the same sysctls are\nsupported, no guarantees or checks are made about their\nsuitability for a clustered environment, and it's up to the user\nto determine whether a given sysctl will work properly in a\nService.\n" - }, - "CapabilityAdd": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Capabilityadd", - "description": "A list of kernel capabilities to add to the default set\nfor the container.\n" - }, - "CapabilityDrop": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Capabilitydrop", - "description": "A list of kernel capabilities to drop from the default set\nfor the container.\n" - }, - "Ulimits": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Ulimit" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Ulimits", - "description": "A list of resource limits to set in the container. For example: `{\"Name\": \"nofile\", \"Soft\": 1024, \"Hard\": 2048}`\"\n" - } - }, - "type": "object", - "title": "ContainerSpec", - "description": "Container spec for the service.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." - }, - "CredentialSpec": { - "properties": { - "Config": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Config", - "description": "Load credential spec from a Swarm Config with the given ID.\nThe specified config must also be present in the Configs\nfield with the Runtime property set.\n\n


\n\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" - }, - "File": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "File", - "description": "Load credential spec from this file. The file is read by\nthe daemon, and must be present in the `CredentialSpecs`\nsubdirectory in the docker data directory, which defaults\nto `C:\\ProgramData\\Docker\\` on Windows.\n\nFor example, specifying `spec.json` loads\n`C:\\ProgramData\\Docker\\CredentialSpecs\\spec.json`.\n\n


\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" - }, - "Registry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Registry", - "description": "Load credential spec from this value in the Windows\nregistry. The specified registry value must be located in:\n\n`HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Virtualization\\Containers\\CredentialSpecs`\n\n


\n\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" - } - }, - "type": "object", - "title": "CredentialSpec", - "description": "CredentialSpec for managed service account (Windows only)" - }, - "DiscreteResourceSpec": { - "properties": { - "Kind": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Kind" - }, - "Value": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Value" - } - }, - "type": "object", - "title": "DiscreteResourceSpec" - }, - "DnsConfig": { - "properties": { - "Nameservers": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Nameservers", - "description": "The IP addresses of the name servers." - }, - "Search": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Search", - "description": "A search list for host-name lookup." - }, - "Options": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Options", - "description": "A list of internal resolver variables to be modified (e.g.,\n`debug`, `ndots:3`, etc.).\n" - } - }, - "type": "object", - "title": "DnsConfig", - "description": "Specification for DNS related configurations in resolver configuration\nfile (`resolv.conf`)." - }, - "DriverConfig": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name of the driver to use to create the volume." - }, - "Options": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Options", - "description": "key/value map of driver specific options." - } - }, - "type": "object", - "title": "DriverConfig", - "description": "Map of driver specific options" - }, - "EndpointPortConfig": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "Protocol": { - "anyOf": [ - { - "$ref": "#/components/schemas/Type" - }, - { - "type": "null" - } - ] - }, - "TargetPort": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Targetport", - "description": "The port inside the container." - }, - "PublishedPort": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Publishedport", - "description": "The port on the swarm hosts." - }, - "PublishMode": { - "anyOf": [ - { - "$ref": "#/components/schemas/PublishMode" - }, - { - "type": "null" - } - ], - "description": "The mode in which port is published.\n\n


\n\n- \"ingress\" makes the target port accessible on every node,\n regardless of whether there is a task for the service running on\n that node or not.\n- \"host\" bypasses the routing mesh and publish the port directly on\n the swarm node where that service is running.\n", - "default": "ingress" - } - }, - "type": "object", - "title": "EndpointPortConfig" - }, - "EndpointSpec": { - "properties": { - "Mode": { - "anyOf": [ - { - "$ref": "#/components/schemas/Mode1" - }, - { - "type": "null" - } - ], - "description": "The mode of resolution to use for internal load balancing between tasks.\n", - "default": "vip" - }, - "Ports": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/EndpointPortConfig" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Ports", - "description": "List of exposed ports that this service is accessible on from the\noutside. Ports can only be provided if `vip` resolution mode is used.\n" - } - }, - "type": "object", - "title": "EndpointSpec", - "description": "Properties that can be configured to access and load balance a service." - }, - "FailureAction": { - "type": "string", - "enum": [ - "continue", - "pause", - "rollback" - ], - "title": "FailureAction", - "description": "Action to take if an updated task fails to run, or stops running\nduring the update." - }, - "FailureAction1": { - "type": "string", - "enum": [ - "continue", - "pause" - ], - "title": "FailureAction1", - "description": "Action to take if an rolled back task fails to run, or stops\nrunning during the rollback." - }, - "File": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name represents the final filename in the filesystem.\n" - }, - "UID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Uid", - "description": "UID represents the file UID." - }, - "GID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Gid", - "description": "GID represents the file GID." - }, - "Mode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Mode", - "description": "Mode represents the FileMode of the file." - } - }, - "type": "object", - "title": "File", - "description": "File represents a specific target that is backed by a file." - }, - "File1": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name represents the final filename in the filesystem.\n" - }, - "UID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Uid", - "description": "UID represents the file UID." - }, - "GID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Gid", - "description": "GID represents the file GID." - }, - "Mode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Mode", - "description": "Mode represents the FileMode of the file." - } - }, - "type": "object", - "title": "File1", - "description": "File represents a specific target that is backed by a file.\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive" - }, - "GenericResource": { - "properties": { - "NamedResourceSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/NamedResourceSpec" - }, - { - "type": "null" - } - ] - }, - "DiscreteResourceSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/DiscreteResourceSpec" - }, - { - "type": "null" - } - ] - } - }, - "type": "object", - "title": "GenericResource" - }, - "GenericResources": { - "items": { - "$ref": "#/components/schemas/GenericResource" - }, - "type": "array", - "title": "GenericResources", - "description": "User-defined resources can be either Integer resources (e.g, `SSD=3`) or\nString resources (e.g, `GPU=UUID1`)." - }, - "HTTPValidationError": { - "properties": { - "errors": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Validation errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "HealthConfig": { - "properties": { - "Test": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Test", - "description": "The test to perform. Possible values are:\n\n- `[]` inherit healthcheck from image or parent image\n- `[\"NONE\"]` disable healthcheck\n- `[\"CMD\", args...]` exec arguments directly\n- `[\"CMD-SHELL\", command]` run command with system's default shell\n" - }, - "Interval": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Interval", - "description": "The time to wait between checks in nanoseconds. It should be 0 or at\nleast 1000000 (1 ms). 0 means inherit.\n" - }, - "Timeout": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Timeout", - "description": "The time to wait before considering the check to have hung. It should\nbe 0 or at least 1000000 (1 ms). 0 means inherit.\n" - }, - "Retries": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Retries", - "description": "The number of consecutive failures needed to consider a container as\nunhealthy. 0 means inherit.\n" - }, - "StartPeriod": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Startperiod", - "description": "Start period for the container to initialize before starting\nhealth-retries countdown in nanoseconds. It should be 0 or at least\n1000000 (1 ms). 0 means inherit.\n" - } - }, - "type": "object", - "title": "HealthConfig", - "description": "A test to perform to check that the container is healthy." - }, - "ImageResources": { - "properties": { - "image": { - "type": "string", - "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", - "title": "Image", - "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." - }, - "resources": { - "additionalProperties": { - "$ref": "#/components/schemas/ResourceValue" - }, - "type": "object", - "title": "Resources" - }, - "boot_modes": { - "items": { - "$ref": "#/components/schemas/BootMode" - }, - "type": "array", - "title": "Boot Modes", - "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", - "default": [ - "CPU" - ] - } - }, - "type": "object", - "required": [ - "image", - "resources" - ], - "title": "ImageResources", - "example": { - "image": "simcore/service/dynamic/pretty-intense:1.0.0", - "resources": { - "AIRAM": { - "limit": 1, - "reservation": 1 - }, - "ANY_resource": { - "limit": "some_value", - "reservation": "some_value" - }, - "CPU": { - "limit": 4, - "reservation": 0.1 - }, - "RAM": { - "limit": 103079215104, - "reservation": 536870912 - }, - "VRAM": { - "limit": 1, - "reservation": 1 - } - } - } - }, - "Isolation1": { - "type": "string", - "enum": [ - "default", - "process", - "hyperv" - ], - "title": "Isolation1", - "description": "Isolation technology of the containers running the service.\n(Windows only)" - }, - "Limit": { - "properties": { - "NanoCPUs": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Nanocpus" - }, - "MemoryBytes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Memorybytes" - }, - "Pids": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Pids", - "description": "Limits the maximum number of PIDs in the container. Set `0` for unlimited.\n", - "default": 0 - } - }, - "type": "object", - "title": "Limit", - "description": "An object describing a limit on resources which can be requested by a task." - }, - "LogDriver1": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "Options": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Options" - } - }, - "type": "object", - "title": "LogDriver1", - "description": "Specifies the log driver to use for tasks created from this spec. If\nnot present, the default one for the swarm will be used, finally\nfalling back to the engine default if not specified." - }, - "Mode": { - "properties": { - "Replicated": { - "anyOf": [ - { - "$ref": "#/components/schemas/Replicated" - }, - { - "type": "null" - } - ] - }, - "Global": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Global" - }, - "ReplicatedJob": { - "anyOf": [ - { - "$ref": "#/components/schemas/ReplicatedJob" - }, - { - "type": "null" - } - ], - "description": "The mode used for services with a finite number of tasks that run\nto a completed state.\n" - }, - "GlobalJob": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Globaljob", - "description": "The mode used for services which run a task to the completed state\non each valid node.\n" - } - }, - "type": "object", - "title": "Mode", - "description": "Scheduling mode for the service." - }, - "Mode1": { - "type": "string", - "enum": [ - "vip", - "dnsrr" - ], - "title": "Mode1", - "description": "The mode of resolution to use for internal load balancing between tasks." - }, - "Mount": { - "properties": { - "Target": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Target", - "description": "Container path." - }, - "Source": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Source", - "description": "Mount source (e.g. a volume name, a host path)." - }, - "Type": { - "anyOf": [ - { - "$ref": "#/components/schemas/Type2" - }, - { - "type": "null" - } - ], - "description": "The mount type. Available types:\n\n- `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.\n- `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.\n- `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.\n- `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container.\n" - }, - "ReadOnly": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Readonly", - "description": "Whether the mount should be read-only." - }, - "Consistency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Consistency", - "description": "The consistency requirement for the mount: `default`, `consistent`, `cached`, or `delegated`." - }, - "BindOptions": { - "anyOf": [ - { - "$ref": "#/components/schemas/BindOptions" - }, - { - "type": "null" - } - ], - "description": "Optional configuration for the `bind` type." - }, - "VolumeOptions": { - "anyOf": [ - { - "$ref": "#/components/schemas/VolumeOptions" - }, - { - "type": "null" - } - ], - "description": "Optional configuration for the `volume` type." - }, - "TmpfsOptions": { - "anyOf": [ - { - "$ref": "#/components/schemas/TmpfsOptions" - }, - { - "type": "null" - } - ], - "description": "Optional configuration for the `tmpfs` type." - } - }, - "type": "object", - "title": "Mount" - }, - "NamedResourceSpec": { - "properties": { - "Kind": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Kind" - }, - "Value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Value" - } - }, - "type": "object", - "title": "NamedResourceSpec" - }, - "NetworkAttachmentConfig": { - "properties": { - "Target": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Target", - "description": "The target network for attachment. Must be a network name or ID.\n" - }, - "Aliases": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Aliases", - "description": "Discoverable alternate names for the service on this network.\n" - }, - "DriverOpts": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Driveropts", - "description": "Driver attachment options for the network target.\n" - } - }, - "type": "object", - "title": "NetworkAttachmentConfig", - "description": "Specifies how a service should be attached to a particular network." - }, - "NetworkAttachmentSpec": { - "properties": { - "ContainerID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Containerid", - "description": "ID of the container represented by this task" - } - }, - "type": "object", - "title": "NetworkAttachmentSpec", - "description": "Read-only spec type for non-swarm containers attached to swarm overlay\nnetworks.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." - }, - "Order": { - "type": "string", - "enum": [ - "stop-first", - "start-first" - ], - "title": "Order", - "description": "The order of operations when rolling out an updated task. Either\nthe old task is shut down before the new task is started, or the\nnew task is started before the old task is shut down." - }, - "Order1": { - "type": "string", - "enum": [ - "stop-first", - "start-first" - ], - "title": "Order1", - "description": "The order of operations when rolling back a task. Either the old\ntask is shut down before the new task is started, or the new task\nis started before the old task is shut down." - }, - "Placement": { - "properties": { - "Constraints": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Constraints", - "description": "An array of constraint expressions to limit the set of nodes where\na task can be scheduled. Constraint expressions can either use a\n_match_ (`==`) or _exclude_ (`!=`) rule. Multiple constraints find\nnodes that satisfy every expression (AND match). Constraints can\nmatch node or Docker Engine labels as follows:\n\nnode attribute | matches | example\n---------------------|--------------------------------|-----------------------------------------------\n`node.id` | Node ID | `node.id==2ivku8v2gvtg4`\n`node.hostname` | Node hostname | `node.hostname!=node-2`\n`node.role` | Node role (`manager`/`worker`) | `node.role==manager`\n`node.platform.os` | Node operating system | `node.platform.os==windows`\n`node.platform.arch` | Node architecture | `node.platform.arch==x86_64`\n`node.labels` | User-defined node labels | `node.labels.security==high`\n`engine.labels` | Docker Engine's labels | `engine.labels.operatingsystem==ubuntu-14.04`\n\n`engine.labels` apply to Docker Engine labels like operating system,\ndrivers, etc. Swarm administrators add `node.labels` for operational\npurposes by using the [`node update endpoint`](#operation/NodeUpdate).\n" - }, - "Preferences": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Preference" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Preferences", - "description": "Preferences provide a way to make the scheduler aware of factors\nsuch as topology. They are provided in order from highest to\nlowest precedence.\n" - }, - "MaxReplicas": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Maxreplicas", - "description": "Maximum number of replicas for per node (default value is 0, which\nis unlimited)\n", - "default": 0 - }, - "Platforms": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Platform" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Platforms", - "description": "Platforms stores all the platforms that the service's image can\nrun on. This field is used in the platform filter for scheduling.\nIf empty, then the platform filter is off, meaning there are no\nscheduling restrictions.\n" - } - }, - "type": "object", - "title": "Placement" - }, - "Platform": { - "properties": { - "Architecture": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Architecture", - "description": "Architecture represents the hardware architecture (for example,\n`x86_64`).\n" - }, - "OS": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Os", - "description": "OS represents the Operating System (for example, `linux` or `windows`).\n" - } - }, - "type": "object", - "title": "Platform", - "description": "Platform represents the platform (Arch/OS)." - }, - "PluginPrivilege": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "Description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "Value": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Value" - } - }, - "type": "object", - "title": "PluginPrivilege", - "description": "Describes a permission the user has to accept upon installing\nthe plugin." - }, - "PluginSpec": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "The name or 'alias' to use for the plugin." - }, - "Remote": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Remote", - "description": "The plugin image reference to use." - }, - "Disabled": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Disabled", - "description": "Disable the plugin once scheduled." - }, - "PluginPrivilege": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/PluginPrivilege" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Pluginprivilege" - } - }, - "type": "object", - "title": "PluginSpec", - "description": "Plugin spec for the service. *(Experimental release only.)*\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." - }, - "Preference": { - "properties": { - "Spread": { - "anyOf": [ - { - "$ref": "#/components/schemas/Spread" - }, - { - "type": "null" - } - ] - } - }, - "type": "object", - "title": "Preference" - }, - "Privileges": { - "properties": { - "CredentialSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/CredentialSpec" - }, - { - "type": "null" - } - ], - "description": "CredentialSpec for managed service account (Windows only)" - }, - "SELinuxContext": { - "anyOf": [ - { - "$ref": "#/components/schemas/SeLinuxContext" - }, - { - "type": "null" - } - ], - "description": "SELinux labels of the container" - } - }, - "type": "object", - "title": "Privileges", - "description": "Security options for the container" - }, - "Propagation": { - "type": "string", - "enum": [ - "private", - "rprivate", - "shared", - "rshared", - "slave", - "rslave" - ], - "title": "Propagation", - "description": "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." - }, - "PublishMode": { - "type": "string", - "enum": [ - "ingress", - "host" - ], - "title": "PublishMode", - "description": "The mode in which port is published.\n\n


\n\n- \"ingress\" makes the target port accessible on every node,\n regardless of whether there is a task for the service running on\n that node or not.\n- \"host\" bypasses the routing mesh and publish the port directly on\n the swarm node where that service is running." - }, - "Replicated": { - "properties": { - "Replicas": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Replicas" - } - }, - "type": "object", - "title": "Replicated" - }, - "ReplicatedJob": { - "properties": { - "MaxConcurrent": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Maxconcurrent", - "description": "The maximum number of replicas to run simultaneously.\n", - "default": 1 - }, - "TotalCompletions": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Totalcompletions", - "description": "The total number of replicas desired to reach the Completed\nstate. If unset, will default to the value of `MaxConcurrent`\n" - } - }, - "type": "object", - "title": "ReplicatedJob", - "description": "The mode used for services with a finite number of tasks that run\nto a completed state." - }, - "ResourceObject": { - "properties": { - "NanoCPUs": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Nanocpus" - }, - "MemoryBytes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Memorybytes" - }, - "GenericResources": { - "anyOf": [ - { - "$ref": "#/components/schemas/GenericResources" - }, - { - "type": "null" - } - ] - } - }, - "type": "object", - "title": "ResourceObject", - "description": "An object describing the resources which can be advertised by a node and\nrequested by a task." - }, - "ResourceValue": { - "properties": { - "limit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Limit" - }, - "reservation": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Reservation" - } - }, - "type": "object", - "required": [ - "limit", - "reservation" - ], - "title": "ResourceValue" - }, - "Resources1": { - "properties": { - "Limits": { - "anyOf": [ - { - "$ref": "#/components/schemas/Limit" - }, - { - "type": "null" - } - ], - "description": "Define resources limits." - }, - "Reservations": { - "anyOf": [ - { - "$ref": "#/components/schemas/ResourceObject" - }, - { - "type": "null" - } - ], - "description": "Define resources reservation." - } - }, - "type": "object", - "title": "Resources1", - "description": "Resource requirements which apply to each individual container created\nas part of the service." - }, - "RestartPolicy1": { - "properties": { - "Condition": { - "anyOf": [ - { - "$ref": "#/components/schemas/Condition" - }, - { - "type": "null" - } - ], - "description": "Condition for restart." - }, - "Delay": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Delay", - "description": "Delay between restart attempts." - }, - "MaxAttempts": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Maxattempts", - "description": "Maximum attempts to restart a given container before giving up\n(default value is 0, which is ignored).\n", - "default": 0 - }, - "Window": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Window", - "description": "Windows is the time window used to evaluate the restart policy\n(default value is 0, which is unbounded).\n", - "default": 0 - } - }, - "type": "object", - "title": "RestartPolicy1", - "description": "Specification for the restart policy which applies to containers\ncreated as part of this service." - }, - "RollbackConfig": { - "properties": { - "Parallelism": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Parallelism", - "description": "Maximum number of tasks to be rolled back in one iteration (0 means\nunlimited parallelism).\n" - }, - "Delay": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Delay", - "description": "Amount of time between rollback iterations, in nanoseconds.\n" - }, - "FailureAction": { - "anyOf": [ - { - "$ref": "#/components/schemas/FailureAction1" - }, - { - "type": "null" - } - ], - "description": "Action to take if an rolled back task fails to run, or stops\nrunning during the rollback.\n" - }, - "Monitor": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Monitor", - "description": "Amount of time to monitor each rolled back task for failures, in\nnanoseconds.\n" - }, - "MaxFailureRatio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Maxfailureratio", - "description": "The fraction of tasks that may fail during a rollback before the\nfailure action is invoked, specified as a floating point number\nbetween 0 and 1.\n", - "default": 0 - }, - "Order": { - "anyOf": [ - { - "$ref": "#/components/schemas/Order1" - }, - { - "type": "null" - } - ], - "description": "The order of operations when rolling back a task. Either the old\ntask is shut down before the new task is started, or the new task\nis started before the old task is shut down.\n" - } - }, - "type": "object", - "title": "RollbackConfig", - "description": "Specification for the rollback strategy of the service." - }, - "SeLinuxContext": { - "properties": { - "Disable": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Disable", - "description": "Disable SELinux" - }, - "User": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User", - "description": "SELinux user label" - }, - "Role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Role", - "description": "SELinux role label" - }, - "Type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Type", - "description": "SELinux type label" - }, - "Level": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Level", - "description": "SELinux level label" - } - }, - "type": "object", - "title": "SeLinuxContext", - "description": "SELinux labels of the container" - }, - "Secret": { - "properties": { - "File": { - "anyOf": [ - { - "$ref": "#/components/schemas/File" - }, - { - "type": "null" - } - ], - "description": "File represents a specific target that is backed by a file.\n" - }, - "SecretID": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Secretid", - "description": "SecretID represents the ID of the specific secret that we're\nreferencing.\n" - }, - "SecretName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Secretname", - "description": "SecretName is the name of the secret that this references,\nbut this is just provided for lookup/display purposes. The\nsecret in the reference will be identified by its ID.\n" - } - }, - "type": "object", - "title": "Secret" - }, - "SelectBox": { - "properties": { - "structure": { - "items": { - "$ref": "#/components/schemas/Structure" - }, - "type": "array", - "minItems": 1, - "title": "Structure" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "structure" - ], - "title": "SelectBox" - }, - "ServiceAccessRightsGet": { - "properties": { - "service_key": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - }, - "service_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - }, - "gids_with_access_rights": { - "additionalProperties": { - "additionalProperties": { - "type": "boolean" - }, - "type": "object" - }, - "type": "object", - "title": "Gids With Access Rights" - } - }, - "type": "object", - "required": [ - "service_key", - "service_version", - "gids_with_access_rights" - ], - "title": "ServiceAccessRightsGet" - }, - "ServiceGet": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "Display name: short, human readable name for the node" - }, - "thumbnail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Thumbnail", - "description": "url to the thumbnail" - }, - "description": { - "type": "string", - "title": "Description", - "description": "human readable description of the purpose of the node" - }, - "description_ui": { - "type": "boolean", - "title": "Description Ui", - "description": "A flag to enable the `description` to be presented as a single web page (=true) or in another structured format (default=false).", - "default": false - }, - "version_display": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version Display", - "description": "A user-friendly or marketing name for the release. This can be used to reference the release in a more readable and recognizable format, such as 'Matterhorn Release,' 'Spring Update,' or 'Holiday Edition.' This name is not used for version comparison but is useful for communication and documentation purposes." - }, - "deprecated": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Deprecated", - "description": "Owner can set the date to retire the service. Three possibilities:If None, the service is marked as `published`;If now=deprecated, the service is retired" - }, - "classifiers": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Classifiers" - }, - "quality": { - "type": "object", - "title": "Quality", - "default": {} - }, - "accessRights": { - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/components/schemas/ServiceGroupAccessRights" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Accessrights", - "description": "service access rights per group id" - }, - "key": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Key", - "description": "distinctive name for the node based on the docker registry path" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version", - "description": "service version number" - }, - "release_date": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Release Date", - "description": "A timestamp when the specific version of the service was released. This field helps in tracking the timeline of releases and understanding the sequence of updates. A timestamp string should be formatted as YYYY-MM-DD[T]HH:MM[:SS[.ffffff]][Z or [\u00b1]HH[:]MM]" - }, - "integration-version": { - "anyOf": [ - { - "type": "string", - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" - }, - { - "type": "null" - } - ], - "title": "Integration-Version", - "description": "This version is used to maintain backward compatibility when there are changes in the way a service is integrated into the framework" - }, - "type": { - "$ref": "#/components/schemas/ServiceType", - "description": "service type" - }, - "badges": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Badge" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Badges", - "deprecated": true - }, - "authors": { - "items": { - "$ref": "#/components/schemas/Author" - }, - "type": "array", - "minItems": 1, - "title": "Authors" - }, - "contact": { - "type": "string", - "format": "email", - "title": "Contact", - "description": "email to correspond to the authors about the node" - }, - "inputs": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Inputs", - "description": "definition of the inputs of this node" - }, - "outputs": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Outputs", - "description": "definition of the outputs of this node" - }, - "boot-options": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Boot-Options", - "description": "Service defined boot options. These get injected in the service as env variables." - }, - "min-visible-inputs": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Min-Visible-Inputs", - "description": "The number of 'data type inputs' displayed by default in the UI. When None all 'data type inputs' are displayed." - }, - "progress_regexp": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Progress Regexp", - "description": "regexp pattern for detecting computational service's progress" - }, - "image_digest": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Image Digest", - "description": "Image manifest digest. Note that this is NOT injected as an image label" - }, - "owner": { - "anyOf": [ - { - "type": "string", - "format": "email" - }, - { - "type": "null" - } - ], - "title": "Owner" - } - }, - "type": "object", - "required": [ - "name", - "description", - "classifiers", - "key", - "version", - "type", - "authors", - "contact", - "inputs", - "outputs", - "owner" - ], - "title": "ServiceGet" - }, - "ServiceGroupAccessRights": { - "properties": { - "execute_access": { - "type": "boolean", - "title": "Execute Access", - "description": "defines whether the group can execute the service", - "default": false - }, - "write_access": { - "type": "boolean", - "title": "Write Access", - "description": "defines whether the group can modify the service", - "default": false - } - }, - "type": "object", - "title": "ServiceGroupAccessRights" - }, - "ServiceInput": { - "properties": { - "displayOrder": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Displayorder", - "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", - "deprecated": true - }, - "label": { - "type": "string", - "title": "Label", - "description": "short name for the property" - }, - "description": { - "type": "string", - "title": "Description", - "description": "description of the property" - }, - "type": { - "type": "string", - "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", - "title": "Type", - "description": "data type expected on this input glob matching for data type is allowed" - }, - "contentSchema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Contentschema", - "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" - }, - "fileToKeyMap": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Filetokeymap", - "description": "Place the data associated with the named keys in files" - }, - "unit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Unit", - "description": "Units, when it refers to a physical quantity", - "deprecated": true - }, - "defaultValue": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Defaultvalue", - "deprecated": true - }, - "widget": { - "anyOf": [ - { - "$ref": "#/components/schemas/Widget" - }, - { - "type": "null" - } - ], - "description": "custom widget to use instead of the default one determined from the data-type" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "label", - "description", - "type" - ], - "title": "ServiceInput", - "description": "Metadata on a service input port" - }, - "ServiceOutput": { - "properties": { - "displayOrder": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Displayorder", - "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", - "deprecated": true - }, - "label": { - "type": "string", - "title": "Label", - "description": "short name for the property" - }, - "description": { - "type": "string", - "title": "Description", - "description": "description of the property" - }, - "type": { - "type": "string", - "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", - "title": "Type", - "description": "data type expected on this input glob matching for data type is allowed" - }, - "contentSchema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Contentschema", - "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" - }, - "fileToKeyMap": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Filetokeymap", - "description": "Place the data associated with the named keys in files" - }, - "unit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Unit", - "description": "Units, when it refers to a physical quantity", - "deprecated": true - }, - "widget": { - "anyOf": [ - { - "$ref": "#/components/schemas/Widget" - }, - { - "type": "null" - } - ], - "description": "custom widget to use instead of the default one determined from the data-type", - "deprecated": true - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "label", - "description", - "type" - ], - "title": "ServiceOutput" - }, - "ServicePortGet": { - "properties": { - "key": { - "type": "string", - "pattern": "^[^_\\W0-9]\\w*$", - "title": "Key name", - "description": "port identifier name" - }, - "kind": { - "type": "string", - "enum": [ - "input", - "output" - ], - "title": "Kind" - }, - "content_media_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Content Media Type" - }, - "content_schema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Content Schema", - "description": "jsonschema for the port's value. SEE https://json-schema.org/understanding-json-schema/" - } - }, - "type": "object", - "required": [ - "key", - "kind" - ], - "title": "ServicePortGet", - "example": { - "content_schema": { - "maximum": 5, - "minimum": 0, - "title": "Sleep interval", - "type": "integer", - "x_unit": "second" - }, - "key": "input_1", - "kind": "input" - } - }, - "ServiceSpec": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name of the service." - }, - "Labels": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Labels", - "description": "User-defined key/value metadata." - }, - "TaskTemplate": { - "anyOf": [ - { - "$ref": "#/components/schemas/TaskSpec" - }, - { - "type": "null" - } - ] - }, - "Mode": { - "anyOf": [ - { - "$ref": "#/components/schemas/Mode" - }, - { - "type": "null" - } - ], - "description": "Scheduling mode for the service." - }, - "UpdateConfig": { - "anyOf": [ - { - "$ref": "#/components/schemas/UpdateConfig" - }, - { - "type": "null" - } - ], - "description": "Specification for the update strategy of the service." - }, - "RollbackConfig": { - "anyOf": [ - { - "$ref": "#/components/schemas/RollbackConfig" - }, - { - "type": "null" - } - ], - "description": "Specification for the rollback strategy of the service." - }, - "Networks": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NetworkAttachmentConfig" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Networks", - "description": "Specifies which networks the service should attach to." - }, - "EndpointSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/EndpointSpec" - }, - { - "type": "null" - } - ] - } - }, - "type": "object", - "title": "ServiceSpec", - "description": "User modifiable configuration for a service." - }, - "ServiceSpecificationsGet": { - "properties": { - "sidecar": { - "anyOf": [ - { - "$ref": "#/components/schemas/ServiceSpec" - }, - { - "type": "null" - } - ], - "description": "schedule-time specifications for the service sidecar (follows Docker Service creation API, see https://docs.docker.com/engine/api/v1.25/#operation/ServiceCreate)" - }, - "service": { - "anyOf": [ - { - "$ref": "#/components/schemas/ServiceSpec" - }, - { - "type": "null" - } - ], - "description": "schedule-time specifications specifications for the service (follows Docker Service creation API (specifically only the Resources part), see https://docs.docker.com/engine/api/v1.41/#tag/Service/operation/ServiceCreate" - } - }, - "type": "object", - "title": "ServiceSpecificationsGet" - }, - "ServiceType": { - "type": "string", - "enum": [ - "computational", - "dynamic", - "frontend", - "backend" - ], - "title": "ServiceType" - }, - "ServiceUpdate": { - "properties": { - "accessRights": { - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/components/schemas/ServiceGroupAccessRights" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Accessrights", - "description": "service access rights per group id" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "thumbnail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Thumbnail" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "description_ui": { - "type": "boolean", - "title": "Description Ui", - "default": false - }, - "version_display": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version Display" - }, - "deprecated": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Deprecated", - "description": "Owner can set the date to retire the service. Three possibilities:If None, the service is marked as `published`;If now=deprecated, the service is retired" - }, - "classifiers": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Classifiers" - }, - "quality": { - "type": "object", - "title": "Quality", - "default": {} - } - }, - "type": "object", - "required": [ - "name", - "thumbnail", - "description", - "classifiers" - ], - "title": "ServiceUpdate", - "example": { - "accessRights": { - "1": { - "execute_access": false, - "write_access": false - }, - "2": { - "execute_access": true, - "write_access": true - }, - "44": { - "execute_access": false, - "write_access": false - } - }, - "classifiers": [ - "RRID:SCR_018997", - "RRID:SCR_019001" - ], - "description": "An interesting service that does something", - "name": "My Human Readable Service Name", - "quality": { - "annotations": { - "certificationLink": "", - "certificationStatus": "Uncertified", - "documentation": "", - "limitations": "", - "purpose": "", - "standards": "", - "vandv": "" - }, - "enabled": true, - "tsr": { - "r01": { - "level": 3, - "references": "" - }, - "r02": { - "level": 2, - "references": "" - }, - "r03": { - "level": 0, - "references": "" - }, - "r04": { - "level": 0, - "references": "" - }, - "r05": { - "level": 2, - "references": "" - }, - "r06": { - "level": 0, - "references": "" - }, - "r07": { - "level": 0, - "references": "" - }, - "r08": { - "level": 1, - "references": "" - }, - "r09": { - "level": 0, - "references": "" - }, - "r10": { - "level": 0, - "references": "" - } - } - } - } - }, - "Spread": { - "properties": { - "SpreadDescriptor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Spreaddescriptor", - "description": "label descriptor, such as `engine.labels.az`.\n" - } - }, - "type": "object", - "title": "Spread" - }, - "Structure": { - "properties": { - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "boolean" - }, - { - "type": "number" - } - ], - "title": "Key" - }, - "label": { - "type": "string", - "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "key", - "label" - ], - "title": "Structure" - }, - "TaskSpec": { - "properties": { - "PluginSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/PluginSpec" - }, - { - "type": "null" - } - ], - "description": "Plugin spec for the service. *(Experimental release only.)*\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" - }, - "ContainerSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/ContainerSpec" - }, - { - "type": "null" - } - ], - "description": "Container spec for the service.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" - }, - "NetworkAttachmentSpec": { - "anyOf": [ - { - "$ref": "#/components/schemas/NetworkAttachmentSpec" - }, - { - "type": "null" - } - ], - "description": "Read-only spec type for non-swarm containers attached to swarm overlay\nnetworks.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" - }, - "Resources": { - "anyOf": [ - { - "$ref": "#/components/schemas/Resources1" - }, - { - "type": "null" - } - ], - "description": "Resource requirements which apply to each individual container created\nas part of the service.\n" - }, - "RestartPolicy": { - "anyOf": [ - { - "$ref": "#/components/schemas/RestartPolicy1" - }, - { - "type": "null" - } - ], - "description": "Specification for the restart policy which applies to containers\ncreated as part of this service.\n" - }, - "Placement": { - "anyOf": [ - { - "$ref": "#/components/schemas/Placement" - }, - { - "type": "null" - } - ] - }, - "ForceUpdate": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Forceupdate", - "description": "A counter that triggers an update even if no relevant parameters have\nbeen changed.\n" - }, - "Runtime": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Runtime", - "description": "Runtime is the type of runtime specified for the task executor.\n" - }, - "Networks": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/NetworkAttachmentConfig" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Networks", - "description": "Specifies which networks the service should attach to." - }, - "LogDriver": { - "anyOf": [ - { - "$ref": "#/components/schemas/LogDriver1" - }, - { - "type": "null" - } - ], - "description": "Specifies the log driver to use for tasks created from this spec. If\nnot present, the default one for the swarm will be used, finally\nfalling back to the engine default if not specified.\n" - } - }, - "type": "object", - "title": "TaskSpec", - "description": "User modifiable task configuration." - }, - "TextArea": { - "properties": { - "minHeight": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Minheight", - "description": "minimum Height of the textarea", - "minimum": 0 - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "minHeight" - ], - "title": "TextArea" - }, - "TmpfsOptions": { - "properties": { - "SizeBytes": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Sizebytes", - "description": "The size for the tmpfs mount in bytes." - }, - "Mode": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Mode", - "description": "The permission mode for the tmpfs mount in an integer." - } - }, - "type": "object", - "title": "TmpfsOptions", - "description": "Optional configuration for the `tmpfs` type." - }, - "Type": { - "type": "string", - "enum": [ - "tcp", - "udp", - "sctp" - ], - "title": "Type" - }, - "Type2": { - "type": "string", - "enum": [ - "bind", - "volume", - "tmpfs", - "npipe" - ], - "title": "Type2", - "description": "The mount type. Available types:\n\n- `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.\n- `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.\n- `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.\n- `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container." - }, - "Ulimit": { - "properties": { - "Name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name of ulimit" - }, - "Soft": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Soft", - "description": "Soft limit" - }, - "Hard": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Hard", - "description": "Hard limit" - } - }, - "type": "object", - "title": "Ulimit" - }, - "UpdateConfig": { - "properties": { - "Parallelism": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Parallelism", - "description": "Maximum number of tasks to be updated in one iteration (0 means\nunlimited parallelism).\n" - }, - "Delay": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Delay", - "description": "Amount of time between updates, in nanoseconds." - }, - "FailureAction": { - "anyOf": [ - { - "$ref": "#/components/schemas/FailureAction" - }, - { - "type": "null" - } - ], - "description": "Action to take if an updated task fails to run, or stops running\nduring the update.\n" - }, - "Monitor": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Monitor", - "description": "Amount of time to monitor each updated task for failures, in\nnanoseconds.\n" - }, - "MaxFailureRatio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Maxfailureratio", - "description": "The fraction of tasks that may fail during an update before the\nfailure action is invoked, specified as a floating point number\nbetween 0 and 1.\n", - "default": 0 - }, - "Order": { - "anyOf": [ - { - "$ref": "#/components/schemas/Order" - }, - { - "type": "null" - } - ], - "description": "The order of operations when rolling out an updated task. Either\nthe old task is shut down before the new task is started, or the\nnew task is started before the old task is shut down.\n" - } - }, - "type": "object", - "title": "UpdateConfig", - "description": "Specification for the update strategy of the service." - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "VolumeOptions": { - "properties": { - "NoCopy": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Nocopy", - "description": "Populate volume with data from the target.", - "default": false - }, - "Labels": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Labels", - "description": "User-defined key/value metadata." - }, - "DriverConfig": { - "anyOf": [ - { - "$ref": "#/components/schemas/DriverConfig" - }, - { - "type": "null" - } - ], - "description": "Map of driver specific options" - } - }, - "type": "object", - "title": "VolumeOptions", - "description": "Optional configuration for the `volume` type." - }, - "Widget": { - "properties": { - "type": { - "$ref": "#/components/schemas/WidgetType", - "description": "type of the property" - }, - "details": { - "anyOf": [ - { - "$ref": "#/components/schemas/TextArea" - }, - { - "$ref": "#/components/schemas/SelectBox" - } - ], - "title": "Details" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type", - "details" - ], - "title": "Widget" - }, - "WidgetType": { - "type": "string", - "enum": [ - "TextArea", - "SelectBox" - ], - "title": "WidgetType" - } - } - } -} diff --git a/services/director-v2/openapi.json b/services/director-v2/openapi.json deleted file mode 100644 index cdd6d4eca05..00000000000 --- a/services/director-v2/openapi.json +++ /dev/null @@ -1,4062 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-director-v2", - "description": "Orchestrates the pipeline of services defined by the user", - "version": "2.3.0" - }, - "servers": [ - { - "url": "/", - "description": "Default server: requests directed to serving url" - }, - { - "url": "http://{host}:{port}", - "description": "Development server: can configure any base url", - "variables": { - "host": { - "default": "127.0.0.1" - }, - "port": { - "default": "8000" - } - } - } - ], - "paths": { - "/": { - "get": { - "summary": "Check Service Health", - "operationId": "check_service_health__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HealthCheckGet" - } - } - } - } - } - } - }, - "/meta": { - "get": { - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BaseMeta" - } - } - } - } - } - } - }, - "/v2/computations": { - "post": { - "tags": [ - "computations" - ], - "summary": "Create and optionally start a new computation", - "operationId": "create_computation_v2_computations_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationCreate" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationGet" - } - } - } - }, - "404": { - "description": "Project or pricing details not found" - }, - "406": { - "description": "Cluster not found" - }, - "503": { - "description": "Service not available" - }, - "422": { - "description": "Configuration error" - }, - "402": { - "description": "Payment required" - }, - "409": { - "description": "Project already started" - } - } - } - }, - "/v2/computations/{project_id}": { - "get": { - "tags": [ - "computations" - ], - "summary": "Returns a computation pipeline state", - "operationId": "get_computation_v2_computations__project_id__get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "computations" - ], - "summary": "Deletes a computation pipeline", - "operationId": "delete_computation_v2_computations__project_id__delete", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationDelete" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/computations/{project_id}:stop": { - "post": { - "tags": [ - "computations" - ], - "summary": "Stops a computation pipeline", - "operationId": "stop_computation_v2_computations__project_id__stop_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationStop" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ComputationGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/computations/{project_id}/tasks/-/logfile": { - "get": { - "tags": [ - "computations" - ], - "summary": "Gets computation task logs file after is done", - "description": "Returns download links to log-files of each task in a computation.\nEach log is only available when the corresponding task is done", - "operationId": "get_all_tasks_log_files_v2_computations__project_id__tasks___logfile_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/TaskLogFileGet" - }, - "type": "array", - "title": "Response Get All Tasks Log Files V2 Computations Project Id Tasks Logfile Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/computations/{project_id}/tasks/{node_uuid}/logfile": { - "get": { - "tags": [ - "computations" - ], - "summary": "Gets computation task logs file after is done", - "description": "Returns a link to download logs file of a give task.\nThe log is only available when the task is done", - "operationId": "get_task_log_file_v2_computations__project_id__tasks__node_uuid__logfile_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TaskLogFileGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/computations/{project_id}/tasks/-/outputs:batchGet": { - "post": { - "tags": [ - "computations" - ], - "summary": "Gets all outputs for selected tasks", - "operationId": "get_batch_tasks_outputs_v2_computations__project_id__tasks___outputs_batchGet_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TasksSelection" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TasksOutputs" - } - } - } - }, - "404": { - "description": "Cannot find computation or the tasks in it" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services": { - "get": { - "tags": [ - "dynamic services" - ], - "summary": "returns a list of running interactive services filtered by user_id and/or project_idboth legacy (director-v0) and modern (director-v2)", - "operationId": "list_tracked_dynamic_services_v2_dynamic_services_get", - "parameters": [ - { - "required": false, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - }, - { - "required": false, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/RunningDynamicServiceDetails" - }, - "type": "array", - "title": "Response List Tracked Dynamic Services V2 Dynamic Services Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "post": { - "tags": [ - "dynamic services" - ], - "summary": "creates & starts the dynamic service", - "operationId": "create_dynamic_service_v2_dynamic_services_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "title": "X-Dynamic-Sidecar-Request-Dns" - }, - "name": "x-dynamic-sidecar-request-dns", - "in": "header" - }, - { - "required": true, - "schema": { - "type": "string", - "title": "X-Dynamic-Sidecar-Request-Scheme" - }, - "name": "x-dynamic-sidecar-request-scheme", - "in": "header" - }, - { - "required": true, - "schema": { - "type": "string", - "title": "X-Simcore-User-Agent" - }, - "name": "x-simcore-user-agent", - "in": "header" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DynamicServiceCreate" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RunningDynamicServiceDetails" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services/{node_uuid}": { - "get": { - "tags": [ - "dynamic services" - ], - "summary": "assembles the status for the dynamic-sidecar", - "operationId": "get_dynamic_sidecar_status_v2_dynamic_services__node_uuid__get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RunningDynamicServiceDetails" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "dynamic services" - ], - "summary": "stops previously spawned dynamic-sidecar", - "operationId": "stop_dynamic_service_v2_dynamic_services__node_uuid__delete", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - }, - { - "required": false, - "schema": { - "type": "boolean", - "title": "Can Save", - "default": true - }, - "name": "can_save", - "in": "query" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services/{node_uuid}:retrieve": { - "post": { - "tags": [ - "dynamic services" - ], - "summary": "Calls the dynamic service's retrieve endpoint with optional port_keys", - "operationId": "service_retrieve_data_on_ports_v2_dynamic_services__node_uuid__retrieve_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RetrieveDataIn" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RetrieveDataOutEnveloped" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services/{node_uuid}:restart": { - "post": { - "tags": [ - "dynamic services" - ], - "summary": "Calls the dynamic service's restart containers endpoint", - "operationId": "service_restart_containers_v2_dynamic_services__node_uuid__restart_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services/projects/{project_id}/-/networks": { - "patch": { - "tags": [ - "dynamic services" - ], - "summary": "Updates the project networks according to the current project's workbench", - "operationId": "update_projects_networks_v2_dynamic_services_projects__project_id____networks_patch", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_services/projects/{project_id}/inactivity": { - "get": { - "tags": [ - "dynamic services" - ], - "summary": "returns if the project is inactive", - "operationId": "get_project_inactivity_v2_dynamic_services_projects__project_id__inactivity_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "name": "project_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "number", - "minimum": 0.0, - "title": "Max Inactivity Seconds" - }, - "name": "max_inactivity_seconds", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetProjectInactivityResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters": { - "get": { - "tags": [ - "clusters" - ], - "summary": "Lists clusters for user", - "operationId": "list_clusters_v2_clusters_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/ClusterGet" - }, - "type": "array", - "title": "Response List Clusters V2 Clusters Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "post": { - "tags": [ - "clusters" - ], - "summary": "Create a new cluster for a user", - "operationId": "create_cluster_v2_clusters_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterCreate" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters/default": { - "get": { - "tags": [ - "clusters" - ], - "summary": "Returns the default cluster", - "operationId": "get_default_cluster_v2_clusters_default_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterGet" - } - } - } - } - } - } - }, - "/v2/clusters/{cluster_id}": { - "get": { - "tags": [ - "clusters" - ], - "summary": "Get one cluster for user", - "operationId": "get_cluster_v2_clusters__cluster_id__get", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - }, - "name": "cluster_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "clusters" - ], - "summary": "Remove a cluster for user", - "operationId": "delete_cluster_v2_clusters__cluster_id__delete", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - }, - "name": "cluster_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "patch": { - "tags": [ - "clusters" - ], - "summary": "Modify a cluster for user", - "operationId": "update_cluster_v2_clusters__cluster_id__patch", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - }, - "name": "cluster_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterPatch" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters/default/details": { - "get": { - "tags": [ - "clusters" - ], - "summary": "Returns the cluster details", - "operationId": "get_default_cluster_details_v2_clusters_default_details_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterDetailsGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters/{cluster_id}/details": { - "get": { - "tags": [ - "clusters" - ], - "summary": "Returns the cluster details", - "operationId": "get_cluster_details_v2_clusters__cluster_id__details_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - }, - "name": "cluster_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterDetailsGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters:ping": { - "post": { - "tags": [ - "clusters" - ], - "summary": "Test cluster connection", - "operationId": "test_cluster_connection_v2_clusters_ping_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterPing" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/clusters/default:ping": { - "post": { - "tags": [ - "clusters" - ], - "summary": "Test cluster connection", - "operationId": "test_default_cluster_connection_v2_clusters_default_ping_post", - "responses": { - "204": { - "description": "Successful Response" - } - } - } - }, - "/v2/clusters/{cluster_id}:ping": { - "post": { - "tags": [ - "clusters" - ], - "summary": "Test cluster connection", - "operationId": "test_specific_cluster_connection_v2_clusters__cluster_id__ping_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - }, - "name": "cluster_id", - "in": "path" - }, - { - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "name": "user_id", - "in": "query" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/observation": { - "patch": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Enable/disable observation of the service", - "operationId": "update_service_observation_v2_dynamic_scheduler_services__node_uuid__observation_patch", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ObservationItem" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/containers": { - "delete": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Removes the service's user services", - "operationId": "delete_service_containers_v2_dynamic_scheduler_services__node_uuid__containers_delete", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Delete Service Containers V2 Dynamic Scheduler Services Node Uuid Containers Delete" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/state": { - "get": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Returns the internals of the scheduler for the given service", - "operationId": "get_service_state_v2_dynamic_scheduler_services__node_uuid__state_get", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SchedulerData" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/state:save": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Starts the saving of the state for the service", - "operationId": "save_service_state_v2_dynamic_scheduler_services__node_uuid__state_save_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Save Service State V2 Dynamic Scheduler Services Node Uuid State Save Post" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/outputs:push": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Starts the pushing of the outputs for the service", - "operationId": "push_service_outputs_v2_dynamic_scheduler_services__node_uuid__outputs_push_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Push Service Outputs V2 Dynamic Scheduler Services Node Uuid Outputs Push Post" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/docker-resources": { - "delete": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Removes the service's sidecar, proxy and docker networks & volumes", - "operationId": "delete_service_docker_resources_v2_dynamic_scheduler_services__node_uuid__docker_resources_delete", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Delete Service Docker Resources V2 Dynamic Scheduler Services Node Uuid Docker Resources Delete" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/disk/reserved:free": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Free up reserved disk space", - "operationId": "free_reserved_disk_space_v2_dynamic_scheduler_services__node_uuid__disk_reserved_free_post", - "parameters": [ - { - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - }, - "name": "node_uuid", - "in": "path" - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "BaseMeta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "released": { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object", - "title": "Released", - "description": "Maps every route's path tag with a released version" - } - }, - "type": "object", - "required": [ - "name", - "version" - ], - "title": "BaseMeta", - "example": { - "name": "simcore_service_foo", - "version": "2.4.45", - "released": { - "v1": "1.3.4", - "v2": "2.4.45" - } - } - }, - "BootMode": { - "type": "string", - "enum": [ - "CPU", - "GPU", - "MPI" - ], - "title": "BootMode", - "description": "An enumeration." - }, - "CallbacksMapping": { - "properties": { - "metrics": { - "allOf": [ - { - "$ref": "#/components/schemas/UserServiceCommand" - } - ], - "title": "Metrics", - "description": "command to recover prometheus metrics from a specific user service" - }, - "before_shutdown": { - "items": { - "$ref": "#/components/schemas/UserServiceCommand" - }, - "type": "array", - "title": "Before Shutdown", - "description": "commands to run before shutting down the user servicescommands get executed first to last, multiple commands for the sameuser services are allowed" - }, - "inactivity": { - "allOf": [ - { - "$ref": "#/components/schemas/UserServiceCommand" - } - ], - "title": "Inactivity", - "description": "command used to figure out for how much time the user service(s) were inactive for" - } - }, - "additionalProperties": false, - "type": "object", - "title": "CallbacksMapping" - }, - "ClusterAccessRights": { - "properties": { - "read": { - "type": "boolean", - "title": "Read", - "description": "allows to run pipelines on that cluster" - }, - "write": { - "type": "boolean", - "title": "Write", - "description": "allows to modify the cluster" - }, - "delete": { - "type": "boolean", - "title": "Delete", - "description": "allows to delete a cluster" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "read", - "write", - "delete" - ], - "title": "ClusterAccessRights" - }, - "ClusterCreate": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "The human readable name of the cluster" - }, - "description": { - "type": "string", - "title": "Description" - }, - "type": { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - "owner": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Owner", - "minimum": 0 - }, - "thumbnail": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Thumbnail", - "description": "url to the image describing this cluster" - }, - "endpoint": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - } - ], - "title": "Authentication" - }, - "accessRights": { - "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" - }, - "type": "object", - "title": "Accessrights" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type", - "endpoint", - "authentication" - ], - "title": "ClusterCreate" - }, - "ClusterDetailsGet": { - "properties": { - "scheduler": { - "allOf": [ - { - "$ref": "#/components/schemas/Scheduler" - } - ], - "title": "Scheduler", - "description": "This contains dask scheduler information given by the underlying dask library" - }, - "dashboard_link": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Dashboard Link", - "description": "Link to this scheduler's dashboard" - } - }, - "type": "object", - "required": [ - "scheduler", - "dashboard_link" - ], - "title": "ClusterDetailsGet" - }, - "ClusterGet": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "The human readable name of the cluster" - }, - "description": { - "type": "string", - "title": "Description" - }, - "type": { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - "owner": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Owner", - "minimum": 0 - }, - "thumbnail": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Thumbnail", - "description": "url to the image describing this cluster" - }, - "endpoint": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - }, - { - "$ref": "#/components/schemas/NoAuthentication" - }, - { - "$ref": "#/components/schemas/TLSAuthentication" - } - ], - "title": "Authentication", - "description": "Dask gateway authentication" - }, - "accessRights": { - "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" - }, - "type": "object", - "title": "Accessrights" - }, - "id": { - "type": "integer", - "minimum": 0, - "title": "Id", - "description": "The cluster ID" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type", - "owner", - "endpoint", - "authentication", - "id" - ], - "title": "ClusterGet" - }, - "ClusterPatch": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "description": { - "type": "string", - "title": "Description" - }, - "type": { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - "owner": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Owner", - "minimum": 0 - }, - "thumbnail": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Thumbnail" - }, - "endpoint": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - } - ], - "title": "Authentication" - }, - "accessRights": { - "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" - }, - "type": "object", - "title": "Accessrights" - } - }, - "additionalProperties": false, - "type": "object", - "title": "ClusterPatch" - }, - "ClusterPing": { - "properties": { - "endpoint": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - }, - { - "$ref": "#/components/schemas/NoAuthentication" - }, - { - "$ref": "#/components/schemas/TLSAuthentication" - } - ], - "title": "Authentication", - "description": "Dask gateway authentication" - } - }, - "type": "object", - "required": [ - "endpoint", - "authentication" - ], - "title": "ClusterPing" - }, - "ClusterTypeInModel": { - "type": "string", - "enum": [ - "AWS", - "ON_PREMISE", - "ON_DEMAND" - ], - "title": "ClusterTypeInModel", - "description": "An enumeration." - }, - "ComputationCreate": { - "properties": { - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "project_id": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "start_pipeline": { - "type": "boolean", - "title": "Start Pipeline", - "description": "if True the computation pipeline will start right away", - "default": false - }, - "product_name": { - "type": "string", - "title": "Product Name" - }, - "subgraph": { - "items": { - "type": "string", - "format": "uuid" - }, - "type": "array", - "title": "Subgraph", - "description": "An optional set of nodes that must be executed, if empty the whole pipeline is executed" - }, - "force_restart": { - "type": "boolean", - "title": "Force Restart", - "description": "if True will force re-running all dependent nodes", - "default": false - }, - "cluster_id": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id", - "description": "the computation shall use the cluster described by its id, 0 is the default cluster" - }, - "simcore_user_agent": { - "type": "string", - "title": "Simcore User Agent", - "default": "" - }, - "use_on_demand_clusters": { - "type": "boolean", - "title": "Use On Demand Clusters", - "description": "if True, a cluster will be created as necessary (wallet_id cannot be None, and cluster_id must be None)", - "default": false - }, - "wallet_info": { - "allOf": [ - { - "$ref": "#/components/schemas/WalletInfo" - } - ], - "title": "Wallet Info", - "description": "contains information about the wallet used to bill the running service" - } - }, - "type": "object", - "required": [ - "user_id", - "project_id", - "product_name" - ], - "title": "ComputationCreate" - }, - "ComputationDelete": { - "properties": { - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "force": { - "type": "boolean", - "title": "Force", - "description": "if True then the pipeline will be removed even if it is running", - "default": false - } - }, - "type": "object", - "required": [ - "user_id" - ], - "title": "ComputationDelete" - }, - "ComputationGet": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id", - "description": "the id of the computation task" - }, - "state": { - "allOf": [ - { - "$ref": "#/components/schemas/RunningState" - } - ], - "description": "the state of the computational task" - }, - "result": { - "type": "string", - "title": "Result", - "description": "the result of the computational task" - }, - "pipeline_details": { - "allOf": [ - { - "$ref": "#/components/schemas/PipelineDetails" - } - ], - "title": "Pipeline Details", - "description": "the details of the generated pipeline" - }, - "iteration": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Iteration", - "description": "the iteration id of the computation task (none if no task ran yet)", - "minimum": 0 - }, - "cluster_id": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id", - "description": "the cluster on which the computaional task runs/ran (none if no task ran yet)" - }, - "started": { - "type": "string", - "format": "date-time", - "title": "Started", - "description": "the timestamp when the computation was started or None if not started yet" - }, - "stopped": { - "type": "string", - "format": "date-time", - "title": "Stopped", - "description": "the timestamp when the computation was stopped or None if not started nor stopped yet" - }, - "submitted": { - "type": "string", - "format": "date-time", - "title": "Submitted", - "description": "task last modification timestamp or None if the there is no task" - }, - "url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Url", - "description": "the link where to get the status of the task" - }, - "stop_url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Stop Url", - "description": "the link where to stop the task" - } - }, - "type": "object", - "required": [ - "id", - "state", - "pipeline_details", - "iteration", - "cluster_id", - "started", - "stopped", - "submitted", - "url" - ], - "title": "ComputationGet" - }, - "ComputationStop": { - "properties": { - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - } - }, - "type": "object", - "required": [ - "user_id" - ], - "title": "ComputationStop" - }, - "ContainerState": { - "properties": { - "Status": { - "allOf": [ - { - "$ref": "#/components/schemas/Status2" - } - ], - "description": "String representation of the container state. Can be one of \"created\",\n\"running\", \"paused\", \"restarting\", \"removing\", \"exited\", or \"dead\".\n", - "example": "running" - }, - "Running": { - "type": "boolean", - "title": "Running", - "description": "Whether this container is running.\n\nNote that a running container can be _paused_. The `Running` and `Paused`\nbooleans are not mutually exclusive:\n\nWhen pausing a container (on Linux), the freezer cgroup is used to suspend\nall processes in the container. Freezing the process requires the process to\nbe running. As a result, paused containers are both `Running` _and_ `Paused`.\n\nUse the `Status` field instead to determine if a container's state is \"running\".\n", - "example": true - }, - "Paused": { - "type": "boolean", - "title": "Paused", - "description": "Whether this container is paused.", - "example": false - }, - "Restarting": { - "type": "boolean", - "title": "Restarting", - "description": "Whether this container is restarting.", - "example": false - }, - "OOMKilled": { - "type": "boolean", - "title": "Oomkilled", - "description": "Whether this container has been killed because it ran out of memory.\n", - "example": false - }, - "Dead": { - "type": "boolean", - "title": "Dead", - "example": false - }, - "Pid": { - "type": "integer", - "title": "Pid", - "description": "The process ID of this container", - "example": 1234 - }, - "ExitCode": { - "type": "integer", - "title": "Exitcode", - "description": "The last exit code of this container", - "example": 0 - }, - "Error": { - "type": "string", - "title": "Error" - }, - "StartedAt": { - "type": "string", - "title": "Startedat", - "description": "The time when this container was last started.", - "example": "2020-01-06T09:06:59.461876391Z" - }, - "FinishedAt": { - "type": "string", - "title": "Finishedat", - "description": "The time when this container last exited.", - "example": "2020-01-06T09:07:59.461876391Z" - }, - "Health": { - "$ref": "#/components/schemas/Health" - } - }, - "type": "object", - "title": "ContainerState", - "description": " ContainerState stores container's running state. It's part of ContainerJSONBase\nand will be returned by the \"inspect\" command." - }, - "DNSResolver": { - "properties": { - "address": { - "anyOf": [ - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - }, - { - "type": "string" - } - ], - "title": "Address", - "description": "this is not an url address is derived from IP address" - }, - "port": { - "anyOf": [ - { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 65535, - "minimum": 0 - }, - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - } - ], - "title": "Port" - } - }, - "type": "object", - "required": [ - "address", - "port" - ], - "title": "DNSResolver" - }, - "DelayedExceptionHandler": { - "properties": { - "delay_for": { - "type": "number", - "minimum": 0.0, - "title": "Delay For", - "description": "interval of time during which exceptions are ignored" - } - }, - "type": "object", - "required": [ - "delay_for" - ], - "title": "DelayedExceptionHandler", - "description": "Allows to ignore an exception for an established\nperiod of time after which it is raised.\n\nThis use case most commonly occurs when dealing with\nexternal systems.\nFor example, due to poor network performance or\nnetwork congestion, an external system which is healthy,\ncurrently is not reachable any longer.\nA possible solution:\n- ignore exceptions for an interval in which the\n system usually is reachable again by not\n raising the error\n- if the error persist give up and raise it\n\nExample code usage:\n\n delayed_handler_external_service = DelayedExceptionHandler(\n delay_for=60\n )\n try:\n function_called_periodically_accessing_external_service()\n except TargetException as e:\n delayed_handler_external_service.try_to_raise(e)\n else:\n delayed_handler_external_service.else_reset()" - }, - "DictModel_str__PositiveFloat_": { - "additionalProperties": { - "type": "number", - "exclusiveMinimum": true, - "minimum": 0.0 - }, - "type": "object", - "title": "DictModel[str, PositiveFloat]" - }, - "DockerContainerInspect": { - "properties": { - "container_state": { - "allOf": [ - { - "$ref": "#/components/schemas/ContainerState" - } - ], - "title": "Container State", - "description": "current state of container" - }, - "name": { - "type": "string", - "title": "Name", - "description": "docker name of the container" - }, - "id": { - "type": "string", - "title": "Id", - "description": "docker id of the container" - } - }, - "type": "object", - "required": [ - "container_state", - "name", - "id" - ], - "title": "DockerContainerInspect" - }, - "DynamicServiceCreate": { - "properties": { - "service_key": { - "type": "string", - "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key", - "description": "distinctive name for the node based on the docker registry path" - }, - "service_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version", - "description": "semantic version number of the node" - }, - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "project_id": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "service_uuid": { - "type": "string", - "format": "uuid", - "title": "Service Uuid" - }, - "service_basepath": { - "type": "string", - "format": "path", - "title": "Service Basepath", - "description": "predefined path where the dynamic service should be served. If empty, the service shall use the root endpoint." - }, - "service_resources": { - "additionalProperties": { - "$ref": "#/components/schemas/ImageResources" - }, - "type": "object", - "title": "Service Resources" - }, - "product_name": { - "type": "string", - "title": "Product Name", - "description": "Current product name" - }, - "can_save": { - "type": "boolean", - "title": "Can Save", - "description": "the service data must be saved when closing" - }, - "wallet_info": { - "allOf": [ - { - "$ref": "#/components/schemas/WalletInfo" - } - ], - "title": "Wallet Info", - "description": "contains information about the wallet used to bill the running service" - }, - "pricing_info": { - "allOf": [ - { - "$ref": "#/components/schemas/PricingInfo" - } - ], - "title": "Pricing Info", - "description": "contains pricing information (ex. pricing plan and unit ids)" - }, - "hardware_info": { - "allOf": [ - { - "$ref": "#/components/schemas/HardwareInfo" - } - ], - "title": "Hardware Info", - "description": "contains harware information (ex. aws_ec2_instances)" - } - }, - "type": "object", - "required": [ - "service_key", - "service_version", - "user_id", - "project_id", - "service_uuid", - "service_resources", - "product_name", - "can_save" - ], - "title": "DynamicServiceCreate", - "example": { - "key": "simcore/services/dynamic/3dviewer", - "version": "2.4.5", - "user_id": 234, - "project_id": "dd1d04d9-d704-4f7e-8f0f-1ca60cc771fe", - "node_uuid": "75c7f3f4-18f9-4678-8610-54a2ade78eaa", - "basepath": "/x/75c7f3f4-18f9-4678-8610-54a2ade78eaa", - "product_name": "osparc", - "can_save": true, - "service_resources": { - "container": { - "image": "simcore/services/dynamic/jupyter-math:2.0.5", - "resources": { - "CPU": { - "limit": 0.1, - "reservation": 0.1 - }, - "RAM": { - "limit": 2147483648, - "reservation": 2147483648 - } - }, - "boot_modes": [ - "CPU" - ] - } - }, - "wallet_info": { - "wallet_id": 1, - "wallet_name": "My Wallet", - "wallet_credit_amount": 10 - }, - "pricing_info": { - "pricing_plan_id": 1, - "pricing_unit_id": 1, - "pricing_unit_cost_id": 1 - }, - "hardware_info": { - "aws_ec2_instances": [ - "c6a.4xlarge" - ] - } - } - }, - "DynamicSidecar": { - "properties": { - "status": { - "allOf": [ - { - "$ref": "#/components/schemas/simcore_service_director_v2__models__dynamic_services_scheduler__Status" - } - ], - "title": "Status", - "description": "status of the service sidecar also with additional information", - "default": { - "current": "ok", - "info": "" - } - }, - "is_ready": { - "type": "boolean", - "title": "Is Ready", - "default": false, - "scription": "is True while the health check on the dynamic-sidecar is responding. Meaning that the dynamic-sidecar is reachable and can accept requests" - }, - "was_compose_spec_submitted": { - "type": "boolean", - "title": "Was Compose Spec Submitted", - "description": "if the docker-compose spec was already submitted this fields is True", - "default": false - }, - "containers_inspect": { - "items": { - "$ref": "#/components/schemas/DockerContainerInspect" - }, - "type": "array", - "title": "Containers Inspect", - "default": [], - "scription": "docker inspect results from all the container ran at regular intervals" - }, - "was_dynamic_sidecar_started": { - "type": "boolean", - "title": "Was Dynamic Sidecar Started", - "default": false - }, - "is_healthy": { - "type": "boolean", - "title": "Is Healthy", - "default": false - }, - "were_containers_created": { - "type": "boolean", - "title": "Were Containers Created", - "description": "when True no longer will the Docker api be used to check if the services were started", - "default": false - }, - "is_project_network_attached": { - "type": "boolean", - "title": "Is Project Network Attached", - "description": "When True, all containers were in running state and project networks were attached. Waiting for the container sto be in running state guarantees all containers have been created", - "default": false - }, - "is_service_environment_ready": { - "type": "boolean", - "title": "Is Service Environment Ready", - "description": "True when the environment setup required by the dynamic-sidecars created services was completed.Example: nodeports data downloaded, globally shared service data fetched, etc..", - "default": false - }, - "service_removal_state": { - "allOf": [ - { - "$ref": "#/components/schemas/ServiceRemovalState" - } - ], - "title": "Service Removal State", - "description": "stores information used during service removal from the dynamic-sidecar scheduler" - }, - "wait_for_manual_intervention_after_error": { - "type": "boolean", - "title": "Wait For Manual Intervention After Error", - "description": "Marks the sidecar as untouchable since there was an error and important data might be lost. awaits for manual intervention.", - "default": false - }, - "wait_for_manual_intervention_logged": { - "type": "boolean", - "title": "Wait For Manual Intervention Logged", - "description": "True if a relative message was logged", - "default": false - }, - "were_state_and_outputs_saved": { - "type": "boolean", - "title": "Were State And Outputs Saved", - "description": "set True if the dy-sidecar saves the state and uploads the outputs", - "default": false - }, - "instrumentation": { - "allOf": [ - { - "$ref": "#/components/schemas/ServicesInstrumentation" - } - ], - "title": "Instrumentation", - "description": "keeps track times for various operations" - }, - "dynamic_sidecar_id": { - "type": "string", - "maxLength": 25, - "pattern": "[A-Za-z0-9]{25}", - "title": "Dynamic Sidecar Id", - "description": "returned by the docker engine; used for starting the proxy" - }, - "dynamic_sidecar_network_id": { - "type": "string", - "maxLength": 25, - "pattern": "[A-Za-z0-9]{25}", - "title": "Dynamic Sidecar Network Id", - "description": "returned by the docker engine; used for starting the proxy" - }, - "swarm_network_id": { - "type": "string", - "maxLength": 25, - "pattern": "[A-Za-z0-9]{25}", - "title": "Swarm Network Id", - "description": "returned by the docker engine; used for starting the proxy" - }, - "swarm_network_name": { - "type": "string", - "title": "Swarm Network Name", - "description": "used for starting the proxy" - }, - "docker_node_id": { - "type": "string", - "title": "Docker Node Id", - "description": "contains node id of the docker node where all services and created containers are started" - }, - "inspect_error_handler": { - "allOf": [ - { - "$ref": "#/components/schemas/DelayedExceptionHandler" - } - ], - "title": "Inspect Error Handler", - "description": "Set when the dy-sidecar can no longer be reached by the director-v2. If it will be possible to reach the dy-sidecar again, this value will be set to None.", - "default": { - "delay_for": 0.0 - } - } - }, - "type": "object", - "title": "DynamicSidecar" - }, - "DynamicSidecarStatus": { - "type": "string", - "enum": [ - "ok", - "failing" - ], - "title": "DynamicSidecarStatus", - "description": "An enumeration." - }, - "GetProjectInactivityResponse": { - "properties": { - "is_inactive": { - "type": "boolean", - "title": "Is Inactive" - } - }, - "type": "object", - "required": [ - "is_inactive" - ], - "title": "GetProjectInactivityResponse" - }, - "HTTPValidationError": { - "properties": { - "errors": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Validation errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "HardwareInfo": { - "properties": { - "aws_ec2_instances": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Aws Ec2 Instances" - } - }, - "type": "object", - "required": [ - "aws_ec2_instances" - ], - "title": "HardwareInfo" - }, - "Health": { - "properties": { - "Status": { - "allOf": [ - { - "$ref": "#/components/schemas/models_library__generated_models__docker_rest_api__Status" - } - ], - "description": "Status is one of `none`, `starting`, `healthy` or `unhealthy`\n\n- \"none\" Indicates there is no healthcheck\n- \"starting\" Starting indicates that the container is not yet ready\n- \"healthy\" Healthy indicates that the container is running correctly\n- \"unhealthy\" Unhealthy indicates that the container has a problem\n", - "example": "healthy" - }, - "FailingStreak": { - "type": "integer", - "title": "Failingstreak", - "description": "FailingStreak is the number of consecutive failures", - "example": 0 - }, - "Log": { - "items": { - "$ref": "#/components/schemas/HealthcheckResult" - }, - "type": "array", - "title": "Log", - "description": "Log contains the last few results (oldest first)\n" - } - }, - "type": "object", - "title": "Health", - "description": "Health stores information about the container's healthcheck results." - }, - "HealthCheckGet": { - "properties": { - "timestamp": { - "type": "string", - "title": "Timestamp" - } - }, - "type": "object", - "required": [ - "timestamp" - ], - "title": "HealthCheckGet", - "example": { - "timestamp": "simcore_service_directorv2.api.routes.health@2023-07-03T12:59:12.024551+00:00" - } - }, - "HealthcheckResult": { - "properties": { - "Start": { - "type": "string", - "format": "date-time", - "title": "Start", - "description": "Date and time at which this check started in\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.\n", - "example": "2020-01-04T10:44:24.496525531Z" - }, - "End": { - "type": "string", - "title": "End", - "description": "Date and time at which this check ended in\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.\n", - "example": "2020-01-04T10:45:21.364524523Z" - }, - "ExitCode": { - "type": "integer", - "title": "Exitcode", - "description": "ExitCode meanings:\n\n- `0` healthy\n- `1` unhealthy\n- `2` reserved (considered unhealthy)\n- other values: error running probe\n", - "example": 0 - }, - "Output": { - "type": "string", - "title": "Output", - "description": "Output from last check" - } - }, - "type": "object", - "title": "HealthcheckResult", - "description": "HealthcheckResult stores information about a single run of a healthcheck probe" - }, - "ImageResources": { - "properties": { - "image": { - "type": "string", - "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", - "title": "Image", - "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." - }, - "resources": { - "additionalProperties": { - "$ref": "#/components/schemas/ResourceValue" - }, - "type": "object", - "title": "Resources" - }, - "boot_modes": { - "items": { - "$ref": "#/components/schemas/BootMode" - }, - "type": "array", - "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", - "default": [ - "CPU" - ] - } - }, - "type": "object", - "required": [ - "image", - "resources" - ], - "title": "ImageResources", - "example": { - "image": "simcore/service/dynamic/pretty-intense:1.0.0", - "resources": { - "CPU": { - "limit": 4, - "reservation": 0.1 - }, - "RAM": { - "limit": 103079215104, - "reservation": 536870912 - }, - "VRAM": { - "limit": 1, - "reservation": 1 - }, - "AIRAM": { - "limit": 1, - "reservation": 1 - }, - "ANY_resource": { - "limit": "some_value", - "reservation": "some_value" - } - } - } - }, - "JupyterHubTokenAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "jupyterhub" - ], - "title": "Type", - "default": "jupyterhub" - }, - "api_token": { - "type": "string", - "title": "Api Token" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "api_token" - ], - "title": "JupyterHubTokenAuthentication" - }, - "KerberosAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "kerberos" - ], - "title": "Type", - "default": "kerberos" - } - }, - "additionalProperties": false, - "type": "object", - "title": "KerberosAuthentication" - }, - "NATRule": { - "properties": { - "hostname": { - "anyOf": [ - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - }, - { - "type": "string" - } - ], - "title": "Hostname" - }, - "tcp_ports": { - "items": { - "anyOf": [ - { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 65535, - "minimum": 0 - }, - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - }, - { - "$ref": "#/components/schemas/_PortRange" - } - ] - }, - "type": "array", - "title": "Tcp Ports" - }, - "dns_resolver": { - "allOf": [ - { - "$ref": "#/components/schemas/DNSResolver" - } - ], - "title": "Dns Resolver", - "description": "specify a DNS resolver address and port" - } - }, - "type": "object", - "required": [ - "hostname", - "tcp_ports" - ], - "title": "NATRule", - "description": "Content of \"simcore.service.containers-allowed-outgoing-permit-list\" label" - }, - "NoAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "none" - ], - "title": "Type", - "default": "none" - } - }, - "additionalProperties": false, - "type": "object", - "title": "NoAuthentication" - }, - "NodeState": { - "properties": { - "modified": { - "type": "boolean", - "title": "Modified", - "description": "true if the node's outputs need to be re-computed", - "default": true - }, - "dependencies": { - "items": { - "type": "string", - "format": "uuid" - }, - "type": "array", - "uniqueItems": true, - "title": "Dependencies", - "description": "contains the node inputs dependencies if they need to be computed first" - }, - "currentStatus": { - "allOf": [ - { - "$ref": "#/components/schemas/RunningState" - } - ], - "description": "the node's current state", - "default": "NOT_STARTED" - }, - "progress": { - "type": "number", - "maximum": 1.0, - "minimum": 0.0, - "title": "Progress", - "description": "current progress of the task if available (None if not started or not a computational task)", - "default": 0 - } - }, - "additionalProperties": false, - "type": "object", - "title": "NodeState" - }, - "ObservationItem": { - "properties": { - "is_disabled": { - "type": "boolean", - "title": "Is Disabled" - } - }, - "type": "object", - "required": [ - "is_disabled" - ], - "title": "ObservationItem" - }, - "OsparcVariableIdentifier": { - "type": "string", - "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$", - "title": "OsparcVariableIdentifier" - }, - "PathMappingsLabel": { - "properties": { - "inputs_path": { - "type": "string", - "format": "path", - "title": "Inputs Path", - "description": "folder path where the service expects all the inputs" - }, - "outputs_path": { - "type": "string", - "format": "path", - "title": "Outputs Path", - "description": "folder path where the service is expected to provide all its outputs" - }, - "state_paths": { - "items": { - "type": "string", - "format": "path" - }, - "type": "array", - "title": "State Paths", - "description": "optional list of paths which contents need to be persisted", - "default": [] - }, - "state_exclude": { - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true, - "title": "State Exclude", - "description": "optional list unix shell rules used to exclude files from the state" - }, - "volume_size_limits": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Volume Size Limits", - "description": "Apply volume size limits to entries in: `inputs_path`, `outputs_path` and `state_paths`. Limits must be parsable by Pydantic's ByteSize." - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "inputs_path", - "outputs_path" - ], - "title": "PathMappingsLabel", - "description": "Content of \"simcore.service.paths-mapping\" label" - }, - "PipelineDetails": { - "properties": { - "adjacency_list": { - "additionalProperties": { - "items": { - "type": "string", - "format": "uuid" - }, - "type": "array" - }, - "type": "object", - "title": "Adjacency List", - "description": "The adjacency list of the current pipeline in terms of {NodeID: [successor NodeID]}" - }, - "progress": { - "type": "number", - "maximum": 1.0, - "minimum": 0.0, - "title": "Progress", - "description": "the progress of the pipeline (None if there are no computational tasks)" - }, - "node_states": { - "additionalProperties": { - "$ref": "#/components/schemas/NodeState" - }, - "type": "object", - "title": "Node States", - "description": "The states of each of the computational nodes in the pipeline" - } - }, - "type": "object", - "required": [ - "adjacency_list", - "progress", - "node_states" - ], - "title": "PipelineDetails" - }, - "PricingInfo": { - "properties": { - "pricing_plan_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Plan Id", - "minimum": 0 - }, - "pricing_unit_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Unit Id", - "minimum": 0 - }, - "pricing_unit_cost_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Unit Cost Id", - "minimum": 0 - } - }, - "type": "object", - "required": [ - "pricing_plan_id", - "pricing_unit_id", - "pricing_unit_cost_id" - ], - "title": "PricingInfo" - }, - "ResourceValue": { - "properties": { - "limit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Limit" - }, - "reservation": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Reservation" - } - }, - "type": "object", - "required": [ - "limit", - "reservation" - ], - "title": "ResourceValue" - }, - "RestartPolicy": { - "type": "string", - "enum": [ - "no-restart", - "on-inputs-downloaded" - ], - "title": "RestartPolicy", - "description": "Content of \"simcore.service.restart-policy\" label" - }, - "RetrieveDataIn": { - "properties": { - "port_keys": { - "items": { - "type": "string", - "pattern": "^[-_a-zA-Z0-9]+$" - }, - "type": "array", - "title": "Port Keys", - "description": "The port keys to retrieve data from" - } - }, - "type": "object", - "required": [ - "port_keys" - ], - "title": "RetrieveDataIn" - }, - "RetrieveDataOut": { - "properties": { - "size_bytes": { - "type": "integer", - "title": "Size Bytes", - "description": "The amount of data transferred by the retrieve call" - } - }, - "type": "object", - "required": [ - "size_bytes" - ], - "title": "RetrieveDataOut" - }, - "RetrieveDataOutEnveloped": { - "properties": { - "data": { - "$ref": "#/components/schemas/RetrieveDataOut" - } - }, - "type": "object", - "required": [ - "data" - ], - "title": "RetrieveDataOutEnveloped" - }, - "RunningDynamicServiceDetails": { - "properties": { - "service_key": { - "type": "string", - "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key", - "description": "distinctive name for the node based on the docker registry path" - }, - "service_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version", - "description": "semantic version number of the node" - }, - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "project_id": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "service_uuid": { - "type": "string", - "format": "uuid", - "title": "Service Uuid" - }, - "service_basepath": { - "type": "string", - "format": "path", - "title": "Service Basepath", - "description": "predefined path where the dynamic service should be served. If empty, the service shall use the root endpoint." - }, - "boot_type": { - "allOf": [ - { - "$ref": "#/components/schemas/ServiceBootType" - } - ], - "description": "Describes how the dynamic services was started (legacy=V0, modern=V2).Since legacy services do not have this label it defaults to V0.", - "default": "V0" - }, - "service_host": { - "type": "string", - "title": "Service Host", - "description": "the service swarm internal host name" - }, - "service_port": { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "title": "Service Port", - "description": "the service swarm internal port", - "maximum": 65535, - "minimum": 0 - }, - "published_port": { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "title": "Published Port", - "description": "the service swarm published port if any", - "deprecated": true, - "maximum": 65535, - "minimum": 0 - }, - "entry_point": { - "type": "string", - "title": "Entry Point", - "description": "if empty the service entrypoint is on the root endpoint.", - "deprecated": true - }, - "service_state": { - "allOf": [ - { - "$ref": "#/components/schemas/ServiceState" - } - ], - "description": "service current state" - }, - "service_message": { - "type": "string", - "title": "Service Message", - "description": "additional information related to service state" - } - }, - "type": "object", - "required": [ - "service_key", - "service_version", - "user_id", - "project_id", - "service_uuid", - "service_host", - "service_port", - "service_state" - ], - "title": "RunningDynamicServiceDetails" - }, - "RunningState": { - "type": "string", - "enum": [ - "UNKNOWN", - "PUBLISHED", - "NOT_STARTED", - "PENDING", - "WAITING_FOR_RESOURCES", - "STARTED", - "SUCCESS", - "FAILED", - "ABORTED", - "WAITING_FOR_CLUSTER" - ], - "title": "RunningState", - "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" - }, - "Scheduler": { - "properties": { - "status": { - "type": "string", - "title": "Status", - "description": "The running status of the scheduler" - }, - "workers": { - "additionalProperties": { - "$ref": "#/components/schemas/Worker" - }, - "type": "object", - "title": "Workers" - } - }, - "type": "object", - "required": [ - "status" - ], - "title": "Scheduler" - }, - "SchedulerData": { - "properties": { - "paths_mapping": { - "$ref": "#/components/schemas/PathMappingsLabel" - }, - "simcore.service.compose-spec": { - "type": "object", - "title": "Simcore.Service.Compose-Spec", - "description": "json encoded docker-compose specifications. see https://docs.docker.com/compose/compose-file/, only used by dynamic-sidecar." - }, - "simcore.service.container-http-entrypoint": { - "type": "string", - "title": "Simcore.Service.Container-Http-Entrypoint", - "description": "When a docker-compose specifications is provided, the container where the traffic must flow has to be specified. Required by dynamic-sidecar when compose_spec is set." - }, - "user_preferences_path": { - "type": "string", - "format": "path", - "title": "User Preferences Path" - }, - "simcore.service.restart-policy": { - "allOf": [ - { - "$ref": "#/components/schemas/RestartPolicy" - } - ], - "description": "the dynamic-sidecar can restart all running containers on certain events. Supported events:\n- `no-restart` default\n- `on-inputs-downloaded` after inputs are downloaded\n", - "default": "no-restart" - }, - "simcore.service.containers-allowed-outgoing-permit-list": { - "additionalProperties": { - "items": { - "$ref": "#/components/schemas/NATRule" - }, - "type": "array" - }, - "type": "object", - "title": "Simcore.Service.Containers-Allowed-Outgoing-Permit-List", - "description": "allow internet access to certain domain names and ports per container" - }, - "simcore.service.containers-allowed-outgoing-internet": { - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true, - "title": "Simcore.Service.Containers-Allowed-Outgoing-Internet", - "description": "allow complete internet access to containers in here" - }, - "callbacks_mapping": { - "$ref": "#/components/schemas/CallbacksMapping" - }, - "service_key": { - "type": "string", - "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key", - "description": "distinctive name for the node based on the docker registry path" - }, - "service_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version", - "description": "semantic version number of the node" - }, - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "project_id": { - "type": "string", - "format": "uuid", - "title": "Project Id" - }, - "service_uuid": { - "type": "string", - "format": "uuid", - "title": "Service Uuid" - }, - "service_name": { - "type": "string", - "minLength": 2, - "title": "Service Name", - "description": "Name of the current dynamic-sidecar being observed" - }, - "run_id": { - "type": "string", - "title": "Run Id", - "description": "Uniquely identify the dynamic sidecar session (a.k.a. 2 subsequent exact same services will have a different run_id)" - }, - "hostname": { - "type": "string", - "title": "Hostname", - "description": "dy-sidecar's service hostname (provided by docker-swarm)" - }, - "port": { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "title": "Port", - "description": "dynamic-sidecar port", - "default": 8000, - "maximum": 65535, - "minimum": 0 - }, - "dynamic_sidecar": { - "allOf": [ - { - "$ref": "#/components/schemas/DynamicSidecar" - } - ], - "title": "Dynamic Sidecar", - "description": "stores information fetched from the dynamic-sidecar" - }, - "dynamic_sidecar_network_name": { - "type": "string", - "title": "Dynamic Sidecar Network Name", - "description": "overlay network biding the proxy to the container spaned by the dynamic-sidecar" - }, - "simcore_traefik_zone": { - "type": "string", - "title": "Simcore Traefik Zone", - "description": "required for Traefik to correctly route requests to the spawned container" - }, - "service_port": { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "title": "Service Port", - "description": "port where the service is exposed defined by the service; NOTE: temporary default because it will be changed once the service is started, this value is fetched from the service start spec", - "default": 65534, - "maximum": 65535, - "minimum": 0 - }, - "service_resources": { - "additionalProperties": { - "$ref": "#/components/schemas/ImageResources" - }, - "type": "object", - "title": "Service Resources", - "description": "service resources used to enforce limits" - }, - "request_dns": { - "type": "string", - "title": "Request Dns", - "description": "used when configuring the CORS options on the proxy" - }, - "request_scheme": { - "type": "string", - "title": "Request Scheme", - "description": "used when configuring the CORS options on the proxy" - }, - "request_simcore_user_agent": { - "type": "string", - "title": "Request Simcore User Agent", - "description": "used as label to filter out the metrics from the cAdvisor prometheus metrics" - }, - "proxy_service_name": { - "type": "string", - "title": "Proxy Service Name", - "description": "service name given to the proxy" - }, - "proxy_admin_api_port": { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "title": "Proxy Admin Api Port", - "description": "used as the admin endpoint API port", - "maximum": 65535, - "minimum": 0 - }, - "wallet_info": { - "allOf": [ - { - "$ref": "#/components/schemas/WalletInfo" - } - ], - "title": "Wallet Info", - "description": "contains information about the wallet used to bill the running service" - }, - "pricing_info": { - "allOf": [ - { - "$ref": "#/components/schemas/PricingInfo" - } - ], - "title": "Pricing Info", - "description": "contains pricing information so we know what is the cost of running of the service" - }, - "hardware_info": { - "allOf": [ - { - "$ref": "#/components/schemas/HardwareInfo" - } - ], - "title": "Hardware Info", - "description": "contains harware information so we know on which hardware to run the service" - }, - "product_name": { - "type": "string", - "title": "Product Name", - "description": "Current product upon which this service is scheduled. If set to None, the current product is undefined. Mostly for backwards compatibility" - } - }, - "type": "object", - "required": [ - "paths_mapping", - "service_key", - "service_version", - "user_id", - "project_id", - "service_uuid", - "service_name", - "hostname", - "dynamic_sidecar", - "dynamic_sidecar_network_name", - "simcore_traefik_zone", - "service_resources", - "request_dns", - "request_scheme", - "request_simcore_user_agent" - ], - "title": "SchedulerData", - "description": "All \"simcore.service.*\" labels including keys" - }, - "ServiceBootType": { - "type": "string", - "enum": [ - "V0", - "V2" - ], - "title": "ServiceBootType", - "description": "An enumeration." - }, - "ServiceRemovalState": { - "properties": { - "can_remove": { - "type": "boolean", - "title": "Can Remove", - "description": "when True, marks the service as ready to be removed", - "default": false - }, - "can_save": { - "type": "boolean", - "title": "Can Save", - "description": "when True, saves the internal state and upload outputs of the service", - "default": false - }, - "was_removed": { - "type": "boolean", - "title": "Was Removed", - "description": "Will be True when the removal finished. Used primarily to cancel retrying long running operations.", - "default": false - } - }, - "type": "object", - "title": "ServiceRemovalState" - }, - "ServiceState": { - "enum": [ - "failed", - "pending", - "pulling", - "starting", - "running", - "stopping", - "complete", - "idle" - ], - "title": "ServiceState", - "description": "An enumeration." - }, - "ServicesInstrumentation": { - "properties": { - "start_requested_at": { - "type": "string", - "format": "date-time", - "title": "Start Requested At", - "description": "moment in which the process of starting the service was requested" - }, - "close_requested_at": { - "type": "string", - "format": "date-time", - "title": "Close Requested At", - "description": "moment in which the process of stopping the service was requested" - } - }, - "type": "object", - "title": "ServicesInstrumentation" - }, - "SimpleAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "simple" - ], - "title": "Type", - "default": "simple" - }, - "username": { - "type": "string", - "title": "Username" - }, - "password": { - "type": "string", - "format": "password", - "title": "Password", - "writeOnly": true - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "username", - "password" - ], - "title": "SimpleAuthentication" - }, - "Status2": { - "type": "string", - "enum": [ - "created", - "running", - "paused", - "restarting", - "removing", - "exited", - "dead" - ], - "title": "Status2", - "description": " String representation of the container state. Can be one of \"created\",\n\"running\", \"paused\", \"restarting\", \"removing\", \"exited\", or \"dead\"." - }, - "TLSAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "tls" - ], - "title": "Type", - "default": "tls" - }, - "tls_ca_file": { - "type": "string", - "format": "path", - "title": "Tls Ca File" - }, - "tls_client_cert": { - "type": "string", - "format": "path", - "title": "Tls Client Cert" - }, - "tls_client_key": { - "type": "string", - "format": "path", - "title": "Tls Client Key" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "tls_ca_file", - "tls_client_cert", - "tls_client_key" - ], - "title": "TLSAuthentication" - }, - "TaskCounts": { - "properties": { - "error": { - "type": "integer", - "title": "Error", - "default": 0 - }, - "memory": { - "type": "integer", - "title": "Memory", - "default": 0 - }, - "executing": { - "type": "integer", - "title": "Executing", - "default": 0 - } - }, - "type": "object", - "title": "TaskCounts" - }, - "TaskLogFileGet": { - "properties": { - "task_id": { - "type": "string", - "format": "uuid", - "title": "Task Id" - }, - "download_link": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Download Link", - "description": "Presigned link for log file or None if still not available" - } - }, - "type": "object", - "required": [ - "task_id" - ], - "title": "TaskLogFileGet" - }, - "TasksOutputs": { - "properties": { - "nodes_outputs": { - "additionalProperties": { - "type": "object" - }, - "type": "object", - "title": "Nodes Outputs" - } - }, - "type": "object", - "required": [ - "nodes_outputs" - ], - "title": "TasksOutputs" - }, - "TasksSelection": { - "properties": { - "nodes_ids": { - "items": { - "type": "string", - "format": "uuid" - }, - "type": "array", - "title": "Nodes Ids" - } - }, - "type": "object", - "required": [ - "nodes_ids" - ], - "title": "TasksSelection" - }, - "UsedResources": { - "additionalProperties": { - "type": "number", - "minimum": 0.0 - }, - "type": "object", - "title": "UsedResources" - }, - "UserServiceCommand": { - "properties": { - "service": { - "type": "string", - "title": "Service", - "description": "name of the docker-compose service in the docker-compose spec" - }, - "command": { - "anyOf": [ - { - "type": "string" - }, - { - "items": { - "type": "string" - }, - "type": "array" - } - ], - "title": "Command", - "description": "command to run in container" - }, - "timeout": { - "type": "number", - "minimum": 0.0, - "title": "Timeout", - "description": "after this interval the command will be timed-out" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "service", - "command", - "timeout" - ], - "title": "UserServiceCommand" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "WalletInfo": { - "properties": { - "wallet_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Wallet Id", - "minimum": 0 - }, - "wallet_name": { - "type": "string", - "title": "Wallet Name" - }, - "wallet_credit_amount": { - "type": "number", - "title": "Wallet Credit Amount" - } - }, - "type": "object", - "required": [ - "wallet_id", - "wallet_name", - "wallet_credit_amount" - ], - "title": "WalletInfo" - }, - "Worker": { - "properties": { - "id": { - "type": "string", - "title": "Id" - }, - "name": { - "type": "string", - "title": "Name" - }, - "resources": { - "$ref": "#/components/schemas/DictModel_str__PositiveFloat_" - }, - "used_resources": { - "$ref": "#/components/schemas/UsedResources" - }, - "memory_limit": { - "type": "integer", - "title": "Memory Limit" - }, - "metrics": { - "$ref": "#/components/schemas/WorkerMetrics" - } - }, - "type": "object", - "required": [ - "id", - "name", - "resources", - "used_resources", - "memory_limit", - "metrics" - ], - "title": "Worker" - }, - "WorkerMetrics": { - "properties": { - "cpu": { - "type": "number", - "title": "Cpu", - "description": "consumed % of cpus" - }, - "memory": { - "type": "integer", - "title": "Memory", - "description": "consumed memory" - }, - "num_fds": { - "type": "integer", - "title": "Num Fds", - "description": "consumed file descriptors" - }, - "task_counts": { - "allOf": [ - { - "$ref": "#/components/schemas/TaskCounts" - } - ], - "title": "Task Counts", - "description": "task details" - } - }, - "type": "object", - "required": [ - "cpu", - "memory", - "num_fds", - "task_counts" - ], - "title": "WorkerMetrics" - }, - "_PortRange": { - "properties": { - "lower": { - "anyOf": [ - { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 65535, - "minimum": 0 - }, - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - } - ], - "title": "Lower" - }, - "upper": { - "anyOf": [ - { - "type": "integer", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 65535, - "minimum": 0 - }, - { - "$ref": "#/components/schemas/OsparcVariableIdentifier" - } - ], - "title": "Upper" - } - }, - "type": "object", - "required": [ - "lower", - "upper" - ], - "title": "_PortRange", - "description": "`lower` and `upper` are included" - }, - "models_library__generated_models__docker_rest_api__Status": { - "type": "string", - "enum": [ - "none", - "starting", - "healthy", - "unhealthy" - ], - "title": "Status", - "description": " Status is one of `none`, `starting`, `healthy` or `unhealthy`\n\n- \"none\" Indicates there is no healthcheck\n- \"starting\" Starting indicates that the container is not yet ready\n- \"healthy\" Healthy indicates that the container is running correctly\n- \"unhealthy\" Unhealthy indicates that the container has a problem" - }, - "simcore_service_director_v2__models__dynamic_services_scheduler__Status": { - "properties": { - "current": { - "allOf": [ - { - "$ref": "#/components/schemas/DynamicSidecarStatus" - } - ], - "description": "status of the service" - }, - "info": { - "type": "string", - "title": "Info", - "description": "additional information for the user" - } - }, - "type": "object", - "required": [ - "current", - "info" - ], - "title": "Status", - "description": "Generated from data from docker container inspect API" - } - } - } -} diff --git a/services/dynamic-scheduler/openapi.json b/services/dynamic-scheduler/openapi.json deleted file mode 100644 index b375bb8729e..00000000000 --- a/services/dynamic-scheduler/openapi.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-dynamic-scheduler web API", - "description": " Service that manages lifecycle of dynamic services", - "version": "1.0.0" - }, - "paths": { - "/": { - "get": { - "summary": "Healthcheck", - "operationId": "healthcheck__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/v1/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_v1_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Meta" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Meta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "docs_url": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Docs Url" - } - }, - "type": "object", - "required": [ - "name", - "version", - "docs_url" - ], - "title": "Meta", - "example": { - "name": "simcore_service_dynamic_scheduler", - "version": "2.4.45", - "docs_url": "https://foo.io/doc" - } - } - } - } -} diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml deleted file mode 100644 index 9cca4bafd06..00000000000 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ /dev/null @@ -1,14987 +0,0 @@ -openapi: 3.1.0 -info: - title: simcore-service-webserver - description: Main service with an interface (http-API & websockets) to the web front-end - version: 0.46.0 -servers: -- url: '' - description: webserver -- url: http://{host}:{port} - description: development server - variables: - host: - default: localhost - port: - default: '8001' -paths: - /v0/auth/request-account: - post: - tags: - - auth - summary: Request Product Account - operationId: request_product_account - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/AccountRequestInfo' - required: true - responses: - '204': - description: Successful Response - /v0/auth/register/invitations:check: - post: - tags: - - auth - summary: Check Registration Invitation - description: Check invitation and returns associated email or None - operationId: auth_check_registration_invitation - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/InvitationCheck' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_InvitationInfo_' - /v0/auth/register: - post: - tags: - - auth - summary: Register - description: User registration - operationId: auth_register - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RegisterBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - /v0/auth/unregister: - post: - tags: - - auth - summary: Unregister Account - operationId: unregister_account - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UnregisterCheck' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '409': - description: Conflict - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/verify-phone-number: - post: - tags: - - auth - summary: Register Phone - description: user tries to verify phone number for 2 Factor Authentication when - registering - operationId: auth_register_phone - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RegisterPhoneBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_RegisterPhoneNextPage_' - /v0/auth/validate-code-register: - post: - tags: - - auth - summary: Phone Confirmation - description: user enters 2 Factor Authentication code when registering - operationId: auth_phone_confirmation - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PhoneConfirmationBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - /v0/auth/login: - post: - tags: - - auth - summary: Login - description: user logs in - operationId: auth_login - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/LoginBody' - required: true - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_LoginNextPage_' - '401': - description: unauthorized reset due to invalid token code - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/validate-code-login: - post: - tags: - - auth - summary: Login 2Fa - description: user enters 2 Factor Authentication code when login in - operationId: auth_login_2fa - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/LoginTwoFactorAuthBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '401': - description: unauthorized reset due to invalid token code - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/two_factor:resend: - post: - tags: - - auth - summary: Resend 2Fa Code - description: Resends 2FA either via email or sms - operationId: auth_resend_2fa_code - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Resend2faBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '401': - description: unauthorized reset due to invalid token code - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/logout: - post: - tags: - - auth - summary: Logout - description: user logout - operationId: auth_logout - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/LogoutBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - /v0/auth:check: - get: - tags: - - auth - summary: Check Auth - description: checks if user is authenticated in the platform - operationId: check_authentication - responses: - '204': - description: Successful Response - '401': - description: unauthorized reset due to invalid token code - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/reset-password: - post: - tags: - - auth - summary: Reset Password - description: a non logged-in user requests a password reset - operationId: auth_reset_password - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ResetPasswordBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '503': - description: Service Unavailable - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/reset-password/{code}: - post: - tags: - - auth - summary: Reset Password Allowed - description: changes password using a token code without being logged in - operationId: auth_reset_password_allowed - parameters: - - name: code - in: path - required: true - schema: - type: string - title: Code - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ResetPasswordConfirmation' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '401': - description: unauthorized reset due to invalid token code - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/change-password: - post: - tags: - - auth - summary: Change Password - description: logged in user changes password - operationId: auth_change_password - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ChangePasswordBody' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - '401': - description: unauthorized user. Login required - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - '409': - description: mismatch between new and confirmation passwords - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - '422': - description: current password is invalid - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - /v0/auth/confirmation/{code}: - get: - tags: - - auth - summary: Email Confirmation - description: email link sent to user to confirm an action - operationId: auth_confirmation - parameters: - - name: code - in: path - required: true - schema: - type: string - title: Code - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Log_' - 3XX: - description: redirection to specific ui application page - /v0/auth/api-keys: - get: - tags: - - auth - summary: List Api Keys - description: lists display names of API keys by this user - operationId: list_api_keys - responses: - '200': - description: returns the display names of API keys - content: - application/json: - schema: - items: - type: string - type: array - title: Response 200 List Api Keys - '400': - description: key name requested is invalid - '401': - description: requires login to list keys - '403': - description: not enough permissions to list keys - post: - tags: - - auth - summary: Create Api Key - description: creates API keys to access public API - operationId: create_api_key - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ApiKeyCreate' - required: true - responses: - '200': - description: Authorization granted returning API key - content: - application/json: - schema: - $ref: '#/components/schemas/ApiKeyGet' - '400': - description: key name requested is invalid - '401': - description: requires login to list keys - '403': - description: not enough permissions to list keys - delete: - tags: - - auth - summary: Delete Api Key - description: deletes API key by name - operationId: delete_api_key - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ApiKeyCreate' - required: true - responses: - '204': - description: api key successfully deleted - '401': - description: requires login to delete a key - '403': - description: not enough permissions to delete a key - /v0/auth/captcha: - get: - tags: - - auth - summary: Request Captcha - operationId: request_captcha - responses: - '200': - description: Successful Response - content: - application/json: - schema: {} - image/png: {} - /v0/groups: - get: - tags: - - groups - summary: List Groups - description: List all groups (organizations, primary, everyone and products) - I belong to - operationId: list_groups - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_MyGroupsGet_' - post: - tags: - - groups - summary: Create Group - description: Creates an organization group - operationId: create_group - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/GroupCreate' - required: true - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GroupGet_' - /v0/groups/{gid}: - get: - tags: - - groups - summary: Get Group - description: Get an organization group - operationId: get_group - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GroupGet_' - patch: - tags: - - groups - summary: Update Group - description: Updates organization groups - operationId: update_group - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/GroupUpdate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GroupGet_' - delete: - tags: - - groups - summary: Delete Group - description: Deletes organization groups - operationId: delete_group - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - responses: - '204': - description: Successful Response - /v0/groups/{gid}/users: - get: - tags: - - groups - summary: Get All Group Users - description: Gets users in organization groups - operationId: get_all_group_users - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_GroupUserGet__' - post: - tags: - - groups - summary: Add Group User - description: Adds a user to an organization group - operationId: add_group_user - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/GroupUserAdd' - responses: - '204': - description: Successful Response - /v0/groups/{gid}/users/{uid}: - get: - tags: - - groups - summary: Get Group User - description: Gets specific user in an organization group - operationId: get_group_user - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - - name: uid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Uid - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GroupUserGet_' - patch: - tags: - - groups - summary: Update Group User - description: Updates user (access-rights) to an organization group - operationId: update_group_user - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - - name: uid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Uid - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/GroupUserUpdate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GroupUserGet_' - delete: - tags: - - groups - summary: Delete Group User - description: Removes a user from an organization group - operationId: delete_group_user - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - - name: uid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Uid - minimum: 0 - responses: - '204': - description: Successful Response - /v0/groups/{gid}/classifiers: - get: - tags: - - groups - summary: Get Group Classifiers - operationId: get_group_classifiers - parameters: - - name: gid - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - - name: tree_view - in: query - required: false - schema: - enum: - - std - const: std - type: string - default: std - title: Tree View - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_str__Any__' - /v0/groups/sparc/classifiers/scicrunch-resources/{rrid}: - get: - tags: - - groups - summary: Get Scicrunch Resource - operationId: get_scicrunch_resource - parameters: - - name: rrid - in: path - required: true - schema: - type: string - title: Rrid - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ResearchResource_' - post: - tags: - - groups - summary: Add Scicrunch Resource - operationId: add_scicrunch_resource - parameters: - - name: rrid - in: path - required: true - schema: - type: string - title: Rrid - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ResearchResource_' - /v0/groups/sparc/classifiers/scicrunch-resources:search: - get: - tags: - - groups - summary: Search Scicrunch Resources - operationId: search_scicrunch_resources - parameters: - - name: guess_name - in: query - required: true - schema: - type: string - title: Guess Name - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ResourceHit__' - /v0/tags: - get: - tags: - - tags - summary: List Tags - operationId: list_tags - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_TagGet__' - post: - tags: - - tags - summary: Create Tag - operationId: create_tag - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TagCreate' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TagGet_' - /v0/tags/{tag_id}: - patch: - tags: - - tags - summary: Update Tag - operationId: update_tag - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TagUpdate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TagGet_' - delete: - tags: - - tags - summary: Delete Tag - operationId: delete_tag - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/tags/{tag_id}/groups: - get: - tags: - - tags - - groups - summary: List Tag Groups - operationId: list_tag_groups - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_TagGroupGet__' - /v0/tags/{tag_id}/groups/{group_id}: - post: - tags: - - tags - - groups - summary: Create Tag Group - operationId: create_tag_group - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TagGroupCreate' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TagGet_' - put: - tags: - - tags - - groups - summary: Replace Tag Groups - operationId: replace_tag_groups - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TagGroupCreate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_TagGroupGet__' - delete: - tags: - - tags - - groups - summary: Delete Tag Group - operationId: delete_tag_group - parameters: - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/credits-price: - get: - tags: - - products - summary: Get Current Product Price - operationId: get_current_product_price - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GetCreditPrice_' - /v0/products/{product_name}: - get: - tags: - - products - - po - summary: Get Product - operationId: get_product - parameters: - - name: product_name - in: path - required: true - schema: - anyOf: - - type: string - minLength: 1 - maxLength: 100 - - enum: - - current - const: current - type: string - title: Product Name - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GetProduct_' - /v0/products/{product_name}/templates/{template_id}: - put: - tags: - - products - - po - summary: Update Product Template - operationId: update_product_template - parameters: - - name: product_name - in: path - required: true - schema: - anyOf: - - type: string - minLength: 1 - maxLength: 100 - - enum: - - current - const: current - type: string - title: Product Name - - name: template_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Template Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UpdateProductTemplate' - responses: - '204': - description: Successful Response - /v0/invitation:generate: - post: - tags: - - products - - po - summary: Generate Invitation - operationId: generate_invitation - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/GenerateInvitation' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_InvitationGenerated_' - /v0/me: - get: - tags: - - user - summary: Get My Profile - operationId: get_my_profile - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProfileGet_' - put: - tags: - - user - summary: Update My Profile - operationId: update_my_profile - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProfileUpdate' - required: true - responses: - '204': - description: Successful Response - /v0/me/preferences/{preference_id}: - patch: - tags: - - user - summary: Set Frontend Preference - operationId: set_frontend_preference - parameters: - - name: preference_id - in: path - required: true - schema: - type: string - title: Preference Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/PatchRequestBody' - responses: - '204': - description: Successful Response - /v0/me/tokens: - get: - tags: - - user - summary: List Tokens - operationId: list_tokens - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ThirdPartyToken__' - post: - tags: - - user - summary: Create Token - operationId: create_token - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TokenCreate' - required: true - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ThirdPartyToken_' - /v0/me/tokens/{service}: - get: - tags: - - user - summary: Get Token - operationId: get_token - parameters: - - name: service - in: path - required: true - schema: - type: string - title: Service - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ThirdPartyToken_' - delete: - tags: - - user - summary: Delete Token - operationId: delete_token - parameters: - - name: service - in: path - required: true - schema: - type: string - title: Service - responses: - '204': - description: Successful Response - /v0/me/notifications: - get: - tags: - - user - summary: List User Notifications - operationId: list_user_notifications - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_UserNotification__' - post: - tags: - - user - summary: Create User Notification - operationId: create_user_notification - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserNotificationCreate' - required: true - responses: - '204': - description: Successful Response - /v0/me/notifications/{notification_id}: - patch: - tags: - - user - summary: Mark Notification As Read - operationId: mark_notification_as_read - parameters: - - name: notification_id - in: path - required: true - schema: - type: string - title: Notification Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UserNotificationPatch' - responses: - '204': - description: Successful Response - /v0/me/permissions: - get: - tags: - - user - summary: List User Permissions - operationId: list_user_permissions - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_PermissionGet__' - /v0/users:search: - get: - tags: - - user - - po - summary: Search Users - operationId: search_users - parameters: - - name: email - in: query - required: true - schema: - type: string - minLength: 3 - maxLength: 200 - title: Email - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_UserProfile__' - /v0/users:pre-register: - post: - tags: - - user - - po - summary: Pre Register User - operationId: pre_register_user - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PreUserProfile' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_UserProfile_' - /v0/wallets: - get: - tags: - - wallets - summary: List Wallets - operationId: list_wallets - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_WalletGetWithAvailableCredits__' - post: - tags: - - wallets - summary: Create Wallet - operationId: create_wallet - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/CreateWalletBodyParams' - required: true - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGet_' - /v0/wallets/default: - get: - tags: - - wallets - summary: Get Default Wallet - operationId: get_default_wallet - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGetWithAvailableCredits_' - /v0/wallets/{wallet_id}: - get: - tags: - - wallets - summary: Get Wallet - operationId: get_wallet - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGetWithAvailableCredits_' - put: - tags: - - wallets - summary: Update Wallet - operationId: update_wallet - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/PutWalletBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGet_' - /v0/wallets/{wallet_id}/payments: - post: - tags: - - wallets - summary: Create Payment - description: Creates payment to wallet `wallet_id` - operationId: create_payment - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateWalletPayment' - responses: - '202': - description: Payment initialized - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletPaymentInitiated_' - /v0/wallets/-/payments: - get: - tags: - - wallets - summary: List All Payments - description: Lists all user payments to his/her wallets (only the ones he/she - created) - operationId: list_all_payments - parameters: - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_PaymentTransaction_' - /v0/wallets/{wallet_id}/payments/{payment_id}/invoice-link: - get: - tags: - - wallets - summary: Get Payment Invoice Link - operationId: get_payment_invoice_link - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Id - responses: - '302': - description: redirection to invoice download link - content: - application/json: - schema: {} - /v0/wallets/{wallet_id}/payments/{payment_id}:cancel: - post: - tags: - - wallets - summary: Cancel Payment - operationId: cancel_payment - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Id - responses: - '204': - description: Successfully cancelled - /v0/wallets/{wallet_id}/payments-methods:init: - post: - tags: - - wallets - summary: Init Creation Of Payment Method - operationId: init_creation_of_payment_method - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '202': - description: Successfully initialized - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PaymentMethodInitiated_' - /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}:cancel: - post: - tags: - - wallets - summary: Cancel Creation Of Payment Method - operationId: cancel_creation_of_payment_method - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_method_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Method Id - responses: - '204': - description: Successfully cancelled - /v0/wallets/{wallet_id}/payments-methods: - get: - tags: - - wallets - summary: List Payments Methods - description: Lists all payments method associated to `wallet_id` - operationId: list_payments_methods - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_PaymentMethodGet__' - /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}: - get: - tags: - - wallets - summary: Get Payment Method - operationId: get_payment_method - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_method_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Method Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PaymentMethodGet_' - delete: - tags: - - wallets - summary: Delete Payment Method - operationId: delete_payment_method - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_method_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Method Id - responses: - '204': - description: Successfully deleted - /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}:pay: - post: - tags: - - wallets - summary: Pay With Payment Method - operationId: pay_with_payment_method - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: payment_method_id - in: path - required: true - schema: - type: string - minLength: 1 - maxLength: 100 - title: Payment Method Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreateWalletPayment' - responses: - '202': - description: Pay with payment-method - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletPaymentInitiated_' - /v0/wallets/{wallet_id}/auto-recharge: - get: - tags: - - wallets - summary: Get Wallet Autorecharge - operationId: get_wallet_autorecharge - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GetWalletAutoRecharge_' - put: - tags: - - wallets - summary: Replace Wallet Autorecharge - operationId: replace_wallet_autorecharge - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ReplaceWalletAutoRecharge' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GetWalletAutoRecharge_' - /v0/wallets/{wallet_id}/groups/{group_id}: - post: - tags: - - wallets - - groups - summary: Create Wallet Group - operationId: create_wallet_group - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_WalletsGroupsBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGroupGet_' - put: - tags: - - wallets - - groups - summary: Update Wallet Group - operationId: update_wallet_group - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_WalletsGroupsBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGroupGet_' - delete: - tags: - - wallets - - groups - summary: Delete Wallet Group - operationId: delete_wallet_group - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/wallets/{wallet_id}/groups: - get: - tags: - - wallets - - groups - summary: List Wallet Groups - operationId: list_wallet_groups - parameters: - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_WalletGroupGet__' - /v0/activity/status: - get: - tags: - - tasks - summary: Get Activity Status - operationId: get_activity_status - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_UUID__Activity__' - /v0/announcements: - get: - tags: - - announcements - summary: List Announcements - operationId: list_announcements - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Announcement__' - /v0/catalog/services/-/latest: - get: - tags: - - catalog - summary: List Services Latest - operationId: list_services_latest - parameters: - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_CatalogServiceGet_' - /v0/catalog/services/{service_key}/{service_version}: - get: - tags: - - catalog - summary: Get Service - operationId: get_service - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CatalogServiceGet_' - patch: - tags: - - catalog - summary: Update Service - operationId: update_service - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CatalogServiceUpdate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CatalogServiceGet_' - /v0/catalog/services/{service_key}/{service_version}/inputs: - get: - tags: - - catalog - summary: List Service Inputs - operationId: list_service_inputs - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ServiceInputGet__' - /v0/catalog/services/{service_key}/{service_version}/inputs/{input_key}: - get: - tags: - - catalog - summary: Get Service Input - operationId: get_service_input - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: input_key - in: path - required: true - schema: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Input Key - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ServiceInputGet_' - /v0/catalog/services/{service_key}/{service_version}/inputs:match: - get: - tags: - - catalog - summary: Get Compatible Inputs Given Source Output - operationId: get_compatible_inputs_given_source_output - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: fromService - in: query - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Fromservice - - name: fromVersion - in: query - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Fromversion - - name: fromOutput - in: query - required: true - schema: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Fromoutput - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' - /v0/catalog/services/{service_key}/{service_version}/outputs: - get: - tags: - - catalog - summary: List Service Outputs - operationId: list_service_outputs - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' - /v0/catalog/services/{service_key}/{service_version}/outputs/{output_key}: - get: - tags: - - catalog - summary: Get Service Output - operationId: get_service_output - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: output_key - in: path - required: true - schema: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Output Key - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ServiceOutputGet__' - /v0/catalog/services/{service_key}/{service_version}/outputs:match: - get: - tags: - - catalog - summary: Get Compatible Outputs Given Target Input - operationId: get_compatible_outputs_given_target_input - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: toService - in: query - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Toservice - - name: toVersion - in: query - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Toversion - - name: toInput - in: query - required: true - schema: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Toinput - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' - /v0/catalog/services/{service_key}/{service_version}/resources: - get: - tags: - - catalog - summary: Get Service Resources - operationId: get_service_resources - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' - /v0/catalog/services/{service_key}/{service_version}/pricing-plan: - get: - tags: - - catalog - - pricing-plans - summary: Retrieve default pricing plan for provided service - operationId: get_service_pricing_plan - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ServicePricingPlanGet_' - /v0/catalog/services/{service_key}/{service_version}/tags: - get: - tags: - - catalog - - tags - summary: List Service Tags - operationId: list_service_tags - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_TagGet__' - /v0/catalog/services/{service_key}/{service_version}/tags/{tag_id}:add: - post: - tags: - - catalog - - tags - summary: Add Service Tag - operationId: add_service_tag - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CatalogServiceGet_' - /v0/catalog/services/{service_key}/{service_version}/tags/{tag_id}:remove: - post: - tags: - - catalog - - tags - summary: Remove Service Tag - operationId: remove_service_tag - parameters: - - name: service_key - in: path - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - - name: service_version - in: path - required: true - schema: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - - name: tag_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Tag Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CatalogServiceGet_' - /v0/clusters: - get: - tags: - - clusters - summary: List Clusters - operationId: list_clusters - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ClusterGet__' - post: - tags: - - clusters - summary: Create Cluster - operationId: create_cluster - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterCreate' - required: true - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ClusterGet_' - /v0/clusters:ping: - post: - tags: - - clusters - summary: Ping Cluster - description: Test connectivity with cluster - operationId: ping_cluster - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterPing' - required: true - responses: - '204': - description: Successful Response - /v0/clusters/{cluster_id}: - get: - tags: - - clusters - summary: Get Cluster - operationId: get_cluster - parameters: - - name: cluster_id - in: path - required: true - schema: - type: integer - minimum: 0 - title: Cluster Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ClusterGet_' - patch: - tags: - - clusters - summary: Update Cluster - operationId: update_cluster - parameters: - - name: cluster_id - in: path - required: true - schema: - type: integer - minimum: 0 - title: Cluster Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ClusterPatch' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ClusterGet_' - delete: - tags: - - clusters - summary: Delete Cluster - operationId: delete_cluster - parameters: - - name: cluster_id - in: path - required: true - schema: - type: integer - minimum: 0 - title: Cluster Id - responses: - '204': - description: Successful Response - /v0/clusters/{cluster_id}/details: - get: - tags: - - clusters - summary: Get Cluster Details - operationId: get_cluster_details - parameters: - - name: cluster_id - in: path - required: true - schema: - type: integer - minimum: 0 - title: Cluster Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ClusterDetails_' - /v0/clusters/{cluster_id}:ping: - post: - tags: - - clusters - summary: Ping Cluster Cluster Id - description: Tests connectivity with cluster - operationId: ping_cluster_cluster_id - parameters: - - name: cluster_id - in: path - required: true - schema: - type: integer - minimum: 0 - title: Cluster Id - responses: - '204': - description: Successful Response - /v0/computations/{project_id}: - get: - tags: - - computations - - projects - summary: Get Computation - operationId: get_computation - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ComputationTaskGet_' - /v0/computations/{project_id}:start: - post: - tags: - - computations - - projects - summary: Start Computation - operationId: start_computation - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ComputationStart' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope__ComputationStarted_' - '402': - description: Insufficient credits to run computation - '404': - description: Project/wallet/pricing details were not found - '406': - description: Cluster not found - '409': - description: Project already started - '422': - description: Configuration error - '503': - description: Service not available - /v0/computations/{project_id}:stop: - post: - tags: - - computations - - projects - summary: Stop Computation - operationId: stop_computation - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}:xport: - post: - tags: - - projects - - exporter - summary: Export Project - description: creates an archive of the project and downloads it - operationId: export_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - responses: - '200': - description: Successful Response - /v0/folders: - post: - tags: - - folders - summary: Create Folder - operationId: create_folder - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/FolderCreateBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FolderGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - get: - tags: - - folders - summary: List Folders - operationId: list_folders - parameters: - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"modified","direction":"desc"}' - title: Order By - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - - name: folder_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folder Id - - name: workspace_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspace Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_FolderGet__' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/folders:search: - get: - tags: - - folders - summary: List Folders Full Search - operationId: list_folders_full_search - parameters: - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"modified","direction":"desc"}' - title: Order By - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - - name: text - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Text - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_FolderGet__' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/folders/{folder_id}: - get: - tags: - - folders - summary: Get Folder - operationId: get_folder - parameters: - - name: folder_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Folder Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FolderGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - put: - tags: - - folders - summary: Replace Folder - operationId: replace_folder - parameters: - - name: folder_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Folder Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/FolderReplaceBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FolderGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - delete: - tags: - - folders - summary: Delete Folder - operationId: delete_folder - parameters: - - name: folder_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Folder Id - minimum: 0 - responses: - '204': - description: Successful Response - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/tasks: - get: - tags: - - long-running-tasks - summary: List Tasks - operationId: list_tasks - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_TaskGet__' - /v0/tasks/{task_id}: - get: - tags: - - long-running-tasks - summary: Get Task Status - operationId: get_task_status - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskStatus_' - delete: - tags: - - long-running-tasks - summary: Cancel And Delete Task - operationId: cancel_and_delete_task - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '204': - description: Successful Response - /v0/tasks/{task_id}/result: - get: - tags: - - long-running-tasks - summary: Get Task Result - operationId: get_task_result - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: {} - /v0/projects/{project_uuid}/checkpoint/{ref_id}/iterations: - get: - tags: - - projects - - metamodeling - summary: List Project Iterations - operationId: list_project_iterations - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: ref_id - in: path - required: true - schema: - type: integer - title: Ref Id - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_ProjectIterationItem_' - /v0/projects/{project_uuid}/checkpoint/{ref_id}/iterations/-/results: - get: - tags: - - projects - - metamodeling - summary: List Project Iterations Results - operationId: list_project_iterations_results - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: ref_id - in: path - required: true - schema: - type: integer - title: Ref Id - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_ProjectIterationResultItem_' - /v0/services: - get: - tags: - - nih-sparc - summary: List Latest Services - description: Returns a list latest version of services - operationId: list_latest_services - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ServiceGet__' - /v0/viewers: - get: - tags: - - nih-sparc - summary: List Viewers - description: 'Lists all publically available viewers - - - Notice that this might contain multiple services for the same filetype - - - If file_type is provided, then it filters viewer for that filetype' - operationId: list_viewers - parameters: - - name: file_type - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: File Type - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Viewer__' - /v0/viewers/default: - get: - tags: - - nih-sparc - summary: List Default Viewers - description: 'Lists the default viewer for each supported filetype - - - This was interfaced as a subcollection of viewers because it is a very common - use-case - - - Only publicaly available viewers - - - If file_type is provided, then it filters viewer for that filetype' - operationId: list_default_viewers - parameters: - - name: file_type - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: File Type - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_Viewer__' - /view: - get: - tags: - - nih-sparc - summary: Get Redirection To Viewer - description: Opens a viewer in osparc for data in the NIH-sparc portal - operationId: get_redirection_to_viewer - parameters: - - name: file_type - in: query - required: true - schema: - type: string - title: File Type - - name: viewer_key - in: query - required: true - schema: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Viewer Key - - name: file_size - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: File Size - minimum: 0 - - name: download_link - in: query - required: true - schema: - type: string - format: uri - minLength: 1 - maxLength: 2083 - title: Download Link - - name: file_name - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - default: unknown - title: File Name - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ServiceKeyVersion' - responses: - '302': - description: Opens osparc and starts viewer for selected data - /study/{id}: - get: - tags: - - nih-sparc - summary: Get Redirection To Study Page - description: Opens a study published in osparc - operationId: get_redirection_to_study_page - parameters: - - name: id - in: path - required: true - schema: - type: string - format: uuid - title: Id - responses: - '302': - description: Opens osparc and opens a copy of publised study - /v0/projects: - post: - tags: - - projects - summary: Creates a new project or copies an existing one - operationId: create_project - parameters: - - name: x_simcore_user_agent - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - default: undefined - title: X Simcore User Agent - - name: x_simcore_parent_project_uuid - in: query - required: false - schema: - anyOf: - - type: string - format: uuid - - type: 'null' - title: X Simcore Parent Project Uuid - - name: x_simcore_parent_node_id - in: query - required: false - schema: - anyOf: - - type: string - format: uuid - - type: 'null' - title: X Simcore Parent Node Id - - name: from_study - in: query - required: false - schema: - anyOf: - - type: string - format: uuid - - type: 'null' - title: From Study - - name: as_template - in: query - required: false - schema: - type: boolean - default: false - title: As Template - - name: copy_data - in: query - required: false - schema: - type: boolean - default: true - title: Copy Data - - name: hidden - in: query - required: false - schema: - type: boolean - default: false - title: Hidden - requestBody: - required: true - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/ProjectCreateNew' - - $ref: '#/components/schemas/ProjectCopyOverride' - title: ' Body' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskGet_' - get: - tags: - - projects - summary: List Projects - operationId: list_projects - parameters: - - name: type - in: query - required: false - schema: - $ref: '#/components/schemas/ProjectTypeAPI' - default: all - - name: show_hidden - in: query - required: false - schema: - type: boolean - default: false - title: Show Hidden - - name: search - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Search - - name: folder_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folder Id - - name: workspace_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspace Id - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"last_change_date","direction":"desc"}' - title: Order By - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_ProjectListItem_' - /v0/projects/active: - get: - tags: - - projects - summary: Get Active Project - operationId: get_active_project - parameters: - - name: client_session_id - in: query - required: true - schema: - type: string - title: Client Session Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGet_' - /v0/projects/{project_id}: - get: - tags: - - projects - summary: Get Project - operationId: get_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGet_' - patch: - tags: - - projects - summary: Patch Project - operationId: patch_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectPatch' - responses: - '204': - description: Successful Response - delete: - tags: - - projects - summary: Delete Project - operationId: delete_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}:clone: - post: - tags: - - projects - summary: Clone Project - operationId: clone_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskGet_' - /v0/projects:search: - get: - tags: - - projects - summary: List Projects Full Search - operationId: list_projects_full_search - parameters: - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"last_change_date","direction":"desc"}' - title: Order By - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - - name: text - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Text - - name: tag_ids - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Tag Ids - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_ProjectListItem_' - /v0/projects/{project_id}/inactivity: - get: - tags: - - projects - summary: Get Project Inactivity - operationId: get_project_inactivity - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_GetProjectInactivityResponse_' - /v0/projects/{project_uuid}/comments: - post: - tags: - - projects - - comments - summary: Create a new comment for a specific project. The request body should - contain the comment contents and user information. - operationId: create_project_comment - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_ProjectCommentsBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_Literal__comment_id____Annotated_int__Gt___' - get: - tags: - - projects - - comments - summary: Retrieve all comments for a specific project. - operationId: list_project_comments - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ProjectsCommentsAPI__' - /v0/projects/{project_uuid}/comments/{comment_id}: - put: - tags: - - projects - - comments - summary: Update the contents of a specific comment for a project. The request - body should contain the updated comment contents. - operationId: update_project_comment - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: comment_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Comment Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_ProjectCommentsBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectsCommentsAPI_' - delete: - tags: - - projects - - comments - summary: Delete a specific comment associated with a project. - operationId: delete_project_comment - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: comment_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Comment Id - minimum: 0 - responses: - '204': - description: Successful Response - get: - tags: - - projects - - comments - summary: Retrieve a specific comment by its ID within a project. - operationId: get_project_comment - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: comment_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Comment Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectsCommentsAPI_' - /v0/projects/{project_id}/folders/{folder_id}: - put: - tags: - - projects - - folders - summary: Move project to the folder - operationId: replace_project_folder - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: folder_id - in: path - required: true - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folder Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/groups/{group_id}: - post: - tags: - - projects - - groups - summary: Create Project Group - operationId: create_project_group - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_ProjectsGroupsBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGroupGet_' - put: - tags: - - projects - - groups - summary: Replace Project Group - operationId: replace_project_group - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/_ProjectsGroupsBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGroupGet_' - delete: - tags: - - projects - - groups - summary: Delete Project Group - operationId: delete_project_group - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/groups: - get: - tags: - - projects - - groups - summary: List Project Groups - operationId: list_project_groups - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ProjectGroupGet__' - /v0/projects/{project_id}/metadata: - get: - tags: - - projects - - metadata - summary: Get Project Metadata - operationId: get_project_metadata - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectMetadataGet_' - patch: - tags: - - projects - - metadata - summary: Update Project Metadata - operationId: update_project_metadata - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectMetadataUpdate' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectMetadataGet_' - /v0/projects/{project_id}/nodes: - post: - tags: - - projects - - nodes - summary: Create Node - operationId: create_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodeCreate' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_NodeCreated_' - /v0/projects/{project_id}/nodes/{node_id}: - get: - tags: - - projects - - nodes - summary: Get Node - operationId: get_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Union_NodeGetIdle__NodeGetUnknown__RunningDynamicServiceDetails__NodeGet__' - delete: - tags: - - projects - - nodes - summary: Delete Node - operationId: delete_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '204': - description: Successful Response - patch: - tags: - - projects - - nodes - summary: Patch Project Node - operationId: patch_project_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodePatch' - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/nodes/{node_id}:retrieve: - post: - tags: - - projects - - nodes - summary: Retrieve Node - operationId: retrieve_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodeRetrieve' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_NodeRetrieved_' - /v0/projects/{project_id}/nodes/{node_id}:start: - post: - tags: - - projects - - nodes - summary: Start Node - operationId: start_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/nodes/{node_id}:stop: - post: - tags: - - projects - - nodes - summary: Stop Node - operationId: stop_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskGet_' - /v0/projects/{project_id}/nodes/{node_id}:restart: - post: - tags: - - projects - - nodes - summary: Restart Node - description: Note that it has only effect on nodes associated to dynamic services - operationId: restart_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/nodes/{node_id}/outputs: - patch: - tags: - - projects - - nodes - summary: Update Node Outputs - operationId: update_node_outputs - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/NodeOutputs' - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/nodes/{node_id}/resources: - get: - tags: - - projects - - nodes - summary: Get Node Resources - operationId: get_node_resources - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' - put: - tags: - - projects - - nodes - summary: Replace Node Resources - operationId: replace_node_resources - parameters: - - name: project_id - in: path - required: true - schema: - type: string - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - title: Node Id - requestBody: - required: true - content: - application/json: - schema: - type: object - title: ' New' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' - /v0/projects/{project_id}/nodes/-/services:access: - get: - tags: - - projects - - nodes - summary: Check whether provided group has access to the project services - operationId: get_project_services_access_for_gid - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: for_gid - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: For Gid - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope__ProjectGroupAccess_' - /v0/projects/{project_id}/nodes/-/preview: - get: - tags: - - projects - - nodes - summary: Lists all previews in the node's project - operationId: list_project_nodes_previews - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list__ProjectNodePreview__' - /v0/projects/{project_id}/nodes/{node_id}/preview: - get: - tags: - - projects - - nodes - summary: Gets a give node's preview - operationId: get_project_node_preview - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - format: uuid - title: Node Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope__ProjectNodePreview_' - '404': - description: Node has no preview - /v0/projects/{project_id}/nodes/{node_id}/pricing-unit: - get: - tags: - - projects - summary: Get currently connected pricing unit to the project node. - operationId: get_project_node_pricing_unit - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - format: uuid - title: Node Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Union_PricingUnitGet__NoneType__' - /v0/projects/{project_id}/nodes/{node_id}/pricing-plan/{pricing_plan_id}/pricing-unit/{pricing_unit_id}: - put: - tags: - - projects - summary: Connect pricing unit to the project node (Project node can have only - one pricing unit) - operationId: connect_pricing_unit_to_project_node - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: node_id - in: path - required: true - schema: - type: string - format: uuid - title: Node Id - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - - name: pricing_unit_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Unit Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/inputs: - get: - tags: - - projects - - ports - summary: Get Project Inputs - description: New in version *0.10* - operationId: get_project_inputs - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_UUID__ProjectInputGet__' - patch: - tags: - - projects - - ports - summary: Update Project Inputs - description: New in version *0.10* - operationId: update_project_inputs - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ProjectInputUpdate' - title: ' Updates' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_UUID__ProjectInputGet__' - /v0/projects/{project_id}/outputs: - get: - tags: - - projects - - ports - summary: Get Project Outputs - description: New in version *0.10* - operationId: get_project_outputs - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_UUID__ProjectOutputGet__' - /v0/projects/{project_id}/metadata/ports: - get: - tags: - - projects - - ports - summary: List Project Metadata Ports - description: New in version *0.12* - operationId: list_project_metadata_ports - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ProjectMetadataPortGet__' - /v0/projects/{project_id}:open: - post: - tags: - - projects - summary: Open Project - operationId: open_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: disable_service_auto_start - in: query - required: false - schema: - type: boolean - default: false - title: Disable Service Auto Start - requestBody: - required: true - content: - application/json: - schema: - type: string - title: Client Session Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGet_' - '400': - description: ValidationError - '402': - description: WalletNotEnoughCreditsError - '403': - description: ProjectInvalidRightsError - '404': - description: ProjectNotFoundError, UserDefaultWalletNotFoundError - '409': - description: ProjectTooManyProjectOpenedError - '422': - description: ValidationError - '503': - description: DirectorServiceError - /v0/projects/{project_id}:close: - post: - tags: - - projects - summary: Close Project - operationId: close_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - requestBody: - required: true - content: - application/json: - schema: - type: string - title: Client Session Id - responses: - '204': - description: Successful Response - /v0/projects/{project_id}/state: - get: - tags: - - projects - summary: Get Project State - operationId: get_project_state - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectState_' - /v0/projects/{project_uuid}/tags/{tag_id}:add: - post: - tags: - - projects - - tags - summary: Add Project Tag - description: 'Links an existing label with an existing study - - - NOTE: that the tag is not created here' - operationId: add_project_tag - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: tag_id - in: path - required: true - schema: - type: integer - title: Tag Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGet_' - /v0/projects/{project_uuid}/tags/{tag_id}:remove: - post: - tags: - - projects - - tags - summary: Remove Project Tag - description: 'Removes an existing link between a label and a study - - - NOTE: that the tag is not deleted here' - operationId: remove_project_tag - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: tag_id - in: path - required: true - schema: - type: integer - title: Tag Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_ProjectGet_' - /v0/projects/{project_id}/wallet: - get: - tags: - - projects - summary: Get current connected wallet to the project. - operationId: get_project_wallet - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Union_WalletGet__NoneType__' - /v0/projects/{project_id}/wallet/{wallet_id}: - put: - tags: - - projects - summary: Connect wallet to the project (Project can have only one wallet) - operationId: connect_wallet_to_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: wallet_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Wallet Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WalletGet_' - /v0/projects/{project_id}/workspaces/{workspace_id}: - put: - tags: - - projects - - workspaces - summary: Move project to the workspace - operationId: replace_project_workspace - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: workspace_id - in: path - required: true - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspace Id - responses: - '204': - description: Successful Response - /v0/publications/service-submission: - post: - tags: - - publication - summary: Service Submission - description: Submits files with new service candidate - operationId: service_submission - requestBody: - content: - multipart/form-data: - schema: - $ref: '#/components/schemas/Body_service_submission' - required: true - responses: - '204': - description: Successful Response - /v0/services/-/resource-usages: - get: - tags: - - usage - summary: Retrieve finished and currently running user services (user and product - are taken from context, optionally wallet_id parameter might be provided). - operationId: list_resource_usage_services - parameters: - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"started_at","direction":"desc"}' - title: Order By - - name: wallet_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Wallet Id - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_ServiceRunGet__' - /v0/services/-/aggregated-usages: - get: - tags: - - usage - summary: Used credits based on aggregate by type, currently supported `services`. - (user and product are taken from context, optionally wallet_id parameter might - be provided). - operationId: list_osparc_credits_aggregated_usages - parameters: - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - - name: aggregated_by - in: query - required: true - schema: - $ref: '#/components/schemas/ServicesAggregatedUsagesType' - - name: time_period - in: query - required: true - schema: - $ref: '#/components/schemas/ServicesAggregatedUsagesTimePeriod' - - name: wallet_id - in: query - required: true - schema: - type: integer - title: Wallet Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_OsparcCreditsAggregatedByServiceGet__' - /v0/services/-/usage-report: - get: - tags: - - usage - summary: Redirects to download CSV link. CSV obtains finished and currently - running user services (user and product are taken from context, optionally - wallet_id parameter might be provided). - operationId: export_resource_usage_services - parameters: - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"started_at","direction":"desc"}' - title: Order By - - name: wallet_id - in: query - required: false - schema: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Wallet Id - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - responses: - '302': - description: redirection to download link - content: - application/json: - schema: {} - /v0/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}: - get: - tags: - - pricing-plans - summary: Retrieve detail information about pricing unit - operationId: get_pricing_plan_unit - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - - name: pricing_unit_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Unit Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingUnitGet_' - /v0/admin/pricing-plans: - get: - tags: - - admin - summary: List pricing plans - description: To keep the listing lightweight, the pricingUnits field is None. - operationId: list_pricing_plans - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_PricingPlanAdminGet__' - post: - tags: - - admin - summary: Create pricing plan - operationId: create_pricing_plan - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/CreatePricingPlanBodyParams' - required: true - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' - /v0/admin/pricing-plans/{pricing_plan_id}: - get: - tags: - - admin - summary: Retrieve detail information about pricing plan - operationId: get_pricing_plan - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' - put: - tags: - - admin - summary: Update detail information about pricing plan - operationId: update_pricing_plan - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UpdatePricingPlanBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' - /v0/admin/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}: - get: - tags: - - admin - summary: Retrieve detail information about pricing unit - operationId: get_pricing_unit - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - - name: pricing_unit_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Unit Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' - put: - tags: - - admin - summary: Update detail information about pricing plan - operationId: update_pricing_unit - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - - name: pricing_unit_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Unit Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/UpdatePricingUnitBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' - /v0/admin/pricing-plans/{pricing_plan_id}/pricing-units: - post: - tags: - - admin - summary: Create pricing unit - operationId: create_pricing_unit - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CreatePricingUnitBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' - /v0/admin/pricing-plans/{pricing_plan_id}/billable-services: - get: - tags: - - admin - summary: List services that are connected to the provided pricing plan - operationId: list_connected_services_to_pricing_plan - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_PricingPlanToServiceAdminGet__' - post: - tags: - - admin - summary: Connect service with pricing plan - operationId: connect_service_to_pricing_plan - parameters: - - name: pricing_plan_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Pricing Plan Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/ConnectServiceToPricingPlanBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PricingPlanToServiceAdminGet_' - /: - get: - tags: - - statics - summary: Get Cached Frontend Index - operationId: get_cached_frontend_index - responses: - '200': - description: Successful Response - content: - text/html: - schema: - type: string - /static-frontend-data.json: - get: - tags: - - statics - summary: Static Frontend Data - description: Generic static info on the product's app - operationId: static_frontend_data - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/StaticFrontEndDict' - /v0/storage/locations: - get: - tags: - - storage - summary: Get available storage locations - description: Returns the list of available storage locations - operationId: get_storage_locations - responses: - '200': - description: Successful Response - content: - application/json: - schema: - items: - $ref: '#/components/schemas/DatasetMetaData' - type: array - title: Response Get Storage Locations - /v0/storage/locations/{location_id}:sync: - post: - tags: - - storage - summary: Manually triggers the synchronisation of the file meta data table in - the database - description: Returns an object containing added, changed and removed paths - operationId: synchronise_meta_data_table - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: dry_run - in: query - required: false - schema: - type: boolean - default: false - title: Dry Run - - name: fire_and_forget - in: query - required: false - schema: - type: boolean - default: false - title: Fire And Forget - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TableSynchronisation_' - /v0/storage/locations/{location_id}/datasets: - get: - tags: - - storage - summary: Get datasets metadata - description: returns all the top level datasets a user has access to - operationId: get_datasets_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' - /v0/storage/locations/{location_id}/files/metadata: - get: - tags: - - storage - summary: Get datasets metadata - description: returns all the file meta data a user has access to (uuid_filter - may be used) - operationId: get_files_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: uuid_filter - in: query - required: false - schema: - type: string - default: '' - title: Uuid Filter - - name: expand_dirs - in: query - required: false - schema: - type: boolean - description: Automatic directory expansion. This will be replaced by pagination - the future - default: true - title: Expand Dirs - description: Automatic directory expansion. This will be replaced by pagination - the future - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' - /v0/storage/locations/{location_id}/datasets/{dataset_id}/metadata: - get: - tags: - - storage - summary: Get Files Metadata - description: returns all the file meta data inside dataset with dataset_id - operationId: get_files_metadata_dataset - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: dataset_id - in: path - required: true - schema: - type: string - title: Dataset Id - - name: expand_dirs - in: query - required: false - schema: - type: boolean - description: Automatic directory expansion. This will be replaced by pagination - the future - default: true - title: Expand Dirs - description: Automatic directory expansion. This will be replaced by pagination - the future - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_FileMetaDataGet__' - /v0/storage/locations/{location_id}/files/{file_id}/metadata: - get: - tags: - - storage - summary: Get File Metadata - description: returns the file meta data of file_id if user_id has the rights - to - operationId: get_file_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/FileMetaData' - - $ref: '#/components/schemas/Envelope_FileMetaDataGet_' - title: Response Get File Metadata - /v0/storage/locations/{location_id}/files/{file_id}: - get: - tags: - - storage - summary: Returns download link for requested file - description: creates a download file link if user has the rights to - operationId: download_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - - name: link_type - in: query - required: false - schema: - $ref: '#/components/schemas/LinkType' - default: PRESIGNED - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PresignedLink_' - put: - tags: - - storage - summary: Returns upload link - description: creates one or more upload file links if user has the rights to, - expects the client to complete/abort upload - operationId: upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - - name: file_size - in: query - required: true - schema: - anyOf: - - type: string - pattern: ^\s*(\d*\.?\d+)\s*(\w+)? - - type: integer - minimum: 0 - - type: 'null' - title: File Size - - name: link_type - in: query - required: false - schema: - $ref: '#/components/schemas/LinkType' - default: PRESIGNED - - name: is_directory - in: query - required: false - schema: - type: boolean - default: false - title: Is Directory - responses: - '200': - description: Successful Response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/Envelope_FileUploadSchema_' - - $ref: '#/components/schemas/Envelope_Url_' - title: Response Upload File - delete: - tags: - - storage - summary: Deletes File - description: deletes file if user has the rights to - operationId: delete_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - responses: - '204': - description: Successful Response - /v0/storage/locations/{location_id}/files/{file_id}:abort: - post: - tags: - - storage - summary: Abort Upload File - description: 'aborts an upload if user has the rights to, and reverts - - to the latest version if available, else will delete the file' - operationId: abort_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - responses: - '204': - description: Successful Response - /v0/storage/locations/{location_id}/files/{file_id}:complete: - post: - tags: - - storage - summary: Complete Upload File - description: completes an upload if the user has the rights to - operationId: complete_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompletionBody_' - responses: - '202': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompleteResponse_' - /v0/storage/locations/{location_id}/files/{file_id}:complete/futures/{future_id}: - post: - tags: - - storage - summary: Check for upload completion - description: Returns state of upload completion - operationId: is_completed_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - type: string - title: File Id - - name: future_id - in: path - required: true - schema: - type: string - title: Future Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompleteFutureResponse_' - /v0/trash: - delete: - tags: - - trash - summary: Empty Trash - operationId: empty_trash - responses: - '204': - description: Successful Response - /v0/projects/{project_id}:trash: - post: - tags: - - trash - - projects - summary: Trash Project - operationId: trash_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - - name: force - in: query - required: false - schema: - type: boolean - default: false - title: Force - responses: - '204': - description: Successful Response - '404': - description: Not such a project - '409': - description: Project is in use and cannot be trashed - '503': - description: Trash service error - /v0/projects/{project_id}:untrash: - post: - tags: - - trash - - projects - summary: Untrash Project - operationId: untrash_project - parameters: - - name: project_id - in: path - required: true - schema: - type: string - format: uuid - title: Project Id - responses: - '204': - description: Successful Response - /v0/folders/{folder_id}:trash: - post: - tags: - - trash - - folders - summary: Trash Folder - operationId: trash_folder - parameters: - - name: folder_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Folder Id - minimum: 0 - - name: force - in: query - required: false - schema: - type: boolean - default: false - title: Force - responses: - '204': - description: Successful Response - '404': - description: Not such a folder - '409': - description: One or more projects in the folder are in use and cannot be - trashed - '503': - description: Trash service error - /v0/folders/{folder_id}:untrash: - post: - tags: - - trash - - folders - summary: Untrash Folder - operationId: untrash_folder - parameters: - - name: folder_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Folder Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/workspaces/{workspace_id}:trash: - post: - tags: - - trash - - workspaces - summary: Trash Workspace - operationId: trash_workspace - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - - name: force - in: query - required: false - schema: - type: boolean - default: false - title: Force - responses: - '204': - description: Successful Response - '404': - description: Not such a workspace - '409': - description: One or more projects in the workspace are in use and cannot - be trashed - '503': - description: Trash service error - /v0/workspaces/{workspace_id}:untrash: - post: - tags: - - trash - - workspaces - summary: Untrash Workspace - operationId: untrash_workspace - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/repos/projects: - get: - tags: - - repository - summary: List Repos - operationId: list_repos - parameters: - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_RepoApiModel_' - /v0/repos/projects/{project_uuid}/checkpoints: - get: - tags: - - repository - summary: List Checkpoints - operationId: list_checkpoints - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - - name: limit - in: query - required: false - schema: - type: integer - minimum: 1 - exclusiveMaximum: true - default: 20 - title: Limit - maximum: 50 - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Page_CheckpointApiModel_' - post: - tags: - - repository - summary: Create Checkpoint - operationId: create_checkpoint - parameters: - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CheckpointNew' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CheckpointApiModel_' - /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}: - get: - tags: - - repository - summary: Get Checkpoint - operationId: get_checkpoint - parameters: - - name: ref_id - in: path - required: true - schema: - anyOf: - - type: integer - - type: string - - enum: - - HEAD - const: HEAD - type: string - title: Ref Id - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CheckpointApiModel_' - patch: - tags: - - repository - summary: Update Checkpoint - description: Update Checkpoint Annotations - operationId: update_checkpoint - parameters: - - name: ref_id - in: path - required: true - schema: - anyOf: - - type: integer - - type: string - title: Ref Id - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/CheckpointAnnotations' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CheckpointApiModel_' - /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}/workbench/view: - get: - tags: - - repository - summary: View Project Workbench - operationId: view_project_workbench - parameters: - - name: ref_id - in: path - required: true - schema: - anyOf: - - type: integer - - type: string - title: Ref Id - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkbenchViewApiModel_' - /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}:checkout: - post: - tags: - - repository - summary: Checkout - operationId: checkout - parameters: - - name: ref_id - in: path - required: true - schema: - anyOf: - - type: integer - - type: string - title: Ref Id - - name: project_uuid - in: path - required: true - schema: - type: string - format: uuid - title: Project Uuid - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_CheckpointApiModel_' - /v0/workspaces: - post: - tags: - - workspaces - summary: Create Workspace - operationId: create_workspace - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceCreateBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkspaceGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - get: - tags: - - workspaces - summary: List Workspaces - operationId: list_workspaces - parameters: - - name: order_by - in: query - required: false - schema: - type: string - contentMediaType: application/json - contentSchema: {} - default: '{"field":"modified","direction":"desc"}' - title: Order By - - name: filters - in: query - required: false - schema: - anyOf: - - type: string - contentMediaType: application/json - contentSchema: {} - - type: 'null' - title: Filters - - name: limit - in: query - required: false - schema: - type: integer - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_WorkspaceGet__' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/workspaces/{workspace_id}: - get: - tags: - - workspaces - summary: Get Workspace - operationId: get_workspace - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkspaceGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - put: - tags: - - workspaces - summary: Replace Workspace - operationId: replace_workspace - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspaceReplaceBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkspaceGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - delete: - tags: - - workspaces - summary: Delete Workspace - operationId: delete_workspace - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - responses: - '204': - description: Successful Response - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/workspaces/{workspace_id}/groups/{group_id}: - post: - tags: - - workspaces - - groups - summary: Create Workspace Group - operationId: create_workspace_group - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspacesGroupsBodyParams' - responses: - '201': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkspaceGroupGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - put: - tags: - - workspaces - - groups - summary: Replace Workspace Group - operationId: replace_workspace_group - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/WorkspacesGroupsBodyParams' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_WorkspaceGroupGet_' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - delete: - tags: - - workspaces - - groups - summary: Delete Workspace Group - operationId: delete_workspace_group - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - - name: group_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Group Id - minimum: 0 - responses: - '204': - description: Successful Response - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/workspaces/{workspace_id}/groups: - get: - tags: - - workspaces - - groups - summary: List Workspace Groups - operationId: list_workspace_groups - parameters: - - name: workspace_id - in: path - required: true - schema: - type: integer - exclusiveMinimum: true - title: Workspace Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_WorkspaceGroupGet__' - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Not Found - '403': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Forbidden - '409': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Conflict - '503': - content: - application/json: - schema: - $ref: '#/components/schemas/EnvelopedError' - description: Service Unavailable - /v0/email:test: - post: - tags: - - admin - summary: Test Email - operationId: test_email - parameters: - - name: x-simcore-products-name - in: header - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: X-Simcore-Products-Name - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/TestEmail' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_Union_EmailTestFailed__EmailTestPassed__' - /v0/: - get: - tags: - - maintenance - summary: Healthcheck Readiness Probe - description: 'Readiness probe: check if the container is ready to receive traffic' - operationId: healthcheck_readiness_probe - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_HealthInfoDict_' - /v0/health: - get: - tags: - - maintenance - summary: Healthcheck Liveness Probe - description: 'Liveness probe: check if the container is alive' - operationId: healthcheck_liveness_probe - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_str__Any__' - /v0/config: - get: - tags: - - maintenance - summary: Front end runtime configuration - description: Returns app and products configs - operationId: get_config - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_dict_str__Any__' - /v0/scheduled_maintenance: - get: - tags: - - maintenance - summary: Get Scheduled Maintenance - operationId: get_scheduled_maintenance - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_str_' - /v0/status: - get: - tags: - - maintenance - summary: checks status of self and connected services - operationId: get_app_status - responses: - '200': - description: Returns app status check - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_AppStatusCheck_' - /v0/status/diagnostics: - get: - tags: - - maintenance - summary: Get App Diagnostics - operationId: get_app_diagnostics - parameters: - - name: top_tracemalloc - in: query - required: false - schema: - anyOf: - - type: integer - - type: 'null' - title: Top Tracemalloc - responses: - '200': - description: Returns app diagnostics report - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_StatusDiagnosticsGet_' - /v0/status/{service_name}: - get: - tags: - - maintenance - summary: Get Service Status - operationId: get_service_status - parameters: - - name: service_name - in: path - required: true - schema: - type: string - title: Service Name - responses: - '200': - description: Returns app status check - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_AppStatusCheck_' -components: - schemas: - AccessEnum: - type: string - enum: - - ReadAndWrite - - Invisible - - ReadOnly - title: AccessEnum - AccessRights: - properties: - read: - type: boolean - title: Read - description: has read access - write: - type: boolean - title: Write - description: has write access - delete: - type: boolean - title: Delete - description: has deletion rights - additionalProperties: false - type: object - required: - - read - - write - - delete - title: AccessRights - AccountRequestInfo: - properties: - form: - type: object - title: Form - captcha: - type: string - title: Captcha - type: object - required: - - form - - captcha - title: AccountRequestInfo - example: - captcha: A12B34 - form: - address: Infinite Loop - application: Antenna_Design - city: Washington - company: EM Com - country: USA - description: Description of something - email: maxwel@email.com - eula: true - firstName: James - hear: Search_Engine - lastName: Maxwel - phone: +1 123456789 - postalCode: '98001' - privacyPolicy: true - Activity: - properties: - stats: - $ref: '#/components/schemas/Stats' - limits: - $ref: '#/components/schemas/Limits' - queued: - type: boolean - title: Queued - type: object - required: - - stats - - limits - title: Activity - Annotation: - properties: - type: - type: string - enum: - - note - - rect - - text - title: Type - color: - type: string - format: color - title: Color - attributes: - type: object - title: Attributes - description: svg attributes - additionalProperties: false - type: object - required: - - type - - color - - attributes - title: Annotation - Announcement: - properties: - id: - type: string - title: Id - products: - items: - type: string - type: array - title: Products - start: - type: string - format: date-time - title: Start - end: - type: string - format: date-time - title: End - title: - type: string - title: Title - description: - type: string - title: Description - link: - type: string - title: Link - widgets: - items: - type: string - enum: - - login - - ribbon - - user-menu - type: array - title: Widgets - type: object - required: - - id - - products - - start - - end - - title - - description - - link - - widgets - title: Announcement - ApiKeyCreate: - properties: - display_name: - type: string - minLength: 3 - title: Display Name - expiration: - anyOf: - - type: string - format: duration - - type: 'null' - title: Expiration - description: Time delta from creation time to expiration. If None, then - it does not expire. - type: object - required: - - display_name - title: ApiKeyCreate - ApiKeyGet: - properties: - display_name: - type: string - minLength: 3 - title: Display Name - api_key: - type: string - title: Api Key - api_secret: - type: string - title: Api Secret - type: object - required: - - display_name - - api_key - - api_secret - title: ApiKeyGet - AppStatusCheck: - properties: - app_name: - type: string - title: App Name - description: Application name - version: - type: string - title: Version - description: Application's version - services: - type: object - title: Services - description: Other backend services connected from this service - default: {} - sessions: - anyOf: - - type: object - - type: 'null' - title: Sessions - description: Client sessions info. If single session per app, then is denoted - as main - default: {} - url: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Url - description: Link to current resource - diagnostics_url: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Diagnostics Url - description: Link to diagnostics report sub-resource. This MIGHT take some - time to compute - type: object - required: - - app_name - - version - title: AppStatusCheck - Author: - properties: - name: - type: string - title: Name - description: Name of the author - email: - type: string - format: email - title: Email - description: Email address - affiliation: - anyOf: - - type: string - - type: 'null' - title: Affiliation - type: object - required: - - name - - email - title: Author - Body_service_submission: - properties: - file: - type: string - format: binary - title: File - description: metadata.json submission file - type: object - required: - - file - title: Body_service_submission - BootChoice: - properties: - label: - type: string - title: Label - description: - type: string - title: Description - type: object - required: - - label - - description - title: BootChoice - BootMode: - type: string - enum: - - CPU - - GPU - - MPI - title: BootMode - BootOption: - properties: - label: - type: string - title: Label - description: - type: string - title: Description - default: - type: string - title: Default - items: - additionalProperties: - $ref: '#/components/schemas/BootChoice' - type: object - title: Items - type: object - required: - - label - - description - - default - - items - title: BootOption - CatalogServiceGet: - properties: - key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Key - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - name: - type: string - title: Name - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - description: - type: string - title: Description - descriptionUi: - type: boolean - title: Descriptionui - default: false - versionDisplay: - anyOf: - - type: string - - type: 'null' - title: Versiondisplay - type: - $ref: '#/components/schemas/ServiceType' - contact: - anyOf: - - type: string - format: email - - type: 'null' - title: Contact - authors: - items: - $ref: '#/components/schemas/Author' - type: array - minItems: 1 - title: Authors - owner: - anyOf: - - type: string - format: email - - type: 'null' - title: Owner - description: None when the owner email cannot be found in the database - inputs: - type: object - title: Inputs - description: inputs with extended information - outputs: - type: object - title: Outputs - description: outputs with extended information - bootOptions: - anyOf: - - type: object - - type: 'null' - title: Bootoptions - minVisibleInputs: - anyOf: - - type: integer - minimum: 0 - - type: 'null' - title: Minvisibleinputs - accessRights: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/ServiceGroupAccessRightsV2' - type: object - - type: 'null' - title: Accessrights - classifiers: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Classifiers - default: [] - quality: - type: object - title: Quality - default: {} - history: - items: - $ref: '#/components/schemas/ServiceRelease' - type: array - title: History - description: history of releases for this service at this point in time, - starting from the newest to the oldest. It includes current release. - default: [] - type: object - required: - - key - - version - - name - - description - - type - - contact - - authors - - owner - - inputs - - outputs - - accessRights - title: CatalogServiceGet - example: - accessRights: - '1': - execute: true - write: false - authors: - - affiliation: ACME - email: author@acme.com - name: Author Bar - classifiers: [] - contact: contact@acme.com - description: A service which awaits for time to pass, two times. - description_ui: true - history: - - released: '2024-07-20T15:00:00' - version: 2.2.1 - version_display: Summer Release - - compatibility: - canUpdateTo: - version: 2.2.1 - version: 2.0.0 - - version: 0.9.11 - - version: 0.9.10 - - compatibility: - canUpdateTo: - version: 0.9.11 - version: 0.9.8 - - compatibility: - can_update_to: - version: 0.9.11 - released: '2024-01-20T18:49:17' - version: 0.9.1 - versionDisplay: Matterhorn - - retired: '2024-07-20T15:00:00' - version: 0.9.0 - - version: 0.8.0 - - version: 0.1.0 - inputs: - input0: - contentSchema: - title: Acceleration - type: number - x_unit: m/s**2 - description: acceleration with units - keyId: input_1 - label: Acceleration - type: ref_contentSchema - unitLong: meter/second3 - unitShort: m/s3 - key: simcore/services/comp/itis/sleeper - name: sleeper - outputs: - outFile: - description: Time the service waited before completion - displayOrder: 2 - keyId: output_2 - label: Time Slept - type: number - unit: second - unitLong: seconds - unitShort: sec - owner: owner@acme.com - quality: {} - type: computational - version: 2.2.1 - version_display: 2 Xtreme - CatalogServiceUpdate: - properties: - name: - anyOf: - - type: string - - type: 'null' - title: Name - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - description: - anyOf: - - type: string - - type: 'null' - title: Description - descriptionUi: - type: boolean - title: Descriptionui - default: false - versionDisplay: - anyOf: - - type: string - - type: 'null' - title: Versiondisplay - deprecated: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Deprecated - classifiers: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Classifiers - quality: - type: object - title: Quality - default: {} - accessRights: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/ServiceGroupAccessRightsV2' - type: object - - type: 'null' - title: Accessrights - type: object - title: CatalogServiceUpdate - ChangePasswordBody: - properties: - current: - type: string - format: password - title: Current - writeOnly: true - new: - type: string - format: password - title: New - writeOnly: true - confirm: - type: string - format: password - title: Confirm - writeOnly: true - additionalProperties: false - type: object - required: - - current - - new - - confirm - title: ChangePasswordBody - CheckpointAnnotations: - properties: - tag: - anyOf: - - type: string - - type: 'null' - title: Tag - message: - anyOf: - - type: string - - type: 'null' - title: Message - type: object - title: CheckpointAnnotations - CheckpointApiModel: - properties: - id: - type: integer - exclusiveMinimum: true - title: Id - minimum: 0 - checksum: - type: string - pattern: ^[a-fA-F0-9]{40}$ - title: Checksum - created_at: - type: string - format: date-time - title: Created At - tags: - items: - type: string - type: array - title: Tags - message: - anyOf: - - type: string - - type: 'null' - title: Message - parents_ids: - anyOf: - - items: - type: integer - exclusiveMinimum: true - minimum: 0 - type: array - - type: 'null' - title: Parents Ids - url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Url - type: object - required: - - id - - checksum - - created_at - - tags - - url - title: CheckpointApiModel - CheckpointNew: - properties: - tag: - type: string - title: Tag - message: - anyOf: - - type: string - - type: 'null' - title: Message - type: object - required: - - tag - title: CheckpointNew - ClusterAccessRights: - properties: - read: - type: boolean - title: Read - description: allows to run pipelines on that cluster - write: - type: boolean - title: Write - description: allows to modify the cluster - delete: - type: boolean - title: Delete - description: allows to delete a cluster - additionalProperties: false - type: object - required: - - read - - write - - delete - title: ClusterAccessRights - ClusterCreate: - properties: - name: - type: string - title: Name - description: The human readable name of the cluster - description: - anyOf: - - type: string - - type: 'null' - title: Description - type: - $ref: '#/components/schemas/ClusterTypeInModel' - owner: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Owner - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - description: url to the image describing this cluster - endpoint: - type: string - minLength: 1 - format: uri - title: Endpoint - authentication: - oneOf: - - $ref: '#/components/schemas/SimpleAuthentication' - - $ref: '#/components/schemas/KerberosAuthentication' - - $ref: '#/components/schemas/JupyterHubTokenAuthentication' - title: Authentication - discriminator: - propertyName: type - mapping: - jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' - kerberos: '#/components/schemas/KerberosAuthentication' - simple: '#/components/schemas/SimpleAuthentication' - accessRights: - additionalProperties: - $ref: '#/components/schemas/ClusterAccessRights' - type: object - title: Accessrights - type: object - required: - - name - - type - - endpoint - - authentication - title: ClusterCreate - ClusterDetails: - properties: - scheduler: - $ref: '#/components/schemas/Scheduler' - description: This contains dask scheduler information given by the underlying - dask library - dashboardLink: - type: string - minLength: 1 - format: uri - title: Dashboardlink - description: Link to this scheduler's dashboard - type: object - required: - - scheduler - - dashboardLink - title: ClusterDetails - ClusterGet: - properties: - name: - type: string - title: Name - description: The human readable name of the cluster - description: - anyOf: - - type: string - - type: 'null' - title: Description - type: - $ref: '#/components/schemas/ClusterTypeInModel' - owner: - type: integer - exclusiveMinimum: true - title: Owner - minimum: 0 - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - description: url to the image describing this cluster - endpoint: - type: string - minLength: 1 - format: uri - title: Endpoint - authentication: - oneOf: - - $ref: '#/components/schemas/SimpleAuthentication' - - $ref: '#/components/schemas/KerberosAuthentication' - - $ref: '#/components/schemas/JupyterHubTokenAuthentication' - - $ref: '#/components/schemas/NoAuthentication' - - $ref: '#/components/schemas/TLSAuthentication' - title: Authentication - description: Dask gateway authentication - discriminator: - propertyName: type - mapping: - jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' - kerberos: '#/components/schemas/KerberosAuthentication' - none: '#/components/schemas/NoAuthentication' - simple: '#/components/schemas/SimpleAuthentication' - tls: '#/components/schemas/TLSAuthentication' - accessRights: - additionalProperties: - $ref: '#/components/schemas/ClusterAccessRights' - type: object - title: Accessrights - default: {} - id: - type: integer - minimum: 0 - title: Id - description: The cluster ID - type: object - required: - - name - - type - - owner - - endpoint - - authentication - - id - title: ClusterGet - ClusterPatch: - properties: - name: - anyOf: - - type: string - - type: 'null' - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - type: - anyOf: - - $ref: '#/components/schemas/ClusterTypeInModel' - - type: 'null' - owner: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Owner - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - endpoint: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Endpoint - authentication: - anyOf: - - oneOf: - - $ref: '#/components/schemas/SimpleAuthentication' - - $ref: '#/components/schemas/KerberosAuthentication' - - $ref: '#/components/schemas/JupyterHubTokenAuthentication' - discriminator: - propertyName: type - mapping: - jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' - kerberos: '#/components/schemas/KerberosAuthentication' - simple: '#/components/schemas/SimpleAuthentication' - - type: 'null' - title: Authentication - accessRights: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/ClusterAccessRights' - type: object - - type: 'null' - title: Accessrights - type: object - title: ClusterPatch - ClusterPing: - properties: - endpoint: - type: string - minLength: 1 - format: uri - title: Endpoint - authentication: - oneOf: - - $ref: '#/components/schemas/SimpleAuthentication' - - $ref: '#/components/schemas/KerberosAuthentication' - - $ref: '#/components/schemas/JupyterHubTokenAuthentication' - - $ref: '#/components/schemas/NoAuthentication' - - $ref: '#/components/schemas/TLSAuthentication' - title: Authentication - description: Dask gateway authentication - discriminator: - propertyName: type - mapping: - jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' - kerberos: '#/components/schemas/KerberosAuthentication' - none: '#/components/schemas/NoAuthentication' - simple: '#/components/schemas/SimpleAuthentication' - tls: '#/components/schemas/TLSAuthentication' - type: object - required: - - endpoint - - authentication - title: ClusterPing - ClusterTypeInModel: - type: string - enum: - - AWS - - ON_PREMISE - - ON_DEMAND - title: ClusterTypeInModel - CodePageParams: - properties: - message: - type: string - title: Message - expiration_2fa: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Expiration 2Fa - next_url: - anyOf: - - type: string - - type: 'null' - title: Next Url - type: object - required: - - message - title: CodePageParams - Compatibility: - properties: - canUpdateTo: - $ref: '#/components/schemas/CompatibleService' - description: Latest compatible service at this moment - type: object - required: - - canUpdateTo - title: Compatibility - CompatibleService: - properties: - key: - anyOf: - - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - - type: 'null' - title: Key - description: If None, it refer to current service. Used only for inter-service - compatibility - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - type: object - required: - - version - title: CompatibleService - ComputationStart: - properties: - force_restart: - type: boolean - title: Force Restart - default: false - cluster_id: - type: integer - minimum: 0 - title: Cluster Id - default: 0 - subgraph: - items: - type: string - type: array - uniqueItems: true - title: Subgraph - default: [] - type: object - title: ComputationStart - ComputationTaskGet: - properties: - cluster_id: - anyOf: - - type: integer - minimum: 0 - - type: 'null' - title: Cluster Id - type: object - required: - - cluster_id - title: ComputationTaskGet - ConnectServiceToPricingPlanBodyParams: - properties: - serviceKey: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Servicekey - serviceVersion: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Serviceversion - type: object - required: - - serviceKey - - serviceVersion - title: ConnectServiceToPricingPlanBodyParams - CountryInfoDict: - properties: - name: - type: string - title: Name - alpha2: - type: string - title: Alpha2 - type: object - required: - - name - - alpha2 - title: CountryInfoDict - CreatePricingPlanBodyParams: - properties: - displayName: - type: string - title: Displayname - description: - type: string - title: Description - classification: - $ref: '#/components/schemas/PricingPlanClassification' - pricingPlanKey: - type: string - title: Pricingplankey - type: object - required: - - displayName - - description - - classification - - pricingPlanKey - title: CreatePricingPlanBodyParams - CreatePricingUnitBodyParams: - properties: - unitName: - type: string - title: Unitname - unitExtraInfo: - $ref: '#/components/schemas/UnitExtraInfo-Input' - default: - type: boolean - title: Default - specificInfo: - $ref: '#/components/schemas/SpecificInfo' - costPerUnit: - anyOf: - - type: number - - type: string - title: Costperunit - comment: - type: string - title: Comment - type: object - required: - - unitName - - unitExtraInfo - - default - - specificInfo - - costPerUnit - - comment - title: CreatePricingUnitBodyParams - CreateWalletBodyParams: - properties: - name: - type: string - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - - type: 'null' - title: Thumbnail - type: object - required: - - name - title: CreateWalletBodyParams - CreateWalletPayment: - properties: - priceDollars: - anyOf: - - type: number - exclusiveMaximum: true - exclusiveMinimum: true - maximum: 1000000.0 - minimum: 0.0 - - type: string - title: Pricedollars - comment: - anyOf: - - type: string - maxLength: 100 - - type: 'null' - title: Comment - type: object - required: - - priceDollars - title: CreateWalletPayment - DatCoreFileLink: - properties: - store: - type: integer - title: Store - description: 'The store identifier: 0 for simcore S3, 1 for datcore' - path: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: Path - description: The path to the file in the storage provider domain - label: - type: string - title: Label - description: The real file name - eTag: - anyOf: - - type: string - - type: 'null' - title: Etag - description: Entity tag that uniquely represents the file. The method to - generate the tag is not specified (black box). - dataset: - type: string - title: Dataset - description: Unique identifier to access the dataset on datcore (REQUIRED - for datcore) - additionalProperties: false - type: object - required: - - store - - path - - label - - dataset - title: DatCoreFileLink - description: I/O port type to hold a link to a file in DATCORE storage - DatasetMetaData: - properties: - dataset_id: - anyOf: - - type: string - - type: 'null' - title: Dataset Id - display_name: - anyOf: - - type: string - - type: 'null' - title: Display Name - type: object - title: DatasetMetaData - example: - dataset_id: N:id-aaaa - display_name: simcore-testing - DictModel_str_Annotated_float__Gt__: - additionalProperties: - type: number - exclusiveMinimum: true - minimum: 0.0 - type: object - title: DictModel[str, Annotated[float, Gt]] - DownloadLink: - properties: - downloadLink: - type: string - title: Downloadlink - label: - anyOf: - - type: string - - type: 'null' - title: Label - description: Display name - additionalProperties: false - type: object - required: - - downloadLink - title: DownloadLink - description: I/O port type to hold a generic download link to a file (e.g. S3 - pre-signed link, etc) - EmailTestFailed: - properties: - test_name: - type: string - title: Test Name - error_type: - type: string - title: Error Type - error_message: - type: string - title: Error Message - traceback: - type: string - title: Traceback - type: object - required: - - test_name - - error_type - - error_message - - traceback - title: EmailTestFailed - EmailTestPassed: - properties: - fixtures: - type: object - title: Fixtures - info: - type: object - title: Info - type: object - required: - - fixtures - - info - title: EmailTestPassed - EmptyModel: - properties: {} - additionalProperties: false - type: object - title: EmptyModel - Envelope_AppStatusCheck_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/AppStatusCheck' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[AppStatusCheck] - Envelope_CatalogServiceGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/CatalogServiceGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[CatalogServiceGet] - Envelope_CheckpointApiModel_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/CheckpointApiModel' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[CheckpointApiModel] - Envelope_ClusterDetails_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ClusterDetails' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ClusterDetails] - Envelope_ClusterGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ClusterGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ClusterGet] - Envelope_ComputationTaskGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ComputationTaskGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ComputationTaskGet] - Envelope_FileMetaDataGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileMetaDataGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileMetaDataGet] - Envelope_FileUploadCompleteFutureResponse_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompleteFutureResponse' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompleteFutureResponse] - Envelope_FileUploadCompleteResponse_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompleteResponse' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompleteResponse] - Envelope_FileUploadCompletionBody_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompletionBody' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompletionBody] - Envelope_FileUploadSchema_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadSchema' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadSchema] - Envelope_FolderGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FolderGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FolderGet] - Envelope_GetCreditPrice_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GetCreditPrice' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GetCreditPrice] - Envelope_GetProduct_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GetProduct' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GetProduct] - Envelope_GetProjectInactivityResponse_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GetProjectInactivityResponse' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GetProjectInactivityResponse] - Envelope_GetWalletAutoRecharge_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GetWalletAutoRecharge' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GetWalletAutoRecharge] - Envelope_GroupGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GroupGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GroupGet] - Envelope_GroupUserGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/GroupUserGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[GroupUserGet] - Envelope_HealthInfoDict_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/HealthInfoDict' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[HealthInfoDict] - Envelope_InvitationGenerated_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/InvitationGenerated' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[InvitationGenerated] - Envelope_InvitationInfo_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/InvitationInfo' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[InvitationInfo] - Envelope_Log_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/Log' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Log] - Envelope_LoginNextPage_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/LoginNextPage' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[LoginNextPage] - Envelope_MyGroupsGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/MyGroupsGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[MyGroupsGet] - Envelope_NodeCreated_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/NodeCreated' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[NodeCreated] - Envelope_NodeRetrieved_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/NodeRetrieved' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[NodeRetrieved] - Envelope_PaymentMethodGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PaymentMethodGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PaymentMethodGet] - Envelope_PaymentMethodInitiated_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PaymentMethodInitiated' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PaymentMethodInitiated] - Envelope_PresignedLink_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PresignedLink' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PresignedLink] - Envelope_PricingPlanAdminGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PricingPlanAdminGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PricingPlanAdminGet] - Envelope_PricingPlanToServiceAdminGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PricingPlanToServiceAdminGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PricingPlanToServiceAdminGet] - Envelope_PricingUnitAdminGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PricingUnitAdminGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PricingUnitAdminGet] - Envelope_PricingUnitGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PricingUnitGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PricingUnitGet] - Envelope_ProfileGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProfileGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProfileGet] - Envelope_ProjectGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProjectGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProjectGet] - Envelope_ProjectGroupGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProjectGroupGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProjectGroupGet] - Envelope_ProjectMetadataGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProjectMetadataGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProjectMetadataGet] - Envelope_ProjectState_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProjectState' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProjectState] - Envelope_ProjectsCommentsAPI_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ProjectsCommentsAPI' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ProjectsCommentsAPI] - Envelope_RegisterPhoneNextPage_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/RegisterPhoneNextPage' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[RegisterPhoneNextPage] - Envelope_ResearchResource_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ResearchResource' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ResearchResource] - Envelope_ServiceInputGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ServiceInputGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ServiceInputGet] - Envelope_ServicePricingPlanGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ServicePricingPlanGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ServicePricingPlanGet] - Envelope_StatusDiagnosticsGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/StatusDiagnosticsGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[StatusDiagnosticsGet] - Envelope_TableSynchronisation_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TableSynchronisation' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TableSynchronisation] - Envelope_TagGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TagGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TagGet] - Envelope_TaskGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TaskGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TaskGet] - Envelope_TaskStatus_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TaskStatus' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TaskStatus] - Envelope_ThirdPartyToken_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/ThirdPartyToken' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[ThirdPartyToken] - Envelope_Union_EmailTestFailed__EmailTestPassed__: - properties: - data: - anyOf: - - $ref: '#/components/schemas/EmailTestFailed' - - $ref: '#/components/schemas/EmailTestPassed' - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Union[EmailTestFailed, EmailTestPassed]] - Envelope_Union_NodeGetIdle__NodeGetUnknown__RunningDynamicServiceDetails__NodeGet__: - properties: - data: - anyOf: - - $ref: '#/components/schemas/NodeGetIdle' - - $ref: '#/components/schemas/NodeGetUnknown' - - $ref: '#/components/schemas/RunningDynamicServiceDetails' - - $ref: '#/components/schemas/NodeGet' - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Union[NodeGetIdle, NodeGetUnknown, RunningDynamicServiceDetails, - NodeGet]] - Envelope_Union_PricingUnitGet__NoneType__: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PricingUnitGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Union[PricingUnitGet, NoneType]] - Envelope_Union_WalletGet__NoneType__: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WalletGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Union[WalletGet, NoneType]] - Envelope_Url_: - properties: - data: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Url] - Envelope_UserProfile_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/UserProfile' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[UserProfile] - Envelope_WalletGetWithAvailableCredits_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WalletGetWithAvailableCredits' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WalletGetWithAvailableCredits] - Envelope_WalletGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WalletGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WalletGet] - Envelope_WalletGroupGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WalletGroupGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WalletGroupGet] - Envelope_WalletPaymentInitiated_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WalletPaymentInitiated' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WalletPaymentInitiated] - Envelope_WorkbenchViewApiModel_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WorkbenchViewApiModel' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WorkbenchViewApiModel] - Envelope_WorkspaceGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WorkspaceGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WorkspaceGet] - Envelope_WorkspaceGroupGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/WorkspaceGroupGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[WorkspaceGroupGet] - Envelope__ComputationStarted_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/_ComputationStarted' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[_ComputationStarted] - Envelope__ProjectGroupAccess_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/_ProjectGroupAccess' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[_ProjectGroupAccess] - Envelope__ProjectNodePreview_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/_ProjectNodePreview' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[_ProjectNodePreview] - Envelope_dict_Annotated_str__StringConstraints___ImageResources__: - properties: - data: - anyOf: - - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[Annotated[str, StringConstraints], ImageResources]] - Envelope_dict_Literal__comment_id____Annotated_int__Gt___: - properties: - data: - anyOf: - - additionalProperties: - type: integer - exclusiveMinimum: true - minimum: 0 - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[Literal['comment_id'], Annotated[int, Gt]]] - Envelope_dict_UUID__Activity__: - properties: - data: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/Activity' - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[UUID, Activity]] - Envelope_dict_UUID__ProjectInputGet__: - properties: - data: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/ProjectInputGet' - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[UUID, ProjectInputGet]] - Envelope_dict_UUID__ProjectOutputGet__: - properties: - data: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/ProjectOutputGet' - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[UUID, ProjectOutputGet]] - Envelope_dict_str__Any__: - properties: - data: - anyOf: - - type: object - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[dict[str, Any]] - Envelope_list_Annotated_str__StringConstraints___: - properties: - data: - anyOf: - - items: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[Annotated[str, StringConstraints]]] - Envelope_list_Announcement__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/Announcement' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[Announcement]] - Envelope_list_ClusterGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ClusterGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ClusterGet]] - Envelope_list_DatasetMetaData__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/DatasetMetaData' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[DatasetMetaData]] - Envelope_list_FileMetaDataGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/FileMetaDataGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[FileMetaDataGet]] - Envelope_list_FolderGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/FolderGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[FolderGet]] - Envelope_list_GroupUserGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/GroupUserGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[GroupUserGet]] - Envelope_list_OsparcCreditsAggregatedByServiceGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/OsparcCreditsAggregatedByServiceGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[OsparcCreditsAggregatedByServiceGet]] - Envelope_list_PaymentMethodGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/PaymentMethodGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[PaymentMethodGet]] - Envelope_list_PermissionGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/PermissionGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[PermissionGet]] - Envelope_list_PricingPlanAdminGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/PricingPlanAdminGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[PricingPlanAdminGet]] - Envelope_list_PricingPlanToServiceAdminGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/PricingPlanToServiceAdminGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[PricingPlanToServiceAdminGet]] - Envelope_list_ProjectGroupGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ProjectGroupGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ProjectGroupGet]] - Envelope_list_ProjectMetadataPortGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ProjectMetadataPortGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ProjectMetadataPortGet]] - Envelope_list_ProjectsCommentsAPI__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ProjectsCommentsAPI' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ProjectsCommentsAPI]] - Envelope_list_ResourceHit__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ResourceHit' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ResourceHit]] - Envelope_list_ServiceGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ServiceGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ServiceGet]] - Envelope_list_ServiceInputGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ServiceInputGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ServiceInputGet]] - Envelope_list_ServiceOutputGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ServiceOutputGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ServiceOutputGet]] - Envelope_list_ServiceRunGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ServiceRunGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ServiceRunGet]] - Envelope_list_TagGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/TagGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[TagGet]] - Envelope_list_TagGroupGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/TagGroupGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[TagGroupGet]] - Envelope_list_TaskGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/TaskGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[TaskGet]] - Envelope_list_ThirdPartyToken__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/ThirdPartyToken' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[ThirdPartyToken]] - Envelope_list_UserNotification__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/UserNotification' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[UserNotification]] - Envelope_list_UserProfile__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/UserProfile' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[UserProfile]] - Envelope_list_Viewer__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/Viewer' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[Viewer]] - Envelope_list_WalletGetWithAvailableCredits__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/WalletGetWithAvailableCredits' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[WalletGetWithAvailableCredits]] - Envelope_list_WalletGroupGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/WalletGroupGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[WalletGroupGet]] - Envelope_list_WorkspaceGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/WorkspaceGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[WorkspaceGet]] - Envelope_list_WorkspaceGroupGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/WorkspaceGroupGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[WorkspaceGroupGet]] - Envelope_list__ProjectNodePreview__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/_ProjectNodePreview' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[_ProjectNodePreview]] - Envelope_str_: - properties: - data: - anyOf: - - type: string - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[str] - EnvelopedError: - properties: - data: - type: 'null' - title: Data - error: - $ref: '#/components/schemas/ErrorGet' - type: object - required: - - error - title: EnvelopedError - ErrorGet: - properties: - message: - type: string - minLength: 5 - title: Message - description: Message displayed to the user - supportId: - anyOf: - - type: string - maxLength: 100 - minLength: 1 - - type: 'null' - title: Supportid - description: ID to track the incident during support - status: - type: integer - title: Status - default: 400 - deprecated: true - errors: - items: - $ref: '#/components/schemas/ErrorItemType' - type: array - title: Errors - default: [] - deprecated: true - logs: - items: - $ref: '#/components/schemas/LogMessageType' - type: array - title: Logs - default: [] - deprecated: true - type: object - required: - - message - title: ErrorGet - ErrorItemType: - properties: - code: - type: string - title: Code - message: - type: string - title: Message - resource: - anyOf: - - type: string - - type: 'null' - title: Resource - field: - anyOf: - - type: string - - type: 'null' - title: Field - type: object - required: - - code - - message - - resource - - field - title: ErrorItemType - ExtractedResults: - properties: - progress: - type: object - title: Progress - description: Progress in each computational node - labels: - type: object - title: Labels - description: Maps captured node with a label - values: - type: object - title: Values - description: Captured outputs per node - type: object - required: - - progress - - labels - - values - title: ExtractedResults - example: - labels: - 0f1e38c9-dcb7-443c-a745-91b97ac28ccc: Integer iterator - 2d0ce8b9-c9c3-43ce-ad2f-ad493898de37: Probe Sensor - Integer - 445b44d1-59b3-425c-ac48-7c13e0f2ea5b: Probe Sensor - Integer_2 - d76fca06-f050-4790-88a8-0aac10c87b39: Boolean Parameter - progress: - 4c08265a-427b-4ac3-9eab-1d11c822ada4: 0 - e33c6880-1b1d-4419-82d7-270197738aa9: 100 - values: - 0f1e38c9-dcb7-443c-a745-91b97ac28ccc: - out_1: 1 - out_2: - - 3 - - 4 - 2d0ce8b9-c9c3-43ce-ad2f-ad493898de37: - in_1: 7 - 445b44d1-59b3-425c-ac48-7c13e0f2ea5b: - in_1: 1 - d76fca06-f050-4790-88a8-0aac10c87b39: - out_1: true - FileMetaData: - properties: - file_uuid: - anyOf: - - type: string - - type: 'null' - title: File Uuid - location_id: - anyOf: - - type: string - - type: 'null' - title: Location Id - project_name: - anyOf: - - type: string - - type: 'null' - title: Project Name - node_name: - anyOf: - - type: string - - type: 'null' - title: Node Name - file_name: - anyOf: - - type: string - - type: 'null' - title: File Name - file_id: - anyOf: - - type: string - - type: 'null' - title: File Id - created_at: - anyOf: - - type: string - - type: 'null' - title: Created At - last_modified: - anyOf: - - type: string - - type: 'null' - title: Last Modified - file_size: - anyOf: - - type: integer - - type: 'null' - title: File Size - entity_tag: - anyOf: - - type: string - - type: 'null' - title: Entity Tag - is_directory: - anyOf: - - type: boolean - - type: 'null' - title: Is Directory - type: object - title: FileMetaData - example: - created_at: '2019-06-19T12:29:03.308611Z' - entity_tag: a87ff679a2f3e71d9181a67b7542122c - file_id: N:package:e263da07-2d89-45a6-8b0f-61061b913873 - file_name: example.txt - file_size: 73 - file_uuid: simcore-testing/105/1000/3 - is_directory: false - last_modified: '2019-06-19T12:29:03.78852Z' - location_id: '0' - node_name: alpha - project_name: futurology - FileMetaDataGet: - properties: - file_uuid: - type: string - title: File Uuid - description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE - folder structure - location_id: - type: integer - title: Location Id - description: Storage location - project_name: - anyOf: - - type: string - - type: 'null' - title: Project Name - description: optional project name, used by frontend to display path - node_name: - anyOf: - - type: string - - type: 'null' - title: Node Name - description: optional node name, used by frontend to display path - file_name: - type: string - title: File Name - description: Display name for a file - file_id: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext - for S3 and N:package:UUID for datcore - created_at: - type: string - format: date-time - title: Created At - last_modified: - type: string - format: date-time - title: Last Modified - file_size: - anyOf: - - type: integer - enum: - - -1 - const: -1 - - type: integer - minimum: 0 - title: File Size - description: File size in bytes (-1 means invalid) - default: -1 - entity_tag: - anyOf: - - type: string - - type: 'null' - title: Entity Tag - description: Entity tag (or ETag), represents a specific version of the - file, None if invalid upload or datcore - is_soft_link: - type: boolean - title: Is Soft Link - description: If true, this file is a soft link.i.e. is another entry with - the same object_name - default: false - is_directory: - type: boolean - title: Is Directory - description: if True this is a directory - default: false - sha256_checksum: - anyOf: - - type: string - pattern: ^[a-fA-F0-9]{64}$ - - type: 'null' - title: Sha256 Checksum - description: 'SHA256 message digest of the file content. Main purpose: cheap - lookup.' - type: object - required: - - file_uuid - - location_id - - file_name - - file_id - - created_at - - last_modified - title: FileMetaDataGet - FileUploadCompleteFutureResponse: - properties: - state: - $ref: '#/components/schemas/FileUploadCompleteState' - e_tag: - anyOf: - - type: string - - type: 'null' - title: E Tag - type: object - required: - - state - title: FileUploadCompleteFutureResponse - FileUploadCompleteLinks: - properties: - state: - type: string - minLength: 1 - format: uri - title: State - type: object - required: - - state - title: FileUploadCompleteLinks - FileUploadCompleteResponse: - properties: - links: - $ref: '#/components/schemas/FileUploadCompleteLinks' - type: object - required: - - links - title: FileUploadCompleteResponse - FileUploadCompleteState: - type: string - enum: - - ok - - nok - title: FileUploadCompleteState - FileUploadCompletionBody: - properties: - parts: - items: - $ref: '#/components/schemas/UploadedPart' - type: array - title: Parts - type: object - required: - - parts - title: FileUploadCompletionBody - FileUploadLinks: - properties: - abort_upload: - type: string - minLength: 1 - format: uri - title: Abort Upload - complete_upload: - type: string - minLength: 1 - format: uri - title: Complete Upload - type: object - required: - - abort_upload - - complete_upload - title: FileUploadLinks - FileUploadSchema: - properties: - chunk_size: - type: integer - minimum: 0 - title: Chunk Size - urls: - items: - type: string - minLength: 1 - format: uri - type: array - title: Urls - links: - $ref: '#/components/schemas/FileUploadLinks' - type: object - required: - - chunk_size - - urls - - links - title: FileUploadSchema - FolderCreateBodyParams: - properties: - name: - type: string - maxLength: 100 - minLength: 1 - title: Name - parentFolderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Parentfolderid - workspaceId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspaceid - additionalProperties: false - type: object - required: - - name - title: FolderCreateBodyParams - FolderGet: - properties: - folderId: - type: integer - exclusiveMinimum: true - title: Folderid - minimum: 0 - parentFolderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Parentfolderid - name: - type: string - title: Name - createdAt: - type: string - format: date-time - title: Createdat - modifiedAt: - type: string - format: date-time - title: Modifiedat - trashedAt: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Trashedat - owner: - type: integer - exclusiveMinimum: true - title: Owner - minimum: 0 - workspaceId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspaceid - myAccessRights: - $ref: '#/components/schemas/AccessRights' - type: object - required: - - folderId - - name - - createdAt - - modifiedAt - - trashedAt - - owner - - workspaceId - - myAccessRights - title: FolderGet - FolderReplaceBodyParams: - properties: - name: - type: string - maxLength: 100 - minLength: 1 - title: Name - parentFolderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Parentfolderid - additionalProperties: false - type: object - required: - - name - title: FolderReplaceBodyParams - GenerateInvitation: - properties: - guest: - type: string - format: email - title: Guest - trialAccountDays: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Trialaccountdays - extraCreditsInUsd: - anyOf: - - type: integer - exclusiveMaximum: true - minimum: 0 - maximum: 500 - - type: 'null' - title: Extracreditsinusd - type: object - required: - - guest - title: GenerateInvitation - GetCreditPrice: - properties: - productName: - type: string - title: Productname - usdPerCredit: - anyOf: - - type: number - minimum: 0.0 - - type: 'null' - title: Usdpercredit - description: Price of a credit in USD. If None, then this product's price - is UNDEFINED - minPaymentAmountUsd: - anyOf: - - type: integer - minimum: 0 - - type: 'null' - title: Minpaymentamountusd - description: Minimum amount (included) in USD that can be paid for this - productCan be None if this product's price is UNDEFINED - type: object - required: - - productName - - usdPerCredit - - minPaymentAmountUsd - title: GetCreditPrice - GetProduct: - properties: - name: - type: string - title: Name - displayName: - type: string - title: Displayname - shortName: - anyOf: - - type: string - - type: 'null' - title: Shortname - description: Short display name for SMS - vendor: - anyOf: - - type: object - - type: 'null' - title: Vendor - description: vendor attributes - issues: - anyOf: - - items: - type: object - type: array - - type: 'null' - title: Issues - description: Reference to issues tracker - manuals: - anyOf: - - items: - type: object - type: array - - type: 'null' - title: Manuals - description: List of manuals - support: - anyOf: - - items: - type: object - type: array - - type: 'null' - title: Support - description: List of support resources - loginSettings: - type: object - title: Loginsettings - maxOpenStudiesPerUser: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Maxopenstudiesperuser - isPaymentEnabled: - type: boolean - title: Ispaymentenabled - creditsPerUsd: - anyOf: - - type: string - - type: 'null' - title: Creditsperusd - templates: - items: - $ref: '#/components/schemas/GetProductTemplate' - type: array - title: Templates - description: List of templates available to this product for communications - (e.g. emails, sms, etc) - type: object - required: - - name - - displayName - - loginSettings - - maxOpenStudiesPerUser - - isPaymentEnabled - - creditsPerUsd - title: GetProduct - GetProductTemplate: - properties: - id: - type: string - maxLength: 100 - minLength: 1 - title: Id - content: - type: string - title: Content - type: object - required: - - id - - content - title: GetProductTemplate - GetProjectInactivityResponse: - properties: - is_inactive: - type: boolean - title: Is Inactive - type: object - required: - - is_inactive - title: GetProjectInactivityResponse - GetWalletAutoRecharge: - properties: - enabled: - type: boolean - title: Enabled - description: Enables/disables auto-recharge trigger in this wallet - default: false - paymentMethodId: - anyOf: - - type: string - maxLength: 100 - minLength: 1 - - type: 'null' - title: Paymentmethodid - description: Payment method in the wallet used to perform the auto-recharge - payments or None if still undefined - minBalanceInCredits: - type: string - title: Minbalanceincredits - description: Minimum balance in credits that triggers an auto-recharge [Read - only] - topUpAmountInUsd: - type: string - title: Topupamountinusd - description: Amount in USD payed when auto-recharge condition is satisfied - monthlyLimitInUsd: - anyOf: - - type: string - - type: 'null' - title: Monthlylimitinusd - description: Maximum amount in USD charged within a natural month.None indicates - no limit. - type: object - required: - - paymentMethodId - - minBalanceInCredits - - topUpAmountInUsd - - monthlyLimitInUsd - title: GetWalletAutoRecharge - GroupAccessRights: - properties: - read: - type: boolean - title: Read - write: - type: boolean - title: Write - delete: - type: boolean - title: Delete - type: object - required: - - read - - write - - delete - title: GroupAccessRights - description: defines acesss rights for the user - GroupCreate: - properties: - label: - type: string - title: Label - description: - type: string - title: Description - thumbnail: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - type: object - required: - - label - - description - title: GroupCreate - GroupGet: - properties: - gid: - type: integer - title: Gid - description: the group ID - label: - type: string - title: Label - description: the group name - description: - type: string - title: Description - description: the group description - thumbnail: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - description: url to the group thumbnail - accessRights: - $ref: '#/components/schemas/GroupAccessRights' - inclusionRules: - additionalProperties: - type: string - type: object - title: Inclusionrules - description: Maps user's column and regular expression - type: object - required: - - gid - - label - - description - - accessRights - title: GroupGet - GroupUpdate: - properties: - label: - anyOf: - - type: string - - type: 'null' - title: Label - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - type: object - title: GroupUpdate - GroupUserAdd: - properties: - uid: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Uid - email: - anyOf: - - type: string - format: email - - type: 'null' - title: Email - type: object - title: GroupUserAdd - description: "Identify the user with either `email` or `uid` \u2014 only one." - GroupUserGet: - properties: - id: - anyOf: - - type: string - - type: 'null' - title: Id - description: the user id - login: - anyOf: - - type: string - format: email - - type: 'null' - title: Login - description: the user login email - first_name: - anyOf: - - type: string - - type: 'null' - title: First Name - description: the user first name - last_name: - anyOf: - - type: string - - type: 'null' - title: Last Name - description: the user last name - gravatar_id: - anyOf: - - type: string - - type: 'null' - title: Gravatar Id - description: the user gravatar id hash - gid: - anyOf: - - type: string - - type: 'null' - title: Gid - description: the user primary gid - accessRights: - $ref: '#/components/schemas/GroupAccessRights' - type: object - required: - - accessRights - title: GroupUserGet - example: - accessRights: - delete: false - read: true - write: false - first_name: Mr - gid: '3' - gravatar_id: a1af5c6ecc38e81f29695f01d6ceb540 - id: '1' - last_name: Smith - login: mr.smith@matrix.com - GroupUserUpdate: - properties: - accessRights: - $ref: '#/components/schemas/GroupAccessRights' - type: object - required: - - accessRights - title: GroupUserUpdate - example: - accessRights: - delete: false - read: true - write: false - HardwareInfo: - properties: - aws_ec2_instances: - items: - type: string - type: array - title: Aws Ec2 Instances - type: object - required: - - aws_ec2_instances - title: HardwareInfo - HealthInfoDict: - properties: - name: - type: string - title: Name - version: - type: string - title: Version - api_version: - type: string - title: Api Version - type: object - required: - - name - - version - - api_version - title: HealthInfoDict - ImageResources: - properties: - image: - type: string - pattern: ^(?:([a-z0-9-]+(?:\.[a-z0-9-]+)+(?::\d+)?|[a-z0-9-]+:\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\w][\w.-]{0,127}))?(\@sha256:[a-fA-F0-9]{32,64})?$ - title: Image - description: Used by the frontend to provide a context for the users.Services - with a docker-compose spec will have multiple entries.Using the `image:version` - instead of the docker-compose spec is more helpful for the end user. - resources: - additionalProperties: - $ref: '#/components/schemas/ResourceValue' - type: object - title: Resources - boot_modes: - items: - $ref: '#/components/schemas/BootMode' - type: array - title: Boot Modes - description: describe how a service shall be booted, using CPU, MPI, openMP - or GPU - default: - - CPU - type: object - required: - - image - - resources - title: ImageResources - example: - image: simcore/service/dynamic/pretty-intense:1.0.0 - resources: - AIRAM: - limit: 1 - reservation: 1 - ANY_resource: - limit: some_value - reservation: some_value - CPU: - limit: 4 - reservation: 0.1 - RAM: - limit: 103079215104 - reservation: 536870912 - VRAM: - limit: 1 - reservation: 1 - InvitationCheck: - properties: - invitation: - type: string - title: Invitation - description: Invitation code - additionalProperties: false - type: object - required: - - invitation - title: InvitationCheck - InvitationGenerated: - properties: - productName: - type: string - title: Productname - issuer: - type: string - title: Issuer - guest: - type: string - format: email - title: Guest - trialAccountDays: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Trialaccountdays - extraCreditsInUsd: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Extracreditsinusd - created: - type: string - format: date-time - title: Created - invitationLink: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Invitationlink - type: object - required: - - productName - - issuer - - guest - - created - - invitationLink - title: InvitationGenerated - InvitationInfo: - properties: - email: - anyOf: - - type: string - format: email - - type: 'null' - title: Email - description: Email associated to invitation or None - additionalProperties: false - type: object - title: InvitationInfo - JupyterHubTokenAuthentication: - properties: - type: - type: string - enum: - - jupyterhub - const: jupyterhub - title: Type - default: jupyterhub - api_token: - type: string - title: Api Token - additionalProperties: false - type: object - required: - - api_token - title: JupyterHubTokenAuthentication - KerberosAuthentication: - properties: - type: - type: string - enum: - - kerberos - const: kerberos - title: Type - default: kerberos - additionalProperties: false - type: object - title: KerberosAuthentication - Limits: - properties: - cpus: - type: number - exclusiveMinimum: true - title: Cpus - minimum: 0.0 - mem: - type: number - exclusiveMinimum: true - title: Mem - minimum: 0.0 - type: object - required: - - cpus - - mem - title: Limits - LinkType: - type: string - enum: - - PRESIGNED - - S3 - title: LinkType - Log: - properties: - level: - anyOf: - - $ref: '#/components/schemas/LogLevel' - - type: 'null' - description: log level - default: INFO - message: - type: string - title: Message - description: log message. If logger is USER, then it MUST be human readable - logger: - anyOf: - - type: string - - type: 'null' - title: Logger - description: name of the logger receiving this message - type: object - required: - - message - title: Log - example: - level: INFO - logger: user-logger - message: Hi there, Mr user - LogLevel: - type: string - enum: - - DEBUG - - INFO - - WARNING - - ERROR - title: LogLevel - LogMessageType: - properties: - message: - type: string - title: Message - level: - type: string - title: Level - default: INFO - logger: - type: string - title: Logger - default: user - type: object - required: - - message - title: LogMessageType - LoginBody: - properties: - email: - type: string - format: email - title: Email - password: - type: string - format: password - title: Password - writeOnly: true - additionalProperties: false - type: object - required: - - email - - password - title: LoginBody - LoginNextPage: - properties: - name: - type: string - title: Name - description: Code name to the front-end page. Ideally a PageStr - parameters: - anyOf: - - $ref: '#/components/schemas/CodePageParams' - - type: 'null' - type: object - required: - - name - title: LoginNextPage - LoginTwoFactorAuthBody: - properties: - email: - type: string - format: email - title: Email - code: - type: string - format: password - title: Code - writeOnly: true - additionalProperties: false - type: object - required: - - email - - code - title: LoginTwoFactorAuthBody - LogoutBody: - properties: - client_session_id: - anyOf: - - type: string - - type: 'null' - title: Client Session Id - additionalProperties: false - type: object - title: LogoutBody - Marker: - properties: - color: - type: string - format: color - title: Color - additionalProperties: false - type: object - required: - - color - title: Marker - MyGroupsGet: - properties: - me: - $ref: '#/components/schemas/GroupGet' - organizations: - anyOf: - - items: - $ref: '#/components/schemas/GroupGet' - type: array - - type: 'null' - title: Organizations - all: - $ref: '#/components/schemas/GroupGet' - product: - anyOf: - - $ref: '#/components/schemas/GroupGet' - - type: 'null' - type: object - required: - - me - - all - title: MyGroupsGet - example: - all: - accessRights: - delete: false - read: true - write: false - description: Open to all users - gid: '0' - label: All - me: - accessRights: - delete: true - read: true - write: true - description: A very special user - gid: '27' - label: A user - organizations: - - accessRights: - delete: false - read: true - write: false - description: The Foundation for Research on Information Technologies in - Society - gid: '15' - label: ITIS Foundation - - accessRights: - delete: false - read: true - write: false - description: Some foundation - gid: '16' - label: Blue Fundation - NoAuthentication: - properties: - type: - type: string - enum: - - none - const: none - title: Type - default: none - additionalProperties: false - type: object - title: NoAuthentication - Node-Input: - properties: - key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Key - description: distinctive name for the node based on the docker registry - path - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - description: semantic version number of the node - label: - type: string - title: Label - description: The short name of the node - progress: - anyOf: - - type: number - maximum: 100.0 - minimum: 0.0 - - type: 'null' - title: Progress - description: the node progress value (deprecated in DB, still used for API - only) - deprecated: true - thumbnail: - anyOf: - - type: string - - type: 'null' - title: Thumbnail - description: url of the latest screenshot of the node - runHash: - anyOf: - - type: string - - type: 'null' - title: Runhash - description: the hex digest of the resolved inputs +outputs hash at the - time when the last outputs were generated - nullable: true - inputs: - anyOf: - - type: object - - type: 'null' - title: Inputs - description: values of input properties - inputsRequired: - items: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - type: array - title: Inputsrequired - description: Defines inputs that are required in order to run the service - inputsUnits: - anyOf: - - type: object - - type: 'null' - title: Inputsunits - description: Overrides default unit (if any) defined in the service for - each port - inputAccess: - anyOf: - - type: object - - type: 'null' - title: Inputaccess - description: map with key - access level pairs - inputNodes: - anyOf: - - items: - type: string - format: uuid - type: array - - type: 'null' - title: Inputnodes - description: node IDs of where the node is connected to - outputs: - anyOf: - - type: object - - type: 'null' - title: Outputs - description: values of output properties - outputNode: - anyOf: - - type: boolean - - type: 'null' - title: Outputnode - deprecated: true - outputNodes: - anyOf: - - items: - type: string - format: uuid - type: array - - type: 'null' - title: Outputnodes - description: Used in group-nodes. Node IDs of those connected to the output - parent: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Parent - description: Parent's (group-nodes') node ID s. Used to group - nullable: true - position: - anyOf: - - $ref: '#/components/schemas/Position' - - type: 'null' - description: Use projects_ui.WorkbenchUI.position instead - deprecated: true - state: - anyOf: - - $ref: '#/components/schemas/NodeState' - - type: 'null' - description: The node's state object - bootOptions: - anyOf: - - type: object - - type: 'null' - title: Bootoptions - description: Some services provide alternative parameters to be injected - at boot time. The user selection should be stored here, and it will overwrite - the services's defaults. - additionalProperties: false - type: object - required: - - key - - version - - label - title: Node - Node-Output: - properties: - key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Key - description: distinctive name for the node based on the docker registry - path - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - description: semantic version number of the node - label: - type: string - title: Label - description: The short name of the node - progress: - anyOf: - - type: number - maximum: 100.0 - minimum: 0.0 - - type: 'null' - title: Progress - description: the node progress value (deprecated in DB, still used for API - only) - deprecated: true - thumbnail: - anyOf: - - type: string - - type: 'null' - title: Thumbnail - description: url of the latest screenshot of the node - runHash: - anyOf: - - type: string - - type: 'null' - title: Runhash - description: the hex digest of the resolved inputs +outputs hash at the - time when the last outputs were generated - nullable: true - inputs: - anyOf: - - type: object - - type: 'null' - title: Inputs - description: values of input properties - inputsRequired: - items: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - type: array - title: Inputsrequired - description: Defines inputs that are required in order to run the service - inputsUnits: - anyOf: - - type: object - - type: 'null' - title: Inputsunits - description: Overrides default unit (if any) defined in the service for - each port - inputAccess: - anyOf: - - type: object - - type: 'null' - title: Inputaccess - description: map with key - access level pairs - inputNodes: - anyOf: - - items: - type: string - format: uuid - type: array - - type: 'null' - title: Inputnodes - description: node IDs of where the node is connected to - outputs: - anyOf: - - type: object - - type: 'null' - title: Outputs - description: values of output properties - outputNode: - anyOf: - - type: boolean - - type: 'null' - title: Outputnode - deprecated: true - outputNodes: - anyOf: - - items: - type: string - format: uuid - type: array - - type: 'null' - title: Outputnodes - description: Used in group-nodes. Node IDs of those connected to the output - parent: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Parent - description: Parent's (group-nodes') node ID s. Used to group - nullable: true - position: - anyOf: - - $ref: '#/components/schemas/Position' - - type: 'null' - description: Use projects_ui.WorkbenchUI.position instead - deprecated: true - state: - anyOf: - - $ref: '#/components/schemas/NodeState' - - type: 'null' - description: The node's state object - bootOptions: - anyOf: - - type: object - - type: 'null' - title: Bootoptions - description: Some services provide alternative parameters to be injected - at boot time. The user selection should be stored here, and it will overwrite - the services's defaults. - additionalProperties: false - type: object - required: - - key - - version - - label - title: Node - NodeCreate: - properties: - service_key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - service_version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - service_id: - anyOf: - - type: string - - type: 'null' - title: Service Id - type: object - required: - - service_key - - service_version - title: NodeCreate - NodeCreated: - properties: - nodeId: - type: string - format: uuid - title: Nodeid - type: object - required: - - nodeId - title: NodeCreated - NodeGet: - properties: - publishedPort: - anyOf: - - type: integer - exclusiveMaximum: true - exclusiveMinimum: true - maximum: 65535 - minimum: 0 - - type: 'null' - title: Publishedport - description: The ports where the service provides its interface - entryPoint: - anyOf: - - type: string - - type: 'null' - title: Entrypoint - description: The entry point where the service provides its interface if - specified - serviceUuid: - type: string - title: Serviceuuid - description: The UUID attached to this service - serviceKey: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Servicekey - description: distinctive name for the node based on the docker registry - path - serviceVersion: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Serviceversion - description: semantic version number - serviceHost: - type: string - title: Servicehost - description: service host name within the network - servicePort: - type: integer - exclusiveMaximum: true - exclusiveMinimum: true - title: Serviceport - description: port to access the service within the network - maximum: 65535 - minimum: 0 - serviceBasepath: - anyOf: - - type: string - - type: 'null' - title: Servicebasepath - description: different base path where current service is mounted otherwise - defaults to root - default: '' - serviceState: - $ref: '#/components/schemas/ServiceState' - description: 'the service state * ''pending'' - The service is waiting for - resources to start * ''pulling'' - The service is being pulled from the - registry * ''starting'' - The service is starting * ''running'' - The - service is running * ''complete'' - The service completed * ''failed'' - - The service failed to start - - ' - serviceMessage: - anyOf: - - type: string - - type: 'null' - title: Servicemessage - description: the service message - userId: - type: string - title: Userid - description: the user that started the service - type: object - required: - - publishedPort - - serviceUuid - - serviceKey - - serviceVersion - - serviceHost - - servicePort - - serviceState - - userId - title: NodeGet - NodeGetIdle: - properties: - serviceState: - type: string - enum: - - idle - const: idle - title: Servicestate - serviceUuid: - type: string - format: uuid - title: Serviceuuid - type: object - required: - - serviceState - - serviceUuid - title: NodeGetIdle - example: - service_state: idle - service_uuid: 3fa85f64-5717-4562-b3fc-2c963f66afa6 - NodeGetUnknown: - properties: - serviceState: - type: string - enum: - - unknown - const: unknown - title: Servicestate - serviceUuid: - type: string - format: uuid - title: Serviceuuid - type: object - required: - - serviceState - - serviceUuid - title: NodeGetUnknown - example: - service_state: unknown - service_uuid: 3fa85f64-5717-4562-b3fc-2c963f66afa6 - NodeOutputs: - properties: - outputs: - type: object - title: Outputs - type: object - required: - - outputs - title: NodeOutputs - NodePatch: - properties: - key: - anyOf: - - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - - type: 'null' - title: Key - version: - anyOf: - - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - - type: 'null' - title: Version - label: - anyOf: - - type: string - - type: 'null' - title: Label - inputs: - type: object - title: Inputs - inputsRequired: - anyOf: - - items: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - type: array - - type: 'null' - title: Inputsrequired - inputNodes: - anyOf: - - items: - type: string - format: uuid - type: array - - type: 'null' - title: Inputnodes - progress: - anyOf: - - type: number - maximum: 100.0 - minimum: 0.0 - - type: 'null' - title: Progress - bootOptions: - anyOf: - - type: object - - type: 'null' - title: Bootoptions - outputs: - anyOf: - - type: object - - type: 'null' - title: Outputs - type: object - title: NodePatch - NodeRetrieve: - properties: - port_keys: - items: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - type: array - title: Port Keys - default: [] - type: object - title: NodeRetrieve - NodeRetrieved: - properties: - sizeBytes: - type: integer - minimum: 0 - title: Sizebytes - description: The amount of data transferred by the retrieve call - type: object - required: - - sizeBytes - title: NodeRetrieved - NodeScreenshot: - properties: - thumbnail_url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Thumbnail Url - file_url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: File Url - mimetype: - anyOf: - - type: string - - type: 'null' - title: Mimetype - description: File's media type or None if unknown. SEE https://www.iana.org/assignments/media-types/media-types.xhtml - type: object - required: - - thumbnail_url - - file_url - title: NodeScreenshot - NodeState: - properties: - modified: - type: boolean - title: Modified - description: true if the node's outputs need to be re-computed - default: true - dependencies: - items: - type: string - format: uuid - type: array - uniqueItems: true - title: Dependencies - description: contains the node inputs dependencies if they need to be computed - first - currentStatus: - $ref: '#/components/schemas/RunningState' - description: the node's current state - default: NOT_STARTED - progress: - anyOf: - - type: number - maximum: 1.0 - minimum: 0.0 - - type: 'null' - title: Progress - description: current progress of the task if available (None if not started - or not a computational task) - default: 0 - additionalProperties: false - type: object - title: NodeState - NotificationCategory: - type: string - enum: - - NEW_ORGANIZATION - - STUDY_SHARED - - TEMPLATE_SHARED - - ANNOTATION_NOTE - - WALLET_SHARED - title: NotificationCategory - OsparcCreditsAggregatedByServiceGet: - properties: - osparc_credits: - type: string - title: Osparc Credits - service_key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - running_time_in_hours: - type: string - title: Running Time In Hours - type: object - required: - - osparc_credits - - service_key - - running_time_in_hours - title: OsparcCreditsAggregatedByServiceGet - Owner: - properties: - user_id: - type: integer - exclusiveMinimum: true - title: User Id - description: Owner's user id - minimum: 0 - first_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: First Name - description: Owner's first name - last_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: Last Name - description: Owner's last name - additionalProperties: false - type: object - required: - - user_id - - first_name - - last_name - title: Owner - PageLinks: - properties: - self: - type: string - title: Self - first: - type: string - title: First - prev: - anyOf: - - type: string - - type: 'null' - title: Prev - next: - anyOf: - - type: string - - type: 'null' - title: Next - last: - type: string - title: Last - additionalProperties: false - type: object - required: - - self - - first - - prev - - next - - last - title: PageLinks - PageMetaInfoLimitOffset: - properties: - limit: - type: integer - exclusiveMinimum: true - title: Limit - default: 20 - minimum: 0 - total: - type: integer - minimum: 0 - title: Total - offset: - type: integer - minimum: 0 - title: Offset - default: 0 - count: - type: integer - minimum: 0 - title: Count - additionalProperties: false - type: object - required: - - total - - count - title: PageMetaInfoLimitOffset - Page_CatalogServiceGet_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/CatalogServiceGet' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[CatalogServiceGet] - Page_CheckpointApiModel_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/CheckpointApiModel' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[CheckpointApiModel] - Page_PaymentTransaction_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/PaymentTransaction' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[PaymentTransaction] - Page_ProjectIterationItem_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/ProjectIterationItem' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[ProjectIterationItem] - Page_ProjectIterationResultItem_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/ProjectIterationResultItem' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[ProjectIterationResultItem] - Page_ProjectListItem_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/ProjectListItem' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[ProjectListItem] - Page_RepoApiModel_: - properties: - _meta: - $ref: '#/components/schemas/PageMetaInfoLimitOffset' - _links: - $ref: '#/components/schemas/PageLinks' - data: - items: - $ref: '#/components/schemas/RepoApiModel' - type: array - title: Data - additionalProperties: false - type: object - required: - - _meta - - _links - - data - title: Page[RepoApiModel] - ParentMetaProjectRef: - properties: - project_id: - type: string - format: uuid - title: Project Id - ref_id: - type: integer - exclusiveMinimum: true - title: Ref Id - minimum: 0 - type: object - required: - - project_id - - ref_id - title: ParentMetaProjectRef - PatchRequestBody: - properties: - value: - title: Value - type: object - required: - - value - title: PatchRequestBody - PaymentMethodGet: - properties: - idr: - type: string - maxLength: 100 - minLength: 1 - title: Idr - walletId: - type: integer - exclusiveMinimum: true - title: Walletid - minimum: 0 - cardHolderName: - anyOf: - - type: string - - type: 'null' - title: Cardholdername - cardNumberMasked: - anyOf: - - type: string - - type: 'null' - title: Cardnumbermasked - cardType: - anyOf: - - type: string - - type: 'null' - title: Cardtype - expirationMonth: - anyOf: - - type: integer - - type: 'null' - title: Expirationmonth - expirationYear: - anyOf: - - type: integer - - type: 'null' - title: Expirationyear - created: - type: string - format: date-time - title: Created - autoRecharge: - type: boolean - title: Autorecharge - description: If true, this payment-method is used for auto-recharge - default: false - type: object - required: - - idr - - walletId - - created - title: PaymentMethodGet - PaymentMethodInitiated: - properties: - walletId: - type: integer - exclusiveMinimum: true - title: Walletid - minimum: 0 - paymentMethodId: - type: string - maxLength: 100 - minLength: 1 - title: Paymentmethodid - paymentMethodFormUrl: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Paymentmethodformurl - description: Link to external site that holds the payment submission form - type: object - required: - - walletId - - paymentMethodId - - paymentMethodFormUrl - title: PaymentMethodInitiated - PaymentTransaction: - properties: - paymentId: - type: string - maxLength: 100 - minLength: 1 - title: Paymentid - priceDollars: - type: string - title: Pricedollars - walletId: - type: integer - exclusiveMinimum: true - title: Walletid - minimum: 0 - osparcCredits: - type: string - title: Osparccredits - comment: - anyOf: - - type: string - - type: 'null' - title: Comment - createdAt: - type: string - format: date-time - title: Createdat - completedAt: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Completedat - completedStatus: - type: string - enum: - - PENDING - - SUCCESS - - FAILED - - CANCELED - title: Completedstatus - stateMessage: - anyOf: - - type: string - - type: 'null' - title: Statemessage - invoiceUrl: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Invoiceurl - type: object - required: - - paymentId - - priceDollars - - walletId - - osparcCredits - - createdAt - - completedAt - - completedStatus - title: PaymentTransaction - PermissionGet: - properties: - name: - type: string - title: Name - allowed: - type: boolean - title: Allowed - type: object - required: - - name - - allowed - title: PermissionGet - PhoneConfirmationBody: - properties: - email: - type: string - format: email - title: Email - phone: - type: string - title: Phone - description: Phone number E.164, needed on the deployments with 2FA - code: - type: string - format: password - title: Code - writeOnly: true - additionalProperties: false - type: object - required: - - email - - phone - - code - title: PhoneConfirmationBody - PortLink: - properties: - nodeUuid: - type: string - format: uuid - title: Nodeuuid - description: The node to get the port output from - output: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Output - description: The port key in the node given by nodeUuid - additionalProperties: false - type: object - required: - - nodeUuid - - output - title: PortLink - description: I/O port type to reference to an output port of another node in - the same project - Position: - properties: - x: - type: integer - title: X - description: The x position - y: - type: integer - title: Y - description: The y position - additionalProperties: false - type: object - required: - - x - - y - title: Position - PreUserProfile: - properties: - firstName: - type: string - title: Firstname - lastName: - type: string - title: Lastname - email: - type: string - format: email - title: Email - institution: - anyOf: - - type: string - - type: 'null' - title: Institution - description: company, university, ... - phone: - anyOf: - - type: string - - type: 'null' - title: Phone - address: - type: string - title: Address - city: - type: string - title: City - state: - anyOf: - - type: string - - type: 'null' - title: State - postalCode: - type: string - title: Postalcode - country: - type: string - title: Country - extras: - type: object - title: Extras - description: Keeps extra information provided in the request form. At most - MAX_NUM_EXTRAS fields - type: object - required: - - firstName - - lastName - - email - - phone - - address - - city - - postalCode - - country - title: PreUserProfile - Preference: - properties: - defaultValue: - title: Defaultvalue - description: used by the frontend - value: - title: Value - description: preference value - type: object - required: - - defaultValue - - value - title: Preference - PresignedLink: - properties: - link: - type: string - minLength: 1 - format: uri - title: Link - type: object - required: - - link - title: PresignedLink - PricingPlanAdminGet: - properties: - pricingPlanId: - type: integer - exclusiveMinimum: true - title: Pricingplanid - minimum: 0 - displayName: - type: string - title: Displayname - description: - type: string - title: Description - classification: - $ref: '#/components/schemas/PricingPlanClassification' - createdAt: - type: string - format: date-time - title: Createdat - pricingPlanKey: - type: string - title: Pricingplankey - pricingUnits: - anyOf: - - items: - $ref: '#/components/schemas/PricingUnitGet' - type: array - - type: 'null' - title: Pricingunits - isActive: - type: boolean - title: Isactive - type: object - required: - - pricingPlanId - - displayName - - description - - classification - - createdAt - - pricingPlanKey - - pricingUnits - - isActive - title: PricingPlanAdminGet - PricingPlanClassification: - type: string - enum: - - TIER - const: TIER - title: PricingPlanClassification - PricingPlanToServiceAdminGet: - properties: - pricingPlanId: - type: integer - exclusiveMinimum: true - title: Pricingplanid - minimum: 0 - serviceKey: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Servicekey - serviceVersion: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Serviceversion - created: - type: string - format: date-time - title: Created - type: object - required: - - pricingPlanId - - serviceKey - - serviceVersion - - created - title: PricingPlanToServiceAdminGet - PricingUnitAdminGet: - properties: - pricingUnitId: - type: integer - exclusiveMinimum: true - title: Pricingunitid - minimum: 0 - unitName: - type: string - title: Unitname - unitExtraInfo: - $ref: '#/components/schemas/UnitExtraInfo-Output' - currentCostPerUnit: - type: number - title: Currentcostperunit - default: - type: boolean - title: Default - specificInfo: - $ref: '#/components/schemas/HardwareInfo' - type: object - required: - - pricingUnitId - - unitName - - unitExtraInfo - - currentCostPerUnit - - default - - specificInfo - title: PricingUnitAdminGet - PricingUnitCostUpdate: - properties: - cost_per_unit: - anyOf: - - type: number - - type: string - title: Cost Per Unit - comment: - type: string - title: Comment - type: object - required: - - cost_per_unit - - comment - title: PricingUnitCostUpdate - PricingUnitGet: - properties: - pricingUnitId: - type: integer - exclusiveMinimum: true - title: Pricingunitid - minimum: 0 - unitName: - type: string - title: Unitname - unitExtraInfo: - $ref: '#/components/schemas/UnitExtraInfo-Output' - currentCostPerUnit: - type: number - title: Currentcostperunit - default: - type: boolean - title: Default - type: object - required: - - pricingUnitId - - unitName - - unitExtraInfo - - currentCostPerUnit - - default - title: PricingUnitGet - ProfileGet: - properties: - id: - type: integer - exclusiveMinimum: true - title: Id - minimum: 0 - first_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: First Name - last_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: Last Name - login: - type: string - format: email - title: Login - role: - type: string - enum: - - ANONYMOUS - - GUEST - - USER - - TESTER - - PRODUCT_OWNER - - ADMIN - title: Role - groups: - anyOf: - - $ref: '#/components/schemas/MyGroupsGet' - - type: 'null' - gravatar_id: - anyOf: - - type: string - - type: 'null' - title: Gravatar Id - expirationDate: - anyOf: - - type: string - format: date - - type: 'null' - title: Expirationdate - description: If user has a trial account, it sets the expiration date, otherwise - None - preferences: - additionalProperties: - $ref: '#/components/schemas/Preference' - type: object - title: Preferences - type: object - required: - - id - - login - - role - - preferences - title: ProfileGet - ProfileUpdate: - properties: - first_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: First Name - last_name: - anyOf: - - type: string - maxLength: 255 - - type: 'null' - title: Last Name - type: object - title: ProfileUpdate - example: - first_name: Pedro - last_name: Crespo - ProjectCopyOverride: - properties: - name: - type: string - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - prjOwner: - type: string - format: email - title: Prjowner - type: object - required: - - name - - prjOwner - title: ProjectCopyOverride - ProjectCreateNew: - properties: - uuid: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Uuid - name: - type: string - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - workbench: - type: object - title: Workbench - accessRights: - additionalProperties: - $ref: '#/components/schemas/AccessRights' - type: object - title: Accessrights - tags: - items: - type: integer - type: array - title: Tags - classifiers: - items: - type: string - type: array - title: Classifiers - ui: - anyOf: - - $ref: '#/components/schemas/StudyUI-Input' - - type: 'null' - workspaceId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspaceid - folderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folderid - type: object - required: - - name - - workbench - - accessRights - title: ProjectCreateNew - ProjectGet: - properties: - uuid: - type: string - format: uuid - title: Uuid - name: - type: string - title: Name - description: - type: string - title: Description - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: string - enum: - - '' - const: '' - title: Thumbnail - creationDate: - type: string - pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z - title: Creationdate - lastChangeDate: - type: string - pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z - title: Lastchangedate - workbench: - type: object - title: Workbench - prjOwner: - type: string - format: email - title: Prjowner - accessRights: - additionalProperties: - $ref: '#/components/schemas/AccessRights' - type: object - title: Accessrights - tags: - items: - type: integer - type: array - title: Tags - classifiers: - items: - type: string - type: array - title: Classifiers - default: [] - state: - anyOf: - - $ref: '#/components/schemas/ProjectState' - - type: 'null' - ui: - anyOf: - - $ref: '#/components/schemas/EmptyModel' - - $ref: '#/components/schemas/StudyUI-Output' - - type: 'null' - title: Ui - quality: - type: object - title: Quality - default: {} - dev: - anyOf: - - type: object - - type: 'null' - title: Dev - permalink: - anyOf: - - $ref: '#/components/schemas/ProjectPermalink' - - type: 'null' - workspaceId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspaceid - folderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folderid - trashedAt: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Trashedat - type: object - required: - - uuid - - name - - description - - thumbnail - - creationDate - - lastChangeDate - - workbench - - prjOwner - - accessRights - - tags - - dev - - workspaceId - - folderId - - trashedAt - title: ProjectGet - ProjectGroupGet: - properties: - gid: - type: integer - exclusiveMinimum: true - title: Gid - minimum: 0 - read: - type: boolean - title: Read - write: - type: boolean - title: Write - delete: - type: boolean - title: Delete - created: - type: string - format: date-time - title: Created - modified: - type: string - format: date-time - title: Modified - type: object - required: - - gid - - read - - write - - delete - - created - - modified - title: ProjectGroupGet - ProjectInputGet: - properties: - key: - type: string - format: uuid - title: Key - description: Project port's unique identifer. Same as the UUID of the associated - port node - value: - title: Value - description: Value assigned to this i/o port - label: - type: string - title: Label - type: object - required: - - key - - value - - label - title: ProjectInputGet - ProjectInputUpdate: - properties: - key: - type: string - format: uuid - title: Key - description: Project port's unique identifer. Same as the UUID of the associated - port node - value: - title: Value - description: Value assigned to this i/o port - type: object - required: - - key - - value - title: ProjectInputUpdate - ProjectIterationItem: - properties: - name: - type: string - title: Name - description: Iteration's resource API name - parent: - $ref: '#/components/schemas/ParentMetaProjectRef' - description: Reference to the the meta-project that created this iteration - iteration_index: - type: integer - exclusiveMinimum: true - title: Iteration Index - minimum: 0 - workcopy_project_id: - type: string - format: uuid - title: Workcopy Project Id - description: ID to this iteration's working copy.A working copy is a real - project where this iteration is run - workcopy_project_url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Workcopy Project Url - description: reference to a working copy project - type: object - required: - - name - - parent - - iteration_index - - workcopy_project_id - - workcopy_project_url - title: ProjectIterationItem - ProjectIterationResultItem: - properties: - name: - type: string - title: Name - description: Iteration's resource API name - parent: - $ref: '#/components/schemas/ParentMetaProjectRef' - description: Reference to the the meta-project that created this iteration - iteration_index: - type: integer - exclusiveMinimum: true - title: Iteration Index - minimum: 0 - workcopy_project_id: - type: string - format: uuid - title: Workcopy Project Id - description: ID to this iteration's working copy.A working copy is a real - project where this iteration is run - workcopy_project_url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Workcopy Project Url - description: reference to a working copy project - results: - $ref: '#/components/schemas/ExtractedResults' - type: object - required: - - name - - parent - - iteration_index - - workcopy_project_id - - workcopy_project_url - - results - title: ProjectIterationResultItem - ProjectListItem: - properties: - uuid: - type: string - format: uuid - title: Uuid - name: - type: string - title: Name - description: - type: string - title: Description - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: string - enum: - - '' - const: '' - title: Thumbnail - creationDate: - type: string - pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z - title: Creationdate - lastChangeDate: - type: string - pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z - title: Lastchangedate - workbench: - type: object - title: Workbench - prjOwner: - type: string - format: email - title: Prjowner - accessRights: - additionalProperties: - $ref: '#/components/schemas/AccessRights' - type: object - title: Accessrights - tags: - items: - type: integer - type: array - title: Tags - classifiers: - items: - type: string - type: array - title: Classifiers - default: [] - state: - anyOf: - - $ref: '#/components/schemas/ProjectState' - - type: 'null' - ui: - anyOf: - - $ref: '#/components/schemas/EmptyModel' - - $ref: '#/components/schemas/StudyUI-Output' - - type: 'null' - title: Ui - quality: - type: object - title: Quality - default: {} - dev: - anyOf: - - type: object - - type: 'null' - title: Dev - permalink: - anyOf: - - $ref: '#/components/schemas/ProjectPermalink' - - type: 'null' - workspaceId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Workspaceid - folderId: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: Folderid - trashedAt: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Trashedat - type: object - required: - - uuid - - name - - description - - thumbnail - - creationDate - - lastChangeDate - - workbench - - prjOwner - - accessRights - - tags - - dev - - workspaceId - - folderId - - trashedAt - title: ProjectListItem - ProjectLocked: - properties: - value: - type: boolean - title: Value - description: True if the project is locked - status: - $ref: '#/components/schemas/ProjectStatus' - description: The status of the project - owner: - anyOf: - - $ref: '#/components/schemas/Owner' - - type: 'null' - description: If locked, the user that owns the lock - additionalProperties: false - type: object - required: - - value - - status - title: ProjectLocked - ProjectMetadataGet: - properties: - projectUuid: - type: string - format: uuid - title: Projectuuid - custom: - additionalProperties: - anyOf: - - type: boolean - - type: integer - - type: number - - type: string - type: object - title: Custom - description: Custom key-value map - type: object - required: - - projectUuid - title: ProjectMetadataGet - ProjectMetadataPortGet: - properties: - key: - type: string - format: uuid - title: Key - description: Project port's unique identifer. Same as the UUID of the associated - port node - kind: - type: string - enum: - - input - - output - title: Kind - content_schema: - anyOf: - - type: object - - type: 'null' - title: Content Schema - description: jsonschema for the port's value. SEE https://json-schema.org/understanding-json-schema/ - type: object - required: - - key - - kind - title: ProjectMetadataPortGet - ProjectMetadataUpdate: - properties: - custom: - additionalProperties: - anyOf: - - type: boolean - - type: integer - - type: number - - type: string - type: object - title: Custom - type: object - required: - - custom - title: ProjectMetadataUpdate - ProjectOutputGet: - properties: - key: - type: string - format: uuid - title: Key - description: Project port's unique identifer. Same as the UUID of the associated - port node - value: - title: Value - description: Value assigned to this i/o port - label: - type: string - title: Label - type: object - required: - - key - - value - - label - title: ProjectOutputGet - ProjectPatch: - properties: - name: - anyOf: - - type: string - - type: 'null' - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - maxLength: 2083 - minLength: 1 - format: uri - - type: 'null' - title: Thumbnail - accessRights: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/AccessRights' - type: object - - type: 'null' - title: Accessrights - classifiers: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Classifiers - dev: - anyOf: - - type: object - - type: 'null' - title: Dev - ui: - anyOf: - - $ref: '#/components/schemas/StudyUI-Input' - - type: 'null' - quality: - anyOf: - - type: object - - type: 'null' - title: Quality - type: object - title: ProjectPatch - ProjectPermalink: - properties: - url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Url - is_public: - type: boolean - title: Is Public - type: object - required: - - url - - is_public - title: ProjectPermalink - ProjectRunningState: - properties: - value: - $ref: '#/components/schemas/RunningState' - description: The running state of the project - additionalProperties: false - type: object - required: - - value - title: ProjectRunningState - ProjectState: - properties: - locked: - $ref: '#/components/schemas/ProjectLocked' - description: The project lock state - state: - $ref: '#/components/schemas/ProjectRunningState' - description: The project running state - additionalProperties: false - type: object - required: - - locked - - state - title: ProjectState - ProjectStatus: - type: string - enum: - - CLOSED - - CLOSING - - CLONING - - EXPORTING - - OPENING - - OPENED - - MAINTAINING - title: ProjectStatus - ProjectTypeAPI: - type: string - enum: - - all - - template - - user - title: ProjectTypeAPI - ProjectsCommentsAPI: - properties: - comment_id: - type: integer - exclusiveMinimum: true - title: Comment Id - description: Primary key, identifies the comment - minimum: 0 - project_uuid: - type: string - format: uuid - title: Project Uuid - description: project reference for this table - user_id: - type: integer - exclusiveMinimum: true - title: User Id - description: user reference for this table - minimum: 0 - contents: - type: string - title: Contents - description: Contents of the comment - created: - type: string - format: date-time - title: Created - description: Timestamp on creation - modified: - type: string - format: date-time - title: Modified - description: Timestamp with last update - additionalProperties: false - type: object - required: - - comment_id - - project_uuid - - user_id - - contents - - created - - modified - title: ProjectsCommentsAPI - PutWalletBodyParams: - properties: - name: - type: string - title: Name - description: - anyOf: - - type: string - - type: 'null' - title: Description - thumbnail: - anyOf: - - type: string - - type: 'null' - title: Thumbnail - status: - $ref: '#/components/schemas/WalletStatus' - type: object - required: - - name - - description - - thumbnail - - status - title: PutWalletBodyParams - RegisterBody: - properties: - email: - type: string - format: email - title: Email - password: - type: string - format: password - title: Password - writeOnly: true - confirm: - anyOf: - - type: string - format: password - writeOnly: true - - type: 'null' - title: Confirm - description: Password confirmation - invitation: - anyOf: - - type: string - - type: 'null' - title: Invitation - description: Invitation code - additionalProperties: false - type: object - required: - - email - - password - title: RegisterBody - RegisterPhoneBody: - properties: - email: - type: string - format: email - title: Email - phone: - type: string - title: Phone - description: Phone number E.164, needed on the deployments with 2FA - additionalProperties: false - type: object - required: - - email - - phone - title: RegisterPhoneBody - RegisterPhoneNextPage: - properties: - name: - type: string - title: Name - description: Code name to the front-end page. Ideally a PageStr - parameters: - anyOf: - - $ref: '#/components/schemas/_PageParams' - - type: 'null' - logger: - type: string - title: Logger - default: user - deprecated: true - level: - type: string - enum: - - INFO - - WARNING - - ERROR - title: Level - default: INFO - message: - type: string - title: Message - type: object - required: - - name - - message - title: RegisterPhoneNextPage - ReplaceWalletAutoRecharge: - properties: - enabled: - type: boolean - title: Enabled - paymentMethodId: - type: string - maxLength: 100 - minLength: 1 - title: Paymentmethodid - topUpAmountInUsd: - anyOf: - - type: number - minimum: 0.0 - - type: string - title: Topupamountinusd - monthlyLimitInUsd: - anyOf: - - type: number - minimum: 0.0 - - type: string - - type: 'null' - title: Monthlylimitinusd - type: object - required: - - enabled - - paymentMethodId - - topUpAmountInUsd - - monthlyLimitInUsd - title: ReplaceWalletAutoRecharge - RepoApiModel: - properties: - project_uuid: - type: string - format: uuid - title: Project Uuid - url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Url - type: object - required: - - project_uuid - - url - title: RepoApiModel - ResearchResource: - properties: - rrid: - type: string - pattern: ^(RRID:)([^_\s]{1,30})_(\S{1,30})$ - title: Rrid - description: Unique identifier used as classifier, i.e. to tag studies and - services - name: - type: string - title: Name - description: - type: string - title: Description - type: object - required: - - rrid - - name - - description - title: ResearchResource - Resend2faBody: - properties: - email: - type: string - format: email - title: Email - description: User email (identifier) - via: - type: string - enum: - - SMS - - Email - title: Via - default: SMS - additionalProperties: false - type: object - required: - - email - title: Resend2faBody - ResetPasswordBody: - properties: - email: - type: string - title: Email - additionalProperties: false - type: object - required: - - email - title: ResetPasswordBody - ResetPasswordConfirmation: - properties: - password: - type: string - format: password - title: Password - writeOnly: true - confirm: - type: string - format: password - title: Confirm - writeOnly: true - additionalProperties: false - type: object - required: - - password - - confirm - title: ResetPasswordConfirmation - ResourceHit: - properties: - rid: - type: string - title: Rid - name: - type: string - title: Name - type: object - required: - - rid - - name - title: ResourceHit - ResourceValue: - properties: - limit: - anyOf: - - type: integer - - type: number - - type: string - title: Limit - reservation: - anyOf: - - type: integer - - type: number - - type: string - title: Reservation - type: object - required: - - limit - - reservation - title: ResourceValue - RunningDynamicServiceDetails: - properties: - service_key: - type: string - pattern: ^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Service Key - description: distinctive name for the node based on the docker registry - path - service_version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Service Version - description: semantic version number of the node - user_id: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - project_id: - type: string - format: uuid - title: Project Id - service_uuid: - type: string - format: uuid - title: Service Uuid - service_basepath: - anyOf: - - type: string - format: path - - type: 'null' - title: Service Basepath - description: predefined path where the dynamic service should be served. - If empty, the service shall use the root endpoint. - boot_type: - $ref: '#/components/schemas/ServiceBootType' - description: Describes how the dynamic services was started (legacy=V0, - modern=V2).Since legacy services do not have this label it defaults to - V0. - default: V0 - service_host: - type: string - title: Service Host - description: the service swarm internal host name - service_port: - type: integer - exclusiveMaximum: true - exclusiveMinimum: true - title: Service Port - description: the service swarm internal port - maximum: 65535 - minimum: 0 - published_port: - anyOf: - - type: integer - exclusiveMaximum: true - exclusiveMinimum: true - maximum: 65535 - minimum: 0 - - type: 'null' - title: Published Port - description: the service swarm published port if any - deprecated: true - entry_point: - anyOf: - - type: string - - type: 'null' - title: Entry Point - description: if empty the service entrypoint is on the root endpoint. - deprecated: true - service_state: - $ref: '#/components/schemas/ServiceState' - description: service current state - service_message: - anyOf: - - type: string - - type: 'null' - title: Service Message - description: additional information related to service state - type: object - required: - - service_key - - service_version - - user_id - - project_id - - service_uuid - - service_host - - service_port - - service_state - title: RunningDynamicServiceDetails - RunningState: - type: string - enum: - - UNKNOWN - - PUBLISHED - - NOT_STARTED - - PENDING - - WAITING_FOR_RESOURCES - - STARTED - - SUCCESS - - FAILED - - ABORTED - - WAITING_FOR_CLUSTER - title: RunningState - description: 'State of execution of a project''s computational workflow - - - SEE StateType for task state' - Scheduler: - properties: - status: - type: string - title: Status - description: The running status of the scheduler - workers: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/Worker' - type: object - - type: 'null' - title: Workers - type: object - required: - - status - title: Scheduler - SelectBox: - properties: - structure: - items: - $ref: '#/components/schemas/Structure' - type: array - minItems: 1 - title: Structure - additionalProperties: false - type: object - required: - - structure - title: SelectBox - ServiceBootType: - type: string - enum: - - V0 - - V2 - title: ServiceBootType - ServiceGet: - properties: - key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Key - description: Service key ID - title: - type: string - title: Title - description: Service name for display - description: - type: string - title: Description - description: Long description of the service - thumbnail: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: Thumbnail - description: Url to service thumbnail - file_extensions: - items: - type: string - type: array - title: File Extensions - description: File extensions that this service can process - view_url: - type: string - maxLength: 2083 - minLength: 1 - format: uri - title: View Url - description: Redirection to open a service in osparc (see /view) - type: object - required: - - key - - title - - description - - thumbnail - - view_url - title: ServiceGet - example: - description: It is also sim4life for the web - file_extensions: - - smash - - h5 - key: simcore/services/dynamic/sim4life - thumbnail: https://via.placeholder.com/170x120.png - title: Sim4Life Mattermost - view_url: https://host.com/view?viewer_key=simcore/services/dynamic/raw-graphs&viewer_version=1.2.3 - ServiceGroupAccessRightsV2: - properties: - execute: - type: boolean - title: Execute - default: false - write: - type: boolean - title: Write - default: false - additionalProperties: false - type: object - title: ServiceGroupAccessRightsV2 - ServiceInputGet: - properties: - unitLong: - anyOf: - - type: string - - type: 'null' - title: Unitlong - description: Long name of the unit for display (html-compatible), if available - unitShort: - anyOf: - - type: string - - type: 'null' - title: Unitshort - description: Short name for the unit for display (html-compatible), if available - displayOrder: - anyOf: - - type: number - - type: 'null' - title: Displayorder - description: 'DEPRECATED: new display order is taken from the item position. - This will be removed.' - deprecated: true - label: - type: string - title: Label - description: short name for the property - description: - type: string - title: Description - description: description of the property - type: - type: string - pattern: ^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$ - title: Type - description: data type expected on this input glob matching for data type - is allowed - contentSchema: - anyOf: - - type: object - - type: 'null' - title: Contentschema - description: jsonschema of this input/output. Required when type='ref_contentSchema' - fileToKeyMap: - anyOf: - - type: object - - type: 'null' - title: Filetokeymap - description: Place the data associated with the named keys in files - unit: - anyOf: - - type: string - - type: 'null' - title: Unit - description: Units, when it refers to a physical quantity - deprecated: true - defaultValue: - anyOf: - - type: boolean - - type: integer - - type: number - - type: string - - type: 'null' - title: Defaultvalue - deprecated: true - widget: - anyOf: - - $ref: '#/components/schemas/Widget' - - type: 'null' - description: custom widget to use instead of the default one determined - from the data-type - keyId: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Keyid - description: Unique name identifier for this input - additionalProperties: false - type: object - required: - - label - - description - - type - - keyId - title: ServiceInputGet - description: Extends fields of api_schemas_catalog.services.ServiceGet.outputs[*] - example: - defaultValue: 0 - description: Time to wait before completion - displayOrder: 2 - keyId: input_2 - label: Sleep Time - type: number - unit: second - unitLong: seconds - unitShort: sec - widget: - details: - minHeight: 1 - type: TextArea - ServiceKeyVersion: - properties: - key: - type: string - pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ - title: Key - description: distinctive name for the node based on the docker registry - path - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - description: service version number - type: object - required: - - key - - version - title: ServiceKeyVersion - description: Service `key-version` pair uniquely identifies a service - ServiceOutputGet: - properties: - unitLong: - anyOf: - - type: string - - type: 'null' - title: Unitlong - description: Long name of the unit for display (html-compatible), if available - unitShort: - anyOf: - - type: string - - type: 'null' - title: Unitshort - description: Short name for the unit for display (html-compatible), if available - displayOrder: - anyOf: - - type: number - - type: 'null' - title: Displayorder - description: 'DEPRECATED: new display order is taken from the item position. - This will be removed.' - deprecated: true - label: - type: string - title: Label - description: short name for the property - description: - type: string - title: Description - description: description of the property - type: - type: string - pattern: ^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$ - title: Type - description: data type expected on this input glob matching for data type - is allowed - contentSchema: - anyOf: - - type: object - - type: 'null' - title: Contentschema - description: jsonschema of this input/output. Required when type='ref_contentSchema' - fileToKeyMap: - anyOf: - - type: object - - type: 'null' - title: Filetokeymap - description: Place the data associated with the named keys in files - unit: - anyOf: - - type: string - - type: 'null' - title: Unit - description: Units, when it refers to a physical quantity - deprecated: true - widget: - anyOf: - - $ref: '#/components/schemas/Widget' - - type: 'null' - description: custom widget to use instead of the default one determined - from the data-type - deprecated: true - keyId: - type: string - pattern: ^[-_a-zA-Z0-9]+$ - title: Keyid - description: Unique name identifier for this input - additionalProperties: false - type: object - required: - - label - - description - - type - - keyId - title: ServiceOutputGet - description: Extends fields of api_schemas_catalog.services.ServiceGet.outputs[*] - example: - description: Time the service waited before completion - displayOrder: 2 - keyId: output_2 - label: Time Slept - type: number - unit: second - unitLong: seconds - unitShort: sec - ServicePricingPlanGet: - properties: - pricingPlanId: - type: integer - exclusiveMinimum: true - title: Pricingplanid - minimum: 0 - displayName: - type: string - title: Displayname - description: - type: string - title: Description - classification: - $ref: '#/components/schemas/PricingPlanClassification' - createdAt: - type: string - format: date-time - title: Createdat - pricingPlanKey: - type: string - title: Pricingplankey - pricingUnits: - items: - $ref: '#/components/schemas/PricingUnitGet' - type: array - title: Pricingunits - type: object - required: - - pricingPlanId - - displayName - - description - - classification - - createdAt - - pricingPlanKey - - pricingUnits - title: ServicePricingPlanGet - ServiceRelease: - properties: - version: - type: string - pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - title: Version - versionDisplay: - anyOf: - - type: string - - type: 'null' - title: Versiondisplay - description: If None, then display `version` - released: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Released - description: When provided, it indicates the release timestamp - retired: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Retired - description: 'whether this service is planned to be retired. If None, the - service is still active. If now Date: Mon, 2 Dec 2024 14:43:42 +0100 Subject: [PATCH 12/79] remove last openapi.json artifacts from repo --- services/api-server/openapi.json | 7121 ------------------ services/dynamic-sidecar/openapi.json | 1514 ---- services/invitations/openapi.json | 456 -- services/payments/gateway/openapi.json | 1039 --- services/payments/openapi.json | 564 -- services/resource-usage-tracker/openapi.json | 600 -- 6 files changed, 11294 deletions(-) delete mode 100644 services/api-server/openapi.json delete mode 100644 services/dynamic-sidecar/openapi.json delete mode 100644 services/invitations/openapi.json delete mode 100644 services/payments/gateway/openapi.json delete mode 100644 services/payments/openapi.json delete mode 100644 services/resource-usage-tracker/openapi.json diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json deleted file mode 100644 index 29d7dda206b..00000000000 --- a/services/api-server/openapi.json +++ /dev/null @@ -1,7121 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "osparc.io public API", - "description": "osparc-simcore public API specifications", - "version": "0.7.0" - }, - "paths": { - "/v0/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Meta" - } - } - } - } - } - } - }, - "/v0/me": { - "get": { - "tags": [ - "users" - ], - "summary": "Get My Profile", - "operationId": "get_my_profile", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Profile" - } - } - } - }, - "404": { - "description": "User not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - }, - "put": { - "tags": [ - "users" - ], - "summary": "Update My Profile", - "operationId": "update_my_profile", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProfileUpdate" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Profile" - } - } - } - }, - "404": { - "description": "User not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v0/files": { - "get": { - "tags": [ - "files" - ], - "summary": "List Files", - "description": "Lists all files stored in the system\n\nSEE `get_files_page` for a paginated version of this function", - "operationId": "list_files", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/File" - }, - "type": "array", - "title": "Response List Files V0 Files Get" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v0/files/content": { - "put": { - "tags": [ - "files" - ], - "summary": "Upload File", - "description": "Uploads a single file to the system", - "operationId": "upload_file", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "content-length", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Content-Length" - } - } - ], - "requestBody": { - "required": true, - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/Body_upload_file_v0_files_content_put" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/File" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "post": { - "tags": [ - "files" - ], - "summary": "Get Upload Links", - "description": "Get upload links for uploading a file to storage", - "operationId": "get_upload_links", - "security": [ - { - "HTTPBasic": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientFile" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClientFileUploadData" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/files/{file_id}": { - "get": { - "tags": [ - "files" - ], - "summary": "Get File", - "description": "Gets metadata for a given file resource", - "operationId": "get_file", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "file_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "File Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/File" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "files" - ], - "summary": "Delete File", - "operationId": "delete_file", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "file_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "File Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/files:search": { - "get": { - "tags": [ - "files" - ], - "summary": "Search Files Page", - "description": "Search files", - "operationId": "search_files_page", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "sha256_checksum", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "pattern": "^[a-fA-F0-9]{64}$" - }, - { - "type": "null" - } - ], - "title": "Sha256 Checksum" - } - }, - { - "name": "file_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "File Id" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 0, - "default": 0, - "title": "Offset" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Page_File_" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/files/{file_id}:abort": { - "post": { - "tags": [ - "files" - ], - "summary": "Abort Multipart Upload", - "operationId": "abort_multipart_upload", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "file_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "File Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Body_abort_multipart_upload_v0_files__file_id__abort_post" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/files/{file_id}:complete": { - "post": { - "tags": [ - "files" - ], - "summary": "Complete Multipart Upload", - "operationId": "complete_multipart_upload", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "file_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "File Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Body_complete_multipart_upload_v0_files__file_id__complete_post" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/File" - } - } - } - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/files/{file_id}/content": { - "get": { - "tags": [ - "files" - ], - "summary": "Download File", - "operationId": "download_file", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "file_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "File Id" - } - } - ], - "responses": { - "307": { - "description": "Successful Response" - }, - "404": { - "description": "File not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "200": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - } - }, - "description": "Returns a arbitrary binary data" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers": { - "get": { - "tags": [ - "solvers" - ], - "summary": "List Solvers", - "description": "Lists all available solvers (latest version)\n\nSEE get_solvers_page for paginated version of this function", - "operationId": "list_solvers", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Solver" - }, - "type": "array", - "title": "Response List Solvers V0 Solvers Get" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v0/solvers/releases": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Lists All Releases", - "description": "Lists all released solvers i.e. all released versions\n\nSEE get_solvers_releases_page for a paginated version of this function", - "operationId": "list_solvers_releases", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Solver" - }, - "type": "array", - "title": "Response List Solvers Releases V0 Solvers Releases Get" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v0/solvers/{solver_key}/latest": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Latest Release of a Solver", - "description": "Gets latest release of a solver", - "operationId": "get_solver", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Solver" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases": { - "get": { - "tags": [ - "solvers" - ], - "summary": "List Solver Releases", - "description": "Lists all releases of a given (one) solver\n\nSEE get_solver_releases_page for a paginated version of this function", - "operationId": "list_solver_releases", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Solver" - }, - "title": "Response List Solver Releases V0 Solvers Solver Key Releases Get" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Solver Release", - "description": "Gets a specific release of a solver", - "operationId": "get_solver_release", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Solver" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/ports": { - "get": { - "tags": [ - "solvers" - ], - "summary": "List Solver Ports", - "description": "Lists inputs and outputs of a given solver\n\nNew in *version 0.5.0*", - "operationId": "list_solver_ports", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OnePage_SolverPort_" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/pricing_plan": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Solver Pricing Plan", - "description": "Gets solver pricing plan\n\nNew in *version 0.7*", - "operationId": "get_solver_pricing_plan", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServicePricingPlanGet" - } - } - } - }, - "404": { - "description": "Not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs": { - "post": { - "tags": [ - "solvers" - ], - "summary": "Create Job", - "description": "Creates a job in a specific release with given inputs.\n\nNOTE: This operation does **not** start the job", - "operationId": "create_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "hidden", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": true, - "title": "Hidden" - } - }, - { - "name": "x-simcore-parent-project-uuid", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Project-Uuid" - } - }, - { - "name": "x-simcore-parent-node-id", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Node-Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobInputs" - } - } - } - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Job" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "tags": [ - "solvers" - ], - "summary": "List Jobs", - "description": "List of jobs in a specific released solver (limited to 20 jobs)\n\n- DEPRECATION: This implementation and returned values are deprecated and the will be replaced by that of get_jobs_page\n- SEE `get_jobs_page` for paginated version of this function", - "operationId": "list_jobs", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Job" - }, - "title": "Response List Jobs V0 Solvers Solver Key Releases Version Jobs Get" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}": { - "delete": { - "tags": [ - "solvers" - ], - "summary": "Delete Job", - "description": "Deletes an existing solver job\n\nNew in *version 0.7*", - "operationId": "delete_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job", - "description": "Gets job of a given solver", - "operationId": "get_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Job" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:start": { - "post": { - "tags": [ - "solvers" - ], - "summary": "Start Job", - "description": "Starts job job_id created with the solver solver_key:version\n\nAdded in *version 0.4.3*: query parameter `cluster_id`\nAdded in *version 0.6*: responds with a 202 when successfully starting a computation", - "operationId": "start_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - }, - { - "name": "cluster_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Cluster Id" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "200": { - "description": "Job already started", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "406": { - "description": "Cluster not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Configuration error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:stop": { - "post": { - "tags": [ - "solvers" - ], - "summary": "Stop Job", - "operationId": "stop_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:inspect": { - "post": { - "tags": [ - "solvers" - ], - "summary": "Inspect Job", - "operationId": "inspect_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/metadata": { - "patch": { - "tags": [ - "solvers" - ], - "summary": "Replace Job Custom Metadata", - "description": "Updates custom metadata from a job\n\nNew in *version 0.7*", - "operationId": "replace_job_custom_metadata", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadataUpdate" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadata" - } - } - } - }, - "404": { - "description": "Metadata not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job Custom Metadata", - "description": "Gets custom metadata from a job\n\nNew in *version 0.7*", - "operationId": "get_job_custom_metadata", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadata" - } - } - } - }, - "404": { - "description": "Metadata not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/page": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Jobs Page", - "description": "List of jobs on a specific released solver (includes pagination)\n\nNew in *version 0.7*", - "operationId": "get_jobs_page", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 0, - "default": 0, - "title": "Offset" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Page_Job_" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/outputs": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job Outputs", - "operationId": "get_job_outputs", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobOutputs" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/outputs/logfile": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job Output Logfile", - "description": "Special extra output with persistent logs file for the solver run.\n\n**NOTE**: this is not a log stream but a predefined output that is only\navailable after the job is done.\n\nNew in *version 0.4.0*", - "operationId": "get_job_output_logfile", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "307": { - "description": "Successful Response" - }, - "200": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "application/zip": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "text/plain": { - "schema": { - "type": "string" - } - } - }, - "description": "Returns a log file" - }, - "404": { - "description": "Log not found" - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/wallet": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job Wallet", - "description": "Get job wallet\n\nNew in *version 0.7*", - "operationId": "get_job_wallet", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" - } - } - } - }, - "404": { - "description": "Wallet not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "403": { - "description": "Access to wallet is not allowed", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/pricing_unit": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Job Pricing Unit", - "description": "Get job pricing unit\n\nNew in *version 0.7*", - "operationId": "get_job_pricing_unit", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PricingUnitGet" - } - } - } - }, - "404": { - "description": "Pricing unit not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/logstream": { - "get": { - "tags": [ - "solvers" - ], - "summary": "Get Log Stream", - "operationId": "get_log_stream", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "solver_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Solver Key" - } - }, - { - "name": "version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Returns a JobLog or an ErrorGet", - "content": { - "application/x-ndjson": { - "schema": { - "type": "string", - "anyOf": [ - { - "$ref": "#/components/schemas/JobLog" - }, - { - "$ref": "#/components/schemas/ErrorGet" - } - ], - "title": "Response 200 Get Log Stream V0 Solvers Solver Key Releases Version Jobs Job Id Logstream Get" - } - } - } - }, - "409": { - "description": "Conflict: Logs are already being streamed", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/x-ndjson": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies": { - "get": { - "tags": [ - "studies" - ], - "summary": "List Studies", - "description": "New in *version 0.5.0*", - "operationId": "list_studies", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 1, - "default": 50, - "title": "Limit" - } - }, - { - "name": "offset", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 0, - "default": 0, - "title": "Offset" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Page_Study_" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}": { - "get": { - "tags": [ - "studies" - ], - "summary": "Get Study", - "description": "New in *version 0.5.0*", - "operationId": "get_study", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Study" - } - } - } - }, - "404": { - "description": "Study not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}:clone": { - "post": { - "tags": [ - "studies" - ], - "summary": "Clone Study", - "operationId": "clone_study", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "x-simcore-parent-project-uuid", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Project-Uuid" - } - }, - { - "name": "x-simcore-parent-node-id", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Node-Id" - } - } - ], - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Study" - } - } - } - }, - "404": { - "description": "Study not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/ports": { - "get": { - "tags": [ - "studies" - ], - "summary": "List Study Ports", - "description": "Lists metadata on ports of a given study\n\nNew in *version 0.5.0*", - "operationId": "list_study_ports", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OnePage_StudyPort_" - } - } - } - }, - "404": { - "description": "Study not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs": { - "post": { - "tags": [ - "studies" - ], - "summary": "Create Study Job", - "description": "hidden -- if True (default) hides project from UI", - "operationId": "create_study_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "hidden", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": true, - "title": "Hidden" - } - }, - { - "name": "x-simcore-parent-project-uuid", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Project-Uuid" - } - }, - { - "name": "x-simcore-parent-node-id", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "X-Simcore-Parent-Node-Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobInputs" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Job" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}": { - "delete": { - "tags": [ - "studies" - ], - "summary": "Delete Study Job", - "description": "Deletes an existing study job", - "operationId": "delete_study_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - }, - "description": "Not Found" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}:start": { - "post": { - "tags": [ - "studies" - ], - "summary": "Start Study Job", - "description": "Changed in *version 0.6.0*: Now responds with a 202 when successfully starting a computation", - "operationId": "start_study_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - }, - { - "name": "cluster_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Cluster Id" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "402": { - "description": "Payment required", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "404": { - "description": "Job/wallet/pricing details not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "200": { - "description": "Job already started", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "406": { - "description": "Cluster not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Configuration error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}:stop": { - "post": { - "tags": [ - "studies" - ], - "summary": "Stop Study Job", - "operationId": "stop_study_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}:inspect": { - "post": { - "tags": [ - "studies" - ], - "summary": "Inspect Study Job", - "operationId": "inspect_study_job", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobStatus" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}/outputs": { - "post": { - "tags": [ - "studies" - ], - "summary": "Get Study Job Outputs", - "operationId": "get_study_job_outputs", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobOutputs" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}/outputs/log-links": { - "get": { - "tags": [ - "studies" - ], - "summary": "Get download links for study job log files", - "operationId": "get_study_job_output_logfile", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobLogsMap" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/studies/{study_id}/jobs/{job_id}/metadata": { - "get": { - "tags": [ - "studies" - ], - "summary": "Get Study Job Custom Metadata", - "description": "Get custom metadata from a study's job\n\nNew in *version 0.7*", - "operationId": "get_study_job_custom_metadata", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadata" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "put": { - "tags": [ - "studies" - ], - "summary": "Replace Study Job Custom Metadata", - "description": "Changes custom metadata of a study's job\n\nNew in *version 0.7*", - "operationId": "replace_study_job_custom_metadata", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "study_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Study Id" - } - }, - { - "name": "job_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Job Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadataUpdate" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/JobMetadata" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/wallets/default": { - "get": { - "tags": [ - "wallets" - ], - "summary": "Get Default Wallet", - "description": "Get default wallet\n\nNew in *version 0.7*", - "operationId": "get_default_wallet", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" - } - } - } - }, - "404": { - "description": "Wallet not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "403": { - "description": "Access to wallet is not allowed", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v0/wallets/{wallet_id}": { - "get": { - "tags": [ - "wallets" - ], - "summary": "Get Wallet", - "description": "Get wallet\n\nNew in *version 0.7*", - "operationId": "get_wallet", - "security": [ - { - "HTTPBasic": [] - } - ], - "parameters": [ - { - "name": "wallet_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "title": "Wallet Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" - } - } - } - }, - "404": { - "description": "Wallet not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "403": { - "description": "Access to wallet is not allowed", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "429": { - "description": "Too many requests", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "500": { - "description": "Internal server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "502": { - "description": "Unexpected error when communicating with backend service", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "503": { - "description": "Service unavailable", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "504": { - "description": "Request to a backend service timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v0/credits/price": { - "get": { - "tags": [ - "credits" - ], - "summary": "Get Credits Price", - "description": "New in *version 0.6.0*", - "operationId": "get_credits_price", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetCreditPriceApiServer" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - } - }, - "components": { - "schemas": { - "Body_abort_multipart_upload_v0_files__file_id__abort_post": { - "properties": { - "client_file": { - "$ref": "#/components/schemas/ClientFile" - } - }, - "type": "object", - "required": [ - "client_file" - ], - "title": "Body_abort_multipart_upload_v0_files__file_id__abort_post" - }, - "Body_complete_multipart_upload_v0_files__file_id__complete_post": { - "properties": { - "client_file": { - "$ref": "#/components/schemas/ClientFile" - }, - "uploaded_parts": { - "$ref": "#/components/schemas/FileUploadCompletionBody" - } - }, - "type": "object", - "required": [ - "client_file", - "uploaded_parts" - ], - "title": "Body_complete_multipart_upload_v0_files__file_id__complete_post" - }, - "Body_upload_file_v0_files_content_put": { - "properties": { - "file": { - "type": "string", - "format": "binary", - "title": "File" - } - }, - "type": "object", - "required": [ - "file" - ], - "title": "Body_upload_file_v0_files_content_put" - }, - "ClientFile": { - "properties": { - "filename": { - "type": "string", - "title": "Filename", - "description": "File name" - }, - "filesize": { - "type": "integer", - "minimum": 0, - "title": "Filesize", - "description": "File size in bytes" - }, - "sha256_checksum": { - "type": "string", - "pattern": "^[a-fA-F0-9]{64}$", - "title": "Sha256 Checksum", - "description": "SHA256 checksum" - } - }, - "type": "object", - "required": [ - "filename", - "filesize", - "sha256_checksum" - ], - "title": "ClientFile", - "description": "Represents a file stored on the client side" - }, - "ClientFileUploadData": { - "properties": { - "file_id": { - "type": "string", - "format": "uuid", - "title": "File Id", - "description": "The file resource id" - }, - "upload_schema": { - "$ref": "#/components/schemas/FileUploadData", - "description": "Schema for uploading file" - } - }, - "type": "object", - "required": [ - "file_id", - "upload_schema" - ], - "title": "ClientFileUploadData" - }, - "ErrorGet": { - "properties": { - "errors": { - "items": {}, - "type": "array", - "title": "Errors" - } - }, - "type": "object", - "required": [ - "errors" - ], - "title": "ErrorGet", - "example": { - "errors": [ - "some error message", - "another error message" - ] - } - }, - "File": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id", - "description": "Resource identifier" - }, - "filename": { - "type": "string", - "title": "Filename", - "description": "Name of the file with extension" - }, - "content_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Content Type", - "description": "Guess of type content [EXPERIMENTAL]" - }, - "checksum": { - "anyOf": [ - { - "type": "string", - "pattern": "^[a-fA-F0-9]{64}$" - }, - { - "type": "null" - } - ], - "title": "Checksum", - "description": "SHA256 hash of the file's content" - }, - "e_tag": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "E Tag", - "description": "S3 entity tag" - } - }, - "type": "object", - "required": [ - "id", - "filename" - ], - "title": "File", - "description": "Represents a file stored on the server side i.e. a unique reference to a file in the cloud." - }, - "FileUploadCompletionBody": { - "properties": { - "parts": { - "items": { - "$ref": "#/components/schemas/UploadedPart" - }, - "type": "array", - "title": "Parts" - } - }, - "type": "object", - "required": [ - "parts" - ], - "title": "FileUploadCompletionBody" - }, - "FileUploadData": { - "properties": { - "chunk_size": { - "type": "integer", - "minimum": 0, - "title": "Chunk Size" - }, - "urls": { - "items": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri" - }, - "type": "array", - "title": "Urls" - }, - "links": { - "$ref": "#/components/schemas/UploadLinks" - } - }, - "type": "object", - "required": [ - "chunk_size", - "urls", - "links" - ], - "title": "FileUploadData" - }, - "GetCreditPriceApiServer": { - "properties": { - "productName": { - "type": "string", - "title": "Productname" - }, - "usdPerCredit": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Usdpercredit", - "description": "Price of a credit in USD. If None, then this product's price is UNDEFINED" - }, - "minPaymentAmountUsd": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Minpaymentamountusd", - "description": "Minimum amount (included) in USD that can be paid for this productCan be None if this product's price is UNDEFINED" - } - }, - "type": "object", - "required": [ - "productName", - "usdPerCredit", - "minPaymentAmountUsd" - ], - "title": "GetCreditPriceApiServer" - }, - "Groups": { - "properties": { - "me": { - "$ref": "#/components/schemas/UsersGroup" - }, - "organizations": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/UsersGroup" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Organizations", - "default": [] - }, - "all": { - "$ref": "#/components/schemas/UsersGroup" - } - }, - "type": "object", - "required": [ - "me", - "all" - ], - "title": "Groups" - }, - "HTTPValidationError": { - "properties": { - "errors": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Validation errors" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "Job": { - "properties": { - "id": { - "type": "string", - "format": "uuid", - "title": "Id" - }, - "name": { - "type": "string", - "pattern": "^([^\\s/]+/?){1,10}$", - "title": "Name" - }, - "inputs_checksum": { - "type": "string", - "title": "Inputs Checksum", - "description": "Input's checksum" - }, - "created_at": { - "type": "string", - "format": "date-time", - "title": "Created At", - "description": "Job creation timestamp" - }, - "runner_name": { - "type": "string", - "pattern": "^([^\\s/]+/?){1,10}$", - "title": "Runner Name", - "description": "Runner that executes job" - }, - "url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Link to get this resource (self)" - }, - "runner_url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Runner Url", - "description": "Link to the solver's job (parent collection)" - }, - "outputs_url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Outputs Url", - "description": "Link to the job outputs (sub-collection)" - } - }, - "type": "object", - "required": [ - "id", - "name", - "inputs_checksum", - "created_at", - "runner_name", - "url", - "runner_url", - "outputs_url" - ], - "title": "Job", - "example": { - "created_at": "2021-01-22T23:59:52.322176", - "id": "f622946d-fd29-35b9-a193-abdd1095167c", - "inputs_checksum": "12345", - "name": "solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c", - "outputs_url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c/outputs", - "runner_name": "solvers/isolve/releases/1.3.4", - "runner_url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4", - "url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c" - } - }, - "JobInputs": { - "properties": { - "values": { - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/components/schemas/File" - }, - { - "type": "number" - }, - { - "type": "integer" - }, - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "type": "object", - "title": "Values" - } - }, - "type": "object", - "required": [ - "values" - ], - "title": "JobInputs", - "example": { - "values": { - "enabled": true, - "input_file": { - "filename": "input.txt", - "id": "0a3b2c56-dbcd-4871-b93b-d454b7883f9f" - }, - "n": 55, - "title": "Temperature", - "x": 4.33 - } - } - }, - "JobLog": { - "properties": { - "job_id": { - "type": "string", - "format": "uuid", - "title": "Job Id" - }, - "node_id": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Node Id" - }, - "log_level": { - "type": "integer", - "title": "Log Level" - }, - "messages": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Messages" - } - }, - "type": "object", - "required": [ - "job_id", - "log_level", - "messages" - ], - "title": "JobLog", - "example": { - "job_id": "145beae4-a3a8-4fde-adbb-4e8257c2c083", - "log_level": 10, - "messages": [ - "PROGRESS: 5/10" - ], - "node_id": "3742215e-6756-48d2-8b73-4d043065309f" - } - }, - "JobLogsMap": { - "properties": { - "log_links": { - "items": { - "$ref": "#/components/schemas/LogLink" - }, - "type": "array", - "title": "Log Links", - "description": "Array of download links" - } - }, - "type": "object", - "required": [ - "log_links" - ], - "title": "JobLogsMap" - }, - "JobMetadata": { - "properties": { - "job_id": { - "type": "string", - "format": "uuid", - "title": "Job Id", - "description": "Parent Job" - }, - "metadata": { - "additionalProperties": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - "type": "object", - "title": "Metadata", - "description": "Custom key-value map" - }, - "url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Link to get this resource (self)" - } - }, - "type": "object", - "required": [ - "job_id", - "metadata", - "url" - ], - "title": "JobMetadata", - "example": { - "job_id": "3497e4de-0e69-41fb-b08f-7f3875a1ac4b", - "metadata": { - "bool": "true", - "float": "3.14", - "int": "42", - "str": "hej med dig" - }, - "url": "https://f02b2452-1dd8-4882-b673-af06373b41b3.fake" - } - }, - "JobMetadataUpdate": { - "properties": { - "metadata": { - "additionalProperties": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - "type": "object", - "title": "Metadata", - "description": "Custom key-value map" - } - }, - "type": "object", - "title": "JobMetadataUpdate", - "example": { - "metadata": { - "bool": "true", - "float": "3.14", - "int": "42", - "str": "hej med dig" - } - } - }, - "JobOutputs": { - "properties": { - "job_id": { - "type": "string", - "format": "uuid", - "title": "Job Id", - "description": "Job that produced this output" - }, - "results": { - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/components/schemas/File" - }, - { - "type": "number" - }, - { - "type": "integer" - }, - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "items": {}, - "type": "array" - }, - { - "type": "null" - } - ] - }, - "type": "object", - "title": "Results" - } - }, - "type": "object", - "required": [ - "job_id", - "results" - ], - "title": "JobOutputs", - "example": { - "job_id": "99d9ac65-9f10-4e2f-a433-b5e412bb037b", - "results": { - "enabled": false, - "maxSAR": 4.33, - "n": 55, - "output_file": { - "filename": "sar_matrix.txt", - "id": "0a3b2c56-dbcd-4871-b93b-d454b7883f9f" - }, - "title": "Specific Absorption Rate" - } - } - }, - "JobStatus": { - "properties": { - "job_id": { - "type": "string", - "format": "uuid", - "title": "Job Id" - }, - "state": { - "$ref": "#/components/schemas/RunningState" - }, - "progress": { - "type": "integer", - "maximum": 100, - "minimum": 0, - "title": "Progress", - "default": 0 - }, - "submitted_at": { - "type": "string", - "format": "date-time", - "title": "Submitted At", - "description": "Last modification timestamp of the solver job" - }, - "started_at": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Started At", - "description": "Timestamp that indicate the moment the solver starts execution or None if the event did not occur" - }, - "stopped_at": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Stopped At", - "description": "Timestamp at which the solver finished or killed execution or None if the event did not occur" - } - }, - "type": "object", - "required": [ - "job_id", - "state", - "submitted_at" - ], - "title": "JobStatus", - "example": { - "job_id": "145beae4-a3a8-4fde-adbb-4e8257c2c083", - "progress": 3, - "started_at": "2021-04-01 07:16:43.670610", - "state": "STARTED", - "submitted_at": "2021-04-01 07:15:54.631007" - } - }, - "Links": { - "properties": { - "first": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "First" - }, - "last": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Last" - }, - "self": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Self" - }, - "next": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Next" - }, - "prev": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Prev" - } - }, - "type": "object", - "required": [ - "first", - "last", - "self", - "next", - "prev" - ], - "title": "Links" - }, - "LogLink": { - "properties": { - "node_name": { - "type": "string", - "title": "Node Name" - }, - "download_link": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Download Link" - } - }, - "type": "object", - "required": [ - "node_name", - "download_link" - ], - "title": "LogLink" - }, - "Meta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "released": { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object", - "title": "Released", - "description": "Maps every route's path tag with a released version" - }, - "docs_url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Docs Url" - }, - "docs_dev_url": { - "type": "string", - "maxLength": 65536, - "minLength": 1, - "format": "uri", - "title": "Docs Dev Url" - } - }, - "type": "object", - "required": [ - "name", - "version", - "docs_url", - "docs_dev_url" - ], - "title": "Meta", - "example": { - "docs_dev_url": "https://api.osparc.io/dev/doc", - "docs_url": "https://api.osparc.io/dev/doc", - "name": "simcore_service_foo", - "released": { - "v1": "1.3.4", - "v2": "2.4.45" - }, - "version": "2.4.45" - } - }, - "OnePage_SolverPort_": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/SolverPort" - }, - "type": "array", - "title": "Items" - }, - "total": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Total" - } - }, - "type": "object", - "required": [ - "items" - ], - "title": "OnePage[SolverPort]" - }, - "OnePage_StudyPort_": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/StudyPort" - }, - "type": "array", - "title": "Items" - }, - "total": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Total" - } - }, - "type": "object", - "required": [ - "items" - ], - "title": "OnePage[StudyPort]" - }, - "Page_File_": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/File" - }, - "type": "array", - "title": "Items" - }, - "total": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Total" - }, - "limit": { - "anyOf": [ - { - "type": "integer", - "minimum": 1 - }, - { - "type": "null" - } - ], - "title": "Limit" - }, - "offset": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Offset" - }, - "links": { - "$ref": "#/components/schemas/Links" - } - }, - "type": "object", - "required": [ - "items", - "total", - "limit", - "offset", - "links" - ], - "title": "Page[File]" - }, - "Page_Job_": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/Job" - }, - "type": "array", - "title": "Items" - }, - "total": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Total" - }, - "limit": { - "anyOf": [ - { - "type": "integer", - "minimum": 1 - }, - { - "type": "null" - } - ], - "title": "Limit" - }, - "offset": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Offset" - }, - "links": { - "$ref": "#/components/schemas/Links" - } - }, - "type": "object", - "required": [ - "items", - "total", - "limit", - "offset", - "links" - ], - "title": "Page[Job]" - }, - "Page_Study_": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/Study" - }, - "type": "array", - "title": "Items" - }, - "total": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Total" - }, - "limit": { - "anyOf": [ - { - "type": "integer", - "minimum": 1 - }, - { - "type": "null" - } - ], - "title": "Limit" - }, - "offset": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Offset" - }, - "links": { - "$ref": "#/components/schemas/Links" - } - }, - "type": "object", - "required": [ - "items", - "total", - "limit", - "offset", - "links" - ], - "title": "Page[Study]" - }, - "PricingPlanClassification": { - "type": "string", - "enum": [ - "TIER" - ], - "const": "TIER", - "title": "PricingPlanClassification" - }, - "PricingUnitGet": { - "properties": { - "pricingUnitId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricingunitid", - "minimum": 0 - }, - "unitName": { - "type": "string", - "title": "Unitname" - }, - "unitExtraInfo": { - "$ref": "#/components/schemas/UnitExtraInfo" - }, - "currentCostPerUnit": { - "type": "number", - "title": "Currentcostperunit" - }, - "default": { - "type": "boolean", - "title": "Default" - } - }, - "type": "object", - "required": [ - "pricingUnitId", - "unitName", - "unitExtraInfo", - "currentCostPerUnit", - "default" - ], - "title": "PricingUnitGet" - }, - "Profile": { - "properties": { - "first_name": { - "anyOf": [ - { - "type": "string", - "maxLength": 255 - }, - { - "type": "null" - } - ], - "title": "First Name" - }, - "last_name": { - "anyOf": [ - { - "type": "string", - "maxLength": 255 - }, - { - "type": "null" - } - ], - "title": "Last Name" - }, - "id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Id", - "minimum": 0 - }, - "login": { - "type": "string", - "format": "email", - "title": "Login" - }, - "role": { - "$ref": "#/components/schemas/UserRoleEnum" - }, - "groups": { - "anyOf": [ - { - "$ref": "#/components/schemas/Groups" - }, - { - "type": "null" - } - ] - }, - "gravatar_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 40 - }, - { - "type": "null" - } - ], - "title": "Gravatar Id", - "description": "md5 hash value of email to retrieve an avatar image from https://www.gravatar.com" - } - }, - "type": "object", - "required": [ - "id", - "login", - "role" - ], - "title": "Profile", - "example": { - "first_name": "James", - "gravatar_id": "9a8930a5b20d7048e37740bac5c1ca4f", - "groups": { - "all": { - "description": "all users", - "gid": "1", - "label": "Everyone" - }, - "me": { - "description": "primary group", - "gid": "123", - "label": "maxy" - }, - "organizations": [] - }, - "id": "20", - "last_name": "Maxwell", - "login": "james-maxwell@itis.swiss", - "role": "USER" - } - }, - "ProfileUpdate": { - "properties": { - "first_name": { - "anyOf": [ - { - "type": "string", - "maxLength": 255 - }, - { - "type": "null" - } - ], - "title": "First Name" - }, - "last_name": { - "anyOf": [ - { - "type": "string", - "maxLength": 255 - }, - { - "type": "null" - } - ], - "title": "Last Name" - } - }, - "type": "object", - "title": "ProfileUpdate" - }, - "RunningState": { - "type": "string", - "enum": [ - "UNKNOWN", - "PUBLISHED", - "NOT_STARTED", - "PENDING", - "WAITING_FOR_RESOURCES", - "STARTED", - "SUCCESS", - "FAILED", - "ABORTED", - "WAITING_FOR_CLUSTER" - ], - "title": "RunningState", - "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" - }, - "ServicePricingPlanGet": { - "properties": { - "pricingPlanId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricingplanid", - "minimum": 0 - }, - "displayName": { - "type": "string", - "title": "Displayname" - }, - "description": { - "type": "string", - "title": "Description" - }, - "classification": { - "$ref": "#/components/schemas/PricingPlanClassification" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "title": "Createdat" - }, - "pricingPlanKey": { - "type": "string", - "title": "Pricingplankey" - }, - "pricingUnits": { - "items": { - "$ref": "#/components/schemas/PricingUnitGet" - }, - "type": "array", - "title": "Pricingunits" - } - }, - "type": "object", - "required": [ - "pricingPlanId", - "displayName", - "description", - "classification", - "createdAt", - "pricingPlanKey", - "pricingUnits" - ], - "title": "ServicePricingPlanGet" - }, - "Solver": { - "properties": { - "id": { - "type": "string", - "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Id", - "description": "Solver identifier" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version", - "description": "semantic version number of the node" - }, - "title": { - "type": "string", - "title": "Title", - "description": "Human readable name" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "maintainer": { - "type": "string", - "title": "Maintainer" - }, - "url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Url", - "description": "Link to get this resource" - } - }, - "type": "object", - "required": [ - "id", - "version", - "title", - "maintainer", - "url" - ], - "title": "Solver", - "description": "A released solver with a specific version", - "example": { - "description": "EM solver", - "id": "simcore/services/comp/isolve", - "maintainer": "info@itis.swiss", - "title": "iSolve", - "url": "https://api.osparc.io/v0/solvers/simcore%2Fservices%2Fcomp%2Fisolve/releases/2.1.1", - "version": "2.1.1" - } - }, - "SolverPort": { - "properties": { - "key": { - "type": "string", - "pattern": "^[^_\\W0-9]\\w*$", - "title": "Key name", - "description": "port identifier name" - }, - "kind": { - "type": "string", - "enum": [ - "input", - "output" - ], - "title": "Kind" - }, - "content_schema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Content Schema", - "description": "jsonschema for the port's value. SEE https://json-schema.org" - } - }, - "type": "object", - "required": [ - "key", - "kind" - ], - "title": "SolverPort", - "example": { - "content_schema": { - "maximum": 5, - "minimum": 0, - "title": "Sleep interval", - "type": "integer", - "x_unit": "second" - }, - "key": "input_2", - "kind": "input" - } - }, - "Study": { - "properties": { - "uid": { - "type": "string", - "format": "uuid", - "title": "Uid" - }, - "title": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Title" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - } - }, - "type": "object", - "required": [ - "uid" - ], - "title": "Study" - }, - "StudyPort": { - "properties": { - "key": { - "type": "string", - "format": "uuid", - "title": "Key name", - "description": "port identifier name.Correponds to the UUID of the parameter/probe node in the study" - }, - "kind": { - "type": "string", - "enum": [ - "input", - "output" - ], - "title": "Kind" - }, - "content_schema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Content Schema", - "description": "jsonschema for the port's value. SEE https://json-schema.org" - } - }, - "type": "object", - "required": [ - "key", - "kind" - ], - "title": "StudyPort", - "example": { - "content_schema": { - "maximum": 5, - "minimum": 0, - "title": "Sleep interval", - "type": "integer", - "x_unit": "second" - }, - "key": "f763658f-a89a-4a90-ace4-c44631290f12", - "kind": "input" - } - }, - "UnitExtraInfo": { - "properties": { - "CPU": { - "type": "integer", - "minimum": 0, - "title": "Cpu" - }, - "RAM": { - "type": "integer", - "minimum": 0, - "title": "Ram" - }, - "VRAM": { - "type": "integer", - "minimum": 0, - "title": "Vram" - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "CPU", - "RAM", - "VRAM" - ], - "title": "UnitExtraInfo", - "description": "Custom information that is propagated to the frontend. Defined fields are mandatory." - }, - "UploadLinks": { - "properties": { - "abort_upload": { - "type": "string", - "title": "Abort Upload" - }, - "complete_upload": { - "type": "string", - "title": "Complete Upload" - } - }, - "type": "object", - "required": [ - "abort_upload", - "complete_upload" - ], - "title": "UploadLinks" - }, - "UploadedPart": { - "properties": { - "number": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Number", - "minimum": 0 - }, - "e_tag": { - "type": "string", - "title": "E Tag" - } - }, - "type": "object", - "required": [ - "number", - "e_tag" - ], - "title": "UploadedPart" - }, - "UserRoleEnum": { - "type": "string", - "enum": [ - "ANONYMOUS", - "GUEST", - "USER", - "TESTER", - "PRODUCT_OWNER", - "ADMIN" - ], - "title": "UserRoleEnum" - }, - "UsersGroup": { - "properties": { - "gid": { - "type": "string", - "title": "Gid" - }, - "label": { - "type": "string", - "title": "Label" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - } - }, - "type": "object", - "required": [ - "gid", - "label" - ], - "title": "UsersGroup" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "WalletGetWithAvailableCredits": { - "properties": { - "walletId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Walletid", - "minimum": 0 - }, - "name": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Name" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "owner": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Owner", - "minimum": 0 - }, - "thumbnail": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Thumbnail" - }, - "status": { - "$ref": "#/components/schemas/WalletStatus" - }, - "created": { - "type": "string", - "format": "date-time", - "title": "Created" - }, - "modified": { - "type": "string", - "format": "date-time", - "title": "Modified" - }, - "availableCredits": { - "type": "number", - "title": "Availablecredits" - } - }, - "type": "object", - "required": [ - "walletId", - "name", - "description", - "owner", - "thumbnail", - "status", - "created", - "modified", - "availableCredits" - ], - "title": "WalletGetWithAvailableCredits" - }, - "WalletStatus": { - "type": "string", - "enum": [ - "ACTIVE", - "INACTIVE" - ], - "title": "WalletStatus" - } - }, - "securitySchemes": { - "HTTPBasic": { - "type": "http", - "scheme": "basic" - } - } - } -} diff --git a/services/dynamic-sidecar/openapi.json b/services/dynamic-sidecar/openapi.json deleted file mode 100644 index cccb9924cdc..00000000000 --- a/services/dynamic-sidecar/openapi.json +++ /dev/null @@ -1,1514 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-dynamic-sidecar", - "description": "Implements a sidecar service to manage user's dynamic/interactive services", - "version": "1.2.0" - }, - "servers": [ - { - "url": "/", - "description": "Default server: requests directed to serving url" - }, - { - "url": "http://{host}:{port}", - "description": "Development server: can configure any base url", - "variables": { - "host": { - "default": "127.0.0.1" - }, - "port": { - "default": "8000" - } - } - } - ], - "paths": { - "/health": { - "get": { - "summary": "Health Endpoint", - "operationId": "health_endpoint_health_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplicationHealth" - } - } - } - }, - "503": { - "description": "Service is unhealthy" - } - } - } - }, - "/metrics": { - "get": { - "summary": "Metrics Endpoint", - "description": "Exposes metrics form the underlying user service.\n\nPossible responses:\n- HTTP 200 & empty body: user services did not start\n- HTTP 200 & prometheus metrics: was able to fetch data from user service\n- HTTP 500 & error message: something went wrong when fetching data from user service", - "operationId": "metrics_endpoint_metrics_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - }, - "500": { - "description": "error in recovering data from user service" - } - } - } - }, - "/v1/containers/compose-spec": { - "post": { - "tags": [ - "containers" - ], - "summary": "Store Compose Spec", - "description": "Validates and stores the docker compose spec for the user services.", - "operationId": "store_compose_spec_v1_containers_compose_spec_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ContainersComposeSpec" - } - } - }, - "required": true - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "500": { - "description": "Errors in container" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers": { - "get": { - "tags": [ - "containers" - ], - "summary": "Containers Docker Inspect", - "description": "Returns entire docker inspect data, if only_state is True,\nthe status of the containers is returned", - "operationId": "containers_docker_inspect_v1_containers_get", - "parameters": [ - { - "name": "only_status", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "description": "if True only show the status of the container", - "default": false, - "title": "Only Status" - }, - "description": "if True only show the status of the container" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "object", - "title": "Response Containers Docker Inspect V1 Containers Get" - } - } - } - }, - "500": { - "description": "Errors in container" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "post": { - "tags": [ - "containers" - ], - "summary": "Starts the containers as defined in ContainerCreate by:\n- cleaning up resources from previous runs if any\n- starting the containers\n\nProgress may be obtained through URL\nProcess may be cancelled through URL", - "operationId": "create_service_containers_task_v1_containers_post", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ContainersCreate" - } - } - } - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Create Service Containers Task V1 Containers Post" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/activity": { - "get": { - "tags": [ - "containers" - ], - "summary": "Get Containers Activity", - "operationId": "get_containers_activity_v1_containers_activity_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ActivityInfo" - }, - { - "type": "null" - } - ], - "title": "Response Get Containers Activity V1 Containers Activity Get" - } - } - } - } - } - } - }, - "/v1/containers/{id}/logs": { - "get": { - "tags": [ - "containers" - ], - "summary": "Get Container Logs", - "description": "Returns the logs of a given container if found", - "operationId": "get_container_logs_v1_containers__id__logs_get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - }, - { - "name": "since", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "title": "Timestamp", - "description": "Only return logs since this time, as a UNIX timestamp", - "default": 0 - }, - "description": "Only return logs since this time, as a UNIX timestamp" - }, - { - "name": "until", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "title": "Timestamp", - "description": "Only return logs before this time, as a UNIX timestamp", - "default": 0 - }, - "description": "Only return logs before this time, as a UNIX timestamp" - }, - { - "name": "timestamps", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "title": "Display timestamps", - "description": "Enabling this parameter will include timestamps in logs", - "default": false - }, - "description": "Enabling this parameter will include timestamps in logs" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Response Get Container Logs V1 Containers Id Logs Get" - } - } - } - }, - "404": { - "description": "Container does not exists" - }, - "500": { - "description": "Errors in container" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/name": { - "get": { - "tags": [ - "containers" - ], - "summary": "Get Containers Name", - "description": "Searches for the container's name given the network\non which the proxy communicates with it.\nSupported filters:\n network: matches against the exact network name\n assigned to the container; `will include`\n containers\n exclude: matches if contained in the name of the\n container; `will exclude` containers", - "operationId": "get_containers_name_v1_containers_name_get", - "parameters": [ - { - "name": "filters", - "in": "query", - "required": true, - "schema": { - "type": "string", - "description": "JSON encoded dictionary. FastAPI does not allow for dict as type in query parameters", - "title": "Filters" - }, - "description": "JSON encoded dictionary. FastAPI does not allow for dict as type in query parameters" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - } - ], - "title": "Response Get Containers Name V1 Containers Name Get" - } - } - } - }, - "404": { - "description": "No entrypoint container found or spec is not yet present" - }, - "422": { - "description": "Filters could not be parsed" - } - } - } - }, - "/v1/containers/{id}": { - "get": { - "tags": [ - "containers" - ], - "summary": "Inspect Container", - "description": "Returns information about the container, like docker inspect command", - "operationId": "inspect_container_v1_containers__id__get", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "object", - "title": "Response Inspect Container V1 Containers Id Get" - } - } - } - }, - "404": { - "description": "Container does not exist" - }, - "500": { - "description": "Errors in container" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/ports/io": { - "patch": { - "tags": [ - "containers" - ], - "summary": "Enable/disable ports i/o", - "operationId": "toggle_ports_io_v1_containers_ports_io_patch", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchPortsIOItem" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/ports/outputs/dirs": { - "post": { - "tags": [ - "containers" - ], - "summary": "Creates the output directories declared by the docker images's labels. It is more convenient to pass the labels from director-v2, since it already has all the machinery to call into director-v0 to retrieve them.", - "operationId": "create_output_dirs_v1_containers_ports_outputs_dirs_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateDirsRequestItem" - } - } - }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/{id}/networks:attach": { - "post": { - "tags": [ - "containers" - ], - "summary": "attach container to a network, if not already attached", - "operationId": "attach_container_to_network_v1_containers__id__networks_attach_post", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AttachContainerToNetworkItem" - } - } - } - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/{id}/networks:detach": { - "post": { - "tags": [ - "containers" - ], - "summary": "detach container from a network, if not already detached", - "operationId": "detach_container_from_network_v1_containers__id__networks_detach_post", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DetachContainerFromNetworkItem" - } - } - } - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/images:pull": { - "post": { - "tags": [ - "containers" - ], - "summary": "Pulls all the docker container images for the user services", - "operationId": "pull_user_servcices_docker_images_v1_containers_images_pull_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Pull User Servcices Docker Images V1 Containers Images Pull Post" - } - } - } - } - } - } - }, - "/v1/containers:down": { - "post": { - "tags": [ - "containers" - ], - "summary": "Remove the previously started containers", - "operationId": "runs_docker_compose_down_task_v1_containers_down_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Runs Docker Compose Down Task V1 Containers Down Post" - } - } - } - } - } - } - }, - "/v1/containers/state:restore": { - "post": { - "tags": [ - "containers" - ], - "summary": "Restores the state of the dynamic service", - "operationId": "state_restore_task_v1_containers_state_restore_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response State Restore Task V1 Containers State Restore Post" - } - } - } - } - } - } - }, - "/v1/containers/state:save": { - "post": { - "tags": [ - "containers" - ], - "summary": "Stores the state of the dynamic service", - "operationId": "state_save_task_v1_containers_state_save_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response State Save Task V1 Containers State Save Post" - } - } - } - } - } - } - }, - "/v1/containers/ports/inputs:pull": { - "post": { - "tags": [ - "containers" - ], - "summary": "Pull input ports data", - "operationId": "ports_inputs_pull_task_v1_containers_ports_inputs_pull_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Port Keys" - } - } - } - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Ports Inputs Pull Task V1 Containers Ports Inputs Pull Post" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/ports/outputs:pull": { - "post": { - "tags": [ - "containers" - ], - "summary": "Pull output ports data", - "operationId": "ports_outputs_pull_task_v1_containers_ports_outputs_pull_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Port Keys" - } - } - } - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Ports Outputs Pull Task V1 Containers Ports Outputs Pull Post" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/containers/ports/outputs:push": { - "post": { - "tags": [ - "containers" - ], - "summary": "Push output ports data", - "operationId": "ports_outputs_push_task_v1_containers_ports_outputs_push_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Ports Outputs Push Task V1 Containers Ports Outputs Push Post" - } - } - } - } - } - } - }, - "/v1/containers:restart": { - "post": { - "tags": [ - "containers" - ], - "summary": "Restarts previously started containers", - "operationId": "containers_restart_task_v1_containers_restart_post", - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Containers Restart Task V1 Containers Restart Post" - } - } - } - } - } - } - }, - "/v1/volumes/{id}": { - "put": { - "tags": [ - "volumes" - ], - "summary": "Updates the state of the volume", - "operationId": "put_volume_state_v1_volumes__id__put", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "$ref": "#/components/schemas/VolumeCategory" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PutVolumeItem" - } - } - } - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/disk/reserved:free": { - "post": { - "tags": [ - "disk" - ], - "summary": "Frees up reserved disk space", - "operationId": "free_reserved_disk_space_v1_disk_reserved_free_post", - "responses": { - "204": { - "description": "Successful Response" - } - } - } - } - }, - "components": { - "schemas": { - "ActivityInfo": { - "properties": { - "seconds_inactive": { - "type": "number", - "minimum": 0.0, - "title": "Seconds Inactive" - } - }, - "type": "object", - "required": [ - "seconds_inactive" - ], - "title": "ActivityInfo" - }, - "ApplicationHealth": { - "properties": { - "is_healthy": { - "type": "boolean", - "title": "Is Healthy", - "description": "returns True if the service sis running correctly", - "default": true - }, - "error_message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error Message", - "description": "in case of error this gets set" - } - }, - "type": "object", - "title": "ApplicationHealth" - }, - "AttachContainerToNetworkItem": { - "properties": { - "network_id": { - "type": "string", - "title": "Network Id" - }, - "network_aliases": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Network Aliases" - } - }, - "type": "object", - "required": [ - "network_id", - "network_aliases" - ], - "title": "AttachContainerToNetworkItem" - }, - "BootMode": { - "type": "string", - "enum": [ - "CPU", - "GPU", - "MPI" - ], - "title": "BootMode" - }, - "ContainersComposeSpec": { - "properties": { - "docker_compose_yaml": { - "type": "string", - "title": "Docker Compose Yaml" - } - }, - "type": "object", - "required": [ - "docker_compose_yaml" - ], - "title": "ContainersComposeSpec" - }, - "ContainersCreate": { - "properties": { - "metrics_params": { - "$ref": "#/components/schemas/CreateServiceMetricsAdditionalParams" - } - }, - "type": "object", - "required": [ - "metrics_params" - ], - "title": "ContainersCreate" - }, - "CreateDirsRequestItem": { - "properties": { - "outputs_labels": { - "additionalProperties": { - "$ref": "#/components/schemas/ServiceOutput" - }, - "type": "object", - "title": "Outputs Labels" - } - }, - "type": "object", - "required": [ - "outputs_labels" - ], - "title": "CreateDirsRequestItem" - }, - "CreateServiceMetricsAdditionalParams": { - "properties": { - "wallet_id": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Wallet Id" - }, - "wallet_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Wallet Name" - }, - "pricing_plan_id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Pricing Plan Id" - }, - "pricing_unit_id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Pricing Unit Id" - }, - "pricing_unit_cost_id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Pricing Unit Cost Id" - }, - "product_name": { - "type": "string", - "title": "Product Name" - }, - "simcore_user_agent": { - "type": "string", - "title": "Simcore User Agent" - }, - "user_email": { - "type": "string", - "title": "User Email" - }, - "project_name": { - "type": "string", - "title": "Project Name" - }, - "node_name": { - "type": "string", - "title": "Node Name" - }, - "service_key": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - }, - "service_version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - }, - "service_resources": { - "type": "object", - "title": "Service Resources" - }, - "service_additional_metadata": { - "type": "object", - "title": "Service Additional Metadata" - } - }, - "type": "object", - "required": [ - "wallet_id", - "wallet_name", - "pricing_plan_id", - "pricing_unit_id", - "pricing_unit_cost_id", - "product_name", - "simcore_user_agent", - "user_email", - "project_name", - "node_name", - "service_key", - "service_version", - "service_resources", - "service_additional_metadata" - ], - "title": "CreateServiceMetricsAdditionalParams", - "example": { - "node_name": "the service of a lifetime _ *!", - "pricing_plan_id": 1, - "pricing_unit_detail_id": 1, - "pricing_unit_id": 1, - "product_name": "osparc", - "project_name": "_!New Study", - "service_additional_metadata": {}, - "service_key": "simcore/services/dynamic/test", - "service_resources": {}, - "service_version": "0.0.1", - "simcore_user_agent": "undefined", - "user_email": "test@test.com", - "wallet_id": 1, - "wallet_name": "a private wallet for me" - } - }, - "DetachContainerFromNetworkItem": { - "properties": { - "network_id": { - "type": "string", - "title": "Network Id" - } - }, - "type": "object", - "required": [ - "network_id" - ], - "title": "DetachContainerFromNetworkItem" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "ImageResources": { - "properties": { - "image": { - "type": "string", - "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", - "title": "Image", - "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." - }, - "resources": { - "additionalProperties": { - "$ref": "#/components/schemas/ResourceValue" - }, - "type": "object", - "title": "Resources" - }, - "boot_modes": { - "items": { - "$ref": "#/components/schemas/BootMode" - }, - "type": "array", - "title": "Boot Modes", - "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", - "default": [ - "CPU" - ] - } - }, - "type": "object", - "required": [ - "image", - "resources" - ], - "title": "ImageResources", - "example": { - "image": "simcore/service/dynamic/pretty-intense:1.0.0", - "resources": { - "AIRAM": { - "limit": 1, - "reservation": 1 - }, - "ANY_resource": { - "limit": "some_value", - "reservation": "some_value" - }, - "CPU": { - "limit": 4, - "reservation": 0.1 - }, - "RAM": { - "limit": 103079215104, - "reservation": 536870912 - }, - "VRAM": { - "limit": 1, - "reservation": 1 - } - } - } - }, - "PatchPortsIOItem": { - "properties": { - "enable_outputs": { - "type": "boolean", - "title": "Enable Outputs" - }, - "enable_inputs": { - "type": "boolean", - "title": "Enable Inputs" - } - }, - "type": "object", - "required": [ - "enable_outputs", - "enable_inputs" - ], - "title": "PatchPortsIOItem" - }, - "PutVolumeItem": { - "properties": { - "status": { - "$ref": "#/components/schemas/VolumeStatus" - } - }, - "type": "object", - "required": [ - "status" - ], - "title": "PutVolumeItem" - }, - "ResourceValue": { - "properties": { - "limit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Limit" - }, - "reservation": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Reservation" - } - }, - "type": "object", - "required": [ - "limit", - "reservation" - ], - "title": "ResourceValue" - }, - "SelectBox": { - "properties": { - "structure": { - "items": { - "$ref": "#/components/schemas/Structure" - }, - "type": "array", - "minItems": 1, - "title": "Structure" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "structure" - ], - "title": "SelectBox" - }, - "ServiceOutput": { - "properties": { - "displayOrder": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Displayorder", - "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", - "deprecated": true - }, - "label": { - "type": "string", - "title": "Label", - "description": "short name for the property" - }, - "description": { - "type": "string", - "title": "Description", - "description": "description of the property" - }, - "type": { - "type": "string", - "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", - "title": "Type", - "description": "data type expected on this input glob matching for data type is allowed" - }, - "contentSchema": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Contentschema", - "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" - }, - "fileToKeyMap": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Filetokeymap", - "description": "Place the data associated with the named keys in files" - }, - "unit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Unit", - "description": "Units, when it refers to a physical quantity", - "deprecated": true - }, - "widget": { - "anyOf": [ - { - "$ref": "#/components/schemas/Widget" - }, - { - "type": "null" - } - ], - "description": "custom widget to use instead of the default one determined from the data-type", - "deprecated": true - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "label", - "description", - "type" - ], - "title": "ServiceOutput" - }, - "Structure": { - "properties": { - "key": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "boolean" - }, - { - "type": "number" - } - ], - "title": "Key" - }, - "label": { - "type": "string", - "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "key", - "label" - ], - "title": "Structure" - }, - "TextArea": { - "properties": { - "minHeight": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Minheight", - "description": "minimum Height of the textarea", - "minimum": 0 - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "minHeight" - ], - "title": "TextArea" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "VolumeCategory": { - "type": "string", - "enum": [ - "OUTPUTS", - "INPUTS", - "STATES", - "SHARED_STORE" - ], - "title": "VolumeCategory", - "description": "These uniquely identify volumes which are mounted by\nthe dynamic-sidecar and user services.\n\nThis is primarily used to keep track of the status of\neach individual volume on the volumes.\n\nThe status is ingested by the agent and processed\nwhen the volume is removed." - }, - "VolumeStatus": { - "type": "string", - "enum": [ - "CONTENT_NEEDS_TO_BE_SAVED", - "CONTENT_WAS_SAVED", - "CONTENT_NO_SAVE_REQUIRED" - ], - "title": "VolumeStatus", - "description": "Used by the agent to figure out what to do with the data\npresent on the volume." - }, - "Widget": { - "properties": { - "type": { - "$ref": "#/components/schemas/WidgetType", - "description": "type of the property" - }, - "details": { - "anyOf": [ - { - "$ref": "#/components/schemas/TextArea" - }, - { - "$ref": "#/components/schemas/SelectBox" - } - ], - "title": "Details" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "type", - "details" - ], - "title": "Widget" - }, - "WidgetType": { - "type": "string", - "enum": [ - "TextArea", - "SelectBox" - ], - "title": "WidgetType" - } - } - } -} diff --git a/services/invitations/openapi.json b/services/invitations/openapi.json deleted file mode 100644 index 6fe64f4702d..00000000000 --- a/services/invitations/openapi.json +++ /dev/null @@ -1,456 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-invitations web API", - "description": "Service that manages creation and validation of registration invitations", - "version": "1.2.0" - }, - "paths": { - "/": { - "get": { - "summary": "Healthcheck", - "operationId": "healthcheck__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/v1/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_v1_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/_Meta" - } - } - } - } - } - } - }, - "/v1/invitations": { - "post": { - "tags": [ - "invitations" - ], - "summary": "Create Invitation", - "description": "Generates a new invitation code and returns its content and an invitation link", - "operationId": "create_invitation_v1_invitations_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiInvitationInputs" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiInvitationContentAndLink" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - }, - "/v1/invitations:extract": { - "post": { - "tags": [ - "invitations" - ], - "summary": "Extracts Invitation From Code", - "description": "Decrypts the invitation code and returns its content", - "operationId": "extracts_invitation_from_code_v1_invitations_extract_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiEncryptedInvitation" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiInvitationContent" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "HTTPBasic": [] - } - ] - } - } - }, - "components": { - "schemas": { - "ApiEncryptedInvitation": { - "properties": { - "invitation_url": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Invitation Url", - "description": "Invitation link" - } - }, - "type": "object", - "required": [ - "invitation_url" - ], - "title": "ApiEncryptedInvitation" - }, - "ApiInvitationContent": { - "properties": { - "issuer": { - "type": "string", - "maxLength": 40, - "minLength": 1, - "title": "Issuer", - "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" - }, - "guest": { - "type": "string", - "format": "email", - "title": "Guest", - "description": "Invitee's email. Note that the registration can ONLY be used with this email" - }, - "trial_account_days": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Trial Account Days", - "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" - }, - "extra_credits_in_usd": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Extra Credits In Usd", - "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" - }, - "product": { - "type": "string", - "title": "Product", - "description": "This invitations can only be used for this product." - }, - "created": { - "type": "string", - "format": "date-time", - "title": "Created", - "description": "Timestamp for creation" - } - }, - "type": "object", - "required": [ - "issuer", - "guest", - "product", - "created" - ], - "title": "ApiInvitationContent", - "example": { - "created": "2023-01-11 13:11:47.293595", - "guest": "invitedguest@company.com", - "issuer": "issuerid", - "product": "osparc", - "trial_account_days": 2 - } - }, - "ApiInvitationContentAndLink": { - "properties": { - "issuer": { - "type": "string", - "maxLength": 40, - "minLength": 1, - "title": "Issuer", - "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" - }, - "guest": { - "type": "string", - "format": "email", - "title": "Guest", - "description": "Invitee's email. Note that the registration can ONLY be used with this email" - }, - "trial_account_days": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Trial Account Days", - "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" - }, - "extra_credits_in_usd": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Extra Credits In Usd", - "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" - }, - "product": { - "type": "string", - "title": "Product", - "description": "This invitations can only be used for this product." - }, - "created": { - "type": "string", - "format": "date-time", - "title": "Created", - "description": "Timestamp for creation" - }, - "invitation_url": { - "type": "string", - "title": "Invitation Url", - "description": "Invitation link" - } - }, - "type": "object", - "required": [ - "issuer", - "guest", - "product", - "created", - "invitation_url" - ], - "title": "ApiInvitationContentAndLink", - "example": { - "created": "2023-01-11 13:11:47.293595", - "guest": "invitedguest@company.com", - "invitation_url": "https://foo.com/#/registration?invitation=1234", - "issuer": "issuerid", - "product": "osparc", - "trial_account_days": 2 - } - }, - "ApiInvitationInputs": { - "properties": { - "issuer": { - "type": "string", - "maxLength": 40, - "minLength": 1, - "title": "Issuer", - "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" - }, - "guest": { - "type": "string", - "format": "email", - "title": "Guest", - "description": "Invitee's email. Note that the registration can ONLY be used with this email" - }, - "trial_account_days": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Trial Account Days", - "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" - }, - "extra_credits_in_usd": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Extra Credits In Usd", - "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" - }, - "product": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Product", - "description": "If None, it will use INVITATIONS_DEFAULT_PRODUCT" - } - }, - "type": "object", - "required": [ - "issuer", - "guest" - ], - "title": "ApiInvitationInputs", - "example": { - "guest": "invitedguest@company.com", - "issuer": "issuerid", - "trial_account_days": 2 - } - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "_Meta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "title": "Version" - }, - "docs_url": { - "type": "string", - "title": "Docs Url" - } - }, - "type": "object", - "required": [ - "name", - "version", - "docs_url" - ], - "title": "_Meta" - } - }, - "securitySchemes": { - "HTTPBasic": { - "type": "http", - "scheme": "basic" - } - } - } -} diff --git a/services/payments/gateway/openapi.json b/services/payments/gateway/openapi.json deleted file mode 100644 index 20b8c11bbbc..00000000000 --- a/services/payments/gateway/openapi.json +++ /dev/null @@ -1,1039 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "osparc-compliant payment-gateway", - "version": "0.3.0" - }, - "paths": { - "/init": { - "post": { - "tags": [ - "payment" - ], - "summary": "Init Payment", - "operationId": "init_payment", - "parameters": [ - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitPayment" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentInitiated" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/pay": { - "get": { - "tags": [ - "payment" - ], - "summary": "Get Payment Form", - "operationId": "get_payment_form", - "parameters": [ - { - "name": "id", - "in": "query", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - } - }, - "4XX": { - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/cancel": { - "post": { - "tags": [ - "payment" - ], - "summary": "Cancel Payment", - "operationId": "cancel_payment", - "parameters": [ - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentInitiated" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentCancelled" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/payment-methods:init": { - "post": { - "tags": [ - "payment-method" - ], - "summary": "Init Payment Method", - "operationId": "init_payment_method", - "parameters": [ - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitPaymentMethod" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentMethodInitiated" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/payment-methods/form": { - "get": { - "tags": [ - "payment-method" - ], - "summary": "Get Form Payment Method", - "operationId": "get_form_payment_method", - "parameters": [ - { - "name": "id", - "in": "query", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - } - }, - "4XX": { - "content": { - "text/html": { - "schema": { - "type": "string" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/payment-methods:batchGet": { - "post": { - "tags": [ - "payment-method" - ], - "summary": "Batch Get Payment Methods", - "operationId": "batch_get_payment_methods", - "parameters": [ - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BatchGetPaymentMethods" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaymentMethodsBatch" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/payment-methods/{id}": { - "get": { - "tags": [ - "payment-method" - ], - "summary": "Get Payment Method", - "operationId": "get_payment_method", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Id" - } - }, - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPaymentMethod" - } - } - } - }, - "404": { - "description": "Payment method not found: It was not added or incomplete (i.e. create flow failed or canceled)", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - }, - "delete": { - "tags": [ - "payment-method" - ], - "summary": "Delete Payment Method", - "operationId": "delete_payment_method", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Id" - } - }, - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - }, - "/payment-methods/{id}:pay": { - "post": { - "tags": [ - "payment-method" - ], - "summary": "Pay With Payment Method", - "operationId": "pay_with_payment_method", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Id" - } - }, - { - "name": "x-init-api-secret", - "in": "header", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "X-Init-Api-Secret" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitPayment" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AckPaymentWithPaymentMethod" - } - } - } - }, - "4XX": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorModel" - } - } - }, - "description": "Client Error" - } - } - } - } - }, - "components": { - "schemas": { - "AckPaymentWithPaymentMethod": { - "properties": { - "success": { - "type": "boolean", - "title": "Success" - }, - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Message" - }, - "provider_payment_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Provider Payment Id", - "description": "Payment ID from the provider (e.g. stripe payment ID)" - }, - "invoice_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Invoice Url", - "description": "Link to invoice is required when success=true" - }, - "invoice_pdf": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Invoice Pdf", - "description": "Link to invoice PDF" - }, - "stripe_invoice_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Stripe Invoice Id", - "description": "Stripe invoice ID" - }, - "stripe_customer_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Stripe Customer Id", - "description": "Stripe customer ID" - }, - "payment_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Payment Id", - "description": "Payment ID from the gateway" - } - }, - "type": "object", - "required": [ - "success" - ], - "title": "AckPaymentWithPaymentMethod", - "example": { - "invoice_url": "https://invoices.com/id=12345", - "payment_id": "D19EE68B-B007-4B61-A8BC-32B7115FB244", - "provider_payment_id": "pi_123ABC", - "success": true - } - }, - "BatchGetPaymentMethods": { - "properties": { - "payment_methods_ids": { - "items": { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - "type": "array", - "title": "Payment Methods Ids" - } - }, - "type": "object", - "required": [ - "payment_methods_ids" - ], - "title": "BatchGetPaymentMethods" - }, - "ErrorModel": { - "properties": { - "message": { - "type": "string", - "title": "Message" - }, - "exception": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Exception" - }, - "file": { - "anyOf": [ - { - "type": "string", - "format": "path" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "File" - }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Line" - }, - "trace": { - "anyOf": [ - { - "items": {}, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Trace" - } - }, - "type": "object", - "required": [ - "message" - ], - "title": "ErrorModel" - }, - "GetPaymentMethod": { - "properties": { - "id": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Id" - }, - "card_holder_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Card Holder Name" - }, - "card_number_masked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Card Number Masked" - }, - "card_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Card Type" - }, - "expiration_month": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Expiration Month" - }, - "expiration_year": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Expiration Year" - }, - "created": { - "type": "string", - "format": "date-time", - "title": "Created" - } - }, - "type": "object", - "required": [ - "id", - "created" - ], - "title": "GetPaymentMethod" - }, - "InitPayment": { - "properties": { - "amount_dollars": { - "anyOf": [ - { - "type": "number", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 1000000.0, - "minimum": 0.0 - }, - { - "type": "string" - } - ], - "title": "Amount Dollars" - }, - "credits": { - "anyOf": [ - { - "type": "number", - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maximum": 1000000.0, - "minimum": 0.0 - }, - { - "type": "string" - } - ], - "title": "Credits", - "describe": "This is equal to `quantity` field in Stripe" - }, - "user_name": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "User Name" - }, - "user_email": { - "type": "string", - "format": "email", - "title": "User Email" - }, - "user_address": { - "$ref": "#/components/schemas/UserInvoiceAddress" - }, - "wallet_name": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Wallet Name" - }, - "stripe_price_id": { - "type": "string", - "title": "Stripe Price Id" - }, - "stripe_tax_rate_id": { - "type": "string", - "title": "Stripe Tax Rate Id" - }, - "stripe_tax_exempt_value": { - "$ref": "#/components/schemas/StripeTaxExempt" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "amount_dollars", - "credits", - "user_name", - "user_email", - "user_address", - "wallet_name", - "stripe_price_id", - "stripe_tax_rate_id", - "stripe_tax_exempt_value" - ], - "title": "InitPayment" - }, - "InitPaymentMethod": { - "properties": { - "method": { - "type": "string", - "const": "CC", - "title": "Method", - "default": "CC" - }, - "user_name": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "User Name" - }, - "user_email": { - "type": "string", - "format": "email", - "title": "User Email" - }, - "wallet_name": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Wallet Name" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "user_name", - "user_email", - "wallet_name" - ], - "title": "InitPaymentMethod" - }, - "PaymentCancelled": { - "properties": { - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Message" - } - }, - "type": "object", - "title": "PaymentCancelled" - }, - "PaymentInitiated": { - "properties": { - "payment_id": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Payment Id" - } - }, - "type": "object", - "required": [ - "payment_id" - ], - "title": "PaymentInitiated" - }, - "PaymentMethodInitiated": { - "properties": { - "payment_method_id": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Payment Method Id" - } - }, - "type": "object", - "required": [ - "payment_method_id" - ], - "title": "PaymentMethodInitiated" - }, - "PaymentMethodsBatch": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/GetPaymentMethod" - }, - "type": "array", - "title": "Items" - } - }, - "type": "object", - "required": [ - "items" - ], - "title": "PaymentMethodsBatch" - }, - "StripeTaxExempt": { - "type": "string", - "enum": [ - "exempt", - "none", - "reverse" - ], - "title": "StripeTaxExempt" - }, - "UserInvoiceAddress": { - "properties": { - "line1": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Line1" - }, - "state": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "State" - }, - "postal_code": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Postal Code" - }, - "city": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "City" - }, - "country": { - "type": "string", - "title": "Country", - "description": "Currently validated in webserver via pycountry library. Two letter country code alpha_2 expected." - } - }, - "type": "object", - "required": [ - "country" - ], - "title": "UserInvoiceAddress" - } - } - } -} diff --git a/services/payments/openapi.json b/services/payments/openapi.json deleted file mode 100644 index a5f2198f99f..00000000000 --- a/services/payments/openapi.json +++ /dev/null @@ -1,564 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-payments web API", - "description": "Service that manages creation and validation of registration payments", - "version": "1.4.0" - }, - "paths": { - "/": { - "get": { - "summary": "Healthcheck", - "operationId": "healthcheck__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/v1/token": { - "post": { - "tags": [ - "auth" - ], - "summary": "Login To Create Access Token", - "operationId": "login_to_create_access_token", - "requestBody": { - "content": { - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Body_login_to_create_access_token" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Token" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_v1_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Meta" - } - } - } - } - }, - "security": [ - { - "OAuth2PasswordBearer": [] - } - ] - } - }, - "/v1/payments/{payment_id}:ack": { - "post": { - "tags": [ - "acks" - ], - "summary": "Acknowledge Payment", - "description": "completes (ie. ack) request initated by `/init` on the payments-gateway API", - "operationId": "acknowledge_payment_v1_payments__payment_id__ack_post", - "security": [ - { - "OAuth2PasswordBearer": [] - } - ], - "parameters": [ - { - "name": "payment_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Payment Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AckPayment" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/payments-methods/{payment_method_id}:ack": { - "post": { - "tags": [ - "acks" - ], - "summary": "Acknowledge Payment Method", - "description": "completes (ie. ack) request initated by `/payments-methods:init` on the payments-gateway API", - "operationId": "acknowledge_payment_method_v1_payments_methods__payment_method_id__ack_post", - "security": [ - { - "OAuth2PasswordBearer": [] - } - ], - "parameters": [ - { - "name": "payment_method_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "minLength": 1, - "maxLength": 100, - "title": "Payment Method Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AckPaymentMethod" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "AckPayment": { - "properties": { - "success": { - "type": "boolean", - "title": "Success" - }, - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Message" - }, - "provider_payment_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Provider Payment Id", - "description": "Payment ID from the provider (e.g. stripe payment ID)" - }, - "invoice_url": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Invoice Url", - "description": "Link to invoice is required when success=true" - }, - "invoice_pdf": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Invoice Pdf", - "description": "Link to invoice PDF" - }, - "stripe_invoice_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Stripe Invoice Id", - "description": "Stripe invoice ID" - }, - "stripe_customer_id": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Stripe Customer Id", - "description": "Stripe customer ID" - }, - "saved": { - "anyOf": [ - { - "$ref": "#/components/schemas/SavedPaymentMethod" - }, - { - "type": "null" - } - ], - "description": "Gets the payment-method if user opted to save it during payment.If used did not opt to save of payment-method was already saved, then it defaults to None" - } - }, - "type": "object", - "required": [ - "success" - ], - "title": "AckPayment", - "example": { - "invoice_url": "https://invoices.com/id=12345", - "provider_payment_id": "pi_123ABC", - "saved": { - "payment_method_id": "3FA85F64-5717-4562-B3FC-2C963F66AFA6", - "success": true - }, - "success": true - } - }, - "AckPaymentMethod": { - "properties": { - "success": { - "type": "boolean", - "title": "Success" - }, - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Message" - } - }, - "type": "object", - "required": [ - "success" - ], - "title": "AckPaymentMethod" - }, - "Body_login_to_create_access_token": { - "properties": { - "grant_type": { - "anyOf": [ - { - "type": "string", - "pattern": "password" - }, - { - "type": "null" - } - ], - "title": "Grant Type" - }, - "username": { - "type": "string", - "title": "Username" - }, - "password": { - "type": "string", - "title": "Password" - }, - "scope": { - "type": "string", - "title": "Scope", - "default": "" - }, - "client_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Client Id" - }, - "client_secret": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Client Secret" - } - }, - "type": "object", - "required": [ - "username", - "password" - ], - "title": "Body_login_to_create_access_token" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "Meta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "released": { - "anyOf": [ - { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Released", - "description": "Maps every route's path tag with a released version" - }, - "docs_url": { - "type": "string", - "title": "Docs Url" - } - }, - "type": "object", - "required": [ - "name", - "version", - "docs_url" - ], - "title": "Meta", - "example": { - "docs_url": "https://foo.io/doc", - "name": "simcore_service_payments", - "version": "2.4.45" - } - }, - "SavedPaymentMethod": { - "properties": { - "success": { - "type": "boolean", - "title": "Success" - }, - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Message" - }, - "payment_method_id": { - "type": "string", - "maxLength": 100, - "minLength": 1, - "title": "Payment Method Id" - } - }, - "type": "object", - "required": [ - "success", - "payment_method_id" - ], - "title": "SavedPaymentMethod" - }, - "Token": { - "properties": { - "access_token": { - "type": "string", - "title": "Access Token" - }, - "token_type": { - "type": "string", - "const": "bearer", - "title": "Token Type" - } - }, - "type": "object", - "required": [ - "access_token", - "token_type" - ], - "title": "Token" - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - } - }, - "securitySchemes": { - "OAuth2PasswordBearer": { - "type": "oauth2", - "flows": { - "password": { - "scopes": {}, - "tokenUrl": "/v1/token" - } - } - } - } - } -} diff --git a/services/resource-usage-tracker/openapi.json b/services/resource-usage-tracker/openapi.json deleted file mode 100644 index 6aa53c7118c..00000000000 --- a/services/resource-usage-tracker/openapi.json +++ /dev/null @@ -1,600 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "simcore-service-resource-usage-tracker web API", - "description": "Service that collects and stores computational resources usage used in osparc-simcore", - "version": "1.0.0" - }, - "paths": { - "/": { - "get": { - "summary": "Healthcheck", - "operationId": "healthcheck__get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - } - } - } - } - }, - "/v1/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata_v1_meta_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/_Meta" - } - } - } - } - } - } - }, - "/v1/credit-transactions/credits:sum": { - "post": { - "tags": [ - "credit-transactions" - ], - "summary": "Sum total available credits in the wallet", - "operationId": "get_credit_transactions_sum_v1_credit_transactions_credits_sum_post", - "parameters": [ - { - "name": "product_name", - "in": "query", - "required": true, - "schema": { - "type": "string", - "title": "Product Name" - } - }, - { - "name": "wallet_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Wallet Id", - "minimum": 0 - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WalletTotalCredits" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/credit-transactions": { - "post": { - "tags": [ - "credit-transactions" - ], - "summary": "Top up credits for specific wallet", - "operationId": "create_credit_transaction_v1_credit_transactions_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreditTransactionCreateBody" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreditTransactionCreated" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/services/{service_key}/{service_version}/pricing-plan": { - "get": { - "tags": [ - "pricing-plans" - ], - "summary": "Get Service Default Pricing Plan", - "description": "Returns a default pricing plan with pricing details for a specified service", - "operationId": "get_service_default_pricing_plan", - "parameters": [ - { - "name": "service_key", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", - "title": "Service Key" - } - }, - { - "name": "service_version", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Service Version" - } - }, - { - "name": "product_name", - "in": "query", - "required": true, - "schema": { - "type": "string", - "title": "Product Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PricingPlanGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}": { - "get": { - "tags": [ - "pricing-plans" - ], - "summary": "Get Pricing Plan Unit", - "description": "Returns a list of service pricing plans with pricing details for a specified service", - "operationId": "list_service_pricing_plans", - "parameters": [ - { - "name": "pricing_plan_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Plan Id", - "minimum": 0 - } - }, - { - "name": "pricing_unit_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Unit Id", - "minimum": 0 - } - }, - { - "name": "product_name", - "in": "query", - "required": true, - "schema": { - "type": "string", - "title": "Product Name" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PricingUnitGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "CreditTransactionCreateBody": { - "properties": { - "product_name": { - "type": "string", - "title": "Product Name" - }, - "wallet_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Wallet Id", - "minimum": 0 - }, - "wallet_name": { - "type": "string", - "title": "Wallet Name" - }, - "user_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - }, - "user_email": { - "type": "string", - "title": "User Email" - }, - "osparc_credits": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Osparc Credits" - }, - "payment_transaction_id": { - "type": "string", - "title": "Payment Transaction Id" - }, - "created_at": { - "type": "string", - "format": "date-time", - "title": "Created At" - } - }, - "type": "object", - "required": [ - "product_name", - "wallet_id", - "wallet_name", - "user_id", - "user_email", - "osparc_credits", - "payment_transaction_id", - "created_at" - ], - "title": "CreditTransactionCreateBody" - }, - "CreditTransactionCreated": { - "properties": { - "credit_transaction_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Credit Transaction Id", - "minimum": 0 - } - }, - "type": "object", - "required": [ - "credit_transaction_id" - ], - "title": "CreditTransactionCreated", - "description": "Response Create Credit Transaction V1 Credit Transactions Post" - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "HardwareInfo": { - "properties": { - "aws_ec2_instances": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Aws Ec2 Instances" - } - }, - "type": "object", - "required": [ - "aws_ec2_instances" - ], - "title": "HardwareInfo" - }, - "PricingPlanClassification": { - "type": "string", - "enum": [ - "TIER" - ], - "const": "TIER", - "title": "PricingPlanClassification" - }, - "PricingPlanGet": { - "properties": { - "pricing_plan_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Plan Id", - "minimum": 0 - }, - "display_name": { - "type": "string", - "title": "Display Name" - }, - "description": { - "type": "string", - "title": "Description" - }, - "classification": { - "$ref": "#/components/schemas/PricingPlanClassification" - }, - "created_at": { - "type": "string", - "format": "date-time", - "title": "Created At" - }, - "pricing_plan_key": { - "type": "string", - "title": "Pricing Plan Key" - }, - "pricing_units": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/PricingUnitGet" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Pricing Units" - }, - "is_active": { - "type": "boolean", - "title": "Is Active" - } - }, - "type": "object", - "required": [ - "pricing_plan_id", - "display_name", - "description", - "classification", - "created_at", - "pricing_plan_key", - "pricing_units", - "is_active" - ], - "title": "PricingPlanGet" - }, - "PricingUnitGet": { - "properties": { - "pricing_unit_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricing Unit Id", - "minimum": 0 - }, - "unit_name": { - "type": "string", - "title": "Unit Name" - }, - "unit_extra_info": { - "$ref": "#/components/schemas/UnitExtraInfo" - }, - "current_cost_per_unit": { - "type": "number", - "title": "Current Cost Per Unit" - }, - "current_cost_per_unit_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Current Cost Per Unit Id", - "minimum": 0 - }, - "default": { - "type": "boolean", - "title": "Default" - }, - "specific_info": { - "$ref": "#/components/schemas/HardwareInfo" - } - }, - "type": "object", - "required": [ - "pricing_unit_id", - "unit_name", - "unit_extra_info", - "current_cost_per_unit", - "current_cost_per_unit_id", - "default", - "specific_info" - ], - "title": "PricingUnitGet" - }, - "UnitExtraInfo": { - "properties": { - "CPU": { - "type": "integer", - "minimum": 0, - "title": "Cpu" - }, - "RAM": { - "type": "integer", - "minimum": 0, - "title": "Ram" - }, - "VRAM": { - "type": "integer", - "minimum": 0, - "title": "Vram" - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "CPU", - "RAM", - "VRAM" - ], - "title": "UnitExtraInfo", - "description": "Custom information that is propagated to the frontend. Defined fields are mandatory." - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "WalletTotalCredits": { - "properties": { - "wallet_id": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Wallet Id", - "minimum": 0 - }, - "available_osparc_credits": { - "type": "number", - "title": "Available Osparc Credits" - } - }, - "type": "object", - "required": [ - "wallet_id", - "available_osparc_credits" - ], - "title": "WalletTotalCredits" - }, - "_Meta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "title": "Version" - }, - "docs_url": { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", - "title": "Docs Url" - } - }, - "type": "object", - "required": [ - "name", - "version", - "docs_url" - ], - "title": "_Meta" - } - } - } -} From 5c37a1923f9a754168d4f2b36cae895179ba3848 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:49:16 +0100 Subject: [PATCH 13/79] bugfix in webserver --- api/specs/web-server/openapi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/specs/web-server/openapi.py b/api/specs/web-server/openapi.py index c205153e506..cba6137953d 100644 --- a/api/specs/web-server/openapi.py +++ b/api/specs/web-server/openapi.py @@ -98,6 +98,8 @@ def main(): # .yaml oas_path = webserver_resources.get_path("api/v0/openapi.yaml").resolve() + if not oas_path.exists(): + oas_path.write_text("") print(f"Writing {oas_path}...", end=None) with oas_path.open("wt") as fh: yaml.safe_dump(openapi, stream=fh, sort_keys=False) From 81c5e9ff0e95ecd52037171e183500b66dcfb4d1 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:51:38 +0100 Subject: [PATCH 14/79] remove openapi.yaml files --- api/specs/director/openapi.yaml | 492 --- .../api/v0/openapi.yaml | 2851 ----------------- .../api/v0/openapi.yaml | 1596 --------- 3 files changed, 4939 deletions(-) delete mode 100644 api/specs/director/openapi.yaml delete mode 100644 services/director/src/simcore_service_director/api/v0/openapi.yaml delete mode 100644 services/storage/src/simcore_service_storage/api/v0/openapi.yaml diff --git a/api/specs/director/openapi.yaml b/api/specs/director/openapi.yaml deleted file mode 100644 index fe95950536e..00000000000 --- a/api/specs/director/openapi.yaml +++ /dev/null @@ -1,492 +0,0 @@ -openapi: "3.0.0" -info: - description: This is the oSparc's director API - version: 0.1.0 - title: Director API - contact: - name: IT'IS Foundation - email: support@simcore.com - license: - name: MIT - url: https://github.com/ITISFoundation/osparc-simcore/blob/master/LICENSE - -servers: - - description: Development server - url: http://{host}:{port}/{version} - variables: - host: - default: "localhost" - port: - default: "8080" - version: - default: "v0" - enum: - - "v0" - - description: Production server - url: http://director:{port}/{version} - variables: - port: - default: "8080" - version: - default: "v0" - enum: - - "v0" - -# tags are used for organizing operations -tags: - - name: admins - description: Secured Admin-only calls - - name: developers - description: Operations available to regular developers - - name: users - description: Operations available to regular users - -paths: - /: - get: - tags: - - users - summary: Service health-check endpoint - description: Some general information on the API and state of the service behind - operationId: root_get - responses: - "200": - description: Service information - content: - application/json: - schema: - $ref: "#/components/schemas/HealthCheckEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /services: - get: - tags: - - users - summary: Lists available services in the oSparc platform - description: Lists available services in the oSparc platform - operationId: services_get - parameters: - - $ref: "#/components/parameters/ServiceType" - responses: - "200": - description: Success, returns the list of available services - content: - application/json: - schema: - $ref: "#/components/schemas/ServicesEnveloped" - "401": - description: Unauthorized access - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /services/{service_key}/{service_version}: - get: - tags: - - users - summary: Returns details of the selected service if available in the oSparc platform - description: Returns details of the selected service if available in the oSparc platform - operationId: services_by_key_version_get - parameters: - - $ref: "#/components/parameters/ServiceKeyPath" - - $ref: "#/components/parameters/ServiceVersionPath" - responses: - "200": - description: Success, returns the details of the service - content: - application/json: - schema: - $ref: "#/components/schemas/ServicesEnveloped" - "401": - description: Unauthorized access - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /services/{service_key}/{service_version}/labels: - get: - tags: - - users - summary: Returns the list of tags attached to a service - operationId: get_service_labels - parameters: - - $ref: "#/components/parameters/ServiceKeyPath" - - $ref: "#/components/parameters/ServiceVersionPath" - responses: - "200": - description: Success, returns the details of the service - content: - application/json: - schema: - type: object - additionalProperties: - type: string - "401": - description: Unauthorized access - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /service_extras/{service_key}/{service_version}: - get: - tags: - - users - summary: Returns the service's details which should be hidden from the user defined as extras. - description: Currently returns the node_requirements an array of resoruces needed for scheduling. - operationId: service_extras_by_key_version_get - parameters: - - $ref: "#/components/parameters/ServiceKeyPath" - - $ref: "#/components/parameters/ServiceVersionPath" - responses: - "200": - description: Success, returns an object containing details hidden from the user - content: - application/json: - schema: - $ref: "#/components/schemas/ServiceExtrasEnveloped" - "401": - description: Unauthorized access - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /running_interactive_services: - get: - tags: - - users - summary: Returns a list of interactive services - operationId: running_interactive_services_list_get - parameters: - - in: query - name: user_id - required: false - schema: - type: string - - in: query - name: project_id - required: false - schema: - type: string - responses: - "200": - description: Returns the running services instances - content: - application/json: - schema: - $ref: "#/components/schemas/RunningServicesEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - post: - tags: - - users - summary: Starts an interactive service in the oSparc platform - operationId: running_interactive_services_post - parameters: - - $ref: "#/components/parameters/UserId" - - $ref: "#/components/parameters/ProjectId" - - $ref: "#/components/parameters/ServiceKey" - - $ref: "#/components/parameters/ServiceVersion" - - $ref: "#/components/parameters/AssignmentUuid" - - $ref: "#/components/parameters/ServiceBasePath" - responses: - "201": - description: Succesfully created the service in the oSparc platform. Returns the location where the service runs. - content: - application/json: - schema: - $ref: "#/components/schemas/RunningServiceEnveloped" - "400": - description: Malformed function call, missing field - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "401": - description: Unauthorized access - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "409": - description: A service with the same uuid already exists - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - - /running_interactive_services/{service_uuid}: - get: - tags: - - users - summary: Succesfully returns if a service with the defined uuid is up and running - description: Succesfully returns if a service with the defined uuid is up and running - operationId: running_interactive_services_get - parameters: - - $ref: "#/components/parameters/ServiceUuid" - responses: - "200": - description: OK service exists and runs. Returns service location. - content: - application/json: - schema: - $ref: "#/components/schemas/RunningServiceEnveloped" - "400": - description: Malformed function call, missing field - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - delete: - tags: - - users - summary: Stops and removes an interactive service from the oSparc platform - description: Stops and removes an interactive service from the oSparc platform - operationId: running_interactive_services_delete - parameters: - - $ref: "#/components/parameters/ServiceUuid" - - $ref: "#/components/parameters/SaveState" - responses: - "204": - description: Succesfully stopped and removed the service from the oSparc platform - "400": - description: Malformed function call, missing field - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - "404": - description: Service not found - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - default: - description: Unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorEnveloped" - -components: - parameters: - UserId: - in: query - name: user_id - description: The ID of the user that starts the service - required: true - schema: - type: string - example: asdfgj233 - ProjectId: - in: query - name: project_id - description: The ID of the project in which the service starts - required: true - schema: - type: string - example: asdfgj233 - AssignmentUuid: - in: query - name: service_uuid - description: The uuid to assign the service with - required: true - schema: - type: string - # format: uuid - example: 123e4567-e89b-12d3-a456-426655440000 - - ServiceKeyPath: - in: path - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - ServiceKey: - in: query - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - ServiceType: - in: query - name: service_type - description: | - The service type: - * computational - a computational service - * interactive - an interactive service - required: false - schema: - type: string - enum: - - computational - - interactive - example: computational - - ServiceBasePath: - in: query - name: service_basepath - description: predefined basepath for the backend service otherwise uses root - required: false - schema: - type: string - example: "/x/EycCXbU0H/" - default: "" - - ServiceUuid: - in: path - name: service_uuid - description: The uuid of the service - required: true - schema: - type: string - # format: uuid - example: 123e4567-e89b-12d3-a456-426655440000 - - ServiceVersionPath: - in: path - name: service_version - description: The tag/version of the service - required: true - schema: - type: string - description: semantic version number - pattern: >- - ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - example: - - 1.0.0 - - 0.0.1 - - ServiceVersion: - in: query - name: service_tag - description: The tag/version of the service - required: false - schema: - type: string - description: semantic version number - pattern: >- - ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ - example: - - 1.0.0 - - 0.0.1 - - SaveState: - in: query - name: save_state - description: Save the state prior to removing the service - required: false - schema: - type: boolean - default: true - - schemas: - ErrorEnveloped: - $ref: "./schemas/error.yaml#/components/schemas/ErrorEnveloped" - - RunningServiceEnveloped: - $ref: "./schemas/running_service.yaml#/components/schemas/RunningServiceEnveloped" - - RunningServicesEnveloped: - $ref: "./schemas/running_service.yaml#/components/schemas/RunningServicesEnveloped" - - ServicesEnveloped: - $ref: "./schemas/services.yaml#/components/schemas/ServicesEnveloped" - - ServiceExtrasEnveloped: - $ref: "./schemas/services.yaml#/components/schemas/ServiceExtrasEnveloped" - - HealthCheckEnveloped: - $ref: "./schemas/health_check.yaml#/components/schemas/HealthCheckEnveloped" diff --git a/services/director/src/simcore_service_director/api/v0/openapi.yaml b/services/director/src/simcore_service_director/api/v0/openapi.yaml deleted file mode 100644 index daf98532f4d..00000000000 --- a/services/director/src/simcore_service_director/api/v0/openapi.yaml +++ /dev/null @@ -1,2851 +0,0 @@ -openapi: 3.0.0 -info: - description: This is the oSparc's director API - version: 0.1.0 - title: Director API - contact: - name: IT'IS Foundation - email: support@simcore.com - license: - name: MIT - url: 'https://github.com/ITISFoundation/osparc-simcore/blob/master/LICENSE' -servers: - - description: Development server - url: 'http://{host}:{port}/{version}' - variables: - host: - default: localhost - port: - default: '8080' - version: - default: v0 - enum: - - v0 - - description: Production server - url: 'http://director:{port}/{version}' - variables: - port: - default: '8080' - version: - default: v0 - enum: - - v0 -tags: - - name: admins - description: Secured Admin-only calls - - name: developers - description: Operations available to regular developers - - name: users - description: Operations available to regular users -paths: - /: - get: - tags: - - users - summary: Service health-check endpoint - description: Some general information on the API and state of the service behind - operationId: root_get - responses: - '200': - description: Service information - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: object - properties: - name: - type: string - example: director service - status: - type: string - example: SERVICE_RUNNING - api_version: - type: string - example: 1.0.0-dev - version: - type: string - example: 1dfcfdc - error: - nullable: true - default: null - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - /services: - get: - tags: - - users - summary: Lists available services in the oSparc platform - description: Lists available services in the oSparc platform - operationId: services_get - parameters: - - in: query - name: service_type - description: | - The service type: - * computational - a computational service - * interactive - an interactive service - required: false - schema: - type: string - enum: - - computational - - interactive - example: computational - responses: - '200': - description: 'Success, returns the list of available services' - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: array - items: - title: simcore node - description: Description of a simcore node 'class' with input and output - type: object - additionalProperties: false - required: - - key - - version - - type - - name - - description - - authors - - contact - - inputs - - outputs - properties: - key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' - example: simcore/services/comp/itis/sleeper - integration-version: - type: string - description: integration version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - version: - type: string - description: service version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - type: - type: string - description: service type - enum: - - frontend - - computational - - dynamic - example: computational - name: - type: string - description: 'short, human readable name for the node' - example: Fast Counter - thumbnail: - type: string - description: url to the thumbnail - example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' - badges: - type: array - items: - type: object - required: - - name - - image - - url - additionalProperties: false - properties: - name: - type: string - description: Name of the subject - example: travis-ci - image: - type: string - description: Url to the shield - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' - url: - type: string - description: Link to status - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' - description: - type: string - description: human readable description of the purpose of the node - example: Our best node type - authors: - type: array - minItems: 1 - items: - type: object - required: - - name - - email - additionalProperties: false - properties: - name: - type: string - description: Name of the author - example: Sun Bak - email: - description: Email address - type: string - format: email - example: sun@sense.eight - affiliation: - description: Affiliation of the author - type: string - example: Sense8 - contact: - type: string - format: email - description: email to correspond to the authors about the node - example: lab@net.flix - inputs: - type: object - description: definition of the inputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the input configurable for this service - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' - deprecated: true - type: number - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' - description: data type expected on this input glob matching for data type is allowed - example: - - number - - boolean - - 'data:*/*' - - 'data:text/*' - - 'data:[image/jpeg,image/png]' - - 'data:application/json' - - 'data:application/json;schema=https://my-schema/not/really/schema.json' - - 'data:application/vnd.ms-excel' - - 'data:text/plain' - - 'data:application/hdf5' - - 'data:application/edu.ucdavis@ceclancy.xyz' - contentSchema: - title: Content Schema - description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data associated with the named keys in files - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - defaultValue: - description: initial value for this input - type: - - string - - number - - integer - - boolean - example: - - Dog - - true - unit: - title: Unit - description: 'Units of this input value, if a physical quantity' - type: string - widget: - description: custom widget to use instead of the default one determined from the data-type - anyOf: - - type: object - additionalProperties: false - required: - - type - properties: - type: - description: type of the property - type: string - enum: - - TextArea - minHeight: - description: minimum Height of the textarea - type: integer - minimum: 1 - - type: object - additionalProperties: false - required: - - type - - structure - properties: - type: - description: type of the property - type: string - enum: - - SelectBox - structure: - type: array - minItems: 1 - items: - type: object - additionalProperties: false - required: - - key - - label - properties: - key: - type: - - string - - boolean - - number - label: - type: string - example: - - - key: rat - label: The Rat - - key: dog - label: Bello the Dog - additionalProperties: true - outputs: - type: object - description: definition of the outputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the output produced by this node - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - type: number - description: use this to numerically sort the properties for display - example: - - 1 - - -0.2 - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' - description: data type expected on this output - example: - - number - - integer - - boolean - - string - - 'data:application/json' - - 'data:application/vnd.ms-excel ' - - 'data:text/plain' - - 'data:application/hdf5' - contentSchema: - title: Content Schema - description: jsonschema of this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - unit: - title: Unit - description: 'Units of the output value, if a physical quantity' - type: string - additionalProperties: true - boot-options: - title: Boot Options - description: Service defined boot options. These get injected in the service as env variables. - type: object - x-patternProperties: - '^[_a-zA-Z0-9]+$': - title: BootOptionMode - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - default: - title: Default - type: string - items: - title: Items - type: object - additionalProperties: - title: BootOptionItem - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - required: - - label - - description - required: - - label - - description - - default - - items - additionalProperties: true - image_digest: - title: Image Manifest digest - description: Provides a unique footprint (hash) of the image manifest - type: string - example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 - error: - nullable: true - default: null - '401': - description: Unauthorized access - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '/services/{service_key}/{service_version}': - get: - tags: - - users - summary: Returns details of the selected service if available in the oSparc platform - description: Returns details of the selected service if available in the oSparc platform - operationId: services_by_key_version_get - parameters: - - in: path - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - in: path - name: service_version - description: The tag/version of the service - required: true - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - responses: - '200': - description: 'Success, returns the details of the service' - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: array - items: - title: simcore node - description: Description of a simcore node 'class' with input and output - type: object - additionalProperties: false - required: - - key - - version - - type - - name - - description - - authors - - contact - - inputs - - outputs - properties: - key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' - example: simcore/services/comp/itis/sleeper - integration-version: - type: string - description: integration version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - version: - type: string - description: service version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - type: - type: string - description: service type - enum: - - frontend - - computational - - dynamic - example: computational - name: - type: string - description: 'short, human readable name for the node' - example: Fast Counter - thumbnail: - type: string - description: url to the thumbnail - example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' - badges: - type: array - items: - type: object - required: - - name - - image - - url - additionalProperties: false - properties: - name: - type: string - description: Name of the subject - example: travis-ci - image: - type: string - description: Url to the shield - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' - url: - type: string - description: Link to status - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' - description: - type: string - description: human readable description of the purpose of the node - example: Our best node type - authors: - type: array - minItems: 1 - items: - type: object - required: - - name - - email - additionalProperties: false - properties: - name: - type: string - description: Name of the author - example: Sun Bak - email: - description: Email address - type: string - format: email - example: sun@sense.eight - affiliation: - description: Affiliation of the author - type: string - example: Sense8 - contact: - type: string - format: email - description: email to correspond to the authors about the node - example: lab@net.flix - inputs: - type: object - description: definition of the inputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the input configurable for this service - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' - deprecated: true - type: number - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' - description: data type expected on this input glob matching for data type is allowed - example: - - number - - boolean - - 'data:*/*' - - 'data:text/*' - - 'data:[image/jpeg,image/png]' - - 'data:application/json' - - 'data:application/json;schema=https://my-schema/not/really/schema.json' - - 'data:application/vnd.ms-excel' - - 'data:text/plain' - - 'data:application/hdf5' - - 'data:application/edu.ucdavis@ceclancy.xyz' - contentSchema: - title: Content Schema - description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data associated with the named keys in files - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - defaultValue: - description: initial value for this input - type: - - string - - number - - integer - - boolean - example: - - Dog - - true - unit: - title: Unit - description: 'Units of this input value, if a physical quantity' - type: string - widget: - description: custom widget to use instead of the default one determined from the data-type - anyOf: - - type: object - additionalProperties: false - required: - - type - properties: - type: - description: type of the property - type: string - enum: - - TextArea - minHeight: - description: minimum Height of the textarea - type: integer - minimum: 1 - - type: object - additionalProperties: false - required: - - type - - structure - properties: - type: - description: type of the property - type: string - enum: - - SelectBox - structure: - type: array - minItems: 1 - items: - type: object - additionalProperties: false - required: - - key - - label - properties: - key: - type: - - string - - boolean - - number - label: - type: string - example: - - - key: rat - label: The Rat - - key: dog - label: Bello the Dog - additionalProperties: true - outputs: - type: object - description: definition of the outputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the output produced by this node - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - type: number - description: use this to numerically sort the properties for display - example: - - 1 - - -0.2 - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' - description: data type expected on this output - example: - - number - - integer - - boolean - - string - - 'data:application/json' - - 'data:application/vnd.ms-excel ' - - 'data:text/plain' - - 'data:application/hdf5' - contentSchema: - title: Content Schema - description: jsonschema of this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - unit: - title: Unit - description: 'Units of the output value, if a physical quantity' - type: string - additionalProperties: true - boot-options: - title: Boot Options - description: Service defined boot options. These get injected in the service as env variables. - type: object - x-patternProperties: - '^[_a-zA-Z0-9]+$': - title: BootOptionMode - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - default: - title: Default - type: string - items: - title: Items - type: object - additionalProperties: - title: BootOptionItem - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - required: - - label - - description - required: - - label - - description - - default - - items - additionalProperties: true - image_digest: - title: Image Manifest digest - description: Provides a unique footprint (hash) of the image manifest - type: string - example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 - error: - nullable: true - default: null - '401': - description: Unauthorized access - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '/services/{service_key}/{service_version}/labels': - get: - tags: - - users - summary: Returns the list of tags attached to a service - operationId: get_service_labels - parameters: - - in: path - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - in: path - name: service_version - description: The tag/version of the service - required: true - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - responses: - '200': - description: 'Success, returns the details of the service' - content: - application/json: - schema: - type: object - additionalProperties: - type: string - '401': - description: Unauthorized access - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '/service_extras/{service_key}/{service_version}': - get: - tags: - - users - summary: Returns the service's details which should be hidden from the user defined as extras. - description: Currently returns the node_requirements an array of resoruces needed for scheduling. - operationId: service_extras_by_key_version_get - parameters: - - in: path - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - in: path - name: service_version - description: The tag/version of the service - required: true - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - responses: - '200': - description: 'Success, returns an object containing details hidden from the user' - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: object - required: - - node_requirements - properties: - node_requirements: - type: object - required: - - CPU - - RAM - properties: - CPU: - type: number - default: 1 - minimum: 1 - GPU: - type: integer - minimum: 0 - RAM: - type: integer - format: int64 - minimum: 1024 - MPI: - type: integer - maximum: 1 - service_build_details: - type: object - properties: - build_date: - type: string - vcs_ref: - type: string - vcs_url: - type: string - container_spec: - type: object - properties: - command: - type: array - items: - type: string - error: - nullable: true - default: null - '401': - description: Unauthorized access - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - /running_interactive_services: - get: - tags: - - users - summary: Returns a list of interactive services - operationId: running_interactive_services_list_get - parameters: - - in: query - name: user_id - required: false - schema: - type: string - - in: query - name: project_id - required: false - schema: - type: string - responses: - '200': - description: Returns the running services instances - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: array - items: - type: object - required: - - published_port - - service_uuid - - service_key - - service_version - - service_host - - service_port - - service_state - - user_id - properties: - published_port: - description: The ports where the service provides its interface - type: integer - format: int32 - minimum: 1 - example: 30000 - entry_point: - description: The entry point where the service provides its interface if specified - type: string - example: /the/entry/point/is/here - service_uuid: - description: The UUID attached to this service - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - service_key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - service_version: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - service_host: - description: service host name within the network - type: string - example: jupyter_E1O2E-LAH - service_port: - description: port to access the service within the network - type: integer - minimum: 1 - example: 8081 - service_basepath: - description: different base path where current service is mounted otherwise defaults to root - type: string - example: /x/E1O2E-LAH - default: '' - service_state: - description: | - the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start - type: string - enum: - - pending - - pulling - - starting - - running - - complete - - failed - service_message: - description: the service message - type: string - example: no suitable node (insufficient resources on 1 node) - user_id: - description: the user that started the service - type: string - example: '123' - error: - nullable: true - default: null - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - post: - tags: - - users - summary: Starts an interactive service in the oSparc platform - operationId: running_interactive_services_post - parameters: - - in: query - name: user_id - description: The ID of the user that starts the service - required: true - schema: - type: string - example: asdfgj233 - - in: query - name: project_id - description: The ID of the project in which the service starts - required: true - schema: - type: string - example: asdfgj233 - - in: query - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - - in: query - name: service_tag - description: The tag/version of the service - required: false - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - - in: query - name: service_uuid - description: The uuid to assign the service with - required: true - schema: - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - - in: query - name: service_basepath - description: predefined basepath for the backend service otherwise uses root - required: false - schema: - type: string - example: /x/EycCXbU0H/ - default: '' - responses: - '201': - description: Succesfully created the service in the oSparc platform. Returns the location where the service runs. - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: object - required: - - published_port - - service_uuid - - service_key - - service_version - - service_host - - service_port - - service_state - - user_id - properties: - published_port: - description: The ports where the service provides its interface - type: integer - format: int32 - minimum: 1 - example: 30000 - entry_point: - description: The entry point where the service provides its interface if specified - type: string - example: /the/entry/point/is/here - service_uuid: - description: The UUID attached to this service - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - service_key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - service_version: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - service_host: - description: service host name within the network - type: string - example: jupyter_E1O2E-LAH - service_port: - description: port to access the service within the network - type: integer - minimum: 1 - example: 8081 - service_basepath: - description: different base path where current service is mounted otherwise defaults to root - type: string - example: /x/E1O2E-LAH - default: '' - service_state: - description: | - the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start - type: string - enum: - - pending - - pulling - - starting - - running - - complete - - failed - service_message: - description: the service message - type: string - example: no suitable node (insufficient resources on 1 node) - user_id: - description: the user that started the service - type: string - example: '123' - error: - nullable: true - default: null - '400': - description: 'Malformed function call, missing field' - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '401': - description: Unauthorized access - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '409': - description: A service with the same uuid already exists - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '/running_interactive_services/{service_uuid}': - get: - tags: - - users - summary: Succesfully returns if a service with the defined uuid is up and running - description: Succesfully returns if a service with the defined uuid is up and running - operationId: running_interactive_services_get - parameters: - - in: path - name: service_uuid - description: The uuid of the service - required: true - schema: - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - responses: - '200': - description: OK service exists and runs. Returns service location. - content: - application/json: - schema: - type: object - required: - - data - properties: - data: - type: object - required: - - published_port - - service_uuid - - service_key - - service_version - - service_host - - service_port - - service_state - - user_id - properties: - published_port: - description: The ports where the service provides its interface - type: integer - format: int32 - minimum: 1 - example: 30000 - entry_point: - description: The entry point where the service provides its interface if specified - type: string - example: /the/entry/point/is/here - service_uuid: - description: The UUID attached to this service - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - service_key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - service_version: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - service_host: - description: service host name within the network - type: string - example: jupyter_E1O2E-LAH - service_port: - description: port to access the service within the network - type: integer - minimum: 1 - example: 8081 - service_basepath: - description: different base path where current service is mounted otherwise defaults to root - type: string - example: /x/E1O2E-LAH - default: '' - service_state: - description: | - the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start - type: string - enum: - - pending - - pulling - - starting - - running - - complete - - failed - service_message: - description: the service message - type: string - example: no suitable node (insufficient resources on 1 node) - user_id: - description: the user that started the service - type: string - example: '123' - error: - nullable: true - default: null - '400': - description: 'Malformed function call, missing field' - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - delete: - tags: - - users - summary: Stops and removes an interactive service from the oSparc platform - description: Stops and removes an interactive service from the oSparc platform - operationId: running_interactive_services_delete - parameters: - - in: path - name: service_uuid - description: The uuid of the service - required: true - schema: - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - - in: query - name: save_state - description: Save the state prior to removing the service - required: false - schema: - type: boolean - default: true - responses: - '204': - description: Succesfully stopped and removed the service from the oSparc platform - '400': - description: 'Malformed function call, missing field' - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - '404': - description: Service not found - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - default: - description: Unexpected error - content: - application/json: - schema: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 -components: - parameters: - UserId: - in: query - name: user_id - description: The ID of the user that starts the service - required: true - schema: - type: string - example: asdfgj233 - ProjectId: - in: query - name: project_id - description: The ID of the project in which the service starts - required: true - schema: - type: string - example: asdfgj233 - AssignmentUuid: - in: query - name: service_uuid - description: The uuid to assign the service with - required: true - schema: - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - ServiceKeyPath: - in: path - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - ServiceKey: - in: query - name: service_key - description: The key (url) of the service - required: true - schema: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - ServiceType: - in: query - name: service_type - description: | - The service type: - * computational - a computational service - * interactive - an interactive service - required: false - schema: - type: string - enum: - - computational - - interactive - example: computational - ServiceBasePath: - in: query - name: service_basepath - description: predefined basepath for the backend service otherwise uses root - required: false - schema: - type: string - example: /x/EycCXbU0H/ - default: '' - ServiceUuid: - in: path - name: service_uuid - description: The uuid of the service - required: true - schema: - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - ServiceVersionPath: - in: path - name: service_version - description: The tag/version of the service - required: true - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - ServiceVersion: - in: query - name: service_tag - description: The tag/version of the service - required: false - schema: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - SaveState: - in: query - name: save_state - description: Save the state prior to removing the service - required: false - schema: - type: boolean - default: true - schemas: - ErrorEnveloped: - type: object - required: - - error - properties: - data: - nullable: true - default: null - error: - type: object - required: - - status - - message - properties: - message: - description: Error message - type: string - example: Unexpected error - errors: - type: array - items: - properties: - code: - type: string - description: Server Exception - example: ServiceUUIDNotFoundError - status: - description: Error code - type: integer - example: 404 - RunningServiceEnveloped: - type: object - required: - - data - properties: - data: - type: object - required: - - published_port - - service_uuid - - service_key - - service_version - - service_host - - service_port - - service_state - - user_id - properties: - published_port: - description: The ports where the service provides its interface - type: integer - format: int32 - minimum: 1 - example: 30000 - entry_point: - description: The entry point where the service provides its interface if specified - type: string - example: /the/entry/point/is/here - service_uuid: - description: The UUID attached to this service - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - service_key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - service_version: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - service_host: - description: service host name within the network - type: string - example: jupyter_E1O2E-LAH - service_port: - description: port to access the service within the network - type: integer - minimum: 1 - example: 8081 - service_basepath: - description: different base path where current service is mounted otherwise defaults to root - type: string - example: /x/E1O2E-LAH - default: '' - service_state: - description: | - the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start - type: string - enum: - - pending - - pulling - - starting - - running - - complete - - failed - service_message: - description: the service message - type: string - example: no suitable node (insufficient resources on 1 node) - user_id: - description: the user that started the service - type: string - example: '123' - error: - nullable: true - default: null - RunningServicesEnveloped: - type: object - required: - - data - properties: - data: - type: array - items: - type: object - required: - - published_port - - service_uuid - - service_key - - service_version - - service_host - - service_port - - service_state - - user_id - properties: - published_port: - description: The ports where the service provides its interface - type: integer - format: int32 - minimum: 1 - example: 30000 - entry_point: - description: The entry point where the service provides its interface if specified - type: string - example: /the/entry/point/is/here - service_uuid: - description: The UUID attached to this service - type: string - example: 123e4567-e89b-12d3-a456-426655440000 - service_key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' - example: - - simcore/services/comp/itis/sleeper - - simcore/services/dynamic/3dviewer - service_version: - type: string - description: semantic version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: - - 1.0.0 - - 0.0.1 - service_host: - description: service host name within the network - type: string - example: jupyter_E1O2E-LAH - service_port: - description: port to access the service within the network - type: integer - minimum: 1 - example: 8081 - service_basepath: - description: different base path where current service is mounted otherwise defaults to root - type: string - example: /x/E1O2E-LAH - default: '' - service_state: - description: | - the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start - type: string - enum: - - pending - - pulling - - starting - - running - - complete - - failed - service_message: - description: the service message - type: string - example: no suitable node (insufficient resources on 1 node) - user_id: - description: the user that started the service - type: string - example: '123' - error: - nullable: true - default: null - ServicesEnveloped: - type: object - required: - - data - properties: - data: - type: array - items: - title: simcore node - description: Description of a simcore node 'class' with input and output - type: object - additionalProperties: false - required: - - key - - version - - type - - name - - description - - authors - - contact - - inputs - - outputs - properties: - key: - type: string - description: distinctive name for the node based on the docker registry path - pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' - example: simcore/services/comp/itis/sleeper - integration-version: - type: string - description: integration version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - version: - type: string - description: service version number - pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' - example: 1.0.0 - type: - type: string - description: service type - enum: - - frontend - - computational - - dynamic - example: computational - name: - type: string - description: 'short, human readable name for the node' - example: Fast Counter - thumbnail: - type: string - description: url to the thumbnail - example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' - badges: - type: array - items: - type: object - required: - - name - - image - - url - additionalProperties: false - properties: - name: - type: string - description: Name of the subject - example: travis-ci - image: - type: string - description: Url to the shield - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' - url: - type: string - description: Link to status - example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' - description: - type: string - description: human readable description of the purpose of the node - example: Our best node type - authors: - type: array - minItems: 1 - items: - type: object - required: - - name - - email - additionalProperties: false - properties: - name: - type: string - description: Name of the author - example: Sun Bak - email: - description: Email address - type: string - format: email - example: sun@sense.eight - affiliation: - description: Affiliation of the author - type: string - example: Sense8 - contact: - type: string - format: email - description: email to correspond to the authors about the node - example: lab@net.flix - inputs: - type: object - description: definition of the inputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the input configurable for this service - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' - deprecated: true - type: number - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' - description: data type expected on this input glob matching for data type is allowed - example: - - number - - boolean - - 'data:*/*' - - 'data:text/*' - - 'data:[image/jpeg,image/png]' - - 'data:application/json' - - 'data:application/json;schema=https://my-schema/not/really/schema.json' - - 'data:application/vnd.ms-excel' - - 'data:text/plain' - - 'data:application/hdf5' - - 'data:application/edu.ucdavis@ceclancy.xyz' - contentSchema: - title: Content Schema - description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data associated with the named keys in files - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - defaultValue: - description: initial value for this input - type: - - string - - number - - integer - - boolean - example: - - Dog - - true - unit: - title: Unit - description: 'Units of this input value, if a physical quantity' - type: string - widget: - description: custom widget to use instead of the default one determined from the data-type - anyOf: - - type: object - additionalProperties: false - required: - - type - properties: - type: - description: type of the property - type: string - enum: - - TextArea - minHeight: - description: minimum Height of the textarea - type: integer - minimum: 1 - - type: object - additionalProperties: false - required: - - type - - structure - properties: - type: - description: type of the property - type: string - enum: - - SelectBox - structure: - type: array - minItems: 1 - items: - type: object - additionalProperties: false - required: - - key - - label - properties: - key: - type: - - string - - boolean - - number - label: - type: string - example: - - - key: rat - label: The Rat - - key: dog - label: Bello the Dog - additionalProperties: true - outputs: - type: object - description: definition of the outputs of this node - x-patternProperties: - '^[-_a-zA-Z0-9]+$': - type: object - description: all the output produced by this node - additionalProperties: false - required: - - displayOrder - - label - - description - - type - properties: - displayOrder: - type: number - description: use this to numerically sort the properties for display - example: - - 1 - - -0.2 - label: - type: string - description: short name for the property - example: - - Age - description: - type: string - description: description of the property - example: - - Age in seconds since 1970 - type: - type: string - pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' - description: data type expected on this output - example: - - number - - integer - - boolean - - string - - 'data:application/json' - - 'data:application/vnd.ms-excel ' - - 'data:text/plain' - - 'data:application/hdf5' - contentSchema: - title: Content Schema - description: jsonschema of this input/output. Required when type='ref_contentSchema' - type: object - fileToKeyMap: - description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. - type: object - patternProperties: - .+: - type: string - pattern: '^[-_a-zA-Z0-9]+$' - example: - - dir/input1.txt: key_1 - dir33/input2.txt: key2 - unit: - title: Unit - description: 'Units of the output value, if a physical quantity' - type: string - additionalProperties: true - boot-options: - title: Boot Options - description: Service defined boot options. These get injected in the service as env variables. - type: object - x-patternProperties: - '^[_a-zA-Z0-9]+$': - title: BootOptionMode - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - default: - title: Default - type: string - items: - title: Items - type: object - additionalProperties: - title: BootOptionItem - type: object - properties: - label: - title: Label - type: string - description: - title: Description - type: string - required: - - label - - description - required: - - label - - description - - default - - items - additionalProperties: true - image_digest: - title: Image Manifest digest - description: Provides a unique footprint (hash) of the image manifest - type: string - example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 - - error: - nullable: true - default: null - ServiceExtrasEnveloped: - type: object - required: - - data - properties: - data: - type: object - required: - - node_requirements - properties: - node_requirements: - type: object - required: - - CPU - - RAM - properties: - CPU: - type: number - default: 1 - minimum: 1 - GPU: - type: integer - minimum: 0 - RAM: - type: integer - format: int64 - minimum: 1024 - MPI: - type: integer - maximum: 1 - service_build_details: - type: object - properties: - build_date: - type: string - vcs_ref: - type: string - vcs_url: - type: string - container_spec: - type: object - properties: - command: - type: array - items: - type: string - error: - nullable: true - default: null - HealthCheckEnveloped: - type: object - required: - - data - properties: - data: - type: object - properties: - name: - type: string - example: director service - status: - type: string - example: SERVICE_RUNNING - api_version: - type: string - example: 1.0.0-dev - version: - type: string - example: 1dfcfdc - error: - nullable: true - default: null diff --git a/services/storage/src/simcore_service_storage/api/v0/openapi.yaml b/services/storage/src/simcore_service_storage/api/v0/openapi.yaml deleted file mode 100644 index 22f27d960ac..00000000000 --- a/services/storage/src/simcore_service_storage/api/v0/openapi.yaml +++ /dev/null @@ -1,1596 +0,0 @@ -openapi: 3.1.0 -info: - title: simcore-service-storage API - description: API definition for simcore-service-storage service - contact: - name: IT'IS Foundation - email: support@simcore.io - license: - name: MIT - url: https://github.com/ITISFoundation/osparc-simcore/blob/master/LICENSE - version: 0.5.0 -servers: -- url: / - description: 'Default server: requests directed to serving url' -- url: http://{host}:{port}/ - description: 'Development server: can configure any base url' - variables: - host: - default: 127.0.0.1 - port: - default: '8000' -paths: - /v0/locations/{location_id}/datasets: - get: - tags: - - datasets - summary: Get datasets metadata - description: returns all the top level datasets a user has access to - operationId: get_datasets_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' - /v0/locations/{location_id}/datasets/{dataset_id}/metadata: - get: - tags: - - datasets - summary: Get Files Metadata - description: returns all the file meta data inside dataset with dataset_id - operationId: get_files_metadata_dataset - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: dataset_id - in: path - required: true - schema: - type: string - title: Dataset Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - - name: expand_dirs - in: query - required: false - schema: - type: boolean - description: Automatic directory expansion. This will be replaced by pagination - the future - default: true - title: Expand Dirs - description: Automatic directory expansion. This will be replaced by pagination - the future - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_FileMetaDataGet__' - /v0/locations: - get: - tags: - - locations - summary: Get available storage locations - description: Returns the list of available storage locations - operationId: get_storage_locations - parameters: - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/DatasetMetaData' - title: Response Get Storage Locations - /v0/locations/{location_id}:sync: - post: - tags: - - locations - summary: Manually triggers the synchronisation of the file meta data table in - the database - description: Returns an object containing added, changed and removed paths - operationId: synchronise_meta_data_table - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: dry_run - in: query - required: false - schema: - type: boolean - default: false - title: Dry Run - - name: fire_and_forget - in: query - required: false - schema: - type: boolean - default: false - title: Fire And Forget - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TableSynchronisation_' - /v0/locations/{location_id}/files/metadata: - get: - tags: - - files - summary: Get datasets metadata - description: returns all the file meta data a user has access to (uuid_filter - may be used) - operationId: get_files_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: uuid_filter - in: query - required: false - schema: - type: string - default: '' - title: Uuid Filter - - name: expand_dirs - in: query - required: false - schema: - type: boolean - description: Automatic directory expansion. This will be replaced by pagination - the future - default: true - title: Expand Dirs - description: Automatic directory expansion. This will be replaced by pagination - the future - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' - /v0/locations/{location_id}/files/{file_id}/metadata: - get: - tags: - - files - summary: Get File Metadata - description: returns the file meta data of file_id if user_id has the rights - to - operationId: get_file_metadata - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/FileMetaData' - - $ref: '#/components/schemas/Envelope_FileMetaDataGet_' - title: Response Get File Metadata - /v0/locations/{location_id}/files/{file_id}: - get: - tags: - - files - summary: Returns download link for requested file - description: creates a download file link if user has the rights to - operationId: download_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - - name: link_type - in: query - required: false - schema: - $ref: '#/components/schemas/LinkType' - default: PRESIGNED - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_PresignedLink_' - put: - tags: - - files - summary: Returns upload link - description: creates one or more upload file links if user has the rights to, - expects the client to complete/abort upload - operationId: upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: file_size - in: query - required: true - schema: - anyOf: - - type: string - pattern: ^\s*(\d*\.?\d+)\s*(\w+)? - - type: integer - minimum: 0 - - type: 'null' - title: File Size - - name: link_type - in: query - required: false - schema: - $ref: '#/components/schemas/LinkType' - default: PRESIGNED - - name: is_directory - in: query - required: false - schema: - type: boolean - default: false - title: Is Directory - responses: - '200': - description: Successful Response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/Envelope_FileUploadSchema_' - - $ref: '#/components/schemas/Envelope_Url_' - title: Response Upload File - delete: - tags: - - files - summary: Deletes File - description: deletes file if user has the rights to - operationId: delete_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/locations/{location_id}/files/{file_id}:abort: - post: - tags: - - files - summary: Abort Upload File - description: 'aborts an upload if user has the rights to, and reverts - - to the latest version if available, else will delete the file' - operationId: abort_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '204': - description: Successful Response - /v0/locations/{location_id}/files/{file_id}:complete: - post: - tags: - - files - summary: Complete Upload File - description: completes an upload if the user has the rights to - operationId: complete_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompletionBody_' - responses: - '202': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompleteResponse_' - /v0/locations/{location_id}/files/{file_id}:complete/futures/{future_id}: - post: - tags: - - files - summary: Check for upload completion - description: Returns state of upload completion - operationId: is_completed_upload_file - parameters: - - name: location_id - in: path - required: true - schema: - type: integer - title: Location Id - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: future_id - in: path - required: true - schema: - type: string - title: Future Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileUploadCompleteFutureResponse_' - /v0/: - get: - tags: - - health - summary: health check endpoint - description: Current service health - operationId: health_check - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_HealthCheck_' - /v0/status: - get: - tags: - - health - summary: returns the status of the services inside - description: returns the status of all the external dependencies - operationId: get_status - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_AppStatusCheck_' - /v0/files/{file_id}:soft-copy: - post: - tags: - - files - summary: copy file as soft link - description: creates and returns a soft link - operationId: copy_as_soft_link - parameters: - - name: file_id - in: path - required: true - schema: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/SoftCopyBody' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/FileMetaDataGet' - /v0/simcore-s3:access: - post: - tags: - - simcore-s3 - summary: gets or creates the a temporary access - description: returns a set of S3 credentials - operationId: get_or_create_temporary_s3_access - parameters: - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_S3Settings_' - /v0/simcore-s3/folders: - post: - tags: - - simcore-s3 - summary: copies folders from project - description: copies folders from project - operationId: copy_folders_from_project - parameters: - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - requestBody: - required: true - content: - application/json: - schema: - $ref: '#/components/schemas/FoldersBody' - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskGet_' - /v0/simcore-s3/folders/{folder_id}: - delete: - tags: - - simcore-s3 - summary: delete folders from project - description: removes folders from a project - operationId: delete_folders_of_project - parameters: - - name: folder_id - in: path - required: true - schema: - type: string - title: Folder Id - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - - name: node_id - in: query - required: false - schema: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Node Id - responses: - '204': - description: Successful Response - /v0/simcore-s3/files/metadata:search: - post: - tags: - - simcore-s3 - summary: search for owned files - description: search for files starting with `startswith` and/or matching a sha256_checksum - in the file_meta_data table - operationId: search_files - parameters: - - name: user_id - in: query - required: true - schema: - type: integer - exclusiveMinimum: true - title: User Id - minimum: 0 - - name: startswith - in: query - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Startswith - - name: sha256_checksum - in: query - required: false - schema: - anyOf: - - type: string - pattern: ^[a-fA-F0-9]{64}$ - - type: 'null' - title: Sha256 Checksum - - name: kind - in: query - required: true - schema: - enum: - - owned - const: owned - type: string - title: Kind - - name: limit - in: query - required: false - schema: - type: integer - maximum: 50 - minimum: 1 - default: 20 - title: Limit - - name: offset - in: query - required: false - schema: - type: integer - minimum: 0 - default: 0 - title: Offset - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_FileMetaDataGet_' - /v0/futures: - get: - tags: - - tasks - summary: list current long running tasks - description: list current long running tasks - operationId: list_tasks - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskGet_' - /v0/futures/{task_id}: - get: - tags: - - tasks - summary: gets the status of the task - description: gets the status of the task - operationId: get_task_status - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - $ref: '#/components/schemas/Envelope_TaskStatus_' - delete: - tags: - - tasks - summary: cancels and removes the task - description: cancels and removes the task - operationId: cancel_and_delete_task - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '204': - description: Successful Response - /v0/futures/{task_id}/result: - get: - tags: - - tasks - summary: get result of the task - description: get result of the task - operationId: get_task_result - parameters: - - name: task_id - in: path - required: true - schema: - type: string - title: Task Id - responses: - '200': - description: Successful Response - content: - application/json: - schema: - title: Response Get Task Result -components: - schemas: - AppStatusCheck: - properties: - app_name: - type: string - title: App Name - description: Application name - version: - type: string - title: Version - description: Application's version - services: - type: object - title: Services - description: Other backend services connected from this service - default: {} - sessions: - anyOf: - - type: object - - type: 'null' - title: Sessions - description: Client sessions info. If single session per app, then is denoted - as main - default: {} - url: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Url - description: Link to current resource - diagnostics_url: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Diagnostics Url - description: Link to diagnostics report sub-resource. This MIGHT take some - time to compute - type: object - required: - - app_name - - version - title: AppStatusCheck - DatasetMetaData: - properties: - dataset_id: - anyOf: - - type: string - format: uuid - - type: string - pattern: ^N:dataset:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: Dataset Id - display_name: - type: string - title: Display Name - additionalProperties: false - type: object - required: - - dataset_id - - display_name - title: DatasetMetaData - Envelope_AppStatusCheck_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/AppStatusCheck' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[AppStatusCheck] - Envelope_FileMetaDataGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileMetaDataGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileMetaDataGet] - Envelope_FileUploadCompleteFutureResponse_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompleteFutureResponse' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompleteFutureResponse] - Envelope_FileUploadCompleteResponse_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompleteResponse' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompleteResponse] - Envelope_FileUploadCompletionBody_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadCompletionBody' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadCompletionBody] - Envelope_FileUploadSchema_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/FileUploadSchema' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[FileUploadSchema] - Envelope_HealthCheck_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/HealthCheck' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[HealthCheck] - Envelope_PresignedLink_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/PresignedLink' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[PresignedLink] - Envelope_S3Settings_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/S3Settings' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[S3Settings] - Envelope_TableSynchronisation_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TableSynchronisation' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TableSynchronisation] - Envelope_TaskGet_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TaskGet' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TaskGet] - Envelope_TaskStatus_: - properties: - data: - anyOf: - - $ref: '#/components/schemas/TaskStatus' - - type: 'null' - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[TaskStatus] - Envelope_Url_: - properties: - data: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Url] - Envelope_list_DatasetMetaData__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/DatasetMetaData' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[DatasetMetaData]] - Envelope_list_FileMetaDataGet__: - properties: - data: - anyOf: - - items: - $ref: '#/components/schemas/FileMetaDataGet' - type: array - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[list[FileMetaDataGet]] - FileMetaData: - properties: - file_uuid: - type: string - title: File Uuid - description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE - folder structure - location_id: - type: integer - title: Location Id - description: Storage location - project_name: - anyOf: - - type: string - - type: 'null' - title: Project Name - description: optional project name, used by frontend to display path - node_name: - anyOf: - - type: string - - type: 'null' - title: Node Name - description: optional node name, used by frontend to display path - file_name: - type: string - title: File Name - description: Display name for a file - file_id: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext - for S3 and N:package:UUID for datcore - created_at: - type: string - format: date-time - title: Created At - last_modified: - type: string - format: date-time - title: Last Modified - file_size: - anyOf: - - type: integer - enum: - - -1 - const: -1 - - type: integer - minimum: 0 - title: File Size - description: File size in bytes (-1 means invalid) - default: -1 - entity_tag: - anyOf: - - type: string - - type: 'null' - title: Entity Tag - description: Entity tag (or ETag), represents a specific version of the - file, None if invalid upload or datcore - is_soft_link: - type: boolean - title: Is Soft Link - description: If true, this file is a soft link.i.e. is another entry with - the same object_name - default: false - is_directory: - type: boolean - title: Is Directory - description: if True this is a directory - default: false - sha256_checksum: - anyOf: - - type: string - pattern: ^[a-fA-F0-9]{64}$ - - type: 'null' - title: Sha256 Checksum - upload_id: - anyOf: - - type: string - - type: 'null' - title: Upload Id - upload_expires_at: - anyOf: - - type: string - format: date-time - - type: 'null' - title: Upload Expires At - location: - type: string - title: Location - bucket_name: - type: string - title: Bucket Name - object_name: - type: string - title: Object Name - project_id: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Project Id - node_id: - anyOf: - - type: string - format: uuid - - type: 'null' - title: Node Id - user_id: - anyOf: - - type: integer - exclusiveMinimum: true - minimum: 0 - - type: 'null' - title: User Id - type: object - required: - - file_uuid - - location_id - - file_name - - file_id - - created_at - - last_modified - - sha256_checksum - - location - - bucket_name - - object_name - - project_id - - node_id - - user_id - title: FileMetaData - FileMetaDataGet: - properties: - file_uuid: - type: string - title: File Uuid - description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE - folder structure - location_id: - type: integer - title: Location Id - description: Storage location - project_name: - anyOf: - - type: string - - type: 'null' - title: Project Name - description: optional project name, used by frontend to display path - node_name: - anyOf: - - type: string - - type: 'null' - title: Node Name - description: optional node name, used by frontend to display path - file_name: - type: string - title: File Name - description: Display name for a file - file_id: - anyOf: - - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - - type: string - pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ - title: File Id - description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext - for S3 and N:package:UUID for datcore - created_at: - type: string - format: date-time - title: Created At - last_modified: - type: string - format: date-time - title: Last Modified - file_size: - anyOf: - - type: integer - enum: - - -1 - const: -1 - - type: integer - minimum: 0 - title: File Size - description: File size in bytes (-1 means invalid) - default: -1 - entity_tag: - anyOf: - - type: string - - type: 'null' - title: Entity Tag - description: Entity tag (or ETag), represents a specific version of the - file, None if invalid upload or datcore - is_soft_link: - type: boolean - title: Is Soft Link - description: If true, this file is a soft link.i.e. is another entry with - the same object_name - default: false - is_directory: - type: boolean - title: Is Directory - description: if True this is a directory - default: false - sha256_checksum: - anyOf: - - type: string - pattern: ^[a-fA-F0-9]{64}$ - - type: 'null' - title: Sha256 Checksum - description: 'SHA256 message digest of the file content. Main purpose: cheap - lookup.' - type: object - required: - - file_uuid - - location_id - - file_name - - file_id - - created_at - - last_modified - title: FileMetaDataGet - FileUploadCompleteFutureResponse: - properties: - state: - $ref: '#/components/schemas/FileUploadCompleteState' - e_tag: - anyOf: - - type: string - - type: 'null' - title: E Tag - type: object - required: - - state - title: FileUploadCompleteFutureResponse - FileUploadCompleteLinks: - properties: - state: - type: string - minLength: 1 - format: uri - title: State - type: object - required: - - state - title: FileUploadCompleteLinks - FileUploadCompleteResponse: - properties: - links: - $ref: '#/components/schemas/FileUploadCompleteLinks' - type: object - required: - - links - title: FileUploadCompleteResponse - FileUploadCompleteState: - type: string - enum: - - ok - - nok - title: FileUploadCompleteState - FileUploadCompletionBody: - properties: - parts: - items: - $ref: '#/components/schemas/UploadedPart' - type: array - title: Parts - type: object - required: - - parts - title: FileUploadCompletionBody - FileUploadLinks: - properties: - abort_upload: - type: string - minLength: 1 - format: uri - title: Abort Upload - complete_upload: - type: string - minLength: 1 - format: uri - title: Complete Upload - type: object - required: - - abort_upload - - complete_upload - title: FileUploadLinks - FileUploadSchema: - properties: - chunk_size: - type: integer - minimum: 0 - title: Chunk Size - urls: - items: - type: string - minLength: 1 - format: uri - type: array - title: Urls - links: - $ref: '#/components/schemas/FileUploadLinks' - type: object - required: - - chunk_size - - urls - - links - title: FileUploadSchema - FoldersBody: - properties: - source: - type: object - title: Source - destination: - type: object - title: Destination - nodes_map: - additionalProperties: - type: string - format: uuid - type: object - title: Nodes Map - type: object - title: FoldersBody - HealthCheck: - properties: - name: - anyOf: - - type: string - - type: 'null' - title: Name - status: - anyOf: - - type: string - - type: 'null' - title: Status - api_version: - anyOf: - - type: string - - type: 'null' - title: Api Version - version: - anyOf: - - type: string - - type: 'null' - title: Version - type: object - required: - - name - - status - - api_version - - version - title: HealthCheck - LinkType: - type: string - enum: - - PRESIGNED - - S3 - title: LinkType - PresignedLink: - properties: - link: - type: string - minLength: 1 - format: uri - title: Link - type: object - required: - - link - title: PresignedLink - S3Settings: - properties: - S3_ACCESS_KEY: - type: string - maxLength: 50 - minLength: 1 - title: S3 Access Key - S3_BUCKET_NAME: - type: string - maxLength: 50 - minLength: 1 - title: S3 Bucket Name - S3_ENDPOINT: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: S3 Endpoint - description: do not define if using standard AWS - S3_REGION: - type: string - maxLength: 50 - minLength: 1 - title: S3 Region - S3_SECRET_KEY: - type: string - maxLength: 50 - minLength: 1 - title: S3 Secret Key - additionalProperties: false - type: object - required: - - S3_ACCESS_KEY - - S3_BUCKET_NAME - - S3_REGION - - S3_SECRET_KEY - title: S3Settings - SoftCopyBody: - properties: - link_id: - type: string - pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ - title: Link Id - type: object - required: - - link_id - title: SoftCopyBody - TableSynchronisation: - properties: - dry_run: - anyOf: - - type: boolean - - type: 'null' - title: Dry Run - fire_and_forget: - anyOf: - - type: boolean - - type: 'null' - title: Fire And Forget - removed: - items: - type: string - type: array - title: Removed - type: object - required: - - removed - title: TableSynchronisation - TaskGet: - properties: - task_id: - type: string - title: Task Id - task_name: - type: string - title: Task Name - status_href: - type: string - title: Status Href - result_href: - type: string - title: Result Href - abort_href: - type: string - title: Abort Href - type: object - required: - - task_id - - task_name - - status_href - - result_href - - abort_href - title: TaskGet - TaskProgress: - properties: - task_id: - anyOf: - - type: string - - type: 'null' - title: Task Id - message: - type: string - title: Message - default: '' - percent: - type: number - maximum: 1.0 - minimum: 0.0 - title: Percent - default: 0.0 - type: object - title: TaskProgress - description: 'Helps the user to keep track of the progress. Progress is expected - to be - - defined as a float bound between 0.0 and 1.0' - TaskStatus: - properties: - task_progress: - $ref: '#/components/schemas/TaskProgress' - done: - type: boolean - title: Done - started: - type: string - format: date-time - title: Started - type: object - required: - - task_progress - - done - - started - title: TaskStatus - UploadedPart: - properties: - number: - type: integer - exclusiveMinimum: true - title: Number - minimum: 0 - e_tag: - type: string - title: E Tag - type: object - required: - - number - - e_tag - title: UploadedPart -tags: -- name: datasets -- name: files -- name: health -- name: locations -- name: tasks -- name: simcore-s3 From 18e0f141259e1131135052bf20e2c41f2e77e05a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 14:59:46 +0100 Subject: [PATCH 15/79] ensure parent dir exists for webserver openapi.yaml --- api/specs/web-server/openapi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/specs/web-server/openapi.py b/api/specs/web-server/openapi.py index cba6137953d..82987818059 100644 --- a/api/specs/web-server/openapi.py +++ b/api/specs/web-server/openapi.py @@ -99,6 +99,7 @@ def main(): # .yaml oas_path = webserver_resources.get_path("api/v0/openapi.yaml").resolve() if not oas_path.exists(): + oas_path.parent.mkdir(parents=True) oas_path.write_text("") print(f"Writing {oas_path}...", end=None) with oas_path.open("wt") as fh: From 0b4e7504a61e04cf78ede3ba58aed201e3509b87 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Mon, 2 Dec 2024 15:29:58 +0100 Subject: [PATCH 16/79] progress on gh workflow --- .github/workflows/ci-testing-deploy.yml | 30 +++++++++++++++++-------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 42992cfebca..3fe0c65b7ba 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2868,11 +2868,10 @@ jobs: api-server-api-spec-backwards-compatible: needs: [changes] if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} - timeout-minutes: 5 - name: "api-server-backwards-compatibility" + timeout-minutes: 10 + name: "api-specs-backwards-compatibility" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - name: setup python environment uses: actions/setup-python@v5 with: @@ -2883,10 +2882,23 @@ jobs: version: "0.4.x" enable-cache: false cache-dependency-glob: "**/service-library/requirements/ci*.txt" - - name: setup python .venv + - name: checkout source branch + uses: actions/checkout@v4 + with: + path: source + - name: checkout target branch + uses: actions/checkout@v4 + with: + path: target + repository: github.event.pull_request.base.repo.full_name + ref: github.event.pull_request.base.ref + - name: Generate target openapi specs + run: | + cd target + uv venv .venv && source .venv/bin/activate + make openapi-specs + - name: Generate source openapi-specs and compare run: | - python -m venv .venv - source .venv/bin/activate - cd services/api-server - make install-dev - make openapi-diff.md OPENAPI_JSON_BASE_URL=https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json + cd source + uv venv .venv && source .venv/bin/activate + make openapi-specs From dae362f74233402c66f594cecfe6c61841349455 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 05:28:51 +0100 Subject: [PATCH 17/79] improve makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e46e94f8479..fbaeed36f2c 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ .DEFAULT_GOAL := help SHELL := /bin/bash - +#.SHELLFLAGS := -e -o pipefail -c MAKE_C := $(MAKE) --no-print-directory --directory # Operating system @@ -582,8 +582,8 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an openapi-specs: .env _check_venv_active ## bundles and validates openapi specifications and schemas of ALL service's API @for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ echo "Generating openapi-specs using $${makefile}"; \ - $(MAKE_C) $$(dirname $${makefile}) install-dev; \ - $(MAKE_C) $$(dirname $${makefile}) openapi-specs; \ + $(MAKE_C) $$(dirname $${makefile}) install-dev && $(MAKE_C) $$(dirname $${makefile}) $@; \ + printf "%0.s=" {1..100} && printf "\n"; \ done From e8fd7a7ae0665ecb3e793db810b19fb9a9e219f9 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 05:29:25 +0100 Subject: [PATCH 18/79] ensure fast failure in make targets --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fbaeed36f2c..c333814d1f3 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ .DEFAULT_GOAL := help SHELL := /bin/bash -#.SHELLFLAGS := -e -o pipefail -c +.SHELLFLAGS := -e -o pipefail -c MAKE_C := $(MAKE) --no-print-directory --directory # Operating system From d02c99051593985468e020ce12eff1c390a8f871 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 05:35:11 +0100 Subject: [PATCH 19/79] readd all openapi specs (tests depend on them) --- services/api-server/openapi.json | 7121 ++++++++ services/catalog/openapi.json | 4178 +++++ services/director-v2/openapi.json | 4548 +++++ services/dynamic-scheduler/openapi.json | 93 + services/dynamic-sidecar/openapi.json | 1514 ++ services/invitations/openapi.json | 456 + services/payments/openapi.json | 564 + services/resource-usage-tracker/openapi.json | 600 + .../api/v0/openapi.yaml | 1596 ++ .../api/v0/openapi.yaml | 14987 ++++++++++++++++ 10 files changed, 35657 insertions(+) create mode 100644 services/api-server/openapi.json create mode 100644 services/catalog/openapi.json create mode 100644 services/director-v2/openapi.json create mode 100644 services/dynamic-scheduler/openapi.json create mode 100644 services/dynamic-sidecar/openapi.json create mode 100644 services/invitations/openapi.json create mode 100644 services/payments/openapi.json create mode 100644 services/resource-usage-tracker/openapi.json create mode 100644 services/storage/src/simcore_service_storage/api/v0/openapi.yaml create mode 100644 services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json new file mode 100644 index 00000000000..29d7dda206b --- /dev/null +++ b/services/api-server/openapi.json @@ -0,0 +1,7121 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "osparc.io public API", + "description": "osparc-simcore public API specifications", + "version": "0.7.0" + }, + "paths": { + "/v0/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Meta" + } + } + } + } + } + } + }, + "/v0/me": { + "get": { + "tags": [ + "users" + ], + "summary": "Get My Profile", + "operationId": "get_my_profile", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Profile" + } + } + } + }, + "404": { + "description": "User not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + }, + "put": { + "tags": [ + "users" + ], + "summary": "Update My Profile", + "operationId": "update_my_profile", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProfileUpdate" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Profile" + } + } + } + }, + "404": { + "description": "User not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v0/files": { + "get": { + "tags": [ + "files" + ], + "summary": "List Files", + "description": "Lists all files stored in the system\n\nSEE `get_files_page` for a paginated version of this function", + "operationId": "list_files", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/File" + }, + "type": "array", + "title": "Response List Files V0 Files Get" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v0/files/content": { + "put": { + "tags": [ + "files" + ], + "summary": "Upload File", + "description": "Uploads a single file to the system", + "operationId": "upload_file", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "content-length", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content-Length" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_file_v0_files_content_put" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/File" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "files" + ], + "summary": "Get Upload Links", + "description": "Get upload links for uploading a file to storage", + "operationId": "get_upload_links", + "security": [ + { + "HTTPBasic": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientFile" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClientFileUploadData" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/files/{file_id}": { + "get": { + "tags": [ + "files" + ], + "summary": "Get File", + "description": "Gets metadata for a given file resource", + "operationId": "get_file", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "file_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "File Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/File" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "files" + ], + "summary": "Delete File", + "operationId": "delete_file", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "file_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "File Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/files:search": { + "get": { + "tags": [ + "files" + ], + "summary": "Search Files Page", + "description": "Search files", + "operationId": "search_files_page", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "sha256_checksum", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "pattern": "^[a-fA-F0-9]{64}$" + }, + { + "type": "null" + } + ], + "title": "Sha256 Checksum" + } + }, + { + "name": "file_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "File Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Page_File_" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/files/{file_id}:abort": { + "post": { + "tags": [ + "files" + ], + "summary": "Abort Multipart Upload", + "operationId": "abort_multipart_upload", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "file_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "File Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_abort_multipart_upload_v0_files__file_id__abort_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/files/{file_id}:complete": { + "post": { + "tags": [ + "files" + ], + "summary": "Complete Multipart Upload", + "operationId": "complete_multipart_upload", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "file_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "File Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_complete_multipart_upload_v0_files__file_id__complete_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/File" + } + } + } + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/files/{file_id}/content": { + "get": { + "tags": [ + "files" + ], + "summary": "Download File", + "operationId": "download_file", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "file_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "File Id" + } + } + ], + "responses": { + "307": { + "description": "Successful Response" + }, + "404": { + "description": "File not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "200": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "description": "Returns a arbitrary binary data" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers": { + "get": { + "tags": [ + "solvers" + ], + "summary": "List Solvers", + "description": "Lists all available solvers (latest version)\n\nSEE get_solvers_page for paginated version of this function", + "operationId": "list_solvers", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Solver" + }, + "type": "array", + "title": "Response List Solvers V0 Solvers Get" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v0/solvers/releases": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Lists All Releases", + "description": "Lists all released solvers i.e. all released versions\n\nSEE get_solvers_releases_page for a paginated version of this function", + "operationId": "list_solvers_releases", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Solver" + }, + "type": "array", + "title": "Response List Solvers Releases V0 Solvers Releases Get" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v0/solvers/{solver_key}/latest": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Latest Release of a Solver", + "description": "Gets latest release of a solver", + "operationId": "get_solver", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Solver" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases": { + "get": { + "tags": [ + "solvers" + ], + "summary": "List Solver Releases", + "description": "Lists all releases of a given (one) solver\n\nSEE get_solver_releases_page for a paginated version of this function", + "operationId": "list_solver_releases", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Solver" + }, + "title": "Response List Solver Releases V0 Solvers Solver Key Releases Get" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Solver Release", + "description": "Gets a specific release of a solver", + "operationId": "get_solver_release", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Solver" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/ports": { + "get": { + "tags": [ + "solvers" + ], + "summary": "List Solver Ports", + "description": "Lists inputs and outputs of a given solver\n\nNew in *version 0.5.0*", + "operationId": "list_solver_ports", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OnePage_SolverPort_" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/pricing_plan": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Solver Pricing Plan", + "description": "Gets solver pricing plan\n\nNew in *version 0.7*", + "operationId": "get_solver_pricing_plan", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServicePricingPlanGet" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs": { + "post": { + "tags": [ + "solvers" + ], + "summary": "Create Job", + "description": "Creates a job in a specific release with given inputs.\n\nNOTE: This operation does **not** start the job", + "operationId": "create_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "hidden", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true, + "title": "Hidden" + } + }, + { + "name": "x-simcore-parent-project-uuid", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Project-Uuid" + } + }, + { + "name": "x-simcore-parent-node-id", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Node-Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobInputs" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "solvers" + ], + "summary": "List Jobs", + "description": "List of jobs in a specific released solver (limited to 20 jobs)\n\n- DEPRECATION: This implementation and returned values are deprecated and the will be replaced by that of get_jobs_page\n- SEE `get_jobs_page` for paginated version of this function", + "operationId": "list_jobs", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Job" + }, + "title": "Response List Jobs V0 Solvers Solver Key Releases Version Jobs Get" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}": { + "delete": { + "tags": [ + "solvers" + ], + "summary": "Delete Job", + "description": "Deletes an existing solver job\n\nNew in *version 0.7*", + "operationId": "delete_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job", + "description": "Gets job of a given solver", + "operationId": "get_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:start": { + "post": { + "tags": [ + "solvers" + ], + "summary": "Start Job", + "description": "Starts job job_id created with the solver solver_key:version\n\nAdded in *version 0.4.3*: query parameter `cluster_id`\nAdded in *version 0.6*: responds with a 202 when successfully starting a computation", + "operationId": "start_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + }, + { + "name": "cluster_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Cluster Id" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "200": { + "description": "Job already started", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "406": { + "description": "Cluster not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Configuration error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:stop": { + "post": { + "tags": [ + "solvers" + ], + "summary": "Stop Job", + "operationId": "stop_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}:inspect": { + "post": { + "tags": [ + "solvers" + ], + "summary": "Inspect Job", + "operationId": "inspect_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/metadata": { + "patch": { + "tags": [ + "solvers" + ], + "summary": "Replace Job Custom Metadata", + "description": "Updates custom metadata from a job\n\nNew in *version 0.7*", + "operationId": "replace_job_custom_metadata", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadataUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadata" + } + } + } + }, + "404": { + "description": "Metadata not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job Custom Metadata", + "description": "Gets custom metadata from a job\n\nNew in *version 0.7*", + "operationId": "get_job_custom_metadata", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadata" + } + } + } + }, + "404": { + "description": "Metadata not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/page": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Jobs Page", + "description": "List of jobs on a specific released solver (includes pagination)\n\nNew in *version 0.7*", + "operationId": "get_jobs_page", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Page_Job_" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/outputs": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job Outputs", + "operationId": "get_job_outputs", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobOutputs" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/outputs/logfile": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job Output Logfile", + "description": "Special extra output with persistent logs file for the solver run.\n\n**NOTE**: this is not a log stream but a predefined output that is only\navailable after the job is done.\n\nNew in *version 0.4.0*", + "operationId": "get_job_output_logfile", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "307": { + "description": "Successful Response" + }, + "200": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "application/zip": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "description": "Returns a log file" + }, + "404": { + "description": "Log not found" + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/wallet": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job Wallet", + "description": "Get job wallet\n\nNew in *version 0.7*", + "operationId": "get_job_wallet", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + } + } + } + }, + "404": { + "description": "Wallet not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "403": { + "description": "Access to wallet is not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/pricing_unit": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Job Pricing Unit", + "description": "Get job pricing unit\n\nNew in *version 0.7*", + "operationId": "get_job_pricing_unit", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PricingUnitGet" + } + } + } + }, + "404": { + "description": "Pricing unit not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/solvers/{solver_key}/releases/{version}/jobs/{job_id}/logstream": { + "get": { + "tags": [ + "solvers" + ], + "summary": "Get Log Stream", + "operationId": "get_log_stream", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "solver_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Solver Key" + } + }, + { + "name": "version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Returns a JobLog or an ErrorGet", + "content": { + "application/x-ndjson": { + "schema": { + "type": "string", + "anyOf": [ + { + "$ref": "#/components/schemas/JobLog" + }, + { + "$ref": "#/components/schemas/ErrorGet" + } + ], + "title": "Response 200 Get Log Stream V0 Solvers Solver Key Releases Version Jobs Job Id Logstream Get" + } + } + } + }, + "409": { + "description": "Conflict: Logs are already being streamed", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/x-ndjson": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies": { + "get": { + "tags": [ + "studies" + ], + "summary": "List Studies", + "description": "New in *version 0.5.0*", + "operationId": "list_studies", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 1, + "default": 50, + "title": "Limit" + } + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 0, + "default": 0, + "title": "Offset" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Page_Study_" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}": { + "get": { + "tags": [ + "studies" + ], + "summary": "Get Study", + "description": "New in *version 0.5.0*", + "operationId": "get_study", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Study" + } + } + } + }, + "404": { + "description": "Study not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}:clone": { + "post": { + "tags": [ + "studies" + ], + "summary": "Clone Study", + "operationId": "clone_study", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "x-simcore-parent-project-uuid", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Project-Uuid" + } + }, + { + "name": "x-simcore-parent-node-id", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Node-Id" + } + } + ], + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Study" + } + } + } + }, + "404": { + "description": "Study not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/ports": { + "get": { + "tags": [ + "studies" + ], + "summary": "List Study Ports", + "description": "Lists metadata on ports of a given study\n\nNew in *version 0.5.0*", + "operationId": "list_study_ports", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OnePage_StudyPort_" + } + } + } + }, + "404": { + "description": "Study not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs": { + "post": { + "tags": [ + "studies" + ], + "summary": "Create Study Job", + "description": "hidden -- if True (default) hides project from UI", + "operationId": "create_study_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "hidden", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true, + "title": "Hidden" + } + }, + { + "name": "x-simcore-parent-project-uuid", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Project-Uuid" + } + }, + { + "name": "x-simcore-parent-node-id", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Parent-Node-Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobInputs" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}": { + "delete": { + "tags": [ + "studies" + ], + "summary": "Delete Study Job", + "description": "Deletes an existing study job", + "operationId": "delete_study_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + }, + "description": "Not Found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}:start": { + "post": { + "tags": [ + "studies" + ], + "summary": "Start Study Job", + "description": "Changed in *version 0.6.0*: Now responds with a 202 when successfully starting a computation", + "operationId": "start_study_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + }, + { + "name": "cluster_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Cluster Id" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "402": { + "description": "Payment required", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "404": { + "description": "Job/wallet/pricing details not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "200": { + "description": "Job already started", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "406": { + "description": "Cluster not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Configuration error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}:stop": { + "post": { + "tags": [ + "studies" + ], + "summary": "Stop Study Job", + "operationId": "stop_study_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}:inspect": { + "post": { + "tags": [ + "studies" + ], + "summary": "Inspect Study Job", + "operationId": "inspect_study_job", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobStatus" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}/outputs": { + "post": { + "tags": [ + "studies" + ], + "summary": "Get Study Job Outputs", + "operationId": "get_study_job_outputs", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobOutputs" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}/outputs/log-links": { + "get": { + "tags": [ + "studies" + ], + "summary": "Get download links for study job log files", + "operationId": "get_study_job_output_logfile", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobLogsMap" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/studies/{study_id}/jobs/{job_id}/metadata": { + "get": { + "tags": [ + "studies" + ], + "summary": "Get Study Job Custom Metadata", + "description": "Get custom metadata from a study's job\n\nNew in *version 0.7*", + "operationId": "get_study_job_custom_metadata", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadata" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "put": { + "tags": [ + "studies" + ], + "summary": "Replace Study Job Custom Metadata", + "description": "Changes custom metadata of a study's job\n\nNew in *version 0.7*", + "operationId": "replace_study_job_custom_metadata", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "study_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Study Id" + } + }, + { + "name": "job_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Job Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadataUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/JobMetadata" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/wallets/default": { + "get": { + "tags": [ + "wallets" + ], + "summary": "Get Default Wallet", + "description": "Get default wallet\n\nNew in *version 0.7*", + "operationId": "get_default_wallet", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + } + } + } + }, + "404": { + "description": "Wallet not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "403": { + "description": "Access to wallet is not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v0/wallets/{wallet_id}": { + "get": { + "tags": [ + "wallets" + ], + "summary": "Get Wallet", + "description": "Get wallet\n\nNew in *version 0.7*", + "operationId": "get_wallet", + "security": [ + { + "HTTPBasic": [] + } + ], + "parameters": [ + { + "name": "wallet_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Wallet Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + } + } + } + }, + "404": { + "description": "Wallet not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "403": { + "description": "Access to wallet is not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "429": { + "description": "Too many requests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "502": { + "description": "Unexpected error when communicating with backend service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "503": { + "description": "Service unavailable", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "504": { + "description": "Request to a backend service timed out.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/credits/price": { + "get": { + "tags": [ + "credits" + ], + "summary": "Get Credits Price", + "description": "New in *version 0.6.0*", + "operationId": "get_credits_price", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetCreditPriceApiServer" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + } + }, + "components": { + "schemas": { + "Body_abort_multipart_upload_v0_files__file_id__abort_post": { + "properties": { + "client_file": { + "$ref": "#/components/schemas/ClientFile" + } + }, + "type": "object", + "required": [ + "client_file" + ], + "title": "Body_abort_multipart_upload_v0_files__file_id__abort_post" + }, + "Body_complete_multipart_upload_v0_files__file_id__complete_post": { + "properties": { + "client_file": { + "$ref": "#/components/schemas/ClientFile" + }, + "uploaded_parts": { + "$ref": "#/components/schemas/FileUploadCompletionBody" + } + }, + "type": "object", + "required": [ + "client_file", + "uploaded_parts" + ], + "title": "Body_complete_multipart_upload_v0_files__file_id__complete_post" + }, + "Body_upload_file_v0_files_content_put": { + "properties": { + "file": { + "type": "string", + "format": "binary", + "title": "File" + } + }, + "type": "object", + "required": [ + "file" + ], + "title": "Body_upload_file_v0_files_content_put" + }, + "ClientFile": { + "properties": { + "filename": { + "type": "string", + "title": "Filename", + "description": "File name" + }, + "filesize": { + "type": "integer", + "minimum": 0, + "title": "Filesize", + "description": "File size in bytes" + }, + "sha256_checksum": { + "type": "string", + "pattern": "^[a-fA-F0-9]{64}$", + "title": "Sha256 Checksum", + "description": "SHA256 checksum" + } + }, + "type": "object", + "required": [ + "filename", + "filesize", + "sha256_checksum" + ], + "title": "ClientFile", + "description": "Represents a file stored on the client side" + }, + "ClientFileUploadData": { + "properties": { + "file_id": { + "type": "string", + "format": "uuid", + "title": "File Id", + "description": "The file resource id" + }, + "upload_schema": { + "$ref": "#/components/schemas/FileUploadData", + "description": "Schema for uploading file" + } + }, + "type": "object", + "required": [ + "file_id", + "upload_schema" + ], + "title": "ClientFileUploadData" + }, + "ErrorGet": { + "properties": { + "errors": { + "items": {}, + "type": "array", + "title": "Errors" + } + }, + "type": "object", + "required": [ + "errors" + ], + "title": "ErrorGet", + "example": { + "errors": [ + "some error message", + "another error message" + ] + } + }, + "File": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id", + "description": "Resource identifier" + }, + "filename": { + "type": "string", + "title": "Filename", + "description": "Name of the file with extension" + }, + "content_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content Type", + "description": "Guess of type content [EXPERIMENTAL]" + }, + "checksum": { + "anyOf": [ + { + "type": "string", + "pattern": "^[a-fA-F0-9]{64}$" + }, + { + "type": "null" + } + ], + "title": "Checksum", + "description": "SHA256 hash of the file's content" + }, + "e_tag": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "E Tag", + "description": "S3 entity tag" + } + }, + "type": "object", + "required": [ + "id", + "filename" + ], + "title": "File", + "description": "Represents a file stored on the server side i.e. a unique reference to a file in the cloud." + }, + "FileUploadCompletionBody": { + "properties": { + "parts": { + "items": { + "$ref": "#/components/schemas/UploadedPart" + }, + "type": "array", + "title": "Parts" + } + }, + "type": "object", + "required": [ + "parts" + ], + "title": "FileUploadCompletionBody" + }, + "FileUploadData": { + "properties": { + "chunk_size": { + "type": "integer", + "minimum": 0, + "title": "Chunk Size" + }, + "urls": { + "items": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri" + }, + "type": "array", + "title": "Urls" + }, + "links": { + "$ref": "#/components/schemas/UploadLinks" + } + }, + "type": "object", + "required": [ + "chunk_size", + "urls", + "links" + ], + "title": "FileUploadData" + }, + "GetCreditPriceApiServer": { + "properties": { + "productName": { + "type": "string", + "title": "Productname" + }, + "usdPerCredit": { + "anyOf": [ + { + "type": "number", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Usdpercredit", + "description": "Price of a credit in USD. If None, then this product's price is UNDEFINED" + }, + "minPaymentAmountUsd": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Minpaymentamountusd", + "description": "Minimum amount (included) in USD that can be paid for this productCan be None if this product's price is UNDEFINED" + } + }, + "type": "object", + "required": [ + "productName", + "usdPerCredit", + "minPaymentAmountUsd" + ], + "title": "GetCreditPriceApiServer" + }, + "Groups": { + "properties": { + "me": { + "$ref": "#/components/schemas/UsersGroup" + }, + "organizations": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/UsersGroup" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Organizations", + "default": [] + }, + "all": { + "$ref": "#/components/schemas/UsersGroup" + } + }, + "type": "object", + "required": [ + "me", + "all" + ], + "title": "Groups" + }, + "HTTPValidationError": { + "properties": { + "errors": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Validation errors" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "Job": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id" + }, + "name": { + "type": "string", + "pattern": "^([^\\s/]+/?){1,10}$", + "title": "Name" + }, + "inputs_checksum": { + "type": "string", + "title": "Inputs Checksum", + "description": "Input's checksum" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At", + "description": "Job creation timestamp" + }, + "runner_name": { + "type": "string", + "pattern": "^([^\\s/]+/?){1,10}$", + "title": "Runner Name", + "description": "Runner that executes job" + }, + "url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "Link to get this resource (self)" + }, + "runner_url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Runner Url", + "description": "Link to the solver's job (parent collection)" + }, + "outputs_url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Outputs Url", + "description": "Link to the job outputs (sub-collection)" + } + }, + "type": "object", + "required": [ + "id", + "name", + "inputs_checksum", + "created_at", + "runner_name", + "url", + "runner_url", + "outputs_url" + ], + "title": "Job", + "example": { + "created_at": "2021-01-22T23:59:52.322176", + "id": "f622946d-fd29-35b9-a193-abdd1095167c", + "inputs_checksum": "12345", + "name": "solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c", + "outputs_url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c/outputs", + "runner_name": "solvers/isolve/releases/1.3.4", + "runner_url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4", + "url": "https://api.osparc.io/v0/solvers/isolve/releases/1.3.4/jobs/f622946d-fd29-35b9-a193-abdd1095167c" + } + }, + "JobInputs": { + "properties": { + "values": { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/File" + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "title": "Values" + } + }, + "type": "object", + "required": [ + "values" + ], + "title": "JobInputs", + "example": { + "values": { + "enabled": true, + "input_file": { + "filename": "input.txt", + "id": "0a3b2c56-dbcd-4871-b93b-d454b7883f9f" + }, + "n": 55, + "title": "Temperature", + "x": 4.33 + } + } + }, + "JobLog": { + "properties": { + "job_id": { + "type": "string", + "format": "uuid", + "title": "Job Id" + }, + "node_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Node Id" + }, + "log_level": { + "type": "integer", + "title": "Log Level" + }, + "messages": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Messages" + } + }, + "type": "object", + "required": [ + "job_id", + "log_level", + "messages" + ], + "title": "JobLog", + "example": { + "job_id": "145beae4-a3a8-4fde-adbb-4e8257c2c083", + "log_level": 10, + "messages": [ + "PROGRESS: 5/10" + ], + "node_id": "3742215e-6756-48d2-8b73-4d043065309f" + } + }, + "JobLogsMap": { + "properties": { + "log_links": { + "items": { + "$ref": "#/components/schemas/LogLink" + }, + "type": "array", + "title": "Log Links", + "description": "Array of download links" + } + }, + "type": "object", + "required": [ + "log_links" + ], + "title": "JobLogsMap" + }, + "JobMetadata": { + "properties": { + "job_id": { + "type": "string", + "format": "uuid", + "title": "Job Id", + "description": "Parent Job" + }, + "metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "type": "object", + "title": "Metadata", + "description": "Custom key-value map" + }, + "url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "Link to get this resource (self)" + } + }, + "type": "object", + "required": [ + "job_id", + "metadata", + "url" + ], + "title": "JobMetadata", + "example": { + "job_id": "3497e4de-0e69-41fb-b08f-7f3875a1ac4b", + "metadata": { + "bool": "true", + "float": "3.14", + "int": "42", + "str": "hej med dig" + }, + "url": "https://f02b2452-1dd8-4882-b673-af06373b41b3.fake" + } + }, + "JobMetadataUpdate": { + "properties": { + "metadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "type": "object", + "title": "Metadata", + "description": "Custom key-value map" + } + }, + "type": "object", + "title": "JobMetadataUpdate", + "example": { + "metadata": { + "bool": "true", + "float": "3.14", + "int": "42", + "str": "hej med dig" + } + } + }, + "JobOutputs": { + "properties": { + "job_id": { + "type": "string", + "format": "uuid", + "title": "Job Id", + "description": "Job that produced this output" + }, + "results": { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/File" + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "title": "Results" + } + }, + "type": "object", + "required": [ + "job_id", + "results" + ], + "title": "JobOutputs", + "example": { + "job_id": "99d9ac65-9f10-4e2f-a433-b5e412bb037b", + "results": { + "enabled": false, + "maxSAR": 4.33, + "n": 55, + "output_file": { + "filename": "sar_matrix.txt", + "id": "0a3b2c56-dbcd-4871-b93b-d454b7883f9f" + }, + "title": "Specific Absorption Rate" + } + } + }, + "JobStatus": { + "properties": { + "job_id": { + "type": "string", + "format": "uuid", + "title": "Job Id" + }, + "state": { + "$ref": "#/components/schemas/RunningState" + }, + "progress": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "title": "Progress", + "default": 0 + }, + "submitted_at": { + "type": "string", + "format": "date-time", + "title": "Submitted At", + "description": "Last modification timestamp of the solver job" + }, + "started_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Started At", + "description": "Timestamp that indicate the moment the solver starts execution or None if the event did not occur" + }, + "stopped_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Stopped At", + "description": "Timestamp at which the solver finished or killed execution or None if the event did not occur" + } + }, + "type": "object", + "required": [ + "job_id", + "state", + "submitted_at" + ], + "title": "JobStatus", + "example": { + "job_id": "145beae4-a3a8-4fde-adbb-4e8257c2c083", + "progress": 3, + "started_at": "2021-04-01 07:16:43.670610", + "state": "STARTED", + "submitted_at": "2021-04-01 07:15:54.631007" + } + }, + "Links": { + "properties": { + "first": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "First" + }, + "last": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last" + }, + "self": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Self" + }, + "next": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next" + }, + "prev": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Prev" + } + }, + "type": "object", + "required": [ + "first", + "last", + "self", + "next", + "prev" + ], + "title": "Links" + }, + "LogLink": { + "properties": { + "node_name": { + "type": "string", + "title": "Node Name" + }, + "download_link": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri", + "title": "Download Link" + } + }, + "type": "object", + "required": [ + "node_name", + "download_link" + ], + "title": "LogLink" + }, + "Meta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + }, + "released": { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object", + "title": "Released", + "description": "Maps every route's path tag with a released version" + }, + "docs_url": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri", + "title": "Docs Url" + }, + "docs_dev_url": { + "type": "string", + "maxLength": 65536, + "minLength": 1, + "format": "uri", + "title": "Docs Dev Url" + } + }, + "type": "object", + "required": [ + "name", + "version", + "docs_url", + "docs_dev_url" + ], + "title": "Meta", + "example": { + "docs_dev_url": "https://api.osparc.io/dev/doc", + "docs_url": "https://api.osparc.io/dev/doc", + "name": "simcore_service_foo", + "released": { + "v1": "1.3.4", + "v2": "2.4.45" + }, + "version": "2.4.45" + } + }, + "OnePage_SolverPort_": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/SolverPort" + }, + "type": "array", + "title": "Items" + }, + "total": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Total" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "OnePage[SolverPort]" + }, + "OnePage_StudyPort_": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/StudyPort" + }, + "type": "array", + "title": "Items" + }, + "total": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Total" + } + }, + "type": "object", + "required": [ + "items" + ], + "title": "OnePage[StudyPort]" + }, + "Page_File_": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/File" + }, + "type": "array", + "title": "Items" + }, + "total": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Total" + }, + "limit": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ], + "title": "Limit" + }, + "offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Offset" + }, + "links": { + "$ref": "#/components/schemas/Links" + } + }, + "type": "object", + "required": [ + "items", + "total", + "limit", + "offset", + "links" + ], + "title": "Page[File]" + }, + "Page_Job_": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/Job" + }, + "type": "array", + "title": "Items" + }, + "total": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Total" + }, + "limit": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ], + "title": "Limit" + }, + "offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Offset" + }, + "links": { + "$ref": "#/components/schemas/Links" + } + }, + "type": "object", + "required": [ + "items", + "total", + "limit", + "offset", + "links" + ], + "title": "Page[Job]" + }, + "Page_Study_": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/Study" + }, + "type": "array", + "title": "Items" + }, + "total": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Total" + }, + "limit": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ], + "title": "Limit" + }, + "offset": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Offset" + }, + "links": { + "$ref": "#/components/schemas/Links" + } + }, + "type": "object", + "required": [ + "items", + "total", + "limit", + "offset", + "links" + ], + "title": "Page[Study]" + }, + "PricingPlanClassification": { + "type": "string", + "enum": [ + "TIER" + ], + "const": "TIER", + "title": "PricingPlanClassification" + }, + "PricingUnitGet": { + "properties": { + "pricingUnitId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricingunitid", + "minimum": 0 + }, + "unitName": { + "type": "string", + "title": "Unitname" + }, + "unitExtraInfo": { + "$ref": "#/components/schemas/UnitExtraInfo" + }, + "currentCostPerUnit": { + "type": "number", + "title": "Currentcostperunit" + }, + "default": { + "type": "boolean", + "title": "Default" + } + }, + "type": "object", + "required": [ + "pricingUnitId", + "unitName", + "unitExtraInfo", + "currentCostPerUnit", + "default" + ], + "title": "PricingUnitGet" + }, + "Profile": { + "properties": { + "first_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "First Name" + }, + "last_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "Last Name" + }, + "id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Id", + "minimum": 0 + }, + "login": { + "type": "string", + "format": "email", + "title": "Login" + }, + "role": { + "$ref": "#/components/schemas/UserRoleEnum" + }, + "groups": { + "anyOf": [ + { + "$ref": "#/components/schemas/Groups" + }, + { + "type": "null" + } + ] + }, + "gravatar_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 40 + }, + { + "type": "null" + } + ], + "title": "Gravatar Id", + "description": "md5 hash value of email to retrieve an avatar image from https://www.gravatar.com" + } + }, + "type": "object", + "required": [ + "id", + "login", + "role" + ], + "title": "Profile", + "example": { + "first_name": "James", + "gravatar_id": "9a8930a5b20d7048e37740bac5c1ca4f", + "groups": { + "all": { + "description": "all users", + "gid": "1", + "label": "Everyone" + }, + "me": { + "description": "primary group", + "gid": "123", + "label": "maxy" + }, + "organizations": [] + }, + "id": "20", + "last_name": "Maxwell", + "login": "james-maxwell@itis.swiss", + "role": "USER" + } + }, + "ProfileUpdate": { + "properties": { + "first_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "First Name" + }, + "last_name": { + "anyOf": [ + { + "type": "string", + "maxLength": 255 + }, + { + "type": "null" + } + ], + "title": "Last Name" + } + }, + "type": "object", + "title": "ProfileUpdate" + }, + "RunningState": { + "type": "string", + "enum": [ + "UNKNOWN", + "PUBLISHED", + "NOT_STARTED", + "PENDING", + "WAITING_FOR_RESOURCES", + "STARTED", + "SUCCESS", + "FAILED", + "ABORTED", + "WAITING_FOR_CLUSTER" + ], + "title": "RunningState", + "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" + }, + "ServicePricingPlanGet": { + "properties": { + "pricingPlanId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricingplanid", + "minimum": 0 + }, + "displayName": { + "type": "string", + "title": "Displayname" + }, + "description": { + "type": "string", + "title": "Description" + }, + "classification": { + "$ref": "#/components/schemas/PricingPlanClassification" + }, + "createdAt": { + "type": "string", + "format": "date-time", + "title": "Createdat" + }, + "pricingPlanKey": { + "type": "string", + "title": "Pricingplankey" + }, + "pricingUnits": { + "items": { + "$ref": "#/components/schemas/PricingUnitGet" + }, + "type": "array", + "title": "Pricingunits" + } + }, + "type": "object", + "required": [ + "pricingPlanId", + "displayName", + "description", + "classification", + "createdAt", + "pricingPlanKey", + "pricingUnits" + ], + "title": "ServicePricingPlanGet" + }, + "Solver": { + "properties": { + "id": { + "type": "string", + "pattern": "^simcore/services/comp/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Id", + "description": "Solver identifier" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version", + "description": "semantic version number of the node" + }, + "title": { + "type": "string", + "title": "Title", + "description": "Human readable name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "maintainer": { + "type": "string", + "title": "Maintainer" + }, + "url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "Link to get this resource" + } + }, + "type": "object", + "required": [ + "id", + "version", + "title", + "maintainer", + "url" + ], + "title": "Solver", + "description": "A released solver with a specific version", + "example": { + "description": "EM solver", + "id": "simcore/services/comp/isolve", + "maintainer": "info@itis.swiss", + "title": "iSolve", + "url": "https://api.osparc.io/v0/solvers/simcore%2Fservices%2Fcomp%2Fisolve/releases/2.1.1", + "version": "2.1.1" + } + }, + "SolverPort": { + "properties": { + "key": { + "type": "string", + "pattern": "^[^_\\W0-9]\\w*$", + "title": "Key name", + "description": "port identifier name" + }, + "kind": { + "type": "string", + "enum": [ + "input", + "output" + ], + "title": "Kind" + }, + "content_schema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Content Schema", + "description": "jsonschema for the port's value. SEE https://json-schema.org" + } + }, + "type": "object", + "required": [ + "key", + "kind" + ], + "title": "SolverPort", + "example": { + "content_schema": { + "maximum": 5, + "minimum": 0, + "title": "Sleep interval", + "type": "integer", + "x_unit": "second" + }, + "key": "input_2", + "kind": "input" + } + }, + "Study": { + "properties": { + "uid": { + "type": "string", + "format": "uuid", + "title": "Uid" + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Title" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + } + }, + "type": "object", + "required": [ + "uid" + ], + "title": "Study" + }, + "StudyPort": { + "properties": { + "key": { + "type": "string", + "format": "uuid", + "title": "Key name", + "description": "port identifier name.Correponds to the UUID of the parameter/probe node in the study" + }, + "kind": { + "type": "string", + "enum": [ + "input", + "output" + ], + "title": "Kind" + }, + "content_schema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Content Schema", + "description": "jsonschema for the port's value. SEE https://json-schema.org" + } + }, + "type": "object", + "required": [ + "key", + "kind" + ], + "title": "StudyPort", + "example": { + "content_schema": { + "maximum": 5, + "minimum": 0, + "title": "Sleep interval", + "type": "integer", + "x_unit": "second" + }, + "key": "f763658f-a89a-4a90-ace4-c44631290f12", + "kind": "input" + } + }, + "UnitExtraInfo": { + "properties": { + "CPU": { + "type": "integer", + "minimum": 0, + "title": "Cpu" + }, + "RAM": { + "type": "integer", + "minimum": 0, + "title": "Ram" + }, + "VRAM": { + "type": "integer", + "minimum": 0, + "title": "Vram" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "CPU", + "RAM", + "VRAM" + ], + "title": "UnitExtraInfo", + "description": "Custom information that is propagated to the frontend. Defined fields are mandatory." + }, + "UploadLinks": { + "properties": { + "abort_upload": { + "type": "string", + "title": "Abort Upload" + }, + "complete_upload": { + "type": "string", + "title": "Complete Upload" + } + }, + "type": "object", + "required": [ + "abort_upload", + "complete_upload" + ], + "title": "UploadLinks" + }, + "UploadedPart": { + "properties": { + "number": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Number", + "minimum": 0 + }, + "e_tag": { + "type": "string", + "title": "E Tag" + } + }, + "type": "object", + "required": [ + "number", + "e_tag" + ], + "title": "UploadedPart" + }, + "UserRoleEnum": { + "type": "string", + "enum": [ + "ANONYMOUS", + "GUEST", + "USER", + "TESTER", + "PRODUCT_OWNER", + "ADMIN" + ], + "title": "UserRoleEnum" + }, + "UsersGroup": { + "properties": { + "gid": { + "type": "string", + "title": "Gid" + }, + "label": { + "type": "string", + "title": "Label" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + } + }, + "type": "object", + "required": [ + "gid", + "label" + ], + "title": "UsersGroup" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "WalletGetWithAvailableCredits": { + "properties": { + "walletId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Walletid", + "minimum": 0 + }, + "name": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "owner": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Owner", + "minimum": 0 + }, + "thumbnail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Thumbnail" + }, + "status": { + "$ref": "#/components/schemas/WalletStatus" + }, + "created": { + "type": "string", + "format": "date-time", + "title": "Created" + }, + "modified": { + "type": "string", + "format": "date-time", + "title": "Modified" + }, + "availableCredits": { + "type": "number", + "title": "Availablecredits" + } + }, + "type": "object", + "required": [ + "walletId", + "name", + "description", + "owner", + "thumbnail", + "status", + "created", + "modified", + "availableCredits" + ], + "title": "WalletGetWithAvailableCredits" + }, + "WalletStatus": { + "type": "string", + "enum": [ + "ACTIVE", + "INACTIVE" + ], + "title": "WalletStatus" + } + }, + "securitySchemes": { + "HTTPBasic": { + "type": "http", + "scheme": "basic" + } + } + } +} diff --git a/services/catalog/openapi.json b/services/catalog/openapi.json new file mode 100644 index 00000000000..15f417f4f79 --- /dev/null +++ b/services/catalog/openapi.json @@ -0,0 +1,4178 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-catalog", + "description": "Manages and maintains a catalog of all published components (e.g. macro-algorithms, scripts, etc)", + "version": "0.6.0" + }, + "paths": { + "/": { + "get": { + "summary": "Check Service Health", + "operationId": "check_service_health__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/v0/": { + "get": { + "tags": [ + "diagnostics" + ], + "summary": "Check Service Health", + "operationId": "check_service_health_v0__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/v0/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_v0_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseMeta" + } + } + } + } + } + } + }, + "/v0/services/{service_key}/{service_version}/resources": { + "get": { + "tags": [ + "services" + ], + "summary": "Get Service Resources", + "operationId": "get_service_resources_v0_services__service_key___service_version__resources_get", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "description": "if passed, and that user has custom resources, they will be merged with default resources and returned.", + "title": "User Id" + }, + "description": "if passed, and that user has custom resources, they will be merged with default resources and returned." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "Response Get Service Resources V0 Services Service Key Service Version Resources Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/services/{service_key}/{service_version}/specifications": { + "get": { + "tags": [ + "services" + ], + "summary": "Get Service Specifications", + "operationId": "get_service_specifications_v0_services__service_key___service_version__specifications_get", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + }, + { + "name": "strict", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "if True only the version specs will be retrieved, if False the latest version will be used instead", + "default": false, + "title": "Strict" + }, + "description": "if True only the version specs will be retrieved, if False the latest version will be used instead" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceSpecificationsGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/services/{service_key}/{service_version}/ports": { + "get": { + "tags": [ + "services" + ], + "summary": "List Service Ports", + "description": "Returns a list of service ports starting with inputs and followed by outputs", + "operationId": "list_service_ports_v0_services__service_key___service_version__ports_get", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "User Id" + } + }, + { + "name": "x-simcore-products-name", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "X-Simcore-Products-Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServicePortGet" + }, + "title": "Response List Service Ports V0 Services Service Key Service Version Ports Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/services/{service_key}/{service_version}/accessRights": { + "get": { + "tags": [ + "services" + ], + "summary": "Get Service Access Rights", + "description": "Returns access rights information for provided service and product", + "operationId": "get_service_access_rights_v0_services__service_key___service_version__accessRights_get", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "User Id" + } + }, + { + "name": "x-simcore-products-name", + "in": "header", + "required": true, + "schema": { + "type": "string", + "title": "X-Simcore-Products-Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccessRightsGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/services": { + "get": { + "tags": [ + "services" + ], + "summary": "List Services", + "operationId": "list_services_v0_services_get", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + }, + { + "name": "details", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true, + "title": "Details" + } + }, + { + "name": "x-simcore-products-name", + "in": "header", + "required": true, + "schema": { + "type": "string", + "title": "X-Simcore-Products-Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceGet" + }, + "title": "Response List Services V0 Services Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v0/services/{service_key}/{service_version}": { + "get": { + "tags": [ + "services" + ], + "summary": "Get Service", + "operationId": "get_service_v0_services__service_key___service_version__get", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "User Id" + } + }, + { + "name": "x-simcore-products-name", + "in": "header", + "required": false, + "schema": { + "type": "string", + "title": "X-Simcore-Products-Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "services" + ], + "summary": "Update Service", + "operationId": "update_service_v0_services__service_key___service_version__patch", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "title": "User Id" + } + }, + { + "name": "x-simcore-products-name", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Simcore-Products-Name" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceUpdate" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Author": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the author" + }, + "email": { + "type": "string", + "format": "email", + "title": "Email", + "description": "Email address" + }, + "affiliation": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Affiliation" + } + }, + "type": "object", + "required": [ + "name", + "email" + ], + "title": "Author" + }, + "Badge": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Name of the subject" + }, + "image": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Image", + "description": "Url to the badge" + }, + "url": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Url", + "description": "Link to the status" + } + }, + "type": "object", + "required": [ + "name", + "image", + "url" + ], + "title": "Badge", + "example": { + "image": "https://img.shields.io/website-up-down-green-red/https/itisfoundation.github.io.svg?label=documentation", + "name": "osparc.io", + "url": "https://itisfoundation.github.io/" + } + }, + "BaseMeta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + }, + "released": { + "anyOf": [ + { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Released", + "description": "Maps every route's path tag with a released version" + } + }, + "type": "object", + "required": [ + "name", + "version" + ], + "title": "BaseMeta", + "example": { + "name": "simcore_service_foo", + "released": { + "v1": "1.3.4", + "v2": "2.4.45" + }, + "version": "2.4.45" + } + }, + "BindOptions": { + "properties": { + "Propagation": { + "anyOf": [ + { + "$ref": "#/components/schemas/Propagation" + }, + { + "type": "null" + } + ], + "description": "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." + }, + "NonRecursive": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Nonrecursive", + "description": "Disable recursive bind mount.", + "default": false + } + }, + "type": "object", + "title": "BindOptions", + "description": "Optional configuration for the `bind` type." + }, + "BootChoice": { + "properties": { + "label": { + "type": "string", + "title": "Label" + }, + "description": { + "type": "string", + "title": "Description" + } + }, + "type": "object", + "required": [ + "label", + "description" + ], + "title": "BootChoice" + }, + "BootMode": { + "type": "string", + "enum": [ + "CPU", + "GPU", + "MPI" + ], + "title": "BootMode" + }, + "BootOption": { + "properties": { + "label": { + "type": "string", + "title": "Label" + }, + "description": { + "type": "string", + "title": "Description" + }, + "default": { + "type": "string", + "title": "Default" + }, + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/BootChoice" + }, + "type": "object", + "title": "Items" + } + }, + "type": "object", + "required": [ + "label", + "description", + "default", + "items" + ], + "title": "BootOption" + }, + "Condition": { + "type": "string", + "enum": [ + "none", + "on-failure", + "any" + ], + "title": "Condition", + "description": "Condition for restart." + }, + "Config1": { + "properties": { + "File": { + "anyOf": [ + { + "$ref": "#/components/schemas/File1" + }, + { + "type": "null" + } + ], + "description": "File represents a specific target that is backed by a file.\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive\n" + }, + "Runtime": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Runtime", + "description": "Runtime represents a target that is not mounted into the\ncontainer but is used by the task\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually\n> exclusive\n" + }, + "ConfigID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Configid", + "description": "ConfigID represents the ID of the specific config that we're\nreferencing.\n" + }, + "ConfigName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Configname", + "description": "ConfigName is the name of the config that this references,\nbut this is just provided for lookup/display purposes. The\nconfig in the reference will be identified by its ID.\n" + } + }, + "type": "object", + "title": "Config1" + }, + "ContainerSpec": { + "properties": { + "Image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Image", + "description": "The image name to use for the container" + }, + "Labels": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Labels", + "description": "User-defined key/value data." + }, + "Command": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Command", + "description": "The command to be run in the image." + }, + "Args": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Args", + "description": "Arguments to the command." + }, + "Hostname": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Hostname", + "description": "The hostname to use for the container, as a valid\n[RFC 1123](https://tools.ietf.org/html/rfc1123) hostname.\n" + }, + "Env": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Env", + "description": "A list of environment variables in the form `VAR=value`.\n" + }, + "Dir": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Dir", + "description": "The working directory for commands to run in." + }, + "User": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User", + "description": "The user inside the container." + }, + "Groups": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Groups", + "description": "A list of additional groups that the container process will run as.\n" + }, + "Privileges": { + "anyOf": [ + { + "$ref": "#/components/schemas/Privileges" + }, + { + "type": "null" + } + ], + "description": "Security options for the container" + }, + "TTY": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Tty", + "description": "Whether a pseudo-TTY should be allocated." + }, + "OpenStdin": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Openstdin", + "description": "Open `stdin`" + }, + "ReadOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Readonly", + "description": "Mount the container's root filesystem as read only." + }, + "Mounts": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Mount" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Mounts", + "description": "Specification for mounts to be added to containers created as part\nof the service.\n" + }, + "StopSignal": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Stopsignal", + "description": "Signal to stop the container." + }, + "StopGracePeriod": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Stopgraceperiod", + "description": "Amount of time to wait for the container to terminate before\nforcefully killing it.\n" + }, + "HealthCheck": { + "anyOf": [ + { + "$ref": "#/components/schemas/HealthConfig" + }, + { + "type": "null" + } + ] + }, + "Hosts": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Hosts", + "description": "A list of hostname/IP mappings to add to the container's `hosts`\nfile. The format of extra hosts is specified in the\n[hosts(5)](http://man7.org/linux/man-pages/man5/hosts.5.html)\nman page:\n\n IP_address canonical_hostname [aliases...]\n" + }, + "DNSConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/DnsConfig" + }, + { + "type": "null" + } + ], + "description": "Specification for DNS related configurations in resolver configuration\nfile (`resolv.conf`).\n" + }, + "Secrets": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Secret" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Secrets", + "description": "Secrets contains references to zero or more secrets that will be\nexposed to the service.\n" + }, + "Configs": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Config1" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Configs", + "description": "Configs contains references to zero or more configs that will be\nexposed to the service.\n" + }, + "Isolation": { + "anyOf": [ + { + "$ref": "#/components/schemas/Isolation1" + }, + { + "type": "null" + } + ], + "description": "Isolation technology of the containers running the service.\n(Windows only)\n" + }, + "Init": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Init", + "description": "Run an init inside the container that forwards signals and reaps\nprocesses. This field is omitted if empty, and the default (as\nconfigured on the daemon) is used.\n" + }, + "Sysctls": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Sysctls", + "description": "Set kernel namedspaced parameters (sysctls) in the container.\nThe Sysctls option on services accepts the same sysctls as the\nare supported on containers. Note that while the same sysctls are\nsupported, no guarantees or checks are made about their\nsuitability for a clustered environment, and it's up to the user\nto determine whether a given sysctl will work properly in a\nService.\n" + }, + "CapabilityAdd": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Capabilityadd", + "description": "A list of kernel capabilities to add to the default set\nfor the container.\n" + }, + "CapabilityDrop": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Capabilitydrop", + "description": "A list of kernel capabilities to drop from the default set\nfor the container.\n" + }, + "Ulimits": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Ulimit" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Ulimits", + "description": "A list of resource limits to set in the container. For example: `{\"Name\": \"nofile\", \"Soft\": 1024, \"Hard\": 2048}`\"\n" + } + }, + "type": "object", + "title": "ContainerSpec", + "description": "Container spec for the service.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." + }, + "CredentialSpec": { + "properties": { + "Config": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config", + "description": "Load credential spec from a Swarm Config with the given ID.\nThe specified config must also be present in the Configs\nfield with the Runtime property set.\n\n


\n\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" + }, + "File": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "File", + "description": "Load credential spec from this file. The file is read by\nthe daemon, and must be present in the `CredentialSpecs`\nsubdirectory in the docker data directory, which defaults\nto `C:\\ProgramData\\Docker\\` on Windows.\n\nFor example, specifying `spec.json` loads\n`C:\\ProgramData\\Docker\\CredentialSpecs\\spec.json`.\n\n


\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" + }, + "Registry": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Registry", + "description": "Load credential spec from this value in the Windows\nregistry. The specified registry value must be located in:\n\n`HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Virtualization\\Containers\\CredentialSpecs`\n\n


\n\n\n> **Note**: `CredentialSpec.File`, `CredentialSpec.Registry`,\n> and `CredentialSpec.Config` are mutually exclusive.\n" + } + }, + "type": "object", + "title": "CredentialSpec", + "description": "CredentialSpec for managed service account (Windows only)" + }, + "DiscreteResourceSpec": { + "properties": { + "Kind": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Kind" + }, + "Value": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Value" + } + }, + "type": "object", + "title": "DiscreteResourceSpec" + }, + "DnsConfig": { + "properties": { + "Nameservers": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Nameservers", + "description": "The IP addresses of the name servers." + }, + "Search": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Search", + "description": "A search list for host-name lookup." + }, + "Options": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Options", + "description": "A list of internal resolver variables to be modified (e.g.,\n`debug`, `ndots:3`, etc.).\n" + } + }, + "type": "object", + "title": "DnsConfig", + "description": "Specification for DNS related configurations in resolver configuration\nfile (`resolv.conf`)." + }, + "DriverConfig": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "Name of the driver to use to create the volume." + }, + "Options": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Options", + "description": "key/value map of driver specific options." + } + }, + "type": "object", + "title": "DriverConfig", + "description": "Map of driver specific options" + }, + "EndpointPortConfig": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "Protocol": { + "anyOf": [ + { + "$ref": "#/components/schemas/Type" + }, + { + "type": "null" + } + ] + }, + "TargetPort": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Targetport", + "description": "The port inside the container." + }, + "PublishedPort": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Publishedport", + "description": "The port on the swarm hosts." + }, + "PublishMode": { + "anyOf": [ + { + "$ref": "#/components/schemas/PublishMode" + }, + { + "type": "null" + } + ], + "description": "The mode in which port is published.\n\n


\n\n- \"ingress\" makes the target port accessible on every node,\n regardless of whether there is a task for the service running on\n that node or not.\n- \"host\" bypasses the routing mesh and publish the port directly on\n the swarm node where that service is running.\n", + "default": "ingress" + } + }, + "type": "object", + "title": "EndpointPortConfig" + }, + "EndpointSpec": { + "properties": { + "Mode": { + "anyOf": [ + { + "$ref": "#/components/schemas/Mode1" + }, + { + "type": "null" + } + ], + "description": "The mode of resolution to use for internal load balancing between tasks.\n", + "default": "vip" + }, + "Ports": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EndpointPortConfig" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Ports", + "description": "List of exposed ports that this service is accessible on from the\noutside. Ports can only be provided if `vip` resolution mode is used.\n" + } + }, + "type": "object", + "title": "EndpointSpec", + "description": "Properties that can be configured to access and load balance a service." + }, + "FailureAction": { + "type": "string", + "enum": [ + "continue", + "pause", + "rollback" + ], + "title": "FailureAction", + "description": "Action to take if an updated task fails to run, or stops running\nduring the update." + }, + "FailureAction1": { + "type": "string", + "enum": [ + "continue", + "pause" + ], + "title": "FailureAction1", + "description": "Action to take if an rolled back task fails to run, or stops\nrunning during the rollback." + }, + "File": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "Name represents the final filename in the filesystem.\n" + }, + "UID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uid", + "description": "UID represents the file UID." + }, + "GID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Gid", + "description": "GID represents the file GID." + }, + "Mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Mode", + "description": "Mode represents the FileMode of the file." + } + }, + "type": "object", + "title": "File", + "description": "File represents a specific target that is backed by a file." + }, + "File1": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "Name represents the final filename in the filesystem.\n" + }, + "UID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uid", + "description": "UID represents the file UID." + }, + "GID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Gid", + "description": "GID represents the file GID." + }, + "Mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Mode", + "description": "Mode represents the FileMode of the file." + } + }, + "type": "object", + "title": "File1", + "description": "File represents a specific target that is backed by a file.\n\n


\n\n> **Note**: `Configs.File` and `Configs.Runtime` are mutually exclusive" + }, + "GenericResource": { + "properties": { + "NamedResourceSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/NamedResourceSpec" + }, + { + "type": "null" + } + ] + }, + "DiscreteResourceSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/DiscreteResourceSpec" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "GenericResource" + }, + "GenericResources": { + "items": { + "$ref": "#/components/schemas/GenericResource" + }, + "type": "array", + "title": "GenericResources", + "description": "User-defined resources can be either Integer resources (e.g, `SSD=3`) or\nString resources (e.g, `GPU=UUID1`)." + }, + "HTTPValidationError": { + "properties": { + "errors": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Validation errors" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "HealthConfig": { + "properties": { + "Test": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Test", + "description": "The test to perform. Possible values are:\n\n- `[]` inherit healthcheck from image or parent image\n- `[\"NONE\"]` disable healthcheck\n- `[\"CMD\", args...]` exec arguments directly\n- `[\"CMD-SHELL\", command]` run command with system's default shell\n" + }, + "Interval": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Interval", + "description": "The time to wait between checks in nanoseconds. It should be 0 or at\nleast 1000000 (1 ms). 0 means inherit.\n" + }, + "Timeout": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Timeout", + "description": "The time to wait before considering the check to have hung. It should\nbe 0 or at least 1000000 (1 ms). 0 means inherit.\n" + }, + "Retries": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Retries", + "description": "The number of consecutive failures needed to consider a container as\nunhealthy. 0 means inherit.\n" + }, + "StartPeriod": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Startperiod", + "description": "Start period for the container to initialize before starting\nhealth-retries countdown in nanoseconds. It should be 0 or at least\n1000000 (1 ms). 0 means inherit.\n" + } + }, + "type": "object", + "title": "HealthConfig", + "description": "A test to perform to check that the container is healthy." + }, + "ImageResources": { + "properties": { + "image": { + "type": "string", + "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", + "title": "Image", + "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." + }, + "resources": { + "additionalProperties": { + "$ref": "#/components/schemas/ResourceValue" + }, + "type": "object", + "title": "Resources" + }, + "boot_modes": { + "items": { + "$ref": "#/components/schemas/BootMode" + }, + "type": "array", + "title": "Boot Modes", + "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", + "default": [ + "CPU" + ] + } + }, + "type": "object", + "required": [ + "image", + "resources" + ], + "title": "ImageResources", + "example": { + "image": "simcore/service/dynamic/pretty-intense:1.0.0", + "resources": { + "AIRAM": { + "limit": 1, + "reservation": 1 + }, + "ANY_resource": { + "limit": "some_value", + "reservation": "some_value" + }, + "CPU": { + "limit": 4, + "reservation": 0.1 + }, + "RAM": { + "limit": 103079215104, + "reservation": 536870912 + }, + "VRAM": { + "limit": 1, + "reservation": 1 + } + } + } + }, + "Isolation1": { + "type": "string", + "enum": [ + "default", + "process", + "hyperv" + ], + "title": "Isolation1", + "description": "Isolation technology of the containers running the service.\n(Windows only)" + }, + "Limit": { + "properties": { + "NanoCPUs": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Nanocpus" + }, + "MemoryBytes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Memorybytes" + }, + "Pids": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pids", + "description": "Limits the maximum number of PIDs in the container. Set `0` for unlimited.\n", + "default": 0 + } + }, + "type": "object", + "title": "Limit", + "description": "An object describing a limit on resources which can be requested by a task." + }, + "LogDriver1": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "Options": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Options" + } + }, + "type": "object", + "title": "LogDriver1", + "description": "Specifies the log driver to use for tasks created from this spec. If\nnot present, the default one for the swarm will be used, finally\nfalling back to the engine default if not specified." + }, + "Mode": { + "properties": { + "Replicated": { + "anyOf": [ + { + "$ref": "#/components/schemas/Replicated" + }, + { + "type": "null" + } + ] + }, + "Global": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Global" + }, + "ReplicatedJob": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReplicatedJob" + }, + { + "type": "null" + } + ], + "description": "The mode used for services with a finite number of tasks that run\nto a completed state.\n" + }, + "GlobalJob": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Globaljob", + "description": "The mode used for services which run a task to the completed state\non each valid node.\n" + } + }, + "type": "object", + "title": "Mode", + "description": "Scheduling mode for the service." + }, + "Mode1": { + "type": "string", + "enum": [ + "vip", + "dnsrr" + ], + "title": "Mode1", + "description": "The mode of resolution to use for internal load balancing between tasks." + }, + "Mount": { + "properties": { + "Target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Target", + "description": "Container path." + }, + "Source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source", + "description": "Mount source (e.g. a volume name, a host path)." + }, + "Type": { + "anyOf": [ + { + "$ref": "#/components/schemas/Type2" + }, + { + "type": "null" + } + ], + "description": "The mount type. Available types:\n\n- `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.\n- `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.\n- `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.\n- `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container.\n" + }, + "ReadOnly": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Readonly", + "description": "Whether the mount should be read-only." + }, + "Consistency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Consistency", + "description": "The consistency requirement for the mount: `default`, `consistent`, `cached`, or `delegated`." + }, + "BindOptions": { + "anyOf": [ + { + "$ref": "#/components/schemas/BindOptions" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for the `bind` type." + }, + "VolumeOptions": { + "anyOf": [ + { + "$ref": "#/components/schemas/VolumeOptions" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for the `volume` type." + }, + "TmpfsOptions": { + "anyOf": [ + { + "$ref": "#/components/schemas/TmpfsOptions" + }, + { + "type": "null" + } + ], + "description": "Optional configuration for the `tmpfs` type." + } + }, + "type": "object", + "title": "Mount" + }, + "NamedResourceSpec": { + "properties": { + "Kind": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Kind" + }, + "Value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Value" + } + }, + "type": "object", + "title": "NamedResourceSpec" + }, + "NetworkAttachmentConfig": { + "properties": { + "Target": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Target", + "description": "The target network for attachment. Must be a network name or ID.\n" + }, + "Aliases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Aliases", + "description": "Discoverable alternate names for the service on this network.\n" + }, + "DriverOpts": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Driveropts", + "description": "Driver attachment options for the network target.\n" + } + }, + "type": "object", + "title": "NetworkAttachmentConfig", + "description": "Specifies how a service should be attached to a particular network." + }, + "NetworkAttachmentSpec": { + "properties": { + "ContainerID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Containerid", + "description": "ID of the container represented by this task" + } + }, + "type": "object", + "title": "NetworkAttachmentSpec", + "description": "Read-only spec type for non-swarm containers attached to swarm overlay\nnetworks.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." + }, + "Order": { + "type": "string", + "enum": [ + "stop-first", + "start-first" + ], + "title": "Order", + "description": "The order of operations when rolling out an updated task. Either\nthe old task is shut down before the new task is started, or the\nnew task is started before the old task is shut down." + }, + "Order1": { + "type": "string", + "enum": [ + "stop-first", + "start-first" + ], + "title": "Order1", + "description": "The order of operations when rolling back a task. Either the old\ntask is shut down before the new task is started, or the new task\nis started before the old task is shut down." + }, + "Placement": { + "properties": { + "Constraints": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Constraints", + "description": "An array of constraint expressions to limit the set of nodes where\na task can be scheduled. Constraint expressions can either use a\n_match_ (`==`) or _exclude_ (`!=`) rule. Multiple constraints find\nnodes that satisfy every expression (AND match). Constraints can\nmatch node or Docker Engine labels as follows:\n\nnode attribute | matches | example\n---------------------|--------------------------------|-----------------------------------------------\n`node.id` | Node ID | `node.id==2ivku8v2gvtg4`\n`node.hostname` | Node hostname | `node.hostname!=node-2`\n`node.role` | Node role (`manager`/`worker`) | `node.role==manager`\n`node.platform.os` | Node operating system | `node.platform.os==windows`\n`node.platform.arch` | Node architecture | `node.platform.arch==x86_64`\n`node.labels` | User-defined node labels | `node.labels.security==high`\n`engine.labels` | Docker Engine's labels | `engine.labels.operatingsystem==ubuntu-14.04`\n\n`engine.labels` apply to Docker Engine labels like operating system,\ndrivers, etc. Swarm administrators add `node.labels` for operational\npurposes by using the [`node update endpoint`](#operation/NodeUpdate).\n" + }, + "Preferences": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Preference" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Preferences", + "description": "Preferences provide a way to make the scheduler aware of factors\nsuch as topology. They are provided in order from highest to\nlowest precedence.\n" + }, + "MaxReplicas": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Maxreplicas", + "description": "Maximum number of replicas for per node (default value is 0, which\nis unlimited)\n", + "default": 0 + }, + "Platforms": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Platform" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Platforms", + "description": "Platforms stores all the platforms that the service's image can\nrun on. This field is used in the platform filter for scheduling.\nIf empty, then the platform filter is off, meaning there are no\nscheduling restrictions.\n" + } + }, + "type": "object", + "title": "Placement" + }, + "Platform": { + "properties": { + "Architecture": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Architecture", + "description": "Architecture represents the hardware architecture (for example,\n`x86_64`).\n" + }, + "OS": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Os", + "description": "OS represents the Operating System (for example, `linux` or `windows`).\n" + } + }, + "type": "object", + "title": "Platform", + "description": "Platform represents the platform (Arch/OS)." + }, + "PluginPrivilege": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "Description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "Value": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Value" + } + }, + "type": "object", + "title": "PluginPrivilege", + "description": "Describes a permission the user has to accept upon installing\nthe plugin." + }, + "PluginSpec": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "The name or 'alias' to use for the plugin." + }, + "Remote": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Remote", + "description": "The plugin image reference to use." + }, + "Disabled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Disabled", + "description": "Disable the plugin once scheduled." + }, + "PluginPrivilege": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PluginPrivilege" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Pluginprivilege" + } + }, + "type": "object", + "title": "PluginSpec", + "description": "Plugin spec for the service. *(Experimental release only.)*\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`." + }, + "Preference": { + "properties": { + "Spread": { + "anyOf": [ + { + "$ref": "#/components/schemas/Spread" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "Preference" + }, + "Privileges": { + "properties": { + "CredentialSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/CredentialSpec" + }, + { + "type": "null" + } + ], + "description": "CredentialSpec for managed service account (Windows only)" + }, + "SELinuxContext": { + "anyOf": [ + { + "$ref": "#/components/schemas/SeLinuxContext" + }, + { + "type": "null" + } + ], + "description": "SELinux labels of the container" + } + }, + "type": "object", + "title": "Privileges", + "description": "Security options for the container" + }, + "Propagation": { + "type": "string", + "enum": [ + "private", + "rprivate", + "shared", + "rshared", + "slave", + "rslave" + ], + "title": "Propagation", + "description": "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." + }, + "PublishMode": { + "type": "string", + "enum": [ + "ingress", + "host" + ], + "title": "PublishMode", + "description": "The mode in which port is published.\n\n


\n\n- \"ingress\" makes the target port accessible on every node,\n regardless of whether there is a task for the service running on\n that node or not.\n- \"host\" bypasses the routing mesh and publish the port directly on\n the swarm node where that service is running." + }, + "Replicated": { + "properties": { + "Replicas": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Replicas" + } + }, + "type": "object", + "title": "Replicated" + }, + "ReplicatedJob": { + "properties": { + "MaxConcurrent": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Maxconcurrent", + "description": "The maximum number of replicas to run simultaneously.\n", + "default": 1 + }, + "TotalCompletions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Totalcompletions", + "description": "The total number of replicas desired to reach the Completed\nstate. If unset, will default to the value of `MaxConcurrent`\n" + } + }, + "type": "object", + "title": "ReplicatedJob", + "description": "The mode used for services with a finite number of tasks that run\nto a completed state." + }, + "ResourceObject": { + "properties": { + "NanoCPUs": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Nanocpus" + }, + "MemoryBytes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Memorybytes" + }, + "GenericResources": { + "anyOf": [ + { + "$ref": "#/components/schemas/GenericResources" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "ResourceObject", + "description": "An object describing the resources which can be advertised by a node and\nrequested by a task." + }, + "ResourceValue": { + "properties": { + "limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Limit" + }, + "reservation": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Reservation" + } + }, + "type": "object", + "required": [ + "limit", + "reservation" + ], + "title": "ResourceValue" + }, + "Resources1": { + "properties": { + "Limits": { + "anyOf": [ + { + "$ref": "#/components/schemas/Limit" + }, + { + "type": "null" + } + ], + "description": "Define resources limits." + }, + "Reservations": { + "anyOf": [ + { + "$ref": "#/components/schemas/ResourceObject" + }, + { + "type": "null" + } + ], + "description": "Define resources reservation." + } + }, + "type": "object", + "title": "Resources1", + "description": "Resource requirements which apply to each individual container created\nas part of the service." + }, + "RestartPolicy1": { + "properties": { + "Condition": { + "anyOf": [ + { + "$ref": "#/components/schemas/Condition" + }, + { + "type": "null" + } + ], + "description": "Condition for restart." + }, + "Delay": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Delay", + "description": "Delay between restart attempts." + }, + "MaxAttempts": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Maxattempts", + "description": "Maximum attempts to restart a given container before giving up\n(default value is 0, which is ignored).\n", + "default": 0 + }, + "Window": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Window", + "description": "Windows is the time window used to evaluate the restart policy\n(default value is 0, which is unbounded).\n", + "default": 0 + } + }, + "type": "object", + "title": "RestartPolicy1", + "description": "Specification for the restart policy which applies to containers\ncreated as part of this service." + }, + "RollbackConfig": { + "properties": { + "Parallelism": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Parallelism", + "description": "Maximum number of tasks to be rolled back in one iteration (0 means\nunlimited parallelism).\n" + }, + "Delay": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Delay", + "description": "Amount of time between rollback iterations, in nanoseconds.\n" + }, + "FailureAction": { + "anyOf": [ + { + "$ref": "#/components/schemas/FailureAction1" + }, + { + "type": "null" + } + ], + "description": "Action to take if an rolled back task fails to run, or stops\nrunning during the rollback.\n" + }, + "Monitor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Monitor", + "description": "Amount of time to monitor each rolled back task for failures, in\nnanoseconds.\n" + }, + "MaxFailureRatio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Maxfailureratio", + "description": "The fraction of tasks that may fail during a rollback before the\nfailure action is invoked, specified as a floating point number\nbetween 0 and 1.\n", + "default": 0 + }, + "Order": { + "anyOf": [ + { + "$ref": "#/components/schemas/Order1" + }, + { + "type": "null" + } + ], + "description": "The order of operations when rolling back a task. Either the old\ntask is shut down before the new task is started, or the new task\nis started before the old task is shut down.\n" + } + }, + "type": "object", + "title": "RollbackConfig", + "description": "Specification for the rollback strategy of the service." + }, + "SeLinuxContext": { + "properties": { + "Disable": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Disable", + "description": "Disable SELinux" + }, + "User": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User", + "description": "SELinux user label" + }, + "Role": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Role", + "description": "SELinux role label" + }, + "Type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Type", + "description": "SELinux type label" + }, + "Level": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Level", + "description": "SELinux level label" + } + }, + "type": "object", + "title": "SeLinuxContext", + "description": "SELinux labels of the container" + }, + "Secret": { + "properties": { + "File": { + "anyOf": [ + { + "$ref": "#/components/schemas/File" + }, + { + "type": "null" + } + ], + "description": "File represents a specific target that is backed by a file.\n" + }, + "SecretID": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Secretid", + "description": "SecretID represents the ID of the specific secret that we're\nreferencing.\n" + }, + "SecretName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Secretname", + "description": "SecretName is the name of the secret that this references,\nbut this is just provided for lookup/display purposes. The\nsecret in the reference will be identified by its ID.\n" + } + }, + "type": "object", + "title": "Secret" + }, + "SelectBox": { + "properties": { + "structure": { + "items": { + "$ref": "#/components/schemas/Structure" + }, + "type": "array", + "minItems": 1, + "title": "Structure" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "structure" + ], + "title": "SelectBox" + }, + "ServiceAccessRightsGet": { + "properties": { + "service_key": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + }, + "service_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + }, + "gids_with_access_rights": { + "additionalProperties": { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + "type": "object", + "title": "Gids With Access Rights" + } + }, + "type": "object", + "required": [ + "service_key", + "service_version", + "gids_with_access_rights" + ], + "title": "ServiceAccessRightsGet" + }, + "ServiceGet": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "Display name: short, human readable name for the node" + }, + "thumbnail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Thumbnail", + "description": "url to the thumbnail" + }, + "description": { + "type": "string", + "title": "Description", + "description": "human readable description of the purpose of the node" + }, + "description_ui": { + "type": "boolean", + "title": "Description Ui", + "description": "A flag to enable the `description` to be presented as a single web page (=true) or in another structured format (default=false).", + "default": false + }, + "version_display": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version Display", + "description": "A user-friendly or marketing name for the release. This can be used to reference the release in a more readable and recognizable format, such as 'Matterhorn Release,' 'Spring Update,' or 'Holiday Edition.' This name is not used for version comparison but is useful for communication and documentation purposes." + }, + "deprecated": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deprecated", + "description": "Owner can set the date to retire the service. Three possibilities:If None, the service is marked as `published`;If now=deprecated, the service is retired" + }, + "classifiers": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Classifiers" + }, + "quality": { + "type": "object", + "title": "Quality", + "default": {} + }, + "accessRights": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/ServiceGroupAccessRights" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Accessrights", + "description": "service access rights per group id" + }, + "key": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Key", + "description": "distinctive name for the node based on the docker registry path" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version", + "description": "service version number" + }, + "release_date": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Release Date", + "description": "A timestamp when the specific version of the service was released. This field helps in tracking the timeline of releases and understanding the sequence of updates. A timestamp string should be formatted as YYYY-MM-DD[T]HH:MM[:SS[.ffffff]][Z or [\u00b1]HH[:]MM]" + }, + "integration-version": { + "anyOf": [ + { + "type": "string", + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + { + "type": "null" + } + ], + "title": "Integration-Version", + "description": "This version is used to maintain backward compatibility when there are changes in the way a service is integrated into the framework" + }, + "type": { + "$ref": "#/components/schemas/ServiceType", + "description": "service type" + }, + "badges": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Badge" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Badges", + "deprecated": true + }, + "authors": { + "items": { + "$ref": "#/components/schemas/Author" + }, + "type": "array", + "minItems": 1, + "title": "Authors" + }, + "contact": { + "type": "string", + "format": "email", + "title": "Contact", + "description": "email to correspond to the authors about the node" + }, + "inputs": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Inputs", + "description": "definition of the inputs of this node" + }, + "outputs": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Outputs", + "description": "definition of the outputs of this node" + }, + "boot-options": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Boot-Options", + "description": "Service defined boot options. These get injected in the service as env variables." + }, + "min-visible-inputs": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Min-Visible-Inputs", + "description": "The number of 'data type inputs' displayed by default in the UI. When None all 'data type inputs' are displayed." + }, + "progress_regexp": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Progress Regexp", + "description": "regexp pattern for detecting computational service's progress" + }, + "image_digest": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Image Digest", + "description": "Image manifest digest. Note that this is NOT injected as an image label" + }, + "owner": { + "anyOf": [ + { + "type": "string", + "format": "email" + }, + { + "type": "null" + } + ], + "title": "Owner", + "description": "None when the owner email cannot be found in the database" + } + }, + "type": "object", + "required": [ + "name", + "description", + "classifiers", + "key", + "version", + "type", + "authors", + "contact", + "inputs", + "outputs", + "owner" + ], + "title": "ServiceGet" + }, + "ServiceGroupAccessRights": { + "properties": { + "execute_access": { + "type": "boolean", + "title": "Execute Access", + "description": "defines whether the group can execute the service", + "default": false + }, + "write_access": { + "type": "boolean", + "title": "Write Access", + "description": "defines whether the group can modify the service", + "default": false + } + }, + "type": "object", + "title": "ServiceGroupAccessRights" + }, + "ServiceInput": { + "properties": { + "displayOrder": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Displayorder", + "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", + "deprecated": true + }, + "label": { + "type": "string", + "title": "Label", + "description": "short name for the property" + }, + "description": { + "type": "string", + "title": "Description", + "description": "description of the property" + }, + "type": { + "type": "string", + "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", + "title": "Type", + "description": "data type expected on this input glob matching for data type is allowed" + }, + "contentSchema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Contentschema", + "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" + }, + "fileToKeyMap": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filetokeymap", + "description": "Place the data associated with the named keys in files" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Unit", + "description": "Units, when it refers to a physical quantity", + "deprecated": true + }, + "defaultValue": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Defaultvalue", + "deprecated": true + }, + "widget": { + "anyOf": [ + { + "$ref": "#/components/schemas/Widget" + }, + { + "type": "null" + } + ], + "description": "custom widget to use instead of the default one determined from the data-type" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "label", + "description", + "type" + ], + "title": "ServiceInput", + "description": "Metadata on a service input port" + }, + "ServiceOutput": { + "properties": { + "displayOrder": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Displayorder", + "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", + "deprecated": true + }, + "label": { + "type": "string", + "title": "Label", + "description": "short name for the property" + }, + "description": { + "type": "string", + "title": "Description", + "description": "description of the property" + }, + "type": { + "type": "string", + "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", + "title": "Type", + "description": "data type expected on this input glob matching for data type is allowed" + }, + "contentSchema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Contentschema", + "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" + }, + "fileToKeyMap": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filetokeymap", + "description": "Place the data associated with the named keys in files" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Unit", + "description": "Units, when it refers to a physical quantity", + "deprecated": true + }, + "widget": { + "anyOf": [ + { + "$ref": "#/components/schemas/Widget" + }, + { + "type": "null" + } + ], + "description": "custom widget to use instead of the default one determined from the data-type", + "deprecated": true + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "label", + "description", + "type" + ], + "title": "ServiceOutput" + }, + "ServicePortGet": { + "properties": { + "key": { + "type": "string", + "pattern": "^[^_\\W0-9]\\w*$", + "title": "Key name", + "description": "port identifier name" + }, + "kind": { + "type": "string", + "enum": [ + "input", + "output" + ], + "title": "Kind" + }, + "content_media_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Content Media Type" + }, + "content_schema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Content Schema", + "description": "jsonschema for the port's value. SEE https://json-schema.org/understanding-json-schema/" + } + }, + "type": "object", + "required": [ + "key", + "kind" + ], + "title": "ServicePortGet", + "example": { + "content_schema": { + "maximum": 5, + "minimum": 0, + "title": "Sleep interval", + "type": "integer", + "x_unit": "second" + }, + "key": "input_1", + "kind": "input" + } + }, + "ServiceSpec": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "Name of the service." + }, + "Labels": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Labels", + "description": "User-defined key/value metadata." + }, + "TaskTemplate": { + "anyOf": [ + { + "$ref": "#/components/schemas/TaskSpec" + }, + { + "type": "null" + } + ] + }, + "Mode": { + "anyOf": [ + { + "$ref": "#/components/schemas/Mode" + }, + { + "type": "null" + } + ], + "description": "Scheduling mode for the service." + }, + "UpdateConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/UpdateConfig" + }, + { + "type": "null" + } + ], + "description": "Specification for the update strategy of the service." + }, + "RollbackConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/RollbackConfig" + }, + { + "type": "null" + } + ], + "description": "Specification for the rollback strategy of the service." + }, + "Networks": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/NetworkAttachmentConfig" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Networks", + "description": "Specifies which networks the service should attach to." + }, + "EndpointSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/EndpointSpec" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "ServiceSpec", + "description": "User modifiable configuration for a service." + }, + "ServiceSpecificationsGet": { + "properties": { + "sidecar": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceSpec" + }, + { + "type": "null" + } + ], + "description": "schedule-time specifications for the service sidecar (follows Docker Service creation API, see https://docs.docker.com/engine/api/v1.25/#operation/ServiceCreate)" + }, + "service": { + "anyOf": [ + { + "$ref": "#/components/schemas/ServiceSpec" + }, + { + "type": "null" + } + ], + "description": "schedule-time specifications specifications for the service (follows Docker Service creation API (specifically only the Resources part), see https://docs.docker.com/engine/api/v1.41/#tag/Service/operation/ServiceCreate" + } + }, + "type": "object", + "title": "ServiceSpecificationsGet" + }, + "ServiceType": { + "type": "string", + "enum": [ + "computational", + "dynamic", + "frontend", + "backend" + ], + "title": "ServiceType" + }, + "ServiceUpdate": { + "properties": { + "accessRights": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/ServiceGroupAccessRights" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Accessrights", + "description": "service access rights per group id" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "thumbnail": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Thumbnail" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "description_ui": { + "type": "boolean", + "title": "Description Ui", + "default": false + }, + "version_display": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version Display" + }, + "deprecated": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Deprecated", + "description": "Owner can set the date to retire the service. Three possibilities:If None, the service is marked as `published`;If now=deprecated, the service is retired" + }, + "classifiers": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Classifiers" + }, + "quality": { + "type": "object", + "title": "Quality", + "default": {} + } + }, + "type": "object", + "required": [ + "name", + "thumbnail", + "description", + "classifiers" + ], + "title": "ServiceUpdate", + "example": { + "accessRights": { + "1": { + "execute_access": false, + "write_access": false + }, + "2": { + "execute_access": true, + "write_access": true + }, + "44": { + "execute_access": false, + "write_access": false + } + }, + "classifiers": [ + "RRID:SCR_018997", + "RRID:SCR_019001" + ], + "description": "An interesting service that does something", + "name": "My Human Readable Service Name", + "quality": { + "annotations": { + "certificationLink": "", + "certificationStatus": "Uncertified", + "documentation": "", + "limitations": "", + "purpose": "", + "standards": "", + "vandv": "" + }, + "enabled": true, + "tsr": { + "r01": { + "level": 3, + "references": "" + }, + "r02": { + "level": 2, + "references": "" + }, + "r03": { + "level": 0, + "references": "" + }, + "r04": { + "level": 0, + "references": "" + }, + "r05": { + "level": 2, + "references": "" + }, + "r06": { + "level": 0, + "references": "" + }, + "r07": { + "level": 0, + "references": "" + }, + "r08": { + "level": 1, + "references": "" + }, + "r09": { + "level": 0, + "references": "" + }, + "r10": { + "level": 0, + "references": "" + } + } + } + } + }, + "Spread": { + "properties": { + "SpreadDescriptor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Spreaddescriptor", + "description": "label descriptor, such as `engine.labels.az`.\n" + } + }, + "type": "object", + "title": "Spread" + }, + "Structure": { + "properties": { + "key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "number" + } + ], + "title": "Key" + }, + "label": { + "type": "string", + "title": "Label" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "key", + "label" + ], + "title": "Structure" + }, + "TaskSpec": { + "properties": { + "PluginSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/PluginSpec" + }, + { + "type": "null" + } + ], + "description": "Plugin spec for the service. *(Experimental release only.)*\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" + }, + "ContainerSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/ContainerSpec" + }, + { + "type": "null" + } + ], + "description": "Container spec for the service.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" + }, + "NetworkAttachmentSpec": { + "anyOf": [ + { + "$ref": "#/components/schemas/NetworkAttachmentSpec" + }, + { + "type": "null" + } + ], + "description": "Read-only spec type for non-swarm containers attached to swarm overlay\nnetworks.\n\n


\n\n> **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are\n> mutually exclusive. PluginSpec is only used when the Runtime field\n> is set to `plugin`. NetworkAttachmentSpec is used when the Runtime\n> field is set to `attachment`.\n" + }, + "Resources": { + "anyOf": [ + { + "$ref": "#/components/schemas/Resources1" + }, + { + "type": "null" + } + ], + "description": "Resource requirements which apply to each individual container created\nas part of the service.\n" + }, + "RestartPolicy": { + "anyOf": [ + { + "$ref": "#/components/schemas/RestartPolicy1" + }, + { + "type": "null" + } + ], + "description": "Specification for the restart policy which applies to containers\ncreated as part of this service.\n" + }, + "Placement": { + "anyOf": [ + { + "$ref": "#/components/schemas/Placement" + }, + { + "type": "null" + } + ] + }, + "ForceUpdate": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Forceupdate", + "description": "A counter that triggers an update even if no relevant parameters have\nbeen changed.\n" + }, + "Runtime": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Runtime", + "description": "Runtime is the type of runtime specified for the task executor.\n" + }, + "Networks": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/NetworkAttachmentConfig" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Networks", + "description": "Specifies which networks the service should attach to." + }, + "LogDriver": { + "anyOf": [ + { + "$ref": "#/components/schemas/LogDriver1" + }, + { + "type": "null" + } + ], + "description": "Specifies the log driver to use for tasks created from this spec. If\nnot present, the default one for the swarm will be used, finally\nfalling back to the engine default if not specified.\n" + } + }, + "type": "object", + "title": "TaskSpec", + "description": "User modifiable task configuration." + }, + "TextArea": { + "properties": { + "minHeight": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Minheight", + "description": "minimum Height of the textarea", + "minimum": 0 + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "minHeight" + ], + "title": "TextArea" + }, + "TmpfsOptions": { + "properties": { + "SizeBytes": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Sizebytes", + "description": "The size for the tmpfs mount in bytes." + }, + "Mode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Mode", + "description": "The permission mode for the tmpfs mount in an integer." + } + }, + "type": "object", + "title": "TmpfsOptions", + "description": "Optional configuration for the `tmpfs` type." + }, + "Type": { + "type": "string", + "enum": [ + "tcp", + "udp", + "sctp" + ], + "title": "Type" + }, + "Type2": { + "type": "string", + "enum": [ + "bind", + "volume", + "tmpfs", + "npipe" + ], + "title": "Type2", + "description": "The mount type. Available types:\n\n- `bind` Mounts a file or directory from the host into the container. Must exist prior to creating the container.\n- `volume` Creates a volume with the given name and options (or uses a pre-existing volume with the same name and options). These are **not** removed when the container is removed.\n- `tmpfs` Create a tmpfs with the given options. The mount source cannot be specified for tmpfs.\n- `npipe` Mounts a named pipe from the host into the container. Must exist prior to creating the container." + }, + "Ulimit": { + "properties": { + "Name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "Name of ulimit" + }, + "Soft": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Soft", + "description": "Soft limit" + }, + "Hard": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Hard", + "description": "Hard limit" + } + }, + "type": "object", + "title": "Ulimit" + }, + "UpdateConfig": { + "properties": { + "Parallelism": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Parallelism", + "description": "Maximum number of tasks to be updated in one iteration (0 means\nunlimited parallelism).\n" + }, + "Delay": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Delay", + "description": "Amount of time between updates, in nanoseconds." + }, + "FailureAction": { + "anyOf": [ + { + "$ref": "#/components/schemas/FailureAction" + }, + { + "type": "null" + } + ], + "description": "Action to take if an updated task fails to run, or stops running\nduring the update.\n" + }, + "Monitor": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Monitor", + "description": "Amount of time to monitor each updated task for failures, in\nnanoseconds.\n" + }, + "MaxFailureRatio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Maxfailureratio", + "description": "The fraction of tasks that may fail during an update before the\nfailure action is invoked, specified as a floating point number\nbetween 0 and 1.\n", + "default": 0 + }, + "Order": { + "anyOf": [ + { + "$ref": "#/components/schemas/Order" + }, + { + "type": "null" + } + ], + "description": "The order of operations when rolling out an updated task. Either\nthe old task is shut down before the new task is started, or the\nnew task is started before the old task is shut down.\n" + } + }, + "type": "object", + "title": "UpdateConfig", + "description": "Specification for the update strategy of the service." + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VolumeOptions": { + "properties": { + "NoCopy": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Nocopy", + "description": "Populate volume with data from the target.", + "default": false + }, + "Labels": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Labels", + "description": "User-defined key/value metadata." + }, + "DriverConfig": { + "anyOf": [ + { + "$ref": "#/components/schemas/DriverConfig" + }, + { + "type": "null" + } + ], + "description": "Map of driver specific options" + } + }, + "type": "object", + "title": "VolumeOptions", + "description": "Optional configuration for the `volume` type." + }, + "Widget": { + "properties": { + "type": { + "$ref": "#/components/schemas/WidgetType", + "description": "type of the property" + }, + "details": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextArea" + }, + { + "$ref": "#/components/schemas/SelectBox" + } + ], + "title": "Details" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "type", + "details" + ], + "title": "Widget" + }, + "WidgetType": { + "type": "string", + "enum": [ + "TextArea", + "SelectBox" + ], + "title": "WidgetType" + } + } + } +} diff --git a/services/director-v2/openapi.json b/services/director-v2/openapi.json new file mode 100644 index 00000000000..a4183f53d9f --- /dev/null +++ b/services/director-v2/openapi.json @@ -0,0 +1,4548 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-director-v2", + "description": "Orchestrates the pipeline of services defined by the user", + "version": "2.3.0" + }, + "servers": [ + { + "url": "/", + "description": "Default server: requests directed to serving url" + }, + { + "url": "http://{host}:{port}", + "description": "Development server: can configure any base url", + "variables": { + "host": { + "default": "127.0.0.1" + }, + "port": { + "default": "8000" + } + } + } + ], + "paths": { + "/": { + "get": { + "summary": "Check Service Health", + "operationId": "check_service_health__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HealthCheckGet" + } + } + } + } + } + } + }, + "/meta": { + "get": { + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseMeta" + } + } + } + } + } + } + }, + "/v2/computations": { + "post": { + "tags": [ + "computations" + ], + "summary": "Create and optionally start a new computation", + "operationId": "create_computation_v2_computations_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationCreate" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationGet" + } + } + } + }, + "404": { + "description": "Project or pricing details not found" + }, + "406": { + "description": "Cluster not found" + }, + "503": { + "description": "Service not available" + }, + "422": { + "description": "Configuration error" + }, + "402": { + "description": "Payment required" + }, + "409": { + "description": "Project already started" + } + } + } + }, + "/v2/computations/{project_id}": { + "get": { + "tags": [ + "computations" + ], + "summary": "Returns a computation pipeline state", + "operationId": "get_computation_v2_computations__project_id__get", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "computations" + ], + "summary": "Deletes a computation pipeline", + "operationId": "delete_computation_v2_computations__project_id__delete", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationDelete" + } + } + } + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/computations/{project_id}:stop": { + "post": { + "tags": [ + "computations" + ], + "summary": "Stops a computation pipeline", + "operationId": "stop_computation_v2_computations__project_id__stop_post", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationStop" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ComputationGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/computations/{project_id}/tasks/-/logfile": { + "get": { + "tags": [ + "computations" + ], + "summary": "Gets computation task logs file after is done", + "description": "Returns download links to log-files of each task in a computation.\nEach log is only available when the corresponding task is done", + "operationId": "get_all_tasks_log_files_v2_computations__project_id__tasks___logfile_get", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TaskLogFileGet" + }, + "title": "Response Get All Tasks Log Files V2 Computations Project Id Tasks Logfile Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/computations/{project_id}/tasks/{node_uuid}/logfile": { + "get": { + "tags": [ + "computations" + ], + "summary": "Gets computation task logs file after is done", + "description": "Returns a link to download logs file of a give task.\nThe log is only available when the task is done", + "operationId": "get_task_log_file_v2_computations__project_id__tasks__node_uuid__logfile_get", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + }, + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TaskLogFileGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/computations/{project_id}/tasks/-/outputs:batchGet": { + "post": { + "tags": [ + "computations" + ], + "summary": "Gets all outputs for selected tasks", + "operationId": "get_batch_tasks_outputs_v2_computations__project_id__tasks___outputs_batchGet_post", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TasksSelection" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TasksOutputs" + } + } + } + }, + "404": { + "description": "Cannot find computation or the tasks in it" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services": { + "get": { + "tags": [ + "dynamic services" + ], + "summary": "returns a list of running interactive services filtered by user_id and/or project_idboth legacy (director-v0) and modern (director-v2)", + "operationId": "list_tracked_dynamic_services_v2_dynamic_services_get", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "User Id" + } + }, + { + "name": "project_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Project Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RunningDynamicServiceDetails" + }, + "title": "Response List Tracked Dynamic Services V2 Dynamic Services Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "dynamic services" + ], + "summary": "creates & starts the dynamic service", + "operationId": "create_dynamic_service_v2_dynamic_services_post", + "parameters": [ + { + "name": "x-dynamic-sidecar-request-dns", + "in": "header", + "required": true, + "schema": { + "type": "string", + "title": "X-Dynamic-Sidecar-Request-Dns" + } + }, + { + "name": "x-dynamic-sidecar-request-scheme", + "in": "header", + "required": true, + "schema": { + "type": "string", + "title": "X-Dynamic-Sidecar-Request-Scheme" + } + }, + { + "name": "x-simcore-user-agent", + "in": "header", + "required": true, + "schema": { + "type": "string", + "title": "X-Simcore-User-Agent" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DynamicServiceCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunningDynamicServiceDetails" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services/{node_uuid}": { + "get": { + "tags": [ + "dynamic services" + ], + "summary": "assembles the status for the dynamic-sidecar", + "operationId": "get_dynamic_sidecar_status_v2_dynamic_services__node_uuid__get", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunningDynamicServiceDetails" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "dynamic services" + ], + "summary": "stops previously spawned dynamic-sidecar", + "operationId": "stop_dynamic_service_v2_dynamic_services__node_uuid__delete", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + }, + { + "name": "can_save", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": true, + "title": "Can Save" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services/{node_uuid}:retrieve": { + "post": { + "tags": [ + "dynamic services" + ], + "summary": "Calls the dynamic service's retrieve endpoint with optional port_keys", + "operationId": "service_retrieve_data_on_ports_v2_dynamic_services__node_uuid__retrieve_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RetrieveDataIn" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RetrieveDataOutEnveloped" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services/{node_uuid}:restart": { + "post": { + "tags": [ + "dynamic services" + ], + "summary": "Calls the dynamic service's restart containers endpoint", + "operationId": "service_restart_containers_v2_dynamic_services__node_uuid__restart_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services/projects/{project_id}/-/networks": { + "patch": { + "tags": [ + "dynamic services" + ], + "summary": "Updates the project networks according to the current project's workbench", + "operationId": "update_projects_networks_v2_dynamic_services_projects__project_id____networks_patch", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_services/projects/{project_id}/inactivity": { + "get": { + "tags": [ + "dynamic services" + ], + "summary": "returns if the project is inactive", + "operationId": "get_project_inactivity_v2_dynamic_services_projects__project_id__inactivity_get", + "parameters": [ + { + "name": "project_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Project Id" + } + }, + { + "name": "max_inactivity_seconds", + "in": "query", + "required": true, + "schema": { + "type": "number", + "minimum": 0.0, + "title": "Max Inactivity Seconds" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetProjectInactivityResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters": { + "post": { + "tags": [ + "clusters" + ], + "summary": "Create a new cluster for a user", + "operationId": "create_cluster_v2_clusters_post", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterCreate" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "clusters" + ], + "summary": "Lists clusters for user", + "operationId": "list_clusters_v2_clusters_get", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ClusterGet" + }, + "title": "Response List Clusters V2 Clusters Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters/default": { + "get": { + "tags": [ + "clusters" + ], + "summary": "Returns the default cluster", + "operationId": "get_default_cluster_v2_clusters_default_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterGet" + } + } + } + } + } + } + }, + "/v2/clusters/{cluster_id}": { + "get": { + "tags": [ + "clusters" + ], + "summary": "Get one cluster for user", + "operationId": "get_cluster_v2_clusters__cluster_id__get", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "title": "Cluster Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "patch": { + "tags": [ + "clusters" + ], + "summary": "Modify a cluster for user", + "operationId": "update_cluster_v2_clusters__cluster_id__patch", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "title": "Cluster Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterPatch" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "clusters" + ], + "summary": "Remove a cluster for user", + "operationId": "delete_cluster_v2_clusters__cluster_id__delete", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "title": "Cluster Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters/default/details": { + "get": { + "tags": [ + "clusters" + ], + "summary": "Returns the cluster details", + "operationId": "get_default_cluster_details_v2_clusters_default_details_get", + "parameters": [ + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterDetailsGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters/{cluster_id}/details": { + "get": { + "tags": [ + "clusters" + ], + "summary": "Returns the cluster details", + "operationId": "get_cluster_details_v2_clusters__cluster_id__details_get", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "title": "Cluster Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterDetailsGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters:ping": { + "post": { + "tags": [ + "clusters" + ], + "summary": "Test cluster connection", + "operationId": "test_cluster_connection_v2_clusters_ping_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClusterPing" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/clusters/default:ping": { + "post": { + "tags": [ + "clusters" + ], + "summary": "Test cluster connection", + "operationId": "test_default_cluster_connection_v2_clusters_default_ping_post", + "responses": { + "204": { + "description": "Successful Response" + } + } + } + }, + "/v2/clusters/{cluster_id}:ping": { + "post": { + "tags": [ + "clusters" + ], + "summary": "Test cluster connection", + "operationId": "test_specific_cluster_connection_v2_clusters__cluster_id__ping_post", + "parameters": [ + { + "name": "cluster_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 0, + "title": "Cluster Id" + } + }, + { + "name": "user_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/observation": { + "patch": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Enable/disable observation of the service", + "operationId": "update_service_observation_v2_dynamic_scheduler_services__node_uuid__observation_patch", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ObservationItem" + } + } + } + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/containers": { + "delete": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Removes the service's user services", + "operationId": "delete_service_containers_v2_dynamic_scheduler_services__node_uuid__containers_delete", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Delete Service Containers V2 Dynamic Scheduler Services Node Uuid Containers Delete" + } + } + } + }, + "409": { + "description": "Task already running, cannot start a new one" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/state": { + "get": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Returns the internals of the scheduler for the given service", + "operationId": "get_service_state_v2_dynamic_scheduler_services__node_uuid__state_get", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchedulerData" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/state:save": { + "post": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Starts the saving of the state for the service", + "operationId": "save_service_state_v2_dynamic_scheduler_services__node_uuid__state_save_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Save Service State V2 Dynamic Scheduler Services Node Uuid State Save Post" + } + } + } + }, + "409": { + "description": "Task already running, cannot start a new one" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/outputs:push": { + "post": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Starts the pushing of the outputs for the service", + "operationId": "push_service_outputs_v2_dynamic_scheduler_services__node_uuid__outputs_push_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Push Service Outputs V2 Dynamic Scheduler Services Node Uuid Outputs Push Post" + } + } + } + }, + "409": { + "description": "Task already running, cannot start a new one" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/docker-resources": { + "delete": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Removes the service's sidecar, proxy and docker networks & volumes", + "operationId": "delete_service_docker_resources_v2_dynamic_scheduler_services__node_uuid__docker_resources_delete", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Delete Service Docker Resources V2 Dynamic Scheduler Services Node Uuid Docker Resources Delete" + } + } + } + }, + "409": { + "description": "Task already running, cannot start a new one" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/disk/reserved:free": { + "post": { + "tags": [ + "dynamic scheduler" + ], + "summary": "Free up reserved disk space", + "operationId": "free_reserved_disk_space_v2_dynamic_scheduler_services__node_uuid__disk_reserved_free_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "BaseMeta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + }, + "released": { + "anyOf": [ + { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Released", + "description": "Maps every route's path tag with a released version" + } + }, + "type": "object", + "required": [ + "name", + "version" + ], + "title": "BaseMeta", + "example": { + "name": "simcore_service_foo", + "released": { + "v1": "1.3.4", + "v2": "2.4.45" + }, + "version": "2.4.45" + } + }, + "BootMode": { + "type": "string", + "enum": [ + "CPU", + "GPU", + "MPI" + ], + "title": "BootMode" + }, + "CallbacksMapping": { + "properties": { + "metrics": { + "anyOf": [ + { + "$ref": "#/components/schemas/UserServiceCommand" + }, + { + "type": "null" + } + ], + "description": "command to recover prometheus metrics from a specific user service" + }, + "before_shutdown": { + "items": { + "$ref": "#/components/schemas/UserServiceCommand" + }, + "type": "array", + "title": "Before Shutdown", + "description": "commands to run before shutting down the user servicescommands get executed first to last, multiple commands for the sameuser services are allowed" + }, + "inactivity": { + "anyOf": [ + { + "$ref": "#/components/schemas/UserServiceCommand" + }, + { + "type": "null" + } + ], + "description": "command used to figure out for how much time the user service(s) were inactive for" + } + }, + "additionalProperties": false, + "type": "object", + "title": "CallbacksMapping" + }, + "ClusterAccessRights": { + "properties": { + "read": { + "type": "boolean", + "title": "Read", + "description": "allows to run pipelines on that cluster" + }, + "write": { + "type": "boolean", + "title": "Write", + "description": "allows to modify the cluster" + }, + "delete": { + "type": "boolean", + "title": "Delete", + "description": "allows to delete a cluster" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "read", + "write", + "delete" + ], + "title": "ClusterAccessRights" + }, + "ClusterCreate": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "The human readable name of the cluster" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "$ref": "#/components/schemas/ClusterTypeInModel" + }, + "owner": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Owner" + }, + "thumbnail": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Thumbnail", + "description": "url to the image describing this cluster" + }, + "endpoint": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Endpoint" + }, + "authentication": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimpleAuthentication" + }, + { + "$ref": "#/components/schemas/KerberosAuthentication" + }, + { + "$ref": "#/components/schemas/JupyterHubTokenAuthentication" + } + ], + "title": "Authentication", + "discriminator": { + "propertyName": "type", + "mapping": { + "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", + "kerberos": "#/components/schemas/KerberosAuthentication", + "simple": "#/components/schemas/SimpleAuthentication" + } + } + }, + "accessRights": { + "additionalProperties": { + "$ref": "#/components/schemas/ClusterAccessRights" + }, + "type": "object", + "title": "Accessrights" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name", + "type", + "endpoint", + "authentication" + ], + "title": "ClusterCreate" + }, + "ClusterDetailsGet": { + "properties": { + "scheduler": { + "$ref": "#/components/schemas/Scheduler", + "description": "This contains dask scheduler information given by the underlying dask library" + }, + "dashboard_link": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Dashboard Link", + "description": "Link to this scheduler's dashboard" + } + }, + "type": "object", + "required": [ + "scheduler", + "dashboard_link" + ], + "title": "ClusterDetailsGet" + }, + "ClusterGet": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "The human readable name of the cluster" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "$ref": "#/components/schemas/ClusterTypeInModel" + }, + "owner": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Owner", + "minimum": 0 + }, + "thumbnail": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Thumbnail", + "description": "url to the image describing this cluster" + }, + "endpoint": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Endpoint" + }, + "authentication": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimpleAuthentication" + }, + { + "$ref": "#/components/schemas/KerberosAuthentication" + }, + { + "$ref": "#/components/schemas/JupyterHubTokenAuthentication" + }, + { + "$ref": "#/components/schemas/NoAuthentication" + }, + { + "$ref": "#/components/schemas/TLSAuthentication" + } + ], + "title": "Authentication", + "description": "Dask gateway authentication", + "discriminator": { + "propertyName": "type", + "mapping": { + "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", + "kerberos": "#/components/schemas/KerberosAuthentication", + "none": "#/components/schemas/NoAuthentication", + "simple": "#/components/schemas/SimpleAuthentication", + "tls": "#/components/schemas/TLSAuthentication" + } + } + }, + "accessRights": { + "additionalProperties": { + "$ref": "#/components/schemas/ClusterAccessRights" + }, + "type": "object", + "title": "Accessrights", + "default": {} + }, + "id": { + "type": "integer", + "minimum": 0, + "title": "Id", + "description": "The cluster ID" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "name", + "type", + "owner", + "endpoint", + "authentication", + "id" + ], + "title": "ClusterGet" + }, + "ClusterPatch": { + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description" + }, + "type": { + "anyOf": [ + { + "$ref": "#/components/schemas/ClusterTypeInModel" + }, + { + "type": "null" + } + ] + }, + "owner": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Owner" + }, + "thumbnail": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Thumbnail" + }, + "endpoint": { + "anyOf": [ + { + "type": "string", + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Endpoint" + }, + "authentication": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/SimpleAuthentication" + }, + { + "$ref": "#/components/schemas/KerberosAuthentication" + }, + { + "$ref": "#/components/schemas/JupyterHubTokenAuthentication" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", + "kerberos": "#/components/schemas/KerberosAuthentication", + "simple": "#/components/schemas/SimpleAuthentication" + } + } + }, + { + "type": "null" + } + ], + "title": "Authentication" + }, + "accessRights": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/ClusterAccessRights" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Accessrights" + } + }, + "additionalProperties": false, + "type": "object", + "title": "ClusterPatch" + }, + "ClusterPing": { + "properties": { + "endpoint": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Endpoint" + }, + "authentication": { + "oneOf": [ + { + "$ref": "#/components/schemas/SimpleAuthentication" + }, + { + "$ref": "#/components/schemas/KerberosAuthentication" + }, + { + "$ref": "#/components/schemas/JupyterHubTokenAuthentication" + }, + { + "$ref": "#/components/schemas/NoAuthentication" + }, + { + "$ref": "#/components/schemas/TLSAuthentication" + } + ], + "title": "Authentication", + "description": "Dask gateway authentication", + "discriminator": { + "propertyName": "type", + "mapping": { + "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", + "kerberos": "#/components/schemas/KerberosAuthentication", + "none": "#/components/schemas/NoAuthentication", + "simple": "#/components/schemas/SimpleAuthentication", + "tls": "#/components/schemas/TLSAuthentication" + } + } + } + }, + "type": "object", + "required": [ + "endpoint", + "authentication" + ], + "title": "ClusterPing" + }, + "ClusterTypeInModel": { + "type": "string", + "enum": [ + "AWS", + "ON_PREMISE", + "ON_DEMAND" + ], + "title": "ClusterTypeInModel" + }, + "ComputationCreate": { + "properties": { + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "project_id": { + "type": "string", + "format": "uuid", + "title": "Project Id" + }, + "start_pipeline": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Start Pipeline", + "description": "if True the computation pipeline will start right away", + "default": false + }, + "product_name": { + "type": "string", + "title": "Product Name" + }, + "subgraph": { + "anyOf": [ + { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Subgraph", + "description": "An optional set of nodes that must be executed, if empty the whole pipeline is executed" + }, + "force_restart": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Force Restart", + "description": "if True will force re-running all dependent nodes", + "default": false + }, + "cluster_id": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Cluster Id", + "description": "the computation shall use the cluster described by its id, 0 is the default cluster" + }, + "simcore_user_agent": { + "type": "string", + "title": "Simcore User Agent", + "default": "" + }, + "use_on_demand_clusters": { + "type": "boolean", + "title": "Use On Demand Clusters", + "description": "if True, a cluster will be created as necessary (wallet_id cannot be None, and cluster_id must be None)", + "default": false + }, + "wallet_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/WalletInfo-Input" + }, + { + "type": "null" + } + ], + "description": "contains information about the wallet used to bill the running service" + } + }, + "type": "object", + "required": [ + "user_id", + "project_id", + "product_name" + ], + "title": "ComputationCreate" + }, + "ComputationDelete": { + "properties": { + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "force": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Force", + "description": "if True then the pipeline will be removed even if it is running", + "default": false + } + }, + "type": "object", + "required": [ + "user_id" + ], + "title": "ComputationDelete" + }, + "ComputationGet": { + "properties": { + "id": { + "type": "string", + "format": "uuid", + "title": "Id", + "description": "the id of the computation task" + }, + "state": { + "$ref": "#/components/schemas/RunningState", + "description": "the state of the computational task" + }, + "result": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Result", + "description": "the result of the computational task" + }, + "pipeline_details": { + "$ref": "#/components/schemas/PipelineDetails", + "description": "the details of the generated pipeline" + }, + "iteration": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Iteration", + "description": "the iteration id of the computation task (none if no task ran yet)" + }, + "cluster_id": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Cluster Id", + "description": "the cluster on which the computaional task runs/ran (none if no task ran yet)" + }, + "started": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Started", + "description": "the timestamp when the computation was started or None if not started yet" + }, + "stopped": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Stopped", + "description": "the timestamp when the computation was stopped or None if not started nor stopped yet" + }, + "submitted": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Submitted", + "description": "task last modification timestamp or None if the there is no task" + }, + "url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Url", + "description": "the link where to get the status of the task" + }, + "stop_url": { + "anyOf": [ + { + "type": "string", + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Stop Url", + "description": "the link where to stop the task" + } + }, + "type": "object", + "required": [ + "id", + "state", + "pipeline_details", + "iteration", + "cluster_id", + "started", + "stopped", + "submitted", + "url" + ], + "title": "ComputationGet" + }, + "ComputationStop": { + "properties": { + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + } + }, + "type": "object", + "required": [ + "user_id" + ], + "title": "ComputationStop" + }, + "ContainerState": { + "properties": { + "Status": { + "anyOf": [ + { + "$ref": "#/components/schemas/Status2" + }, + { + "type": "null" + } + ], + "description": "String representation of the container state. Can be one of \"created\",\n\"running\", \"paused\", \"restarting\", \"removing\", \"exited\", or \"dead\".\n" + }, + "Running": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Running", + "description": "Whether this container is running.\n\nNote that a running container can be _paused_. The `Running` and `Paused`\nbooleans are not mutually exclusive:\n\nWhen pausing a container (on Linux), the freezer cgroup is used to suspend\nall processes in the container. Freezing the process requires the process to\nbe running. As a result, paused containers are both `Running` _and_ `Paused`.\n\nUse the `Status` field instead to determine if a container's state is \"running\".\n" + }, + "Paused": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Paused", + "description": "Whether this container is paused." + }, + "Restarting": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Restarting", + "description": "Whether this container is restarting." + }, + "OOMKilled": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Oomkilled", + "description": "Whether this container has been killed because it ran out of memory.\n" + }, + "Dead": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Dead" + }, + "Pid": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pid", + "description": "The process ID of this container" + }, + "ExitCode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Exitcode", + "description": "The last exit code of this container" + }, + "Error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + }, + "StartedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Startedat", + "description": "The time when this container was last started." + }, + "FinishedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Finishedat", + "description": "The time when this container last exited." + }, + "Health": { + "anyOf": [ + { + "$ref": "#/components/schemas/Health" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "ContainerState", + "description": "ContainerState stores container's running state. It's part of ContainerJSONBase\nand will be returned by the \"inspect\" command." + }, + "DNSResolver": { + "properties": { + "address": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + }, + { + "type": "string" + } + ], + "title": "Address", + "description": "this is not an url address is derived from IP address" + }, + "port": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + } + ], + "title": "Port" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "address", + "port" + ], + "title": "DNSResolver" + }, + "DelayedExceptionHandler": { + "properties": { + "delay_for": { + "type": "number", + "minimum": 0.0, + "title": "Delay For", + "description": "interval of time during which exceptions are ignored" + } + }, + "type": "object", + "required": [ + "delay_for" + ], + "title": "DelayedExceptionHandler", + "description": "Allows to ignore an exception for an established\nperiod of time after which it is raised.\n\nThis use case most commonly occurs when dealing with\nexternal systems.\nFor example, due to poor network performance or\nnetwork congestion, an external system which is healthy,\ncurrently is not reachable any longer.\nA possible solution:\n- ignore exceptions for an interval in which the\n system usually is reachable again by not\n raising the error\n- if the error persist give up and raise it\n\nExample code usage:\n\n delayed_handler_external_service = DelayedExceptionHandler(\n delay_for=60\n )\n try:\n function_called_periodically_accessing_external_service()\n except TargetException as e:\n delayed_handler_external_service.try_to_raise(e)\n else:\n delayed_handler_external_service.else_reset()" + }, + "DictModel_str_Annotated_float__Gt__": { + "additionalProperties": { + "type": "number", + "exclusiveMinimum": true, + "minimum": 0.0 + }, + "type": "object", + "title": "DictModel[str, Annotated[float, Gt]]" + }, + "DockerContainerInspect": { + "properties": { + "container_state": { + "$ref": "#/components/schemas/ContainerState", + "description": "current state of container" + }, + "name": { + "type": "string", + "title": "Name", + "description": "docker name of the container" + }, + "id": { + "type": "string", + "title": "Id", + "description": "docker id of the container" + } + }, + "type": "object", + "required": [ + "container_state", + "name", + "id" + ], + "title": "DockerContainerInspect" + }, + "DynamicServiceCreate": { + "properties": { + "service_key": { + "type": "string", + "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key", + "description": "distinctive name for the node based on the docker registry path" + }, + "service_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version", + "description": "semantic version number of the node" + }, + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "project_id": { + "type": "string", + "format": "uuid", + "title": "Project Id" + }, + "service_uuid": { + "type": "string", + "format": "uuid", + "title": "Service Uuid" + }, + "service_basepath": { + "anyOf": [ + { + "type": "string", + "format": "path" + }, + { + "type": "null" + } + ], + "title": "Service Basepath", + "description": "predefined path where the dynamic service should be served. If empty, the service shall use the root endpoint." + }, + "service_resources": { + "type": "object", + "title": "Service Resources" + }, + "product_name": { + "type": "string", + "title": "Product Name", + "description": "Current product name" + }, + "can_save": { + "type": "boolean", + "title": "Can Save", + "description": "the service data must be saved when closing" + }, + "wallet_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/WalletInfo-Input" + }, + { + "type": "null" + } + ], + "description": "contains information about the wallet used to bill the running service" + }, + "pricing_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/PricingInfo" + }, + { + "type": "null" + } + ], + "description": "contains pricing information (ex. pricing plan and unit ids)" + }, + "hardware_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/HardwareInfo" + }, + { + "type": "null" + } + ], + "description": "contains harware information (ex. aws_ec2_instances)" + } + }, + "type": "object", + "required": [ + "service_key", + "service_version", + "user_id", + "project_id", + "service_uuid", + "service_resources", + "product_name", + "can_save" + ], + "title": "DynamicServiceCreate", + "example": { + "basepath": "/x/75c7f3f4-18f9-4678-8610-54a2ade78eaa", + "can_save": true, + "hardware_info": { + "aws_ec2_instances": [ + "c6a.4xlarge" + ] + }, + "key": "simcore/services/dynamic/3dviewer", + "node_uuid": "75c7f3f4-18f9-4678-8610-54a2ade78eaa", + "pricing_info": { + "pricing_plan_id": 1, + "pricing_unit_cost_id": 1, + "pricing_unit_id": 1 + }, + "product_name": "osparc", + "project_id": "dd1d04d9-d704-4f7e-8f0f-1ca60cc771fe", + "service_resources": { + "container": { + "boot_modes": [ + "CPU" + ], + "image": "simcore/services/dynamic/jupyter-math:2.0.5", + "resources": { + "CPU": { + "limit": 0.1, + "reservation": 0.1 + }, + "RAM": { + "limit": 2147483648, + "reservation": 2147483648 + } + } + } + }, + "user_id": 234, + "version": "2.4.5", + "wallet_info": { + "wallet_credit_amount": "10", + "wallet_id": 1, + "wallet_name": "My Wallet" + } + } + }, + "DynamicSidecar": { + "properties": { + "status": { + "$ref": "#/components/schemas/simcore_service_director_v2__models__dynamic_services_scheduler__Status", + "description": "status of the service sidecar also with additional information", + "default": { + "current": "ok", + "info": "" + } + }, + "is_ready": { + "type": "boolean", + "title": "Is Ready", + "description": "is True while the health check on the dynamic-sidecar is responding. Meaning that the dynamic-sidecar is reachable and can accept requests", + "default": false + }, + "was_compose_spec_submitted": { + "type": "boolean", + "title": "Was Compose Spec Submitted", + "description": "if the docker-compose spec was already submitted this fields is True", + "default": false + }, + "containers_inspect": { + "items": { + "$ref": "#/components/schemas/DockerContainerInspect" + }, + "type": "array", + "title": "Containers Inspect", + "description": "docker inspect results from all the container ran at regular intervals", + "default": [] + }, + "was_dynamic_sidecar_started": { + "type": "boolean", + "title": "Was Dynamic Sidecar Started", + "default": false + }, + "is_healthy": { + "type": "boolean", + "title": "Is Healthy", + "default": false + }, + "were_containers_created": { + "type": "boolean", + "title": "Were Containers Created", + "description": "when True no longer will the Docker api be used to check if the services were started", + "default": false + }, + "is_project_network_attached": { + "type": "boolean", + "title": "Is Project Network Attached", + "description": "When True, all containers were in running state and project networks were attached. Waiting for the container sto be in running state guarantees all containers have been created", + "default": false + }, + "is_service_environment_ready": { + "type": "boolean", + "title": "Is Service Environment Ready", + "description": "True when the environment setup required by the dynamic-sidecars created services was completed.Example: nodeports data downloaded, globally shared service data fetched, etc..", + "default": false + }, + "service_removal_state": { + "$ref": "#/components/schemas/ServiceRemovalState", + "description": "stores information used during service removal from the dynamic-sidecar scheduler" + }, + "wait_for_manual_intervention_after_error": { + "type": "boolean", + "title": "Wait For Manual Intervention After Error", + "description": "Marks the sidecar as untouchable since there was an error and important data might be lost. awaits for manual intervention.", + "default": false + }, + "wait_for_manual_intervention_logged": { + "type": "boolean", + "title": "Wait For Manual Intervention Logged", + "description": "True if a relative message was logged", + "default": false + }, + "were_state_and_outputs_saved": { + "type": "boolean", + "title": "Were State And Outputs Saved", + "description": "set True if the dy-sidecar saves the state and uploads the outputs", + "default": false + }, + "instrumentation": { + "$ref": "#/components/schemas/ServicesInstrumentation", + "description": "keeps track times for various operations" + }, + "dynamic_sidecar_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 25, + "pattern": "[A-Za-z0-9]{25}" + }, + { + "type": "null" + } + ], + "title": "Dynamic Sidecar Id", + "description": "returned by the docker engine; used for starting the proxy" + }, + "dynamic_sidecar_network_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 25, + "pattern": "[A-Za-z0-9]{25}" + }, + { + "type": "null" + } + ], + "title": "Dynamic Sidecar Network Id", + "description": "returned by the docker engine; used for starting the proxy" + }, + "swarm_network_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 25, + "pattern": "[A-Za-z0-9]{25}" + }, + { + "type": "null" + } + ], + "title": "Swarm Network Id", + "description": "returned by the docker engine; used for starting the proxy" + }, + "swarm_network_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Swarm Network Name", + "description": "used for starting the proxy" + }, + "docker_node_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Docker Node Id", + "description": "contains node id of the docker node where all services and created containers are started" + }, + "inspect_error_handler": { + "$ref": "#/components/schemas/DelayedExceptionHandler", + "description": "Set when the dy-sidecar can no longer be reached by the director-v2. If it will be possible to reach the dy-sidecar again, this value will be set to None.", + "default": { + "delay_for": 0.0 + } + } + }, + "type": "object", + "title": "DynamicSidecar" + }, + "DynamicSidecarStatus": { + "type": "string", + "enum": [ + "ok", + "failing" + ], + "title": "DynamicSidecarStatus" + }, + "GetProjectInactivityResponse": { + "properties": { + "is_inactive": { + "type": "boolean", + "title": "Is Inactive" + } + }, + "type": "object", + "required": [ + "is_inactive" + ], + "title": "GetProjectInactivityResponse" + }, + "HTTPValidationError": { + "properties": { + "errors": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Validation errors" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "HardwareInfo": { + "properties": { + "aws_ec2_instances": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Aws Ec2 Instances" + } + }, + "type": "object", + "required": [ + "aws_ec2_instances" + ], + "title": "HardwareInfo" + }, + "Health": { + "properties": { + "Status": { + "anyOf": [ + { + "$ref": "#/components/schemas/models_library__generated_models__docker_rest_api__Status" + }, + { + "type": "null" + } + ], + "description": "Status is one of `none`, `starting`, `healthy` or `unhealthy`\n\n- \"none\" Indicates there is no healthcheck\n- \"starting\" Starting indicates that the container is not yet ready\n- \"healthy\" Healthy indicates that the container is running correctly\n- \"unhealthy\" Unhealthy indicates that the container has a problem\n" + }, + "FailingStreak": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Failingstreak", + "description": "FailingStreak is the number of consecutive failures" + }, + "Log": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/HealthcheckResult" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Log", + "description": "Log contains the last few results (oldest first)\n" + } + }, + "type": "object", + "title": "Health", + "description": "Health stores information about the container's healthcheck results." + }, + "HealthCheckGet": { + "properties": { + "timestamp": { + "type": "string", + "title": "Timestamp" + } + }, + "type": "object", + "required": [ + "timestamp" + ], + "title": "HealthCheckGet", + "example": { + "timestamp": "simcore_service_directorv2.api.routes.health@2023-07-03T12:59:12.024551+00:00" + } + }, + "HealthcheckResult": { + "properties": { + "Start": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Start", + "description": "Date and time at which this check started in\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.\n" + }, + "End": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End", + "description": "Date and time at which this check ended in\n[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds.\n" + }, + "ExitCode": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Exitcode", + "description": "ExitCode meanings:\n\n- `0` healthy\n- `1` unhealthy\n- `2` reserved (considered unhealthy)\n- other values: error running probe\n" + }, + "Output": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Output", + "description": "Output from last check" + } + }, + "type": "object", + "title": "HealthcheckResult", + "description": "HealthcheckResult stores information about a single run of a healthcheck probe" + }, + "ImageResources": { + "properties": { + "image": { + "type": "string", + "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", + "title": "Image", + "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." + }, + "resources": { + "additionalProperties": { + "$ref": "#/components/schemas/ResourceValue" + }, + "type": "object", + "title": "Resources" + }, + "boot_modes": { + "items": { + "$ref": "#/components/schemas/BootMode" + }, + "type": "array", + "title": "Boot Modes", + "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", + "default": [ + "CPU" + ] + } + }, + "type": "object", + "required": [ + "image", + "resources" + ], + "title": "ImageResources", + "example": { + "image": "simcore/service/dynamic/pretty-intense:1.0.0", + "resources": { + "AIRAM": { + "limit": 1, + "reservation": 1 + }, + "ANY_resource": { + "limit": "some_value", + "reservation": "some_value" + }, + "CPU": { + "limit": 4, + "reservation": 0.1 + }, + "RAM": { + "limit": 103079215104, + "reservation": 536870912 + }, + "VRAM": { + "limit": 1, + "reservation": 1 + } + } + } + }, + "JupyterHubTokenAuthentication": { + "properties": { + "type": { + "type": "string", + "enum": [ + "jupyterhub" + ], + "const": "jupyterhub", + "title": "Type", + "default": "jupyterhub" + }, + "api_token": { + "type": "string", + "title": "Api Token" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "api_token" + ], + "title": "JupyterHubTokenAuthentication" + }, + "KerberosAuthentication": { + "properties": { + "type": { + "type": "string", + "enum": [ + "kerberos" + ], + "const": "kerberos", + "title": "Type", + "default": "kerberos" + } + }, + "additionalProperties": false, + "type": "object", + "title": "KerberosAuthentication" + }, + "NATRule": { + "properties": { + "hostname": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + }, + { + "type": "string" + } + ], + "title": "Hostname" + }, + "tcp_ports": { + "items": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + }, + { + "$ref": "#/components/schemas/_PortRange" + } + ] + }, + "type": "array", + "title": "Tcp Ports" + }, + "dns_resolver": { + "$ref": "#/components/schemas/DNSResolver", + "description": "specify a DNS resolver address and port" + } + }, + "type": "object", + "required": [ + "hostname", + "tcp_ports" + ], + "title": "NATRule", + "description": "Content of \"simcore.service.containers-allowed-outgoing-permit-list\" label" + }, + "NoAuthentication": { + "properties": { + "type": { + "type": "string", + "enum": [ + "none" + ], + "const": "none", + "title": "Type", + "default": "none" + } + }, + "additionalProperties": false, + "type": "object", + "title": "NoAuthentication" + }, + "NodeState": { + "properties": { + "modified": { + "type": "boolean", + "title": "Modified", + "description": "true if the node's outputs need to be re-computed", + "default": true + }, + "dependencies": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "uniqueItems": true, + "title": "Dependencies", + "description": "contains the node inputs dependencies if they need to be computed first" + }, + "currentStatus": { + "$ref": "#/components/schemas/RunningState", + "description": "the node's current state", + "default": "NOT_STARTED" + }, + "progress": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Progress", + "description": "current progress of the task if available (None if not started or not a computational task)", + "default": 0 + } + }, + "additionalProperties": false, + "type": "object", + "title": "NodeState" + }, + "ObservationItem": { + "properties": { + "is_disabled": { + "type": "boolean", + "title": "Is Disabled" + } + }, + "type": "object", + "required": [ + "is_disabled" + ], + "title": "ObservationItem" + }, + "PathMappingsLabel": { + "properties": { + "inputs_path": { + "type": "string", + "format": "path", + "title": "Inputs Path", + "description": "folder path where the service expects all the inputs" + }, + "outputs_path": { + "type": "string", + "format": "path", + "title": "Outputs Path", + "description": "folder path where the service is expected to provide all its outputs" + }, + "state_paths": { + "items": { + "type": "string", + "format": "path" + }, + "type": "array", + "title": "State Paths", + "description": "optional list of paths which contents need to be persisted" + }, + "state_exclude": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "State Exclude", + "description": "optional list unix shell rules used to exclude files from the state" + }, + "volume_size_limits": { + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Volume Size Limits", + "description": "Apply volume size limits to entries in: `inputs_path`, `outputs_path` and `state_paths`. Limits must be parsable by Pydantic's ByteSize." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "inputs_path", + "outputs_path" + ], + "title": "PathMappingsLabel", + "description": "Content of \"simcore.service.paths-mapping\" label" + }, + "PipelineDetails": { + "properties": { + "adjacency_list": { + "additionalProperties": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array" + }, + "type": "object", + "title": "Adjacency List", + "description": "The adjacency list of the current pipeline in terms of {NodeID: [successor NodeID]}" + }, + "progress": { + "anyOf": [ + { + "type": "number", + "maximum": 1.0, + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Progress", + "description": "the progress of the pipeline (None if there are no computational tasks)" + }, + "node_states": { + "additionalProperties": { + "$ref": "#/components/schemas/NodeState" + }, + "type": "object", + "title": "Node States", + "description": "The states of each of the computational nodes in the pipeline" + } + }, + "type": "object", + "required": [ + "adjacency_list", + "progress", + "node_states" + ], + "title": "PipelineDetails" + }, + "PricingInfo": { + "properties": { + "pricing_plan_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Plan Id", + "minimum": 0 + }, + "pricing_unit_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Unit Id", + "minimum": 0 + }, + "pricing_unit_cost_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Unit Cost Id", + "minimum": 0 + } + }, + "type": "object", + "required": [ + "pricing_plan_id", + "pricing_unit_id", + "pricing_unit_cost_id" + ], + "title": "PricingInfo" + }, + "ResourceValue": { + "properties": { + "limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Limit" + }, + "reservation": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Reservation" + } + }, + "type": "object", + "required": [ + "limit", + "reservation" + ], + "title": "ResourceValue" + }, + "RestartPolicy": { + "type": "string", + "enum": [ + "no-restart", + "on-inputs-downloaded" + ], + "title": "RestartPolicy", + "description": "Content of \"simcore.service.restart-policy\" label" + }, + "RetrieveDataIn": { + "properties": { + "port_keys": { + "items": { + "type": "string", + "pattern": "^[-_a-zA-Z0-9]+$" + }, + "type": "array", + "title": "Port Keys", + "description": "The port keys to retrieve data from" + } + }, + "type": "object", + "required": [ + "port_keys" + ], + "title": "RetrieveDataIn" + }, + "RetrieveDataOut": { + "properties": { + "size_bytes": { + "type": "integer", + "minimum": 0, + "title": "Size Bytes", + "description": "The amount of data transferred by the retrieve call" + } + }, + "type": "object", + "required": [ + "size_bytes" + ], + "title": "RetrieveDataOut" + }, + "RetrieveDataOutEnveloped": { + "properties": { + "data": { + "$ref": "#/components/schemas/RetrieveDataOut" + } + }, + "type": "object", + "required": [ + "data" + ], + "title": "RetrieveDataOutEnveloped" + }, + "RunningDynamicServiceDetails": { + "properties": { + "service_key": { + "type": "string", + "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key", + "description": "distinctive name for the node based on the docker registry path" + }, + "service_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version", + "description": "semantic version number of the node" + }, + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "project_id": { + "type": "string", + "format": "uuid", + "title": "Project Id" + }, + "service_uuid": { + "type": "string", + "format": "uuid", + "title": "Service Uuid" + }, + "service_basepath": { + "anyOf": [ + { + "type": "string", + "format": "path" + }, + { + "type": "null" + } + ], + "title": "Service Basepath", + "description": "predefined path where the dynamic service should be served. If empty, the service shall use the root endpoint." + }, + "boot_type": { + "$ref": "#/components/schemas/ServiceBootType", + "description": "Describes how the dynamic services was started (legacy=V0, modern=V2).Since legacy services do not have this label it defaults to V0.", + "default": "V0" + }, + "service_host": { + "type": "string", + "title": "Service Host", + "description": "the service swarm internal host name" + }, + "service_port": { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "title": "Service Port", + "description": "the service swarm internal port", + "maximum": 65535, + "minimum": 0 + }, + "published_port": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Published Port", + "description": "the service swarm published port if any", + "deprecated": true + }, + "entry_point": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Entry Point", + "description": "if empty the service entrypoint is on the root endpoint.", + "deprecated": true + }, + "service_state": { + "$ref": "#/components/schemas/ServiceState", + "description": "service current state" + }, + "service_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Service Message", + "description": "additional information related to service state" + } + }, + "type": "object", + "required": [ + "service_key", + "service_version", + "user_id", + "project_id", + "service_uuid", + "service_host", + "service_port", + "service_state" + ], + "title": "RunningDynamicServiceDetails" + }, + "RunningState": { + "type": "string", + "enum": [ + "UNKNOWN", + "PUBLISHED", + "NOT_STARTED", + "PENDING", + "WAITING_FOR_RESOURCES", + "STARTED", + "SUCCESS", + "FAILED", + "ABORTED", + "WAITING_FOR_CLUSTER" + ], + "title": "RunningState", + "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" + }, + "Scheduler": { + "properties": { + "status": { + "type": "string", + "title": "Status", + "description": "The running status of the scheduler" + }, + "workers": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/Worker" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Workers" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "Scheduler" + }, + "SchedulerData": { + "properties": { + "paths_mapping": { + "$ref": "#/components/schemas/PathMappingsLabel" + }, + "simcore.service.compose-spec": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Simcore.Service.Compose-Spec", + "description": "json encoded docker-compose specifications. see https://docs.docker.com/compose/compose-file/, only used by dynamic-sidecar." + }, + "simcore.service.container-http-entrypoint": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Simcore.Service.Container-Http-Entrypoint", + "description": "When a docker-compose specifications is provided, the container where the traffic must flow has to be specified. Required by dynamic-sidecar when compose_spec is set." + }, + "user_preferences_path": { + "anyOf": [ + { + "type": "string", + "format": "path" + }, + { + "type": "null" + } + ], + "title": "User Preferences Path" + }, + "simcore.service.restart-policy": { + "$ref": "#/components/schemas/RestartPolicy", + "description": "the dynamic-sidecar can restart all running containers on certain events. Supported events:\n- `no-restart` default\n- `on-inputs-downloaded` after inputs are downloaded\n", + "default": "no-restart" + }, + "simcore.service.containers-allowed-outgoing-permit-list": { + "anyOf": [ + { + "additionalProperties": { + "items": { + "$ref": "#/components/schemas/NATRule" + }, + "type": "array" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Simcore.Service.Containers-Allowed-Outgoing-Permit-List", + "description": "allow internet access to certain domain names and ports per container" + }, + "simcore.service.containers-allowed-outgoing-internet": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Simcore.Service.Containers-Allowed-Outgoing-Internet", + "description": "allow complete internet access to containers in here" + }, + "callbacks_mapping": { + "$ref": "#/components/schemas/CallbacksMapping" + }, + "service_key": { + "type": "string", + "pattern": "^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key", + "description": "distinctive name for the node based on the docker registry path" + }, + "service_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version", + "description": "semantic version number of the node" + }, + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "project_id": { + "type": "string", + "format": "uuid", + "title": "Project Id" + }, + "service_uuid": { + "type": "string", + "format": "uuid", + "title": "Service Uuid" + }, + "service_name": { + "type": "string", + "minLength": 2, + "title": "Service Name", + "description": "Name of the current dynamic-sidecar being observed" + }, + "run_id": { + "type": "string", + "title": "Run Id", + "description": "Uniquely identify the dynamic sidecar session (a.k.a. 2 subsequent exact same services will have a different run_id)" + }, + "hostname": { + "type": "string", + "title": "Hostname", + "description": "dy-sidecar's service hostname (provided by docker-swarm)" + }, + "port": { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "title": "Port", + "description": "dynamic-sidecar port", + "default": 8000, + "maximum": 65535, + "minimum": 0 + }, + "dynamic_sidecar": { + "$ref": "#/components/schemas/DynamicSidecar", + "description": "stores information fetched from the dynamic-sidecar" + }, + "dynamic_sidecar_network_name": { + "type": "string", + "title": "Dynamic Sidecar Network Name", + "description": "overlay network biding the proxy to the container spaned by the dynamic-sidecar" + }, + "simcore_traefik_zone": { + "type": "string", + "title": "Simcore Traefik Zone", + "description": "required for Traefik to correctly route requests to the spawned container" + }, + "service_port": { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "title": "Service Port", + "description": "port where the service is exposed defined by the service; NOTE: temporary default because it will be changed once the service is started, this value is fetched from the service start spec", + "default": 65534, + "maximum": 65535, + "minimum": 0 + }, + "service_resources": { + "type": "object", + "title": "Service Resources", + "description": "service resources used to enforce limits" + }, + "request_dns": { + "type": "string", + "title": "Request Dns", + "description": "used when configuring the CORS options on the proxy" + }, + "request_scheme": { + "type": "string", + "title": "Request Scheme", + "description": "used when configuring the CORS options on the proxy" + }, + "request_simcore_user_agent": { + "type": "string", + "title": "Request Simcore User Agent", + "description": "used as label to filter out the metrics from the cAdvisor prometheus metrics" + }, + "proxy_service_name": { + "type": "string", + "title": "Proxy Service Name", + "description": "service name given to the proxy" + }, + "proxy_admin_api_port": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Proxy Admin Api Port", + "description": "used as the admin endpoint API port" + }, + "wallet_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/WalletInfo-Output" + }, + { + "type": "null" + } + ], + "description": "contains information about the wallet used to bill the running service" + }, + "pricing_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/PricingInfo" + }, + { + "type": "null" + } + ], + "description": "contains pricing information so we know what is the cost of running of the service" + }, + "hardware_info": { + "anyOf": [ + { + "$ref": "#/components/schemas/HardwareInfo" + }, + { + "type": "null" + } + ], + "description": "contains harware information so we know on which hardware to run the service" + }, + "product_name": { + "type": "string", + "title": "Product Name", + "description": "Current product upon which this service is scheduled. If set to None, the current product is undefined. Mostly for backwards compatibility" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "paths_mapping", + "service_key", + "service_version", + "user_id", + "project_id", + "service_uuid", + "service_name", + "hostname", + "dynamic_sidecar", + "dynamic_sidecar_network_name", + "simcore_traefik_zone", + "service_resources", + "request_dns", + "request_scheme", + "request_simcore_user_agent" + ], + "title": "SchedulerData" + }, + "ServiceBootType": { + "type": "string", + "enum": [ + "V0", + "V2" + ], + "title": "ServiceBootType" + }, + "ServiceRemovalState": { + "properties": { + "can_remove": { + "type": "boolean", + "title": "Can Remove", + "description": "when True, marks the service as ready to be removed", + "default": false + }, + "can_save": { + "type": "boolean", + "title": "Can Save", + "description": "when True, saves the internal state and upload outputs of the service", + "default": false + }, + "was_removed": { + "type": "boolean", + "title": "Was Removed", + "description": "Will be True when the removal finished. Used primarily to cancel retrying long running operations.", + "default": false + } + }, + "type": "object", + "title": "ServiceRemovalState" + }, + "ServiceState": { + "type": "string", + "enum": [ + "failed", + "pending", + "pulling", + "starting", + "running", + "stopping", + "complete", + "idle" + ], + "title": "ServiceState" + }, + "ServicesInstrumentation": { + "properties": { + "start_requested_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Start Requested At", + "description": "moment in which the process of starting the service was requested" + }, + "close_requested_at": { + "anyOf": [ + { + "type": "string", + "format": "date-time" + }, + { + "type": "null" + } + ], + "title": "Close Requested At", + "description": "moment in which the process of stopping the service was requested" + } + }, + "type": "object", + "title": "ServicesInstrumentation" + }, + "SimpleAuthentication": { + "properties": { + "type": { + "type": "string", + "enum": [ + "simple" + ], + "const": "simple", + "title": "Type", + "default": "simple" + }, + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "format": "password", + "title": "Password", + "writeOnly": true + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "username", + "password" + ], + "title": "SimpleAuthentication" + }, + "Status2": { + "type": "string", + "enum": [ + "created", + "running", + "paused", + "restarting", + "removing", + "exited", + "dead" + ], + "title": "Status2", + "description": "String representation of the container state. Can be one of \"created\",\n\"running\", \"paused\", \"restarting\", \"removing\", \"exited\", or \"dead\"." + }, + "TLSAuthentication": { + "properties": { + "type": { + "type": "string", + "enum": [ + "tls" + ], + "const": "tls", + "title": "Type", + "default": "tls" + }, + "tls_ca_file": { + "type": "string", + "format": "path", + "title": "Tls Ca File" + }, + "tls_client_cert": { + "type": "string", + "format": "path", + "title": "Tls Client Cert" + }, + "tls_client_key": { + "type": "string", + "format": "path", + "title": "Tls Client Key" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tls_ca_file", + "tls_client_cert", + "tls_client_key" + ], + "title": "TLSAuthentication" + }, + "TaskCounts": { + "properties": { + "error": { + "type": "integer", + "title": "Error", + "default": 0 + }, + "memory": { + "type": "integer", + "title": "Memory", + "default": 0 + }, + "executing": { + "type": "integer", + "title": "Executing", + "default": 0 + } + }, + "type": "object", + "title": "TaskCounts" + }, + "TaskLogFileGet": { + "properties": { + "task_id": { + "type": "string", + "format": "uuid", + "title": "Task Id" + }, + "download_link": { + "anyOf": [ + { + "type": "string", + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Download Link", + "description": "Presigned link for log file or None if still not available" + } + }, + "type": "object", + "required": [ + "task_id" + ], + "title": "TaskLogFileGet" + }, + "TasksOutputs": { + "properties": { + "nodes_outputs": { + "additionalProperties": { + "type": "object" + }, + "type": "object", + "title": "Nodes Outputs" + } + }, + "type": "object", + "required": [ + "nodes_outputs" + ], + "title": "TasksOutputs" + }, + "TasksSelection": { + "properties": { + "nodes_ids": { + "items": { + "type": "string", + "format": "uuid" + }, + "type": "array", + "title": "Nodes Ids" + } + }, + "type": "object", + "required": [ + "nodes_ids" + ], + "title": "TasksSelection" + }, + "UsedResources": { + "additionalProperties": { + "type": "number", + "minimum": 0.0 + }, + "type": "object", + "title": "UsedResources" + }, + "UserServiceCommand": { + "properties": { + "service": { + "type": "string", + "title": "Service", + "description": "name of the docker-compose service in the docker-compose spec" + }, + "command": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "title": "Command", + "description": "command to run in container" + }, + "timeout": { + "type": "number", + "minimum": 0.0, + "title": "Timeout", + "description": "after this interval the command will be timed-out" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "service", + "command", + "timeout" + ], + "title": "UserServiceCommand" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "WalletInfo-Input": { + "properties": { + "wallet_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Wallet Id", + "minimum": 0 + }, + "wallet_name": { + "type": "string", + "title": "Wallet Name" + }, + "wallet_credit_amount": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Wallet Credit Amount" + } + }, + "type": "object", + "required": [ + "wallet_id", + "wallet_name", + "wallet_credit_amount" + ], + "title": "WalletInfo" + }, + "WalletInfo-Output": { + "properties": { + "wallet_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Wallet Id", + "minimum": 0 + }, + "wallet_name": { + "type": "string", + "title": "Wallet Name" + }, + "wallet_credit_amount": { + "type": "string", + "title": "Wallet Credit Amount" + } + }, + "type": "object", + "required": [ + "wallet_id", + "wallet_name", + "wallet_credit_amount" + ], + "title": "WalletInfo" + }, + "Worker": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "resources": { + "$ref": "#/components/schemas/DictModel_str_Annotated_float__Gt__" + }, + "used_resources": { + "$ref": "#/components/schemas/UsedResources" + }, + "memory_limit": { + "type": "integer", + "minimum": 0, + "title": "Memory Limit" + }, + "metrics": { + "$ref": "#/components/schemas/WorkerMetrics" + } + }, + "type": "object", + "required": [ + "id", + "name", + "resources", + "used_resources", + "memory_limit", + "metrics" + ], + "title": "Worker" + }, + "WorkerMetrics": { + "properties": { + "cpu": { + "type": "number", + "title": "Cpu", + "description": "consumed % of cpus" + }, + "memory": { + "type": "integer", + "minimum": 0, + "title": "Memory", + "description": "consumed memory" + }, + "num_fds": { + "type": "integer", + "title": "Num Fds", + "description": "consumed file descriptors" + }, + "task_counts": { + "$ref": "#/components/schemas/TaskCounts", + "description": "task details" + } + }, + "type": "object", + "required": [ + "cpu", + "memory", + "num_fds", + "task_counts" + ], + "title": "WorkerMetrics" + }, + "_PortRange": { + "properties": { + "lower": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + } + ], + "title": "Lower" + }, + "upper": { + "anyOf": [ + { + "type": "integer", + "exclusiveMaximum": true, + "exclusiveMinimum": true, + "maximum": 65535, + "minimum": 0 + }, + { + "type": "string", + "pattern": "^\\${1,2}(?:\\{)?OSPARC_VARIABLE_[A-Za-z0-9_]+(?:\\})?(:-.+)?$" + } + ], + "title": "Upper" + } + }, + "type": "object", + "required": [ + "lower", + "upper" + ], + "title": "_PortRange", + "description": "`lower` and `upper` are included" + }, + "models_library__generated_models__docker_rest_api__Status": { + "type": "string", + "enum": [ + "none", + "starting", + "healthy", + "unhealthy" + ], + "title": "Status", + "description": "Status is one of `none`, `starting`, `healthy` or `unhealthy`\n\n- \"none\" Indicates there is no healthcheck\n- \"starting\" Starting indicates that the container is not yet ready\n- \"healthy\" Healthy indicates that the container is running correctly\n- \"unhealthy\" Unhealthy indicates that the container has a problem" + }, + "simcore_service_director_v2__models__dynamic_services_scheduler__Status": { + "properties": { + "current": { + "$ref": "#/components/schemas/DynamicSidecarStatus", + "description": "status of the service" + }, + "info": { + "type": "string", + "title": "Info", + "description": "additional information for the user" + } + }, + "type": "object", + "required": [ + "current", + "info" + ], + "title": "Status", + "description": "Generated from data from docker container inspect API" + } + } + } +} diff --git a/services/dynamic-scheduler/openapi.json b/services/dynamic-scheduler/openapi.json new file mode 100644 index 00000000000..add75b123d2 --- /dev/null +++ b/services/dynamic-scheduler/openapi.json @@ -0,0 +1,93 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-dynamic-scheduler web API", + "description": "Service that manages lifecycle of dynamic services", + "version": "1.0.0" + }, + "paths": { + "/": { + "get": { + "summary": "Healthcheck", + "operationId": "healthcheck__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/v1/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_v1_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Meta" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Meta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + }, + "released": { + "anyOf": [ + { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Released", + "description": "Maps every route's path tag with a released version" + }, + "docs_url": { + "type": "string", + "title": "Docs Url" + } + }, + "type": "object", + "required": [ + "name", + "version", + "docs_url" + ], + "title": "Meta" + } + } + } +} diff --git a/services/dynamic-sidecar/openapi.json b/services/dynamic-sidecar/openapi.json new file mode 100644 index 00000000000..cccb9924cdc --- /dev/null +++ b/services/dynamic-sidecar/openapi.json @@ -0,0 +1,1514 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-dynamic-sidecar", + "description": "Implements a sidecar service to manage user's dynamic/interactive services", + "version": "1.2.0" + }, + "servers": [ + { + "url": "/", + "description": "Default server: requests directed to serving url" + }, + { + "url": "http://{host}:{port}", + "description": "Development server: can configure any base url", + "variables": { + "host": { + "default": "127.0.0.1" + }, + "port": { + "default": "8000" + } + } + } + ], + "paths": { + "/health": { + "get": { + "summary": "Health Endpoint", + "operationId": "health_endpoint_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationHealth" + } + } + } + }, + "503": { + "description": "Service is unhealthy" + } + } + } + }, + "/metrics": { + "get": { + "summary": "Metrics Endpoint", + "description": "Exposes metrics form the underlying user service.\n\nPossible responses:\n- HTTP 200 & empty body: user services did not start\n- HTTP 200 & prometheus metrics: was able to fetch data from user service\n- HTTP 500 & error message: something went wrong when fetching data from user service", + "operationId": "metrics_endpoint_metrics_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "500": { + "description": "error in recovering data from user service" + } + } + } + }, + "/v1/containers/compose-spec": { + "post": { + "tags": [ + "containers" + ], + "summary": "Store Compose Spec", + "description": "Validates and stores the docker compose spec for the user services.", + "operationId": "store_compose_spec_v1_containers_compose_spec_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainersComposeSpec" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "500": { + "description": "Errors in container" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers": { + "get": { + "tags": [ + "containers" + ], + "summary": "Containers Docker Inspect", + "description": "Returns entire docker inspect data, if only_state is True,\nthe status of the containers is returned", + "operationId": "containers_docker_inspect_v1_containers_get", + "parameters": [ + { + "name": "only_status", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "if True only show the status of the container", + "default": false, + "title": "Only Status" + }, + "description": "if True only show the status of the container" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "Response Containers Docker Inspect V1 Containers Get" + } + } + } + }, + "500": { + "description": "Errors in container" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "containers" + ], + "summary": "Starts the containers as defined in ContainerCreate by:\n- cleaning up resources from previous runs if any\n- starting the containers\n\nProgress may be obtained through URL\nProcess may be cancelled through URL", + "operationId": "create_service_containers_task_v1_containers_post", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainersCreate" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Create Service Containers Task V1 Containers Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/activity": { + "get": { + "tags": [ + "containers" + ], + "summary": "Get Containers Activity", + "operationId": "get_containers_activity_v1_containers_activity_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ActivityInfo" + }, + { + "type": "null" + } + ], + "title": "Response Get Containers Activity V1 Containers Activity Get" + } + } + } + } + } + } + }, + "/v1/containers/{id}/logs": { + "get": { + "tags": [ + "containers" + ], + "summary": "Get Container Logs", + "description": "Returns the logs of a given container if found", + "operationId": "get_container_logs_v1_containers__id__logs_get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "title": "Timestamp", + "description": "Only return logs since this time, as a UNIX timestamp", + "default": 0 + }, + "description": "Only return logs since this time, as a UNIX timestamp" + }, + { + "name": "until", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "title": "Timestamp", + "description": "Only return logs before this time, as a UNIX timestamp", + "default": 0 + }, + "description": "Only return logs before this time, as a UNIX timestamp" + }, + { + "name": "timestamps", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "title": "Display timestamps", + "description": "Enabling this parameter will include timestamps in logs", + "default": false + }, + "description": "Enabling this parameter will include timestamps in logs" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Response Get Container Logs V1 Containers Id Logs Get" + } + } + } + }, + "404": { + "description": "Container does not exists" + }, + "500": { + "description": "Errors in container" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/name": { + "get": { + "tags": [ + "containers" + ], + "summary": "Get Containers Name", + "description": "Searches for the container's name given the network\non which the proxy communicates with it.\nSupported filters:\n network: matches against the exact network name\n assigned to the container; `will include`\n containers\n exclude: matches if contained in the name of the\n container; `will exclude` containers", + "operationId": "get_containers_name_v1_containers_name_get", + "parameters": [ + { + "name": "filters", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "JSON encoded dictionary. FastAPI does not allow for dict as type in query parameters", + "title": "Filters" + }, + "description": "JSON encoded dictionary. FastAPI does not allow for dict as type in query parameters" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object" + } + ], + "title": "Response Get Containers Name V1 Containers Name Get" + } + } + } + }, + "404": { + "description": "No entrypoint container found or spec is not yet present" + }, + "422": { + "description": "Filters could not be parsed" + } + } + } + }, + "/v1/containers/{id}": { + "get": { + "tags": [ + "containers" + ], + "summary": "Inspect Container", + "description": "Returns information about the container, like docker inspect command", + "operationId": "inspect_container_v1_containers__id__get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "Response Inspect Container V1 Containers Id Get" + } + } + } + }, + "404": { + "description": "Container does not exist" + }, + "500": { + "description": "Errors in container" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/ports/io": { + "patch": { + "tags": [ + "containers" + ], + "summary": "Enable/disable ports i/o", + "operationId": "toggle_ports_io_v1_containers_ports_io_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchPortsIOItem" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/ports/outputs/dirs": { + "post": { + "tags": [ + "containers" + ], + "summary": "Creates the output directories declared by the docker images's labels. It is more convenient to pass the labels from director-v2, since it already has all the machinery to call into director-v0 to retrieve them.", + "operationId": "create_output_dirs_v1_containers_ports_outputs_dirs_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDirsRequestItem" + } + } + }, + "required": true + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/{id}/networks:attach": { + "post": { + "tags": [ + "containers" + ], + "summary": "attach container to a network, if not already attached", + "operationId": "attach_container_to_network_v1_containers__id__networks_attach_post", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AttachContainerToNetworkItem" + } + } + } + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/{id}/networks:detach": { + "post": { + "tags": [ + "containers" + ], + "summary": "detach container from a network, if not already detached", + "operationId": "detach_container_from_network_v1_containers__id__networks_detach_post", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DetachContainerFromNetworkItem" + } + } + } + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/images:pull": { + "post": { + "tags": [ + "containers" + ], + "summary": "Pulls all the docker container images for the user services", + "operationId": "pull_user_servcices_docker_images_v1_containers_images_pull_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Pull User Servcices Docker Images V1 Containers Images Pull Post" + } + } + } + } + } + } + }, + "/v1/containers:down": { + "post": { + "tags": [ + "containers" + ], + "summary": "Remove the previously started containers", + "operationId": "runs_docker_compose_down_task_v1_containers_down_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Runs Docker Compose Down Task V1 Containers Down Post" + } + } + } + } + } + } + }, + "/v1/containers/state:restore": { + "post": { + "tags": [ + "containers" + ], + "summary": "Restores the state of the dynamic service", + "operationId": "state_restore_task_v1_containers_state_restore_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response State Restore Task V1 Containers State Restore Post" + } + } + } + } + } + } + }, + "/v1/containers/state:save": { + "post": { + "tags": [ + "containers" + ], + "summary": "Stores the state of the dynamic service", + "operationId": "state_save_task_v1_containers_state_save_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response State Save Task V1 Containers State Save Post" + } + } + } + } + } + } + }, + "/v1/containers/ports/inputs:pull": { + "post": { + "tags": [ + "containers" + ], + "summary": "Pull input ports data", + "operationId": "ports_inputs_pull_task_v1_containers_ports_inputs_pull_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Port Keys" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Ports Inputs Pull Task V1 Containers Ports Inputs Pull Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/ports/outputs:pull": { + "post": { + "tags": [ + "containers" + ], + "summary": "Pull output ports data", + "operationId": "ports_outputs_pull_task_v1_containers_ports_outputs_pull_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Port Keys" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Ports Outputs Pull Task V1 Containers Ports Outputs Pull Post" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/containers/ports/outputs:push": { + "post": { + "tags": [ + "containers" + ], + "summary": "Push output ports data", + "operationId": "ports_outputs_push_task_v1_containers_ports_outputs_push_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Ports Outputs Push Task V1 Containers Ports Outputs Push Post" + } + } + } + } + } + } + }, + "/v1/containers:restart": { + "post": { + "tags": [ + "containers" + ], + "summary": "Restarts previously started containers", + "operationId": "containers_restart_task_v1_containers_restart_post", + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "string", + "title": "Response Containers Restart Task V1 Containers Restart Post" + } + } + } + } + } + } + }, + "/v1/volumes/{id}": { + "put": { + "tags": [ + "volumes" + ], + "summary": "Updates the state of the volume", + "operationId": "put_volume_state_v1_volumes__id__put", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "$ref": "#/components/schemas/VolumeCategory" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PutVolumeItem" + } + } + } + }, + "responses": { + "204": { + "description": "Successful Response" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/disk/reserved:free": { + "post": { + "tags": [ + "disk" + ], + "summary": "Frees up reserved disk space", + "operationId": "free_reserved_disk_space_v1_disk_reserved_free_post", + "responses": { + "204": { + "description": "Successful Response" + } + } + } + } + }, + "components": { + "schemas": { + "ActivityInfo": { + "properties": { + "seconds_inactive": { + "type": "number", + "minimum": 0.0, + "title": "Seconds Inactive" + } + }, + "type": "object", + "required": [ + "seconds_inactive" + ], + "title": "ActivityInfo" + }, + "ApplicationHealth": { + "properties": { + "is_healthy": { + "type": "boolean", + "title": "Is Healthy", + "description": "returns True if the service sis running correctly", + "default": true + }, + "error_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error Message", + "description": "in case of error this gets set" + } + }, + "type": "object", + "title": "ApplicationHealth" + }, + "AttachContainerToNetworkItem": { + "properties": { + "network_id": { + "type": "string", + "title": "Network Id" + }, + "network_aliases": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Network Aliases" + } + }, + "type": "object", + "required": [ + "network_id", + "network_aliases" + ], + "title": "AttachContainerToNetworkItem" + }, + "BootMode": { + "type": "string", + "enum": [ + "CPU", + "GPU", + "MPI" + ], + "title": "BootMode" + }, + "ContainersComposeSpec": { + "properties": { + "docker_compose_yaml": { + "type": "string", + "title": "Docker Compose Yaml" + } + }, + "type": "object", + "required": [ + "docker_compose_yaml" + ], + "title": "ContainersComposeSpec" + }, + "ContainersCreate": { + "properties": { + "metrics_params": { + "$ref": "#/components/schemas/CreateServiceMetricsAdditionalParams" + } + }, + "type": "object", + "required": [ + "metrics_params" + ], + "title": "ContainersCreate" + }, + "CreateDirsRequestItem": { + "properties": { + "outputs_labels": { + "additionalProperties": { + "$ref": "#/components/schemas/ServiceOutput" + }, + "type": "object", + "title": "Outputs Labels" + } + }, + "type": "object", + "required": [ + "outputs_labels" + ], + "title": "CreateDirsRequestItem" + }, + "CreateServiceMetricsAdditionalParams": { + "properties": { + "wallet_id": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Wallet Id" + }, + "wallet_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Wallet Name" + }, + "pricing_plan_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pricing Plan Id" + }, + "pricing_unit_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pricing Unit Id" + }, + "pricing_unit_cost_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Pricing Unit Cost Id" + }, + "product_name": { + "type": "string", + "title": "Product Name" + }, + "simcore_user_agent": { + "type": "string", + "title": "Simcore User Agent" + }, + "user_email": { + "type": "string", + "title": "User Email" + }, + "project_name": { + "type": "string", + "title": "Project Name" + }, + "node_name": { + "type": "string", + "title": "Node Name" + }, + "service_key": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + }, + "service_version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + }, + "service_resources": { + "type": "object", + "title": "Service Resources" + }, + "service_additional_metadata": { + "type": "object", + "title": "Service Additional Metadata" + } + }, + "type": "object", + "required": [ + "wallet_id", + "wallet_name", + "pricing_plan_id", + "pricing_unit_id", + "pricing_unit_cost_id", + "product_name", + "simcore_user_agent", + "user_email", + "project_name", + "node_name", + "service_key", + "service_version", + "service_resources", + "service_additional_metadata" + ], + "title": "CreateServiceMetricsAdditionalParams", + "example": { + "node_name": "the service of a lifetime _ *!", + "pricing_plan_id": 1, + "pricing_unit_detail_id": 1, + "pricing_unit_id": 1, + "product_name": "osparc", + "project_name": "_!New Study", + "service_additional_metadata": {}, + "service_key": "simcore/services/dynamic/test", + "service_resources": {}, + "service_version": "0.0.1", + "simcore_user_agent": "undefined", + "user_email": "test@test.com", + "wallet_id": 1, + "wallet_name": "a private wallet for me" + } + }, + "DetachContainerFromNetworkItem": { + "properties": { + "network_id": { + "type": "string", + "title": "Network Id" + } + }, + "type": "object", + "required": [ + "network_id" + ], + "title": "DetachContainerFromNetworkItem" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ImageResources": { + "properties": { + "image": { + "type": "string", + "pattern": "^(?:([a-z0-9-]+(?:\\.[a-z0-9-]+)+(?::\\d+)?|[a-z0-9-]+:\\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\\w][\\w.-]{0,127}))?(\\@sha256:[a-fA-F0-9]{32,64})?$", + "title": "Image", + "description": "Used by the frontend to provide a context for the users.Services with a docker-compose spec will have multiple entries.Using the `image:version` instead of the docker-compose spec is more helpful for the end user." + }, + "resources": { + "additionalProperties": { + "$ref": "#/components/schemas/ResourceValue" + }, + "type": "object", + "title": "Resources" + }, + "boot_modes": { + "items": { + "$ref": "#/components/schemas/BootMode" + }, + "type": "array", + "title": "Boot Modes", + "description": "describe how a service shall be booted, using CPU, MPI, openMP or GPU", + "default": [ + "CPU" + ] + } + }, + "type": "object", + "required": [ + "image", + "resources" + ], + "title": "ImageResources", + "example": { + "image": "simcore/service/dynamic/pretty-intense:1.0.0", + "resources": { + "AIRAM": { + "limit": 1, + "reservation": 1 + }, + "ANY_resource": { + "limit": "some_value", + "reservation": "some_value" + }, + "CPU": { + "limit": 4, + "reservation": 0.1 + }, + "RAM": { + "limit": 103079215104, + "reservation": 536870912 + }, + "VRAM": { + "limit": 1, + "reservation": 1 + } + } + } + }, + "PatchPortsIOItem": { + "properties": { + "enable_outputs": { + "type": "boolean", + "title": "Enable Outputs" + }, + "enable_inputs": { + "type": "boolean", + "title": "Enable Inputs" + } + }, + "type": "object", + "required": [ + "enable_outputs", + "enable_inputs" + ], + "title": "PatchPortsIOItem" + }, + "PutVolumeItem": { + "properties": { + "status": { + "$ref": "#/components/schemas/VolumeStatus" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "PutVolumeItem" + }, + "ResourceValue": { + "properties": { + "limit": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Limit" + }, + "reservation": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Reservation" + } + }, + "type": "object", + "required": [ + "limit", + "reservation" + ], + "title": "ResourceValue" + }, + "SelectBox": { + "properties": { + "structure": { + "items": { + "$ref": "#/components/schemas/Structure" + }, + "type": "array", + "minItems": 1, + "title": "Structure" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "structure" + ], + "title": "SelectBox" + }, + "ServiceOutput": { + "properties": { + "displayOrder": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Displayorder", + "description": "DEPRECATED: new display order is taken from the item position. This will be removed.", + "deprecated": true + }, + "label": { + "type": "string", + "title": "Label", + "description": "short name for the property" + }, + "description": { + "type": "string", + "title": "Description", + "description": "description of the property" + }, + "type": { + "type": "string", + "pattern": "^(number|integer|boolean|string|ref_contentSchema|data:([^/\\s,]+/[^/\\s,]+|\\[[^/\\s,]+/[^/\\s,]+(,[^/\\s]+/[^/,\\s]+)*\\]))$", + "title": "Type", + "description": "data type expected on this input glob matching for data type is allowed" + }, + "contentSchema": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Contentschema", + "description": "jsonschema of this input/output. Required when type='ref_contentSchema'" + }, + "fileToKeyMap": { + "anyOf": [ + { + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filetokeymap", + "description": "Place the data associated with the named keys in files" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Unit", + "description": "Units, when it refers to a physical quantity", + "deprecated": true + }, + "widget": { + "anyOf": [ + { + "$ref": "#/components/schemas/Widget" + }, + { + "type": "null" + } + ], + "description": "custom widget to use instead of the default one determined from the data-type", + "deprecated": true + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "label", + "description", + "type" + ], + "title": "ServiceOutput" + }, + "Structure": { + "properties": { + "key": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "number" + } + ], + "title": "Key" + }, + "label": { + "type": "string", + "title": "Label" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "key", + "label" + ], + "title": "Structure" + }, + "TextArea": { + "properties": { + "minHeight": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Minheight", + "description": "minimum Height of the textarea", + "minimum": 0 + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "minHeight" + ], + "title": "TextArea" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VolumeCategory": { + "type": "string", + "enum": [ + "OUTPUTS", + "INPUTS", + "STATES", + "SHARED_STORE" + ], + "title": "VolumeCategory", + "description": "These uniquely identify volumes which are mounted by\nthe dynamic-sidecar and user services.\n\nThis is primarily used to keep track of the status of\neach individual volume on the volumes.\n\nThe status is ingested by the agent and processed\nwhen the volume is removed." + }, + "VolumeStatus": { + "type": "string", + "enum": [ + "CONTENT_NEEDS_TO_BE_SAVED", + "CONTENT_WAS_SAVED", + "CONTENT_NO_SAVE_REQUIRED" + ], + "title": "VolumeStatus", + "description": "Used by the agent to figure out what to do with the data\npresent on the volume." + }, + "Widget": { + "properties": { + "type": { + "$ref": "#/components/schemas/WidgetType", + "description": "type of the property" + }, + "details": { + "anyOf": [ + { + "$ref": "#/components/schemas/TextArea" + }, + { + "$ref": "#/components/schemas/SelectBox" + } + ], + "title": "Details" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "type", + "details" + ], + "title": "Widget" + }, + "WidgetType": { + "type": "string", + "enum": [ + "TextArea", + "SelectBox" + ], + "title": "WidgetType" + } + } + } +} diff --git a/services/invitations/openapi.json b/services/invitations/openapi.json new file mode 100644 index 00000000000..6fe64f4702d --- /dev/null +++ b/services/invitations/openapi.json @@ -0,0 +1,456 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-invitations web API", + "description": "Service that manages creation and validation of registration invitations", + "version": "1.2.0" + }, + "paths": { + "/": { + "get": { + "summary": "Healthcheck", + "operationId": "healthcheck__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/v1/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_v1_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/_Meta" + } + } + } + } + } + } + }, + "/v1/invitations": { + "post": { + "tags": [ + "invitations" + ], + "summary": "Create Invitation", + "description": "Generates a new invitation code and returns its content and an invitation link", + "operationId": "create_invitation_v1_invitations_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiInvitationInputs" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiInvitationContentAndLink" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + }, + "/v1/invitations:extract": { + "post": { + "tags": [ + "invitations" + ], + "summary": "Extracts Invitation From Code", + "description": "Decrypts the invitation code and returns its content", + "operationId": "extracts_invitation_from_code_v1_invitations_extract_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiEncryptedInvitation" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiInvitationContent" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "HTTPBasic": [] + } + ] + } + } + }, + "components": { + "schemas": { + "ApiEncryptedInvitation": { + "properties": { + "invitation_url": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Invitation Url", + "description": "Invitation link" + } + }, + "type": "object", + "required": [ + "invitation_url" + ], + "title": "ApiEncryptedInvitation" + }, + "ApiInvitationContent": { + "properties": { + "issuer": { + "type": "string", + "maxLength": 40, + "minLength": 1, + "title": "Issuer", + "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" + }, + "guest": { + "type": "string", + "format": "email", + "title": "Guest", + "description": "Invitee's email. Note that the registration can ONLY be used with this email" + }, + "trial_account_days": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Trial Account Days", + "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" + }, + "extra_credits_in_usd": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Extra Credits In Usd", + "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" + }, + "product": { + "type": "string", + "title": "Product", + "description": "This invitations can only be used for this product." + }, + "created": { + "type": "string", + "format": "date-time", + "title": "Created", + "description": "Timestamp for creation" + } + }, + "type": "object", + "required": [ + "issuer", + "guest", + "product", + "created" + ], + "title": "ApiInvitationContent", + "example": { + "created": "2023-01-11 13:11:47.293595", + "guest": "invitedguest@company.com", + "issuer": "issuerid", + "product": "osparc", + "trial_account_days": 2 + } + }, + "ApiInvitationContentAndLink": { + "properties": { + "issuer": { + "type": "string", + "maxLength": 40, + "minLength": 1, + "title": "Issuer", + "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" + }, + "guest": { + "type": "string", + "format": "email", + "title": "Guest", + "description": "Invitee's email. Note that the registration can ONLY be used with this email" + }, + "trial_account_days": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Trial Account Days", + "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" + }, + "extra_credits_in_usd": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Extra Credits In Usd", + "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" + }, + "product": { + "type": "string", + "title": "Product", + "description": "This invitations can only be used for this product." + }, + "created": { + "type": "string", + "format": "date-time", + "title": "Created", + "description": "Timestamp for creation" + }, + "invitation_url": { + "type": "string", + "title": "Invitation Url", + "description": "Invitation link" + } + }, + "type": "object", + "required": [ + "issuer", + "guest", + "product", + "created", + "invitation_url" + ], + "title": "ApiInvitationContentAndLink", + "example": { + "created": "2023-01-11 13:11:47.293595", + "guest": "invitedguest@company.com", + "invitation_url": "https://foo.com/#/registration?invitation=1234", + "issuer": "issuerid", + "product": "osparc", + "trial_account_days": 2 + } + }, + "ApiInvitationInputs": { + "properties": { + "issuer": { + "type": "string", + "maxLength": 40, + "minLength": 1, + "title": "Issuer", + "description": "Identifies who issued the invitation. E.g. an email, a service name etc. NOTE: it will be trimmed if exceeds maximum" + }, + "guest": { + "type": "string", + "format": "email", + "title": "Guest", + "description": "Invitee's email. Note that the registration can ONLY be used with this email" + }, + "trial_account_days": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Trial Account Days", + "description": "If set, this invitation will activate a trial account.Sets the number of days from creation until the account expires" + }, + "extra_credits_in_usd": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "Extra Credits In Usd", + "description": "If set, the account's primary wallet will add extra credits corresponding to this ammount in USD" + }, + "product": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Product", + "description": "If None, it will use INVITATIONS_DEFAULT_PRODUCT" + } + }, + "type": "object", + "required": [ + "issuer", + "guest" + ], + "title": "ApiInvitationInputs", + "example": { + "guest": "invitedguest@company.com", + "issuer": "issuerid", + "trial_account_days": 2 + } + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "_Meta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "title": "Version" + }, + "docs_url": { + "type": "string", + "title": "Docs Url" + } + }, + "type": "object", + "required": [ + "name", + "version", + "docs_url" + ], + "title": "_Meta" + } + }, + "securitySchemes": { + "HTTPBasic": { + "type": "http", + "scheme": "basic" + } + } + } +} diff --git a/services/payments/openapi.json b/services/payments/openapi.json new file mode 100644 index 00000000000..a5f2198f99f --- /dev/null +++ b/services/payments/openapi.json @@ -0,0 +1,564 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-payments web API", + "description": "Service that manages creation and validation of registration payments", + "version": "1.4.0" + }, + "paths": { + "/": { + "get": { + "summary": "Healthcheck", + "operationId": "healthcheck__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/v1/token": { + "post": { + "tags": [ + "auth" + ], + "summary": "Login To Create Access Token", + "operationId": "login_to_create_access_token", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Body_login_to_create_access_token" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Token" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_v1_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Meta" + } + } + } + } + }, + "security": [ + { + "OAuth2PasswordBearer": [] + } + ] + } + }, + "/v1/payments/{payment_id}:ack": { + "post": { + "tags": [ + "acks" + ], + "summary": "Acknowledge Payment", + "description": "completes (ie. ack) request initated by `/init` on the payments-gateway API", + "operationId": "acknowledge_payment_v1_payments__payment_id__ack_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "payment_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "title": "Payment Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AckPayment" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/payments-methods/{payment_method_id}:ack": { + "post": { + "tags": [ + "acks" + ], + "summary": "Acknowledge Payment Method", + "description": "completes (ie. ack) request initated by `/payments-methods:init` on the payments-gateway API", + "operationId": "acknowledge_payment_method_v1_payments_methods__payment_method_id__ack_post", + "security": [ + { + "OAuth2PasswordBearer": [] + } + ], + "parameters": [ + { + "name": "payment_method_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "minLength": 1, + "maxLength": 100, + "title": "Payment Method Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AckPaymentMethod" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AckPayment": { + "properties": { + "success": { + "type": "boolean", + "title": "Success" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "provider_payment_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 100, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Provider Payment Id", + "description": "Payment ID from the provider (e.g. stripe payment ID)" + }, + "invoice_url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Invoice Url", + "description": "Link to invoice is required when success=true" + }, + "invoice_pdf": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Invoice Pdf", + "description": "Link to invoice PDF" + }, + "stripe_invoice_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 100, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Stripe Invoice Id", + "description": "Stripe invoice ID" + }, + "stripe_customer_id": { + "anyOf": [ + { + "type": "string", + "maxLength": 100, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Stripe Customer Id", + "description": "Stripe customer ID" + }, + "saved": { + "anyOf": [ + { + "$ref": "#/components/schemas/SavedPaymentMethod" + }, + { + "type": "null" + } + ], + "description": "Gets the payment-method if user opted to save it during payment.If used did not opt to save of payment-method was already saved, then it defaults to None" + } + }, + "type": "object", + "required": [ + "success" + ], + "title": "AckPayment", + "example": { + "invoice_url": "https://invoices.com/id=12345", + "provider_payment_id": "pi_123ABC", + "saved": { + "payment_method_id": "3FA85F64-5717-4562-B3FC-2C963F66AFA6", + "success": true + }, + "success": true + } + }, + "AckPaymentMethod": { + "properties": { + "success": { + "type": "boolean", + "title": "Success" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + } + }, + "type": "object", + "required": [ + "success" + ], + "title": "AckPaymentMethod" + }, + "Body_login_to_create_access_token": { + "properties": { + "grant_type": { + "anyOf": [ + { + "type": "string", + "pattern": "password" + }, + { + "type": "null" + } + ], + "title": "Grant Type" + }, + "username": { + "type": "string", + "title": "Username" + }, + "password": { + "type": "string", + "title": "Password" + }, + "scope": { + "type": "string", + "title": "Scope", + "default": "" + }, + "client_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Client Id" + }, + "client_secret": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Client Secret" + } + }, + "type": "object", + "required": [ + "username", + "password" + ], + "title": "Body_login_to_create_access_token" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "Meta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" + }, + "released": { + "anyOf": [ + { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Released", + "description": "Maps every route's path tag with a released version" + }, + "docs_url": { + "type": "string", + "title": "Docs Url" + } + }, + "type": "object", + "required": [ + "name", + "version", + "docs_url" + ], + "title": "Meta", + "example": { + "docs_url": "https://foo.io/doc", + "name": "simcore_service_payments", + "version": "2.4.45" + } + }, + "SavedPaymentMethod": { + "properties": { + "success": { + "type": "boolean", + "title": "Success" + }, + "message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message" + }, + "payment_method_id": { + "type": "string", + "maxLength": 100, + "minLength": 1, + "title": "Payment Method Id" + } + }, + "type": "object", + "required": [ + "success", + "payment_method_id" + ], + "title": "SavedPaymentMethod" + }, + "Token": { + "properties": { + "access_token": { + "type": "string", + "title": "Access Token" + }, + "token_type": { + "type": "string", + "const": "bearer", + "title": "Token Type" + } + }, + "type": "object", + "required": [ + "access_token", + "token_type" + ], + "title": "Token" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + }, + "securitySchemes": { + "OAuth2PasswordBearer": { + "type": "oauth2", + "flows": { + "password": { + "scopes": {}, + "tokenUrl": "/v1/token" + } + } + } + } + } +} diff --git a/services/resource-usage-tracker/openapi.json b/services/resource-usage-tracker/openapi.json new file mode 100644 index 00000000000..6aa53c7118c --- /dev/null +++ b/services/resource-usage-tracker/openapi.json @@ -0,0 +1,600 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "simcore-service-resource-usage-tracker web API", + "description": "Service that collects and stores computational resources usage used in osparc-simcore", + "version": "1.0.0" + }, + "paths": { + "/": { + "get": { + "summary": "Healthcheck", + "operationId": "healthcheck__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/v1/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata_v1_meta_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/_Meta" + } + } + } + } + } + } + }, + "/v1/credit-transactions/credits:sum": { + "post": { + "tags": [ + "credit-transactions" + ], + "summary": "Sum total available credits in the wallet", + "operationId": "get_credit_transactions_sum_v1_credit_transactions_credits_sum_post", + "parameters": [ + { + "name": "product_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Product Name" + } + }, + { + "name": "wallet_id", + "in": "query", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Wallet Id", + "minimum": 0 + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WalletTotalCredits" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/credit-transactions": { + "post": { + "tags": [ + "credit-transactions" + ], + "summary": "Top up credits for specific wallet", + "operationId": "create_credit_transaction_v1_credit_transactions_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreditTransactionCreateBody" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreditTransactionCreated" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/services/{service_key}/{service_version}/pricing-plan": { + "get": { + "tags": [ + "pricing-plans" + ], + "summary": "Get Service Default Pricing Plan", + "description": "Returns a default pricing plan with pricing details for a specified service", + "operationId": "get_service_default_pricing_plan", + "parameters": [ + { + "name": "service_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$", + "title": "Service Key" + } + }, + { + "name": "service_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Service Version" + } + }, + { + "name": "product_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Product Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PricingPlanGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}": { + "get": { + "tags": [ + "pricing-plans" + ], + "summary": "Get Pricing Plan Unit", + "description": "Returns a list of service pricing plans with pricing details for a specified service", + "operationId": "list_service_pricing_plans", + "parameters": [ + { + "name": "pricing_plan_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Plan Id", + "minimum": 0 + } + }, + { + "name": "pricing_unit_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Unit Id", + "minimum": 0 + } + }, + { + "name": "product_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Product Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PricingUnitGet" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "CreditTransactionCreateBody": { + "properties": { + "product_name": { + "type": "string", + "title": "Product Name" + }, + "wallet_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Wallet Id", + "minimum": 0 + }, + "wallet_name": { + "type": "string", + "title": "Wallet Name" + }, + "user_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "User Id", + "minimum": 0 + }, + "user_email": { + "type": "string", + "title": "User Email" + }, + "osparc_credits": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Osparc Credits" + }, + "payment_transaction_id": { + "type": "string", + "title": "Payment Transaction Id" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + } + }, + "type": "object", + "required": [ + "product_name", + "wallet_id", + "wallet_name", + "user_id", + "user_email", + "osparc_credits", + "payment_transaction_id", + "created_at" + ], + "title": "CreditTransactionCreateBody" + }, + "CreditTransactionCreated": { + "properties": { + "credit_transaction_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Credit Transaction Id", + "minimum": 0 + } + }, + "type": "object", + "required": [ + "credit_transaction_id" + ], + "title": "CreditTransactionCreated", + "description": "Response Create Credit Transaction V1 Credit Transactions Post" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "HardwareInfo": { + "properties": { + "aws_ec2_instances": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Aws Ec2 Instances" + } + }, + "type": "object", + "required": [ + "aws_ec2_instances" + ], + "title": "HardwareInfo" + }, + "PricingPlanClassification": { + "type": "string", + "enum": [ + "TIER" + ], + "const": "TIER", + "title": "PricingPlanClassification" + }, + "PricingPlanGet": { + "properties": { + "pricing_plan_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Plan Id", + "minimum": 0 + }, + "display_name": { + "type": "string", + "title": "Display Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "classification": { + "$ref": "#/components/schemas/PricingPlanClassification" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "pricing_plan_key": { + "type": "string", + "title": "Pricing Plan Key" + }, + "pricing_units": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PricingUnitGet" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Pricing Units" + }, + "is_active": { + "type": "boolean", + "title": "Is Active" + } + }, + "type": "object", + "required": [ + "pricing_plan_id", + "display_name", + "description", + "classification", + "created_at", + "pricing_plan_key", + "pricing_units", + "is_active" + ], + "title": "PricingPlanGet" + }, + "PricingUnitGet": { + "properties": { + "pricing_unit_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricing Unit Id", + "minimum": 0 + }, + "unit_name": { + "type": "string", + "title": "Unit Name" + }, + "unit_extra_info": { + "$ref": "#/components/schemas/UnitExtraInfo" + }, + "current_cost_per_unit": { + "type": "number", + "title": "Current Cost Per Unit" + }, + "current_cost_per_unit_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Current Cost Per Unit Id", + "minimum": 0 + }, + "default": { + "type": "boolean", + "title": "Default" + }, + "specific_info": { + "$ref": "#/components/schemas/HardwareInfo" + } + }, + "type": "object", + "required": [ + "pricing_unit_id", + "unit_name", + "unit_extra_info", + "current_cost_per_unit", + "current_cost_per_unit_id", + "default", + "specific_info" + ], + "title": "PricingUnitGet" + }, + "UnitExtraInfo": { + "properties": { + "CPU": { + "type": "integer", + "minimum": 0, + "title": "Cpu" + }, + "RAM": { + "type": "integer", + "minimum": 0, + "title": "Ram" + }, + "VRAM": { + "type": "integer", + "minimum": 0, + "title": "Vram" + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "CPU", + "RAM", + "VRAM" + ], + "title": "UnitExtraInfo", + "description": "Custom information that is propagated to the frontend. Defined fields are mandatory." + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "WalletTotalCredits": { + "properties": { + "wallet_id": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Wallet Id", + "minimum": 0 + }, + "available_osparc_credits": { + "type": "number", + "title": "Available Osparc Credits" + } + }, + "type": "object", + "required": [ + "wallet_id", + "available_osparc_credits" + ], + "title": "WalletTotalCredits" + }, + "_Meta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "title": "Version" + }, + "docs_url": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Docs Url" + } + }, + "type": "object", + "required": [ + "name", + "version", + "docs_url" + ], + "title": "_Meta" + } + } + } +} diff --git a/services/storage/src/simcore_service_storage/api/v0/openapi.yaml b/services/storage/src/simcore_service_storage/api/v0/openapi.yaml new file mode 100644 index 00000000000..22f27d960ac --- /dev/null +++ b/services/storage/src/simcore_service_storage/api/v0/openapi.yaml @@ -0,0 +1,1596 @@ +openapi: 3.1.0 +info: + title: simcore-service-storage API + description: API definition for simcore-service-storage service + contact: + name: IT'IS Foundation + email: support@simcore.io + license: + name: MIT + url: https://github.com/ITISFoundation/osparc-simcore/blob/master/LICENSE + version: 0.5.0 +servers: +- url: / + description: 'Default server: requests directed to serving url' +- url: http://{host}:{port}/ + description: 'Development server: can configure any base url' + variables: + host: + default: 127.0.0.1 + port: + default: '8000' +paths: + /v0/locations/{location_id}/datasets: + get: + tags: + - datasets + summary: Get datasets metadata + description: returns all the top level datasets a user has access to + operationId: get_datasets_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' + /v0/locations/{location_id}/datasets/{dataset_id}/metadata: + get: + tags: + - datasets + summary: Get Files Metadata + description: returns all the file meta data inside dataset with dataset_id + operationId: get_files_metadata_dataset + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: dataset_id + in: path + required: true + schema: + type: string + title: Dataset Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + - name: expand_dirs + in: query + required: false + schema: + type: boolean + description: Automatic directory expansion. This will be replaced by pagination + the future + default: true + title: Expand Dirs + description: Automatic directory expansion. This will be replaced by pagination + the future + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_FileMetaDataGet__' + /v0/locations: + get: + tags: + - locations + summary: Get available storage locations + description: Returns the list of available storage locations + operationId: get_storage_locations + parameters: + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/DatasetMetaData' + title: Response Get Storage Locations + /v0/locations/{location_id}:sync: + post: + tags: + - locations + summary: Manually triggers the synchronisation of the file meta data table in + the database + description: Returns an object containing added, changed and removed paths + operationId: synchronise_meta_data_table + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: dry_run + in: query + required: false + schema: + type: boolean + default: false + title: Dry Run + - name: fire_and_forget + in: query + required: false + schema: + type: boolean + default: false + title: Fire And Forget + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TableSynchronisation_' + /v0/locations/{location_id}/files/metadata: + get: + tags: + - files + summary: Get datasets metadata + description: returns all the file meta data a user has access to (uuid_filter + may be used) + operationId: get_files_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: uuid_filter + in: query + required: false + schema: + type: string + default: '' + title: Uuid Filter + - name: expand_dirs + in: query + required: false + schema: + type: boolean + description: Automatic directory expansion. This will be replaced by pagination + the future + default: true + title: Expand Dirs + description: Automatic directory expansion. This will be replaced by pagination + the future + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' + /v0/locations/{location_id}/files/{file_id}/metadata: + get: + tags: + - files + summary: Get File Metadata + description: returns the file meta data of file_id if user_id has the rights + to + operationId: get_file_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/FileMetaData' + - $ref: '#/components/schemas/Envelope_FileMetaDataGet_' + title: Response Get File Metadata + /v0/locations/{location_id}/files/{file_id}: + get: + tags: + - files + summary: Returns download link for requested file + description: creates a download file link if user has the rights to + operationId: download_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + - name: link_type + in: query + required: false + schema: + $ref: '#/components/schemas/LinkType' + default: PRESIGNED + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PresignedLink_' + put: + tags: + - files + summary: Returns upload link + description: creates one or more upload file links if user has the rights to, + expects the client to complete/abort upload + operationId: upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: file_size + in: query + required: true + schema: + anyOf: + - type: string + pattern: ^\s*(\d*\.?\d+)\s*(\w+)? + - type: integer + minimum: 0 + - type: 'null' + title: File Size + - name: link_type + in: query + required: false + schema: + $ref: '#/components/schemas/LinkType' + default: PRESIGNED + - name: is_directory + in: query + required: false + schema: + type: boolean + default: false + title: Is Directory + responses: + '200': + description: Successful Response + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/Envelope_FileUploadSchema_' + - $ref: '#/components/schemas/Envelope_Url_' + title: Response Upload File + delete: + tags: + - files + summary: Deletes File + description: deletes file if user has the rights to + operationId: delete_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/locations/{location_id}/files/{file_id}:abort: + post: + tags: + - files + summary: Abort Upload File + description: 'aborts an upload if user has the rights to, and reverts + + to the latest version if available, else will delete the file' + operationId: abort_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/locations/{location_id}/files/{file_id}:complete: + post: + tags: + - files + summary: Complete Upload File + description: completes an upload if the user has the rights to + operationId: complete_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompletionBody_' + responses: + '202': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompleteResponse_' + /v0/locations/{location_id}/files/{file_id}:complete/futures/{future_id}: + post: + tags: + - files + summary: Check for upload completion + description: Returns state of upload completion + operationId: is_completed_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: future_id + in: path + required: true + schema: + type: string + title: Future Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompleteFutureResponse_' + /v0/: + get: + tags: + - health + summary: health check endpoint + description: Current service health + operationId: health_check + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_HealthCheck_' + /v0/status: + get: + tags: + - health + summary: returns the status of the services inside + description: returns the status of all the external dependencies + operationId: get_status + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_AppStatusCheck_' + /v0/files/{file_id}:soft-copy: + post: + tags: + - files + summary: copy file as soft link + description: creates and returns a soft link + operationId: copy_as_soft_link + parameters: + - name: file_id + in: path + required: true + schema: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/SoftCopyBody' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/FileMetaDataGet' + /v0/simcore-s3:access: + post: + tags: + - simcore-s3 + summary: gets or creates the a temporary access + description: returns a set of S3 credentials + operationId: get_or_create_temporary_s3_access + parameters: + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_S3Settings_' + /v0/simcore-s3/folders: + post: + tags: + - simcore-s3 + summary: copies folders from project + description: copies folders from project + operationId: copy_folders_from_project + parameters: + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FoldersBody' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskGet_' + /v0/simcore-s3/folders/{folder_id}: + delete: + tags: + - simcore-s3 + summary: delete folders from project + description: removes folders from a project + operationId: delete_folders_of_project + parameters: + - name: folder_id + in: path + required: true + schema: + type: string + title: Folder Id + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + - name: node_id + in: query + required: false + schema: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Node Id + responses: + '204': + description: Successful Response + /v0/simcore-s3/files/metadata:search: + post: + tags: + - simcore-s3 + summary: search for owned files + description: search for files starting with `startswith` and/or matching a sha256_checksum + in the file_meta_data table + operationId: search_files + parameters: + - name: user_id + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + - name: startswith + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Startswith + - name: sha256_checksum + in: query + required: false + schema: + anyOf: + - type: string + pattern: ^[a-fA-F0-9]{64}$ + - type: 'null' + title: Sha256 Checksum + - name: kind + in: query + required: true + schema: + enum: + - owned + const: owned + type: string + title: Kind + - name: limit + in: query + required: false + schema: + type: integer + maximum: 50 + minimum: 1 + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileMetaDataGet_' + /v0/futures: + get: + tags: + - tasks + summary: list current long running tasks + description: list current long running tasks + operationId: list_tasks + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskGet_' + /v0/futures/{task_id}: + get: + tags: + - tasks + summary: gets the status of the task + description: gets the status of the task + operationId: get_task_status + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskStatus_' + delete: + tags: + - tasks + summary: cancels and removes the task + description: cancels and removes the task + operationId: cancel_and_delete_task + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '204': + description: Successful Response + /v0/futures/{task_id}/result: + get: + tags: + - tasks + summary: get result of the task + description: get result of the task + operationId: get_task_result + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + title: Response Get Task Result +components: + schemas: + AppStatusCheck: + properties: + app_name: + type: string + title: App Name + description: Application name + version: + type: string + title: Version + description: Application's version + services: + type: object + title: Services + description: Other backend services connected from this service + default: {} + sessions: + anyOf: + - type: object + - type: 'null' + title: Sessions + description: Client sessions info. If single session per app, then is denoted + as main + default: {} + url: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Url + description: Link to current resource + diagnostics_url: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Diagnostics Url + description: Link to diagnostics report sub-resource. This MIGHT take some + time to compute + type: object + required: + - app_name + - version + title: AppStatusCheck + DatasetMetaData: + properties: + dataset_id: + anyOf: + - type: string + format: uuid + - type: string + pattern: ^N:dataset:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: Dataset Id + display_name: + type: string + title: Display Name + additionalProperties: false + type: object + required: + - dataset_id + - display_name + title: DatasetMetaData + Envelope_AppStatusCheck_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/AppStatusCheck' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[AppStatusCheck] + Envelope_FileMetaDataGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileMetaDataGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileMetaDataGet] + Envelope_FileUploadCompleteFutureResponse_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompleteFutureResponse' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompleteFutureResponse] + Envelope_FileUploadCompleteResponse_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompleteResponse' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompleteResponse] + Envelope_FileUploadCompletionBody_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompletionBody' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompletionBody] + Envelope_FileUploadSchema_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadSchema' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadSchema] + Envelope_HealthCheck_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/HealthCheck' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[HealthCheck] + Envelope_PresignedLink_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PresignedLink' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PresignedLink] + Envelope_S3Settings_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/S3Settings' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[S3Settings] + Envelope_TableSynchronisation_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TableSynchronisation' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TableSynchronisation] + Envelope_TaskGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TaskGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TaskGet] + Envelope_TaskStatus_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TaskStatus' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TaskStatus] + Envelope_Url_: + properties: + data: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Url] + Envelope_list_DatasetMetaData__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/DatasetMetaData' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[DatasetMetaData]] + Envelope_list_FileMetaDataGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/FileMetaDataGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[FileMetaDataGet]] + FileMetaData: + properties: + file_uuid: + type: string + title: File Uuid + description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE + folder structure + location_id: + type: integer + title: Location Id + description: Storage location + project_name: + anyOf: + - type: string + - type: 'null' + title: Project Name + description: optional project name, used by frontend to display path + node_name: + anyOf: + - type: string + - type: 'null' + title: Node Name + description: optional node name, used by frontend to display path + file_name: + type: string + title: File Name + description: Display name for a file + file_id: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext + for S3 and N:package:UUID for datcore + created_at: + type: string + format: date-time + title: Created At + last_modified: + type: string + format: date-time + title: Last Modified + file_size: + anyOf: + - type: integer + enum: + - -1 + const: -1 + - type: integer + minimum: 0 + title: File Size + description: File size in bytes (-1 means invalid) + default: -1 + entity_tag: + anyOf: + - type: string + - type: 'null' + title: Entity Tag + description: Entity tag (or ETag), represents a specific version of the + file, None if invalid upload or datcore + is_soft_link: + type: boolean + title: Is Soft Link + description: If true, this file is a soft link.i.e. is another entry with + the same object_name + default: false + is_directory: + type: boolean + title: Is Directory + description: if True this is a directory + default: false + sha256_checksum: + anyOf: + - type: string + pattern: ^[a-fA-F0-9]{64}$ + - type: 'null' + title: Sha256 Checksum + upload_id: + anyOf: + - type: string + - type: 'null' + title: Upload Id + upload_expires_at: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Upload Expires At + location: + type: string + title: Location + bucket_name: + type: string + title: Bucket Name + object_name: + type: string + title: Object Name + project_id: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Project Id + node_id: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Node Id + user_id: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: User Id + type: object + required: + - file_uuid + - location_id + - file_name + - file_id + - created_at + - last_modified + - sha256_checksum + - location + - bucket_name + - object_name + - project_id + - node_id + - user_id + title: FileMetaData + FileMetaDataGet: + properties: + file_uuid: + type: string + title: File Uuid + description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE + folder structure + location_id: + type: integer + title: Location Id + description: Storage location + project_name: + anyOf: + - type: string + - type: 'null' + title: Project Name + description: optional project name, used by frontend to display path + node_name: + anyOf: + - type: string + - type: 'null' + title: Node Name + description: optional node name, used by frontend to display path + file_name: + type: string + title: File Name + description: Display name for a file + file_id: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext + for S3 and N:package:UUID for datcore + created_at: + type: string + format: date-time + title: Created At + last_modified: + type: string + format: date-time + title: Last Modified + file_size: + anyOf: + - type: integer + enum: + - -1 + const: -1 + - type: integer + minimum: 0 + title: File Size + description: File size in bytes (-1 means invalid) + default: -1 + entity_tag: + anyOf: + - type: string + - type: 'null' + title: Entity Tag + description: Entity tag (or ETag), represents a specific version of the + file, None if invalid upload or datcore + is_soft_link: + type: boolean + title: Is Soft Link + description: If true, this file is a soft link.i.e. is another entry with + the same object_name + default: false + is_directory: + type: boolean + title: Is Directory + description: if True this is a directory + default: false + sha256_checksum: + anyOf: + - type: string + pattern: ^[a-fA-F0-9]{64}$ + - type: 'null' + title: Sha256 Checksum + description: 'SHA256 message digest of the file content. Main purpose: cheap + lookup.' + type: object + required: + - file_uuid + - location_id + - file_name + - file_id + - created_at + - last_modified + title: FileMetaDataGet + FileUploadCompleteFutureResponse: + properties: + state: + $ref: '#/components/schemas/FileUploadCompleteState' + e_tag: + anyOf: + - type: string + - type: 'null' + title: E Tag + type: object + required: + - state + title: FileUploadCompleteFutureResponse + FileUploadCompleteLinks: + properties: + state: + type: string + minLength: 1 + format: uri + title: State + type: object + required: + - state + title: FileUploadCompleteLinks + FileUploadCompleteResponse: + properties: + links: + $ref: '#/components/schemas/FileUploadCompleteLinks' + type: object + required: + - links + title: FileUploadCompleteResponse + FileUploadCompleteState: + type: string + enum: + - ok + - nok + title: FileUploadCompleteState + FileUploadCompletionBody: + properties: + parts: + items: + $ref: '#/components/schemas/UploadedPart' + type: array + title: Parts + type: object + required: + - parts + title: FileUploadCompletionBody + FileUploadLinks: + properties: + abort_upload: + type: string + minLength: 1 + format: uri + title: Abort Upload + complete_upload: + type: string + minLength: 1 + format: uri + title: Complete Upload + type: object + required: + - abort_upload + - complete_upload + title: FileUploadLinks + FileUploadSchema: + properties: + chunk_size: + type: integer + minimum: 0 + title: Chunk Size + urls: + items: + type: string + minLength: 1 + format: uri + type: array + title: Urls + links: + $ref: '#/components/schemas/FileUploadLinks' + type: object + required: + - chunk_size + - urls + - links + title: FileUploadSchema + FoldersBody: + properties: + source: + type: object + title: Source + destination: + type: object + title: Destination + nodes_map: + additionalProperties: + type: string + format: uuid + type: object + title: Nodes Map + type: object + title: FoldersBody + HealthCheck: + properties: + name: + anyOf: + - type: string + - type: 'null' + title: Name + status: + anyOf: + - type: string + - type: 'null' + title: Status + api_version: + anyOf: + - type: string + - type: 'null' + title: Api Version + version: + anyOf: + - type: string + - type: 'null' + title: Version + type: object + required: + - name + - status + - api_version + - version + title: HealthCheck + LinkType: + type: string + enum: + - PRESIGNED + - S3 + title: LinkType + PresignedLink: + properties: + link: + type: string + minLength: 1 + format: uri + title: Link + type: object + required: + - link + title: PresignedLink + S3Settings: + properties: + S3_ACCESS_KEY: + type: string + maxLength: 50 + minLength: 1 + title: S3 Access Key + S3_BUCKET_NAME: + type: string + maxLength: 50 + minLength: 1 + title: S3 Bucket Name + S3_ENDPOINT: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: S3 Endpoint + description: do not define if using standard AWS + S3_REGION: + type: string + maxLength: 50 + minLength: 1 + title: S3 Region + S3_SECRET_KEY: + type: string + maxLength: 50 + minLength: 1 + title: S3 Secret Key + additionalProperties: false + type: object + required: + - S3_ACCESS_KEY + - S3_BUCKET_NAME + - S3_REGION + - S3_SECRET_KEY + title: S3Settings + SoftCopyBody: + properties: + link_id: + type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + title: Link Id + type: object + required: + - link_id + title: SoftCopyBody + TableSynchronisation: + properties: + dry_run: + anyOf: + - type: boolean + - type: 'null' + title: Dry Run + fire_and_forget: + anyOf: + - type: boolean + - type: 'null' + title: Fire And Forget + removed: + items: + type: string + type: array + title: Removed + type: object + required: + - removed + title: TableSynchronisation + TaskGet: + properties: + task_id: + type: string + title: Task Id + task_name: + type: string + title: Task Name + status_href: + type: string + title: Status Href + result_href: + type: string + title: Result Href + abort_href: + type: string + title: Abort Href + type: object + required: + - task_id + - task_name + - status_href + - result_href + - abort_href + title: TaskGet + TaskProgress: + properties: + task_id: + anyOf: + - type: string + - type: 'null' + title: Task Id + message: + type: string + title: Message + default: '' + percent: + type: number + maximum: 1.0 + minimum: 0.0 + title: Percent + default: 0.0 + type: object + title: TaskProgress + description: 'Helps the user to keep track of the progress. Progress is expected + to be + + defined as a float bound between 0.0 and 1.0' + TaskStatus: + properties: + task_progress: + $ref: '#/components/schemas/TaskProgress' + done: + type: boolean + title: Done + started: + type: string + format: date-time + title: Started + type: object + required: + - task_progress + - done + - started + title: TaskStatus + UploadedPart: + properties: + number: + type: integer + exclusiveMinimum: true + title: Number + minimum: 0 + e_tag: + type: string + title: E Tag + type: object + required: + - number + - e_tag + title: UploadedPart +tags: +- name: datasets +- name: files +- name: health +- name: locations +- name: tasks +- name: simcore-s3 diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml new file mode 100644 index 00000000000..9cca4bafd06 --- /dev/null +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -0,0 +1,14987 @@ +openapi: 3.1.0 +info: + title: simcore-service-webserver + description: Main service with an interface (http-API & websockets) to the web front-end + version: 0.46.0 +servers: +- url: '' + description: webserver +- url: http://{host}:{port} + description: development server + variables: + host: + default: localhost + port: + default: '8001' +paths: + /v0/auth/request-account: + post: + tags: + - auth + summary: Request Product Account + operationId: request_product_account + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AccountRequestInfo' + required: true + responses: + '204': + description: Successful Response + /v0/auth/register/invitations:check: + post: + tags: + - auth + summary: Check Registration Invitation + description: Check invitation and returns associated email or None + operationId: auth_check_registration_invitation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationCheck' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_InvitationInfo_' + /v0/auth/register: + post: + tags: + - auth + summary: Register + description: User registration + operationId: auth_register + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + /v0/auth/unregister: + post: + tags: + - auth + summary: Unregister Account + operationId: unregister_account + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UnregisterCheck' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/verify-phone-number: + post: + tags: + - auth + summary: Register Phone + description: user tries to verify phone number for 2 Factor Authentication when + registering + operationId: auth_register_phone + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterPhoneBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_RegisterPhoneNextPage_' + /v0/auth/validate-code-register: + post: + tags: + - auth + summary: Phone Confirmation + description: user enters 2 Factor Authentication code when registering + operationId: auth_phone_confirmation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PhoneConfirmationBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + /v0/auth/login: + post: + tags: + - auth + summary: Login + description: user logs in + operationId: auth_login + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LoginBody' + required: true + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_LoginNextPage_' + '401': + description: unauthorized reset due to invalid token code + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/validate-code-login: + post: + tags: + - auth + summary: Login 2Fa + description: user enters 2 Factor Authentication code when login in + operationId: auth_login_2fa + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LoginTwoFactorAuthBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '401': + description: unauthorized reset due to invalid token code + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/two_factor:resend: + post: + tags: + - auth + summary: Resend 2Fa Code + description: Resends 2FA either via email or sms + operationId: auth_resend_2fa_code + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Resend2faBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '401': + description: unauthorized reset due to invalid token code + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/logout: + post: + tags: + - auth + summary: Logout + description: user logout + operationId: auth_logout + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LogoutBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + /v0/auth:check: + get: + tags: + - auth + summary: Check Auth + description: checks if user is authenticated in the platform + operationId: check_authentication + responses: + '204': + description: Successful Response + '401': + description: unauthorized reset due to invalid token code + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/reset-password: + post: + tags: + - auth + summary: Reset Password + description: a non logged-in user requests a password reset + operationId: auth_reset_password + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResetPasswordBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '503': + description: Service Unavailable + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/reset-password/{code}: + post: + tags: + - auth + summary: Reset Password Allowed + description: changes password using a token code without being logged in + operationId: auth_reset_password_allowed + parameters: + - name: code + in: path + required: true + schema: + type: string + title: Code + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ResetPasswordConfirmation' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '401': + description: unauthorized reset due to invalid token code + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/change-password: + post: + tags: + - auth + summary: Change Password + description: logged in user changes password + operationId: auth_change_password + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ChangePasswordBody' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + '401': + description: unauthorized user. Login required + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + '409': + description: mismatch between new and confirmation passwords + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + '422': + description: current password is invalid + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + /v0/auth/confirmation/{code}: + get: + tags: + - auth + summary: Email Confirmation + description: email link sent to user to confirm an action + operationId: auth_confirmation + parameters: + - name: code + in: path + required: true + schema: + type: string + title: Code + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Log_' + 3XX: + description: redirection to specific ui application page + /v0/auth/api-keys: + get: + tags: + - auth + summary: List Api Keys + description: lists display names of API keys by this user + operationId: list_api_keys + responses: + '200': + description: returns the display names of API keys + content: + application/json: + schema: + items: + type: string + type: array + title: Response 200 List Api Keys + '400': + description: key name requested is invalid + '401': + description: requires login to list keys + '403': + description: not enough permissions to list keys + post: + tags: + - auth + summary: Create Api Key + description: creates API keys to access public API + operationId: create_api_key + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyCreate' + required: true + responses: + '200': + description: Authorization granted returning API key + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyGet' + '400': + description: key name requested is invalid + '401': + description: requires login to list keys + '403': + description: not enough permissions to list keys + delete: + tags: + - auth + summary: Delete Api Key + description: deletes API key by name + operationId: delete_api_key + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApiKeyCreate' + required: true + responses: + '204': + description: api key successfully deleted + '401': + description: requires login to delete a key + '403': + description: not enough permissions to delete a key + /v0/auth/captcha: + get: + tags: + - auth + summary: Request Captcha + operationId: request_captcha + responses: + '200': + description: Successful Response + content: + application/json: + schema: {} + image/png: {} + /v0/groups: + get: + tags: + - groups + summary: List Groups + description: List all groups (organizations, primary, everyone and products) + I belong to + operationId: list_groups + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_MyGroupsGet_' + post: + tags: + - groups + summary: Create Group + description: Creates an organization group + operationId: create_group + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GroupCreate' + required: true + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GroupGet_' + /v0/groups/{gid}: + get: + tags: + - groups + summary: Get Group + description: Get an organization group + operationId: get_group + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GroupGet_' + patch: + tags: + - groups + summary: Update Group + description: Updates organization groups + operationId: update_group + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupUpdate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GroupGet_' + delete: + tags: + - groups + summary: Delete Group + description: Deletes organization groups + operationId: delete_group + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + responses: + '204': + description: Successful Response + /v0/groups/{gid}/users: + get: + tags: + - groups + summary: Get All Group Users + description: Gets users in organization groups + operationId: get_all_group_users + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_GroupUserGet__' + post: + tags: + - groups + summary: Add Group User + description: Adds a user to an organization group + operationId: add_group_user + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupUserAdd' + responses: + '204': + description: Successful Response + /v0/groups/{gid}/users/{uid}: + get: + tags: + - groups + summary: Get Group User + description: Gets specific user in an organization group + operationId: get_group_user + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + - name: uid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Uid + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GroupUserGet_' + patch: + tags: + - groups + summary: Update Group User + description: Updates user (access-rights) to an organization group + operationId: update_group_user + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + - name: uid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Uid + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/GroupUserUpdate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GroupUserGet_' + delete: + tags: + - groups + summary: Delete Group User + description: Removes a user from an organization group + operationId: delete_group_user + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + - name: uid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Uid + minimum: 0 + responses: + '204': + description: Successful Response + /v0/groups/{gid}/classifiers: + get: + tags: + - groups + summary: Get Group Classifiers + operationId: get_group_classifiers + parameters: + - name: gid + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + - name: tree_view + in: query + required: false + schema: + enum: + - std + const: std + type: string + default: std + title: Tree View + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_str__Any__' + /v0/groups/sparc/classifiers/scicrunch-resources/{rrid}: + get: + tags: + - groups + summary: Get Scicrunch Resource + operationId: get_scicrunch_resource + parameters: + - name: rrid + in: path + required: true + schema: + type: string + title: Rrid + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ResearchResource_' + post: + tags: + - groups + summary: Add Scicrunch Resource + operationId: add_scicrunch_resource + parameters: + - name: rrid + in: path + required: true + schema: + type: string + title: Rrid + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ResearchResource_' + /v0/groups/sparc/classifiers/scicrunch-resources:search: + get: + tags: + - groups + summary: Search Scicrunch Resources + operationId: search_scicrunch_resources + parameters: + - name: guess_name + in: query + required: true + schema: + type: string + title: Guess Name + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ResourceHit__' + /v0/tags: + get: + tags: + - tags + summary: List Tags + operationId: list_tags + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_TagGet__' + post: + tags: + - tags + summary: Create Tag + operationId: create_tag + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TagCreate' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TagGet_' + /v0/tags/{tag_id}: + patch: + tags: + - tags + summary: Update Tag + operationId: update_tag + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TagUpdate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TagGet_' + delete: + tags: + - tags + summary: Delete Tag + operationId: delete_tag + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/tags/{tag_id}/groups: + get: + tags: + - tags + - groups + summary: List Tag Groups + operationId: list_tag_groups + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_TagGroupGet__' + /v0/tags/{tag_id}/groups/{group_id}: + post: + tags: + - tags + - groups + summary: Create Tag Group + operationId: create_tag_group + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TagGroupCreate' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TagGet_' + put: + tags: + - tags + - groups + summary: Replace Tag Groups + operationId: replace_tag_groups + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TagGroupCreate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_TagGroupGet__' + delete: + tags: + - tags + - groups + summary: Delete Tag Group + operationId: delete_tag_group + parameters: + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/credits-price: + get: + tags: + - products + summary: Get Current Product Price + operationId: get_current_product_price + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GetCreditPrice_' + /v0/products/{product_name}: + get: + tags: + - products + - po + summary: Get Product + operationId: get_product + parameters: + - name: product_name + in: path + required: true + schema: + anyOf: + - type: string + minLength: 1 + maxLength: 100 + - enum: + - current + const: current + type: string + title: Product Name + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GetProduct_' + /v0/products/{product_name}/templates/{template_id}: + put: + tags: + - products + - po + summary: Update Product Template + operationId: update_product_template + parameters: + - name: product_name + in: path + required: true + schema: + anyOf: + - type: string + minLength: 1 + maxLength: 100 + - enum: + - current + const: current + type: string + title: Product Name + - name: template_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Template Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateProductTemplate' + responses: + '204': + description: Successful Response + /v0/invitation:generate: + post: + tags: + - products + - po + summary: Generate Invitation + operationId: generate_invitation + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GenerateInvitation' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_InvitationGenerated_' + /v0/me: + get: + tags: + - user + summary: Get My Profile + operationId: get_my_profile + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProfileGet_' + put: + tags: + - user + summary: Update My Profile + operationId: update_my_profile + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProfileUpdate' + required: true + responses: + '204': + description: Successful Response + /v0/me/preferences/{preference_id}: + patch: + tags: + - user + summary: Set Frontend Preference + operationId: set_frontend_preference + parameters: + - name: preference_id + in: path + required: true + schema: + type: string + title: Preference Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequestBody' + responses: + '204': + description: Successful Response + /v0/me/tokens: + get: + tags: + - user + summary: List Tokens + operationId: list_tokens + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ThirdPartyToken__' + post: + tags: + - user + summary: Create Token + operationId: create_token + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenCreate' + required: true + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ThirdPartyToken_' + /v0/me/tokens/{service}: + get: + tags: + - user + summary: Get Token + operationId: get_token + parameters: + - name: service + in: path + required: true + schema: + type: string + title: Service + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ThirdPartyToken_' + delete: + tags: + - user + summary: Delete Token + operationId: delete_token + parameters: + - name: service + in: path + required: true + schema: + type: string + title: Service + responses: + '204': + description: Successful Response + /v0/me/notifications: + get: + tags: + - user + summary: List User Notifications + operationId: list_user_notifications + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_UserNotification__' + post: + tags: + - user + summary: Create User Notification + operationId: create_user_notification + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserNotificationCreate' + required: true + responses: + '204': + description: Successful Response + /v0/me/notifications/{notification_id}: + patch: + tags: + - user + summary: Mark Notification As Read + operationId: mark_notification_as_read + parameters: + - name: notification_id + in: path + required: true + schema: + type: string + title: Notification Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserNotificationPatch' + responses: + '204': + description: Successful Response + /v0/me/permissions: + get: + tags: + - user + summary: List User Permissions + operationId: list_user_permissions + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_PermissionGet__' + /v0/users:search: + get: + tags: + - user + - po + summary: Search Users + operationId: search_users + parameters: + - name: email + in: query + required: true + schema: + type: string + minLength: 3 + maxLength: 200 + title: Email + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_UserProfile__' + /v0/users:pre-register: + post: + tags: + - user + - po + summary: Pre Register User + operationId: pre_register_user + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PreUserProfile' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_UserProfile_' + /v0/wallets: + get: + tags: + - wallets + summary: List Wallets + operationId: list_wallets + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_WalletGetWithAvailableCredits__' + post: + tags: + - wallets + summary: Create Wallet + operationId: create_wallet + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWalletBodyParams' + required: true + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGet_' + /v0/wallets/default: + get: + tags: + - wallets + summary: Get Default Wallet + operationId: get_default_wallet + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGetWithAvailableCredits_' + /v0/wallets/{wallet_id}: + get: + tags: + - wallets + summary: Get Wallet + operationId: get_wallet + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGetWithAvailableCredits_' + put: + tags: + - wallets + summary: Update Wallet + operationId: update_wallet + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PutWalletBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGet_' + /v0/wallets/{wallet_id}/payments: + post: + tags: + - wallets + summary: Create Payment + description: Creates payment to wallet `wallet_id` + operationId: create_payment + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWalletPayment' + responses: + '202': + description: Payment initialized + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletPaymentInitiated_' + /v0/wallets/-/payments: + get: + tags: + - wallets + summary: List All Payments + description: Lists all user payments to his/her wallets (only the ones he/she + created) + operationId: list_all_payments + parameters: + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_PaymentTransaction_' + /v0/wallets/{wallet_id}/payments/{payment_id}/invoice-link: + get: + tags: + - wallets + summary: Get Payment Invoice Link + operationId: get_payment_invoice_link + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Id + responses: + '302': + description: redirection to invoice download link + content: + application/json: + schema: {} + /v0/wallets/{wallet_id}/payments/{payment_id}:cancel: + post: + tags: + - wallets + summary: Cancel Payment + operationId: cancel_payment + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Id + responses: + '204': + description: Successfully cancelled + /v0/wallets/{wallet_id}/payments-methods:init: + post: + tags: + - wallets + summary: Init Creation Of Payment Method + operationId: init_creation_of_payment_method + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '202': + description: Successfully initialized + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PaymentMethodInitiated_' + /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}:cancel: + post: + tags: + - wallets + summary: Cancel Creation Of Payment Method + operationId: cancel_creation_of_payment_method + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_method_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Method Id + responses: + '204': + description: Successfully cancelled + /v0/wallets/{wallet_id}/payments-methods: + get: + tags: + - wallets + summary: List Payments Methods + description: Lists all payments method associated to `wallet_id` + operationId: list_payments_methods + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_PaymentMethodGet__' + /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}: + get: + tags: + - wallets + summary: Get Payment Method + operationId: get_payment_method + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_method_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Method Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PaymentMethodGet_' + delete: + tags: + - wallets + summary: Delete Payment Method + operationId: delete_payment_method + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_method_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Method Id + responses: + '204': + description: Successfully deleted + /v0/wallets/{wallet_id}/payments-methods/{payment_method_id}:pay: + post: + tags: + - wallets + summary: Pay With Payment Method + operationId: pay_with_payment_method + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: payment_method_id + in: path + required: true + schema: + type: string + minLength: 1 + maxLength: 100 + title: Payment Method Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateWalletPayment' + responses: + '202': + description: Pay with payment-method + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletPaymentInitiated_' + /v0/wallets/{wallet_id}/auto-recharge: + get: + tags: + - wallets + summary: Get Wallet Autorecharge + operationId: get_wallet_autorecharge + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GetWalletAutoRecharge_' + put: + tags: + - wallets + summary: Replace Wallet Autorecharge + operationId: replace_wallet_autorecharge + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ReplaceWalletAutoRecharge' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GetWalletAutoRecharge_' + /v0/wallets/{wallet_id}/groups/{group_id}: + post: + tags: + - wallets + - groups + summary: Create Wallet Group + operationId: create_wallet_group + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_WalletsGroupsBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGroupGet_' + put: + tags: + - wallets + - groups + summary: Update Wallet Group + operationId: update_wallet_group + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_WalletsGroupsBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGroupGet_' + delete: + tags: + - wallets + - groups + summary: Delete Wallet Group + operationId: delete_wallet_group + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/wallets/{wallet_id}/groups: + get: + tags: + - wallets + - groups + summary: List Wallet Groups + operationId: list_wallet_groups + parameters: + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_WalletGroupGet__' + /v0/activity/status: + get: + tags: + - tasks + summary: Get Activity Status + operationId: get_activity_status + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_UUID__Activity__' + /v0/announcements: + get: + tags: + - announcements + summary: List Announcements + operationId: list_announcements + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Announcement__' + /v0/catalog/services/-/latest: + get: + tags: + - catalog + summary: List Services Latest + operationId: list_services_latest + parameters: + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_CatalogServiceGet_' + /v0/catalog/services/{service_key}/{service_version}: + get: + tags: + - catalog + summary: Get Service + operationId: get_service + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CatalogServiceGet_' + patch: + tags: + - catalog + summary: Update Service + operationId: update_service + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CatalogServiceUpdate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CatalogServiceGet_' + /v0/catalog/services/{service_key}/{service_version}/inputs: + get: + tags: + - catalog + summary: List Service Inputs + operationId: list_service_inputs + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ServiceInputGet__' + /v0/catalog/services/{service_key}/{service_version}/inputs/{input_key}: + get: + tags: + - catalog + summary: Get Service Input + operationId: get_service_input + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: input_key + in: path + required: true + schema: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Input Key + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ServiceInputGet_' + /v0/catalog/services/{service_key}/{service_version}/inputs:match: + get: + tags: + - catalog + summary: Get Compatible Inputs Given Source Output + operationId: get_compatible_inputs_given_source_output + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: fromService + in: query + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Fromservice + - name: fromVersion + in: query + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Fromversion + - name: fromOutput + in: query + required: true + schema: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Fromoutput + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' + /v0/catalog/services/{service_key}/{service_version}/outputs: + get: + tags: + - catalog + summary: List Service Outputs + operationId: list_service_outputs + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' + /v0/catalog/services/{service_key}/{service_version}/outputs/{output_key}: + get: + tags: + - catalog + summary: Get Service Output + operationId: get_service_output + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: output_key + in: path + required: true + schema: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Output Key + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ServiceOutputGet__' + /v0/catalog/services/{service_key}/{service_version}/outputs:match: + get: + tags: + - catalog + summary: Get Compatible Outputs Given Target Input + operationId: get_compatible_outputs_given_target_input + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: toService + in: query + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Toservice + - name: toVersion + in: query + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Toversion + - name: toInput + in: query + required: true + schema: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Toinput + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Annotated_str__StringConstraints___' + /v0/catalog/services/{service_key}/{service_version}/resources: + get: + tags: + - catalog + summary: Get Service Resources + operationId: get_service_resources + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' + /v0/catalog/services/{service_key}/{service_version}/pricing-plan: + get: + tags: + - catalog + - pricing-plans + summary: Retrieve default pricing plan for provided service + operationId: get_service_pricing_plan + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ServicePricingPlanGet_' + /v0/catalog/services/{service_key}/{service_version}/tags: + get: + tags: + - catalog + - tags + summary: List Service Tags + operationId: list_service_tags + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_TagGet__' + /v0/catalog/services/{service_key}/{service_version}/tags/{tag_id}:add: + post: + tags: + - catalog + - tags + summary: Add Service Tag + operationId: add_service_tag + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CatalogServiceGet_' + /v0/catalog/services/{service_key}/{service_version}/tags/{tag_id}:remove: + post: + tags: + - catalog + - tags + summary: Remove Service Tag + operationId: remove_service_tag + parameters: + - name: service_key + in: path + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + - name: service_version + in: path + required: true + schema: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + - name: tag_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Tag Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CatalogServiceGet_' + /v0/clusters: + get: + tags: + - clusters + summary: List Clusters + operationId: list_clusters + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ClusterGet__' + post: + tags: + - clusters + summary: Create Cluster + operationId: create_cluster + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClusterCreate' + required: true + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ClusterGet_' + /v0/clusters:ping: + post: + tags: + - clusters + summary: Ping Cluster + description: Test connectivity with cluster + operationId: ping_cluster + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ClusterPing' + required: true + responses: + '204': + description: Successful Response + /v0/clusters/{cluster_id}: + get: + tags: + - clusters + summary: Get Cluster + operationId: get_cluster + parameters: + - name: cluster_id + in: path + required: true + schema: + type: integer + minimum: 0 + title: Cluster Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ClusterGet_' + patch: + tags: + - clusters + summary: Update Cluster + operationId: update_cluster + parameters: + - name: cluster_id + in: path + required: true + schema: + type: integer + minimum: 0 + title: Cluster Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ClusterPatch' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ClusterGet_' + delete: + tags: + - clusters + summary: Delete Cluster + operationId: delete_cluster + parameters: + - name: cluster_id + in: path + required: true + schema: + type: integer + minimum: 0 + title: Cluster Id + responses: + '204': + description: Successful Response + /v0/clusters/{cluster_id}/details: + get: + tags: + - clusters + summary: Get Cluster Details + operationId: get_cluster_details + parameters: + - name: cluster_id + in: path + required: true + schema: + type: integer + minimum: 0 + title: Cluster Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ClusterDetails_' + /v0/clusters/{cluster_id}:ping: + post: + tags: + - clusters + summary: Ping Cluster Cluster Id + description: Tests connectivity with cluster + operationId: ping_cluster_cluster_id + parameters: + - name: cluster_id + in: path + required: true + schema: + type: integer + minimum: 0 + title: Cluster Id + responses: + '204': + description: Successful Response + /v0/computations/{project_id}: + get: + tags: + - computations + - projects + summary: Get Computation + operationId: get_computation + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ComputationTaskGet_' + /v0/computations/{project_id}:start: + post: + tags: + - computations + - projects + summary: Start Computation + operationId: start_computation + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ComputationStart' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope__ComputationStarted_' + '402': + description: Insufficient credits to run computation + '404': + description: Project/wallet/pricing details were not found + '406': + description: Cluster not found + '409': + description: Project already started + '422': + description: Configuration error + '503': + description: Service not available + /v0/computations/{project_id}:stop: + post: + tags: + - computations + - projects + summary: Stop Computation + operationId: stop_computation + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}:xport: + post: + tags: + - projects + - exporter + summary: Export Project + description: creates an archive of the project and downloads it + operationId: export_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + responses: + '200': + description: Successful Response + /v0/folders: + post: + tags: + - folders + summary: Create Folder + operationId: create_folder + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FolderCreateBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FolderGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + get: + tags: + - folders + summary: List Folders + operationId: list_folders + parameters: + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"modified","direction":"desc"}' + title: Order By + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + - name: folder_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folder Id + - name: workspace_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspace Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_FolderGet__' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/folders:search: + get: + tags: + - folders + summary: List Folders Full Search + operationId: list_folders_full_search + parameters: + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"modified","direction":"desc"}' + title: Order By + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + - name: text + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Text + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_FolderGet__' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/folders/{folder_id}: + get: + tags: + - folders + summary: Get Folder + operationId: get_folder + parameters: + - name: folder_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Folder Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FolderGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + put: + tags: + - folders + summary: Replace Folder + operationId: replace_folder + parameters: + - name: folder_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Folder Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/FolderReplaceBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FolderGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + delete: + tags: + - folders + summary: Delete Folder + operationId: delete_folder + parameters: + - name: folder_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Folder Id + minimum: 0 + responses: + '204': + description: Successful Response + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/tasks: + get: + tags: + - long-running-tasks + summary: List Tasks + operationId: list_tasks + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_TaskGet__' + /v0/tasks/{task_id}: + get: + tags: + - long-running-tasks + summary: Get Task Status + operationId: get_task_status + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskStatus_' + delete: + tags: + - long-running-tasks + summary: Cancel And Delete Task + operationId: cancel_and_delete_task + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '204': + description: Successful Response + /v0/tasks/{task_id}/result: + get: + tags: + - long-running-tasks + summary: Get Task Result + operationId: get_task_result + parameters: + - name: task_id + in: path + required: true + schema: + type: string + title: Task Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: {} + /v0/projects/{project_uuid}/checkpoint/{ref_id}/iterations: + get: + tags: + - projects + - metamodeling + summary: List Project Iterations + operationId: list_project_iterations + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: ref_id + in: path + required: true + schema: + type: integer + title: Ref Id + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_ProjectIterationItem_' + /v0/projects/{project_uuid}/checkpoint/{ref_id}/iterations/-/results: + get: + tags: + - projects + - metamodeling + summary: List Project Iterations Results + operationId: list_project_iterations_results + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: ref_id + in: path + required: true + schema: + type: integer + title: Ref Id + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_ProjectIterationResultItem_' + /v0/services: + get: + tags: + - nih-sparc + summary: List Latest Services + description: Returns a list latest version of services + operationId: list_latest_services + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ServiceGet__' + /v0/viewers: + get: + tags: + - nih-sparc + summary: List Viewers + description: 'Lists all publically available viewers + + + Notice that this might contain multiple services for the same filetype + + + If file_type is provided, then it filters viewer for that filetype' + operationId: list_viewers + parameters: + - name: file_type + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: File Type + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Viewer__' + /v0/viewers/default: + get: + tags: + - nih-sparc + summary: List Default Viewers + description: 'Lists the default viewer for each supported filetype + + + This was interfaced as a subcollection of viewers because it is a very common + use-case + + + Only publicaly available viewers + + + If file_type is provided, then it filters viewer for that filetype' + operationId: list_default_viewers + parameters: + - name: file_type + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: File Type + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_Viewer__' + /view: + get: + tags: + - nih-sparc + summary: Get Redirection To Viewer + description: Opens a viewer in osparc for data in the NIH-sparc portal + operationId: get_redirection_to_viewer + parameters: + - name: file_type + in: query + required: true + schema: + type: string + title: File Type + - name: viewer_key + in: query + required: true + schema: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Viewer Key + - name: file_size + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: File Size + minimum: 0 + - name: download_link + in: query + required: true + schema: + type: string + format: uri + minLength: 1 + maxLength: 2083 + title: Download Link + - name: file_name + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + default: unknown + title: File Name + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ServiceKeyVersion' + responses: + '302': + description: Opens osparc and starts viewer for selected data + /study/{id}: + get: + tags: + - nih-sparc + summary: Get Redirection To Study Page + description: Opens a study published in osparc + operationId: get_redirection_to_study_page + parameters: + - name: id + in: path + required: true + schema: + type: string + format: uuid + title: Id + responses: + '302': + description: Opens osparc and opens a copy of publised study + /v0/projects: + post: + tags: + - projects + summary: Creates a new project or copies an existing one + operationId: create_project + parameters: + - name: x_simcore_user_agent + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + default: undefined + title: X Simcore User Agent + - name: x_simcore_parent_project_uuid + in: query + required: false + schema: + anyOf: + - type: string + format: uuid + - type: 'null' + title: X Simcore Parent Project Uuid + - name: x_simcore_parent_node_id + in: query + required: false + schema: + anyOf: + - type: string + format: uuid + - type: 'null' + title: X Simcore Parent Node Id + - name: from_study + in: query + required: false + schema: + anyOf: + - type: string + format: uuid + - type: 'null' + title: From Study + - name: as_template + in: query + required: false + schema: + type: boolean + default: false + title: As Template + - name: copy_data + in: query + required: false + schema: + type: boolean + default: true + title: Copy Data + - name: hidden + in: query + required: false + schema: + type: boolean + default: false + title: Hidden + requestBody: + required: true + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/ProjectCreateNew' + - $ref: '#/components/schemas/ProjectCopyOverride' + title: ' Body' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskGet_' + get: + tags: + - projects + summary: List Projects + operationId: list_projects + parameters: + - name: type + in: query + required: false + schema: + $ref: '#/components/schemas/ProjectTypeAPI' + default: all + - name: show_hidden + in: query + required: false + schema: + type: boolean + default: false + title: Show Hidden + - name: search + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Search + - name: folder_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folder Id + - name: workspace_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspace Id + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"last_change_date","direction":"desc"}' + title: Order By + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_ProjectListItem_' + /v0/projects/active: + get: + tags: + - projects + summary: Get Active Project + operationId: get_active_project + parameters: + - name: client_session_id + in: query + required: true + schema: + type: string + title: Client Session Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGet_' + /v0/projects/{project_id}: + get: + tags: + - projects + summary: Get Project + operationId: get_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGet_' + patch: + tags: + - projects + summary: Patch Project + operationId: patch_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectPatch' + responses: + '204': + description: Successful Response + delete: + tags: + - projects + summary: Delete Project + operationId: delete_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}:clone: + post: + tags: + - projects + summary: Clone Project + operationId: clone_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskGet_' + /v0/projects:search: + get: + tags: + - projects + summary: List Projects Full Search + operationId: list_projects_full_search + parameters: + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"last_change_date","direction":"desc"}' + title: Order By + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + - name: text + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Text + - name: tag_ids + in: query + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Tag Ids + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_ProjectListItem_' + /v0/projects/{project_id}/inactivity: + get: + tags: + - projects + summary: Get Project Inactivity + operationId: get_project_inactivity + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_GetProjectInactivityResponse_' + /v0/projects/{project_uuid}/comments: + post: + tags: + - projects + - comments + summary: Create a new comment for a specific project. The request body should + contain the comment contents and user information. + operationId: create_project_comment + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_ProjectCommentsBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_Literal__comment_id____Annotated_int__Gt___' + get: + tags: + - projects + - comments + summary: Retrieve all comments for a specific project. + operationId: list_project_comments + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ProjectsCommentsAPI__' + /v0/projects/{project_uuid}/comments/{comment_id}: + put: + tags: + - projects + - comments + summary: Update the contents of a specific comment for a project. The request + body should contain the updated comment contents. + operationId: update_project_comment + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: comment_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Comment Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_ProjectCommentsBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectsCommentsAPI_' + delete: + tags: + - projects + - comments + summary: Delete a specific comment associated with a project. + operationId: delete_project_comment + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: comment_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Comment Id + minimum: 0 + responses: + '204': + description: Successful Response + get: + tags: + - projects + - comments + summary: Retrieve a specific comment by its ID within a project. + operationId: get_project_comment + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: comment_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Comment Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectsCommentsAPI_' + /v0/projects/{project_id}/folders/{folder_id}: + put: + tags: + - projects + - folders + summary: Move project to the folder + operationId: replace_project_folder + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: folder_id + in: path + required: true + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folder Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/groups/{group_id}: + post: + tags: + - projects + - groups + summary: Create Project Group + operationId: create_project_group + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_ProjectsGroupsBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGroupGet_' + put: + tags: + - projects + - groups + summary: Replace Project Group + operationId: replace_project_group + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/_ProjectsGroupsBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGroupGet_' + delete: + tags: + - projects + - groups + summary: Delete Project Group + operationId: delete_project_group + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/groups: + get: + tags: + - projects + - groups + summary: List Project Groups + operationId: list_project_groups + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ProjectGroupGet__' + /v0/projects/{project_id}/metadata: + get: + tags: + - projects + - metadata + summary: Get Project Metadata + operationId: get_project_metadata + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectMetadataGet_' + patch: + tags: + - projects + - metadata + summary: Update Project Metadata + operationId: update_project_metadata + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ProjectMetadataUpdate' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectMetadataGet_' + /v0/projects/{project_id}/nodes: + post: + tags: + - projects + - nodes + summary: Create Node + operationId: create_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NodeCreate' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_NodeCreated_' + /v0/projects/{project_id}/nodes/{node_id}: + get: + tags: + - projects + - nodes + summary: Get Node + operationId: get_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Union_NodeGetIdle__NodeGetUnknown__RunningDynamicServiceDetails__NodeGet__' + delete: + tags: + - projects + - nodes + summary: Delete Node + operationId: delete_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '204': + description: Successful Response + patch: + tags: + - projects + - nodes + summary: Patch Project Node + operationId: patch_project_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NodePatch' + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/nodes/{node_id}:retrieve: + post: + tags: + - projects + - nodes + summary: Retrieve Node + operationId: retrieve_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NodeRetrieve' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_NodeRetrieved_' + /v0/projects/{project_id}/nodes/{node_id}:start: + post: + tags: + - projects + - nodes + summary: Start Node + operationId: start_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/nodes/{node_id}:stop: + post: + tags: + - projects + - nodes + summary: Stop Node + operationId: stop_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TaskGet_' + /v0/projects/{project_id}/nodes/{node_id}:restart: + post: + tags: + - projects + - nodes + summary: Restart Node + description: Note that it has only effect on nodes associated to dynamic services + operationId: restart_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/nodes/{node_id}/outputs: + patch: + tags: + - projects + - nodes + summary: Update Node Outputs + operationId: update_node_outputs + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/NodeOutputs' + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/nodes/{node_id}/resources: + get: + tags: + - projects + - nodes + summary: Get Node Resources + operationId: get_node_resources + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' + put: + tags: + - projects + - nodes + summary: Replace Node Resources + operationId: replace_node_resources + parameters: + - name: project_id + in: path + required: true + schema: + type: string + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + title: Node Id + requestBody: + required: true + content: + application/json: + schema: + type: object + title: ' New' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_Annotated_str__StringConstraints___ImageResources__' + /v0/projects/{project_id}/nodes/-/services:access: + get: + tags: + - projects + - nodes + summary: Check whether provided group has access to the project services + operationId: get_project_services_access_for_gid + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: for_gid + in: query + required: true + schema: + type: integer + exclusiveMinimum: true + title: For Gid + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope__ProjectGroupAccess_' + /v0/projects/{project_id}/nodes/-/preview: + get: + tags: + - projects + - nodes + summary: Lists all previews in the node's project + operationId: list_project_nodes_previews + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list__ProjectNodePreview__' + /v0/projects/{project_id}/nodes/{node_id}/preview: + get: + tags: + - projects + - nodes + summary: Gets a give node's preview + operationId: get_project_node_preview + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + format: uuid + title: Node Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope__ProjectNodePreview_' + '404': + description: Node has no preview + /v0/projects/{project_id}/nodes/{node_id}/pricing-unit: + get: + tags: + - projects + summary: Get currently connected pricing unit to the project node. + operationId: get_project_node_pricing_unit + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + format: uuid + title: Node Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Union_PricingUnitGet__NoneType__' + /v0/projects/{project_id}/nodes/{node_id}/pricing-plan/{pricing_plan_id}/pricing-unit/{pricing_unit_id}: + put: + tags: + - projects + summary: Connect pricing unit to the project node (Project node can have only + one pricing unit) + operationId: connect_pricing_unit_to_project_node + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: node_id + in: path + required: true + schema: + type: string + format: uuid + title: Node Id + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + - name: pricing_unit_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Unit Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/inputs: + get: + tags: + - projects + - ports + summary: Get Project Inputs + description: New in version *0.10* + operationId: get_project_inputs + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_UUID__ProjectInputGet__' + patch: + tags: + - projects + - ports + summary: Update Project Inputs + description: New in version *0.10* + operationId: update_project_inputs + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ProjectInputUpdate' + title: ' Updates' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_UUID__ProjectInputGet__' + /v0/projects/{project_id}/outputs: + get: + tags: + - projects + - ports + summary: Get Project Outputs + description: New in version *0.10* + operationId: get_project_outputs + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_UUID__ProjectOutputGet__' + /v0/projects/{project_id}/metadata/ports: + get: + tags: + - projects + - ports + summary: List Project Metadata Ports + description: New in version *0.12* + operationId: list_project_metadata_ports + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ProjectMetadataPortGet__' + /v0/projects/{project_id}:open: + post: + tags: + - projects + summary: Open Project + operationId: open_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: disable_service_auto_start + in: query + required: false + schema: + type: boolean + default: false + title: Disable Service Auto Start + requestBody: + required: true + content: + application/json: + schema: + type: string + title: Client Session Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGet_' + '400': + description: ValidationError + '402': + description: WalletNotEnoughCreditsError + '403': + description: ProjectInvalidRightsError + '404': + description: ProjectNotFoundError, UserDefaultWalletNotFoundError + '409': + description: ProjectTooManyProjectOpenedError + '422': + description: ValidationError + '503': + description: DirectorServiceError + /v0/projects/{project_id}:close: + post: + tags: + - projects + summary: Close Project + operationId: close_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + requestBody: + required: true + content: + application/json: + schema: + type: string + title: Client Session Id + responses: + '204': + description: Successful Response + /v0/projects/{project_id}/state: + get: + tags: + - projects + summary: Get Project State + operationId: get_project_state + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectState_' + /v0/projects/{project_uuid}/tags/{tag_id}:add: + post: + tags: + - projects + - tags + summary: Add Project Tag + description: 'Links an existing label with an existing study + + + NOTE: that the tag is not created here' + operationId: add_project_tag + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: tag_id + in: path + required: true + schema: + type: integer + title: Tag Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGet_' + /v0/projects/{project_uuid}/tags/{tag_id}:remove: + post: + tags: + - projects + - tags + summary: Remove Project Tag + description: 'Removes an existing link between a label and a study + + + NOTE: that the tag is not deleted here' + operationId: remove_project_tag + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: tag_id + in: path + required: true + schema: + type: integer + title: Tag Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_ProjectGet_' + /v0/projects/{project_id}/wallet: + get: + tags: + - projects + summary: Get current connected wallet to the project. + operationId: get_project_wallet + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Union_WalletGet__NoneType__' + /v0/projects/{project_id}/wallet/{wallet_id}: + put: + tags: + - projects + summary: Connect wallet to the project (Project can have only one wallet) + operationId: connect_wallet_to_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: wallet_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Wallet Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WalletGet_' + /v0/projects/{project_id}/workspaces/{workspace_id}: + put: + tags: + - projects + - workspaces + summary: Move project to the workspace + operationId: replace_project_workspace + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: workspace_id + in: path + required: true + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspace Id + responses: + '204': + description: Successful Response + /v0/publications/service-submission: + post: + tags: + - publication + summary: Service Submission + description: Submits files with new service candidate + operationId: service_submission + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/Body_service_submission' + required: true + responses: + '204': + description: Successful Response + /v0/services/-/resource-usages: + get: + tags: + - usage + summary: Retrieve finished and currently running user services (user and product + are taken from context, optionally wallet_id parameter might be provided). + operationId: list_resource_usage_services + parameters: + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"started_at","direction":"desc"}' + title: Order By + - name: wallet_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Wallet Id + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_ServiceRunGet__' + /v0/services/-/aggregated-usages: + get: + tags: + - usage + summary: Used credits based on aggregate by type, currently supported `services`. + (user and product are taken from context, optionally wallet_id parameter might + be provided). + operationId: list_osparc_credits_aggregated_usages + parameters: + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + - name: aggregated_by + in: query + required: true + schema: + $ref: '#/components/schemas/ServicesAggregatedUsagesType' + - name: time_period + in: query + required: true + schema: + $ref: '#/components/schemas/ServicesAggregatedUsagesTimePeriod' + - name: wallet_id + in: query + required: true + schema: + type: integer + title: Wallet Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_OsparcCreditsAggregatedByServiceGet__' + /v0/services/-/usage-report: + get: + tags: + - usage + summary: Redirects to download CSV link. CSV obtains finished and currently + running user services (user and product are taken from context, optionally + wallet_id parameter might be provided). + operationId: export_resource_usage_services + parameters: + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"started_at","direction":"desc"}' + title: Order By + - name: wallet_id + in: query + required: false + schema: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Wallet Id + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + responses: + '302': + description: redirection to download link + content: + application/json: + schema: {} + /v0/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}: + get: + tags: + - pricing-plans + summary: Retrieve detail information about pricing unit + operationId: get_pricing_plan_unit + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + - name: pricing_unit_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Unit Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingUnitGet_' + /v0/admin/pricing-plans: + get: + tags: + - admin + summary: List pricing plans + description: To keep the listing lightweight, the pricingUnits field is None. + operationId: list_pricing_plans + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_PricingPlanAdminGet__' + post: + tags: + - admin + summary: Create pricing plan + operationId: create_pricing_plan + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreatePricingPlanBodyParams' + required: true + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' + /v0/admin/pricing-plans/{pricing_plan_id}: + get: + tags: + - admin + summary: Retrieve detail information about pricing plan + operationId: get_pricing_plan + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' + put: + tags: + - admin + summary: Update detail information about pricing plan + operationId: update_pricing_plan + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePricingPlanBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingPlanAdminGet_' + /v0/admin/pricing-plans/{pricing_plan_id}/pricing-units/{pricing_unit_id}: + get: + tags: + - admin + summary: Retrieve detail information about pricing unit + operationId: get_pricing_unit + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + - name: pricing_unit_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Unit Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' + put: + tags: + - admin + summary: Update detail information about pricing plan + operationId: update_pricing_unit + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + - name: pricing_unit_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Unit Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdatePricingUnitBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' + /v0/admin/pricing-plans/{pricing_plan_id}/pricing-units: + post: + tags: + - admin + summary: Create pricing unit + operationId: create_pricing_unit + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreatePricingUnitBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingUnitAdminGet_' + /v0/admin/pricing-plans/{pricing_plan_id}/billable-services: + get: + tags: + - admin + summary: List services that are connected to the provided pricing plan + operationId: list_connected_services_to_pricing_plan + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_PricingPlanToServiceAdminGet__' + post: + tags: + - admin + summary: Connect service with pricing plan + operationId: connect_service_to_pricing_plan + parameters: + - name: pricing_plan_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Pricing Plan Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectServiceToPricingPlanBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PricingPlanToServiceAdminGet_' + /: + get: + tags: + - statics + summary: Get Cached Frontend Index + operationId: get_cached_frontend_index + responses: + '200': + description: Successful Response + content: + text/html: + schema: + type: string + /static-frontend-data.json: + get: + tags: + - statics + summary: Static Frontend Data + description: Generic static info on the product's app + operationId: static_frontend_data + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/StaticFrontEndDict' + /v0/storage/locations: + get: + tags: + - storage + summary: Get available storage locations + description: Returns the list of available storage locations + operationId: get_storage_locations + responses: + '200': + description: Successful Response + content: + application/json: + schema: + items: + $ref: '#/components/schemas/DatasetMetaData' + type: array + title: Response Get Storage Locations + /v0/storage/locations/{location_id}:sync: + post: + tags: + - storage + summary: Manually triggers the synchronisation of the file meta data table in + the database + description: Returns an object containing added, changed and removed paths + operationId: synchronise_meta_data_table + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: dry_run + in: query + required: false + schema: + type: boolean + default: false + title: Dry Run + - name: fire_and_forget + in: query + required: false + schema: + type: boolean + default: false + title: Fire And Forget + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_TableSynchronisation_' + /v0/storage/locations/{location_id}/datasets: + get: + tags: + - storage + summary: Get datasets metadata + description: returns all the top level datasets a user has access to + operationId: get_datasets_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' + /v0/storage/locations/{location_id}/files/metadata: + get: + tags: + - storage + summary: Get datasets metadata + description: returns all the file meta data a user has access to (uuid_filter + may be used) + operationId: get_files_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: uuid_filter + in: query + required: false + schema: + type: string + default: '' + title: Uuid Filter + - name: expand_dirs + in: query + required: false + schema: + type: boolean + description: Automatic directory expansion. This will be replaced by pagination + the future + default: true + title: Expand Dirs + description: Automatic directory expansion. This will be replaced by pagination + the future + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_DatasetMetaData__' + /v0/storage/locations/{location_id}/datasets/{dataset_id}/metadata: + get: + tags: + - storage + summary: Get Files Metadata + description: returns all the file meta data inside dataset with dataset_id + operationId: get_files_metadata_dataset + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: dataset_id + in: path + required: true + schema: + type: string + title: Dataset Id + - name: expand_dirs + in: query + required: false + schema: + type: boolean + description: Automatic directory expansion. This will be replaced by pagination + the future + default: true + title: Expand Dirs + description: Automatic directory expansion. This will be replaced by pagination + the future + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_FileMetaDataGet__' + /v0/storage/locations/{location_id}/files/{file_id}/metadata: + get: + tags: + - storage + summary: Get File Metadata + description: returns the file meta data of file_id if user_id has the rights + to + operationId: get_file_metadata + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/FileMetaData' + - $ref: '#/components/schemas/Envelope_FileMetaDataGet_' + title: Response Get File Metadata + /v0/storage/locations/{location_id}/files/{file_id}: + get: + tags: + - storage + summary: Returns download link for requested file + description: creates a download file link if user has the rights to + operationId: download_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + - name: link_type + in: query + required: false + schema: + $ref: '#/components/schemas/LinkType' + default: PRESIGNED + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_PresignedLink_' + put: + tags: + - storage + summary: Returns upload link + description: creates one or more upload file links if user has the rights to, + expects the client to complete/abort upload + operationId: upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + - name: file_size + in: query + required: true + schema: + anyOf: + - type: string + pattern: ^\s*(\d*\.?\d+)\s*(\w+)? + - type: integer + minimum: 0 + - type: 'null' + title: File Size + - name: link_type + in: query + required: false + schema: + $ref: '#/components/schemas/LinkType' + default: PRESIGNED + - name: is_directory + in: query + required: false + schema: + type: boolean + default: false + title: Is Directory + responses: + '200': + description: Successful Response + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/Envelope_FileUploadSchema_' + - $ref: '#/components/schemas/Envelope_Url_' + title: Response Upload File + delete: + tags: + - storage + summary: Deletes File + description: deletes file if user has the rights to + operationId: delete_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + responses: + '204': + description: Successful Response + /v0/storage/locations/{location_id}/files/{file_id}:abort: + post: + tags: + - storage + summary: Abort Upload File + description: 'aborts an upload if user has the rights to, and reverts + + to the latest version if available, else will delete the file' + operationId: abort_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + responses: + '204': + description: Successful Response + /v0/storage/locations/{location_id}/files/{file_id}:complete: + post: + tags: + - storage + summary: Complete Upload File + description: completes an upload if the user has the rights to + operationId: complete_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompletionBody_' + responses: + '202': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompleteResponse_' + /v0/storage/locations/{location_id}/files/{file_id}:complete/futures/{future_id}: + post: + tags: + - storage + summary: Check for upload completion + description: Returns state of upload completion + operationId: is_completed_upload_file + parameters: + - name: location_id + in: path + required: true + schema: + type: integer + title: Location Id + - name: file_id + in: path + required: true + schema: + type: string + title: File Id + - name: future_id + in: path + required: true + schema: + type: string + title: Future Id + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_FileUploadCompleteFutureResponse_' + /v0/trash: + delete: + tags: + - trash + summary: Empty Trash + operationId: empty_trash + responses: + '204': + description: Successful Response + /v0/projects/{project_id}:trash: + post: + tags: + - trash + - projects + summary: Trash Project + operationId: trash_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + - name: force + in: query + required: false + schema: + type: boolean + default: false + title: Force + responses: + '204': + description: Successful Response + '404': + description: Not such a project + '409': + description: Project is in use and cannot be trashed + '503': + description: Trash service error + /v0/projects/{project_id}:untrash: + post: + tags: + - trash + - projects + summary: Untrash Project + operationId: untrash_project + parameters: + - name: project_id + in: path + required: true + schema: + type: string + format: uuid + title: Project Id + responses: + '204': + description: Successful Response + /v0/folders/{folder_id}:trash: + post: + tags: + - trash + - folders + summary: Trash Folder + operationId: trash_folder + parameters: + - name: folder_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Folder Id + minimum: 0 + - name: force + in: query + required: false + schema: + type: boolean + default: false + title: Force + responses: + '204': + description: Successful Response + '404': + description: Not such a folder + '409': + description: One or more projects in the folder are in use and cannot be + trashed + '503': + description: Trash service error + /v0/folders/{folder_id}:untrash: + post: + tags: + - trash + - folders + summary: Untrash Folder + operationId: untrash_folder + parameters: + - name: folder_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Folder Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/workspaces/{workspace_id}:trash: + post: + tags: + - trash + - workspaces + summary: Trash Workspace + operationId: trash_workspace + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + - name: force + in: query + required: false + schema: + type: boolean + default: false + title: Force + responses: + '204': + description: Successful Response + '404': + description: Not such a workspace + '409': + description: One or more projects in the workspace are in use and cannot + be trashed + '503': + description: Trash service error + /v0/workspaces/{workspace_id}:untrash: + post: + tags: + - trash + - workspaces + summary: Untrash Workspace + operationId: untrash_workspace + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + responses: + '204': + description: Successful Response + /v0/repos/projects: + get: + tags: + - repository + summary: List Repos + operationId: list_repos + parameters: + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_RepoApiModel_' + /v0/repos/projects/{project_uuid}/checkpoints: + get: + tags: + - repository + summary: List Checkpoints + operationId: list_checkpoints + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + exclusiveMaximum: true + default: 20 + title: Limit + maximum: 50 + - name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Page_CheckpointApiModel_' + post: + tags: + - repository + summary: Create Checkpoint + operationId: create_checkpoint + parameters: + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CheckpointNew' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CheckpointApiModel_' + /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}: + get: + tags: + - repository + summary: Get Checkpoint + operationId: get_checkpoint + parameters: + - name: ref_id + in: path + required: true + schema: + anyOf: + - type: integer + - type: string + - enum: + - HEAD + const: HEAD + type: string + title: Ref Id + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CheckpointApiModel_' + patch: + tags: + - repository + summary: Update Checkpoint + description: Update Checkpoint Annotations + operationId: update_checkpoint + parameters: + - name: ref_id + in: path + required: true + schema: + anyOf: + - type: integer + - type: string + title: Ref Id + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CheckpointAnnotations' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CheckpointApiModel_' + /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}/workbench/view: + get: + tags: + - repository + summary: View Project Workbench + operationId: view_project_workbench + parameters: + - name: ref_id + in: path + required: true + schema: + anyOf: + - type: integer + - type: string + title: Ref Id + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkbenchViewApiModel_' + /v0/repos/projects/{project_uuid}/checkpoints/{ref_id}:checkout: + post: + tags: + - repository + summary: Checkout + operationId: checkout + parameters: + - name: ref_id + in: path + required: true + schema: + anyOf: + - type: integer + - type: string + title: Ref Id + - name: project_uuid + in: path + required: true + schema: + type: string + format: uuid + title: Project Uuid + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_CheckpointApiModel_' + /v0/workspaces: + post: + tags: + - workspaces + summary: Create Workspace + operationId: create_workspace + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceCreateBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkspaceGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + get: + tags: + - workspaces + summary: List Workspaces + operationId: list_workspaces + parameters: + - name: order_by + in: query + required: false + schema: + type: string + contentMediaType: application/json + contentSchema: {} + default: '{"field":"modified","direction":"desc"}' + title: Order By + - name: filters + in: query + required: false + schema: + anyOf: + - type: string + contentMediaType: application/json + contentSchema: {} + - type: 'null' + title: Filters + - name: limit + in: query + required: false + schema: + type: integer + default: 20 + title: Limit + - name: offset + in: query + required: false + schema: + type: integer + default: 0 + title: Offset + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_WorkspaceGet__' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/workspaces/{workspace_id}: + get: + tags: + - workspaces + summary: Get Workspace + operationId: get_workspace + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkspaceGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + put: + tags: + - workspaces + summary: Replace Workspace + operationId: replace_workspace + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspaceReplaceBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkspaceGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + delete: + tags: + - workspaces + summary: Delete Workspace + operationId: delete_workspace + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + responses: + '204': + description: Successful Response + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/workspaces/{workspace_id}/groups/{group_id}: + post: + tags: + - workspaces + - groups + summary: Create Workspace Group + operationId: create_workspace_group + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspacesGroupsBodyParams' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkspaceGroupGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + put: + tags: + - workspaces + - groups + summary: Replace Workspace Group + operationId: replace_workspace_group + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WorkspacesGroupsBodyParams' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_WorkspaceGroupGet_' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + delete: + tags: + - workspaces + - groups + summary: Delete Workspace Group + operationId: delete_workspace_group + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + - name: group_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Group Id + minimum: 0 + responses: + '204': + description: Successful Response + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/workspaces/{workspace_id}/groups: + get: + tags: + - workspaces + - groups + summary: List Workspace Groups + operationId: list_workspace_groups + parameters: + - name: workspace_id + in: path + required: true + schema: + type: integer + exclusiveMinimum: true + title: Workspace Id + minimum: 0 + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_list_WorkspaceGroupGet__' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Not Found + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Forbidden + '409': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Conflict + '503': + content: + application/json: + schema: + $ref: '#/components/schemas/EnvelopedError' + description: Service Unavailable + /v0/email:test: + post: + tags: + - admin + summary: Test Email + operationId: test_email + parameters: + - name: x-simcore-products-name + in: header + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: X-Simcore-Products-Name + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/TestEmail' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_Union_EmailTestFailed__EmailTestPassed__' + /v0/: + get: + tags: + - maintenance + summary: Healthcheck Readiness Probe + description: 'Readiness probe: check if the container is ready to receive traffic' + operationId: healthcheck_readiness_probe + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_HealthInfoDict_' + /v0/health: + get: + tags: + - maintenance + summary: Healthcheck Liveness Probe + description: 'Liveness probe: check if the container is alive' + operationId: healthcheck_liveness_probe + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_str__Any__' + /v0/config: + get: + tags: + - maintenance + summary: Front end runtime configuration + description: Returns app and products configs + operationId: get_config + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_dict_str__Any__' + /v0/scheduled_maintenance: + get: + tags: + - maintenance + summary: Get Scheduled Maintenance + operationId: get_scheduled_maintenance + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_str_' + /v0/status: + get: + tags: + - maintenance + summary: checks status of self and connected services + operationId: get_app_status + responses: + '200': + description: Returns app status check + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_AppStatusCheck_' + /v0/status/diagnostics: + get: + tags: + - maintenance + summary: Get App Diagnostics + operationId: get_app_diagnostics + parameters: + - name: top_tracemalloc + in: query + required: false + schema: + anyOf: + - type: integer + - type: 'null' + title: Top Tracemalloc + responses: + '200': + description: Returns app diagnostics report + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_StatusDiagnosticsGet_' + /v0/status/{service_name}: + get: + tags: + - maintenance + summary: Get Service Status + operationId: get_service_status + parameters: + - name: service_name + in: path + required: true + schema: + type: string + title: Service Name + responses: + '200': + description: Returns app status check + content: + application/json: + schema: + $ref: '#/components/schemas/Envelope_AppStatusCheck_' +components: + schemas: + AccessEnum: + type: string + enum: + - ReadAndWrite + - Invisible + - ReadOnly + title: AccessEnum + AccessRights: + properties: + read: + type: boolean + title: Read + description: has read access + write: + type: boolean + title: Write + description: has write access + delete: + type: boolean + title: Delete + description: has deletion rights + additionalProperties: false + type: object + required: + - read + - write + - delete + title: AccessRights + AccountRequestInfo: + properties: + form: + type: object + title: Form + captcha: + type: string + title: Captcha + type: object + required: + - form + - captcha + title: AccountRequestInfo + example: + captcha: A12B34 + form: + address: Infinite Loop + application: Antenna_Design + city: Washington + company: EM Com + country: USA + description: Description of something + email: maxwel@email.com + eula: true + firstName: James + hear: Search_Engine + lastName: Maxwel + phone: +1 123456789 + postalCode: '98001' + privacyPolicy: true + Activity: + properties: + stats: + $ref: '#/components/schemas/Stats' + limits: + $ref: '#/components/schemas/Limits' + queued: + type: boolean + title: Queued + type: object + required: + - stats + - limits + title: Activity + Annotation: + properties: + type: + type: string + enum: + - note + - rect + - text + title: Type + color: + type: string + format: color + title: Color + attributes: + type: object + title: Attributes + description: svg attributes + additionalProperties: false + type: object + required: + - type + - color + - attributes + title: Annotation + Announcement: + properties: + id: + type: string + title: Id + products: + items: + type: string + type: array + title: Products + start: + type: string + format: date-time + title: Start + end: + type: string + format: date-time + title: End + title: + type: string + title: Title + description: + type: string + title: Description + link: + type: string + title: Link + widgets: + items: + type: string + enum: + - login + - ribbon + - user-menu + type: array + title: Widgets + type: object + required: + - id + - products + - start + - end + - title + - description + - link + - widgets + title: Announcement + ApiKeyCreate: + properties: + display_name: + type: string + minLength: 3 + title: Display Name + expiration: + anyOf: + - type: string + format: duration + - type: 'null' + title: Expiration + description: Time delta from creation time to expiration. If None, then + it does not expire. + type: object + required: + - display_name + title: ApiKeyCreate + ApiKeyGet: + properties: + display_name: + type: string + minLength: 3 + title: Display Name + api_key: + type: string + title: Api Key + api_secret: + type: string + title: Api Secret + type: object + required: + - display_name + - api_key + - api_secret + title: ApiKeyGet + AppStatusCheck: + properties: + app_name: + type: string + title: App Name + description: Application name + version: + type: string + title: Version + description: Application's version + services: + type: object + title: Services + description: Other backend services connected from this service + default: {} + sessions: + anyOf: + - type: object + - type: 'null' + title: Sessions + description: Client sessions info. If single session per app, then is denoted + as main + default: {} + url: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Url + description: Link to current resource + diagnostics_url: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Diagnostics Url + description: Link to diagnostics report sub-resource. This MIGHT take some + time to compute + type: object + required: + - app_name + - version + title: AppStatusCheck + Author: + properties: + name: + type: string + title: Name + description: Name of the author + email: + type: string + format: email + title: Email + description: Email address + affiliation: + anyOf: + - type: string + - type: 'null' + title: Affiliation + type: object + required: + - name + - email + title: Author + Body_service_submission: + properties: + file: + type: string + format: binary + title: File + description: metadata.json submission file + type: object + required: + - file + title: Body_service_submission + BootChoice: + properties: + label: + type: string + title: Label + description: + type: string + title: Description + type: object + required: + - label + - description + title: BootChoice + BootMode: + type: string + enum: + - CPU + - GPU + - MPI + title: BootMode + BootOption: + properties: + label: + type: string + title: Label + description: + type: string + title: Description + default: + type: string + title: Default + items: + additionalProperties: + $ref: '#/components/schemas/BootChoice' + type: object + title: Items + type: object + required: + - label + - description + - default + - items + title: BootOption + CatalogServiceGet: + properties: + key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Key + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + name: + type: string + title: Name + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + description: + type: string + title: Description + descriptionUi: + type: boolean + title: Descriptionui + default: false + versionDisplay: + anyOf: + - type: string + - type: 'null' + title: Versiondisplay + type: + $ref: '#/components/schemas/ServiceType' + contact: + anyOf: + - type: string + format: email + - type: 'null' + title: Contact + authors: + items: + $ref: '#/components/schemas/Author' + type: array + minItems: 1 + title: Authors + owner: + anyOf: + - type: string + format: email + - type: 'null' + title: Owner + description: None when the owner email cannot be found in the database + inputs: + type: object + title: Inputs + description: inputs with extended information + outputs: + type: object + title: Outputs + description: outputs with extended information + bootOptions: + anyOf: + - type: object + - type: 'null' + title: Bootoptions + minVisibleInputs: + anyOf: + - type: integer + minimum: 0 + - type: 'null' + title: Minvisibleinputs + accessRights: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/ServiceGroupAccessRightsV2' + type: object + - type: 'null' + title: Accessrights + classifiers: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Classifiers + default: [] + quality: + type: object + title: Quality + default: {} + history: + items: + $ref: '#/components/schemas/ServiceRelease' + type: array + title: History + description: history of releases for this service at this point in time, + starting from the newest to the oldest. It includes current release. + default: [] + type: object + required: + - key + - version + - name + - description + - type + - contact + - authors + - owner + - inputs + - outputs + - accessRights + title: CatalogServiceGet + example: + accessRights: + '1': + execute: true + write: false + authors: + - affiliation: ACME + email: author@acme.com + name: Author Bar + classifiers: [] + contact: contact@acme.com + description: A service which awaits for time to pass, two times. + description_ui: true + history: + - released: '2024-07-20T15:00:00' + version: 2.2.1 + version_display: Summer Release + - compatibility: + canUpdateTo: + version: 2.2.1 + version: 2.0.0 + - version: 0.9.11 + - version: 0.9.10 + - compatibility: + canUpdateTo: + version: 0.9.11 + version: 0.9.8 + - compatibility: + can_update_to: + version: 0.9.11 + released: '2024-01-20T18:49:17' + version: 0.9.1 + versionDisplay: Matterhorn + - retired: '2024-07-20T15:00:00' + version: 0.9.0 + - version: 0.8.0 + - version: 0.1.0 + inputs: + input0: + contentSchema: + title: Acceleration + type: number + x_unit: m/s**2 + description: acceleration with units + keyId: input_1 + label: Acceleration + type: ref_contentSchema + unitLong: meter/second3 + unitShort: m/s3 + key: simcore/services/comp/itis/sleeper + name: sleeper + outputs: + outFile: + description: Time the service waited before completion + displayOrder: 2 + keyId: output_2 + label: Time Slept + type: number + unit: second + unitLong: seconds + unitShort: sec + owner: owner@acme.com + quality: {} + type: computational + version: 2.2.1 + version_display: 2 Xtreme + CatalogServiceUpdate: + properties: + name: + anyOf: + - type: string + - type: 'null' + title: Name + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + description: + anyOf: + - type: string + - type: 'null' + title: Description + descriptionUi: + type: boolean + title: Descriptionui + default: false + versionDisplay: + anyOf: + - type: string + - type: 'null' + title: Versiondisplay + deprecated: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Deprecated + classifiers: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Classifiers + quality: + type: object + title: Quality + default: {} + accessRights: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/ServiceGroupAccessRightsV2' + type: object + - type: 'null' + title: Accessrights + type: object + title: CatalogServiceUpdate + ChangePasswordBody: + properties: + current: + type: string + format: password + title: Current + writeOnly: true + new: + type: string + format: password + title: New + writeOnly: true + confirm: + type: string + format: password + title: Confirm + writeOnly: true + additionalProperties: false + type: object + required: + - current + - new + - confirm + title: ChangePasswordBody + CheckpointAnnotations: + properties: + tag: + anyOf: + - type: string + - type: 'null' + title: Tag + message: + anyOf: + - type: string + - type: 'null' + title: Message + type: object + title: CheckpointAnnotations + CheckpointApiModel: + properties: + id: + type: integer + exclusiveMinimum: true + title: Id + minimum: 0 + checksum: + type: string + pattern: ^[a-fA-F0-9]{40}$ + title: Checksum + created_at: + type: string + format: date-time + title: Created At + tags: + items: + type: string + type: array + title: Tags + message: + anyOf: + - type: string + - type: 'null' + title: Message + parents_ids: + anyOf: + - items: + type: integer + exclusiveMinimum: true + minimum: 0 + type: array + - type: 'null' + title: Parents Ids + url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Url + type: object + required: + - id + - checksum + - created_at + - tags + - url + title: CheckpointApiModel + CheckpointNew: + properties: + tag: + type: string + title: Tag + message: + anyOf: + - type: string + - type: 'null' + title: Message + type: object + required: + - tag + title: CheckpointNew + ClusterAccessRights: + properties: + read: + type: boolean + title: Read + description: allows to run pipelines on that cluster + write: + type: boolean + title: Write + description: allows to modify the cluster + delete: + type: boolean + title: Delete + description: allows to delete a cluster + additionalProperties: false + type: object + required: + - read + - write + - delete + title: ClusterAccessRights + ClusterCreate: + properties: + name: + type: string + title: Name + description: The human readable name of the cluster + description: + anyOf: + - type: string + - type: 'null' + title: Description + type: + $ref: '#/components/schemas/ClusterTypeInModel' + owner: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Owner + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + description: url to the image describing this cluster + endpoint: + type: string + minLength: 1 + format: uri + title: Endpoint + authentication: + oneOf: + - $ref: '#/components/schemas/SimpleAuthentication' + - $ref: '#/components/schemas/KerberosAuthentication' + - $ref: '#/components/schemas/JupyterHubTokenAuthentication' + title: Authentication + discriminator: + propertyName: type + mapping: + jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' + kerberos: '#/components/schemas/KerberosAuthentication' + simple: '#/components/schemas/SimpleAuthentication' + accessRights: + additionalProperties: + $ref: '#/components/schemas/ClusterAccessRights' + type: object + title: Accessrights + type: object + required: + - name + - type + - endpoint + - authentication + title: ClusterCreate + ClusterDetails: + properties: + scheduler: + $ref: '#/components/schemas/Scheduler' + description: This contains dask scheduler information given by the underlying + dask library + dashboardLink: + type: string + minLength: 1 + format: uri + title: Dashboardlink + description: Link to this scheduler's dashboard + type: object + required: + - scheduler + - dashboardLink + title: ClusterDetails + ClusterGet: + properties: + name: + type: string + title: Name + description: The human readable name of the cluster + description: + anyOf: + - type: string + - type: 'null' + title: Description + type: + $ref: '#/components/schemas/ClusterTypeInModel' + owner: + type: integer + exclusiveMinimum: true + title: Owner + minimum: 0 + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + description: url to the image describing this cluster + endpoint: + type: string + minLength: 1 + format: uri + title: Endpoint + authentication: + oneOf: + - $ref: '#/components/schemas/SimpleAuthentication' + - $ref: '#/components/schemas/KerberosAuthentication' + - $ref: '#/components/schemas/JupyterHubTokenAuthentication' + - $ref: '#/components/schemas/NoAuthentication' + - $ref: '#/components/schemas/TLSAuthentication' + title: Authentication + description: Dask gateway authentication + discriminator: + propertyName: type + mapping: + jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' + kerberos: '#/components/schemas/KerberosAuthentication' + none: '#/components/schemas/NoAuthentication' + simple: '#/components/schemas/SimpleAuthentication' + tls: '#/components/schemas/TLSAuthentication' + accessRights: + additionalProperties: + $ref: '#/components/schemas/ClusterAccessRights' + type: object + title: Accessrights + default: {} + id: + type: integer + minimum: 0 + title: Id + description: The cluster ID + type: object + required: + - name + - type + - owner + - endpoint + - authentication + - id + title: ClusterGet + ClusterPatch: + properties: + name: + anyOf: + - type: string + - type: 'null' + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + type: + anyOf: + - $ref: '#/components/schemas/ClusterTypeInModel' + - type: 'null' + owner: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Owner + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + endpoint: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Endpoint + authentication: + anyOf: + - oneOf: + - $ref: '#/components/schemas/SimpleAuthentication' + - $ref: '#/components/schemas/KerberosAuthentication' + - $ref: '#/components/schemas/JupyterHubTokenAuthentication' + discriminator: + propertyName: type + mapping: + jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' + kerberos: '#/components/schemas/KerberosAuthentication' + simple: '#/components/schemas/SimpleAuthentication' + - type: 'null' + title: Authentication + accessRights: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/ClusterAccessRights' + type: object + - type: 'null' + title: Accessrights + type: object + title: ClusterPatch + ClusterPing: + properties: + endpoint: + type: string + minLength: 1 + format: uri + title: Endpoint + authentication: + oneOf: + - $ref: '#/components/schemas/SimpleAuthentication' + - $ref: '#/components/schemas/KerberosAuthentication' + - $ref: '#/components/schemas/JupyterHubTokenAuthentication' + - $ref: '#/components/schemas/NoAuthentication' + - $ref: '#/components/schemas/TLSAuthentication' + title: Authentication + description: Dask gateway authentication + discriminator: + propertyName: type + mapping: + jupyterhub: '#/components/schemas/JupyterHubTokenAuthentication' + kerberos: '#/components/schemas/KerberosAuthentication' + none: '#/components/schemas/NoAuthentication' + simple: '#/components/schemas/SimpleAuthentication' + tls: '#/components/schemas/TLSAuthentication' + type: object + required: + - endpoint + - authentication + title: ClusterPing + ClusterTypeInModel: + type: string + enum: + - AWS + - ON_PREMISE + - ON_DEMAND + title: ClusterTypeInModel + CodePageParams: + properties: + message: + type: string + title: Message + expiration_2fa: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Expiration 2Fa + next_url: + anyOf: + - type: string + - type: 'null' + title: Next Url + type: object + required: + - message + title: CodePageParams + Compatibility: + properties: + canUpdateTo: + $ref: '#/components/schemas/CompatibleService' + description: Latest compatible service at this moment + type: object + required: + - canUpdateTo + title: Compatibility + CompatibleService: + properties: + key: + anyOf: + - type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + - type: 'null' + title: Key + description: If None, it refer to current service. Used only for inter-service + compatibility + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + type: object + required: + - version + title: CompatibleService + ComputationStart: + properties: + force_restart: + type: boolean + title: Force Restart + default: false + cluster_id: + type: integer + minimum: 0 + title: Cluster Id + default: 0 + subgraph: + items: + type: string + type: array + uniqueItems: true + title: Subgraph + default: [] + type: object + title: ComputationStart + ComputationTaskGet: + properties: + cluster_id: + anyOf: + - type: integer + minimum: 0 + - type: 'null' + title: Cluster Id + type: object + required: + - cluster_id + title: ComputationTaskGet + ConnectServiceToPricingPlanBodyParams: + properties: + serviceKey: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Servicekey + serviceVersion: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Serviceversion + type: object + required: + - serviceKey + - serviceVersion + title: ConnectServiceToPricingPlanBodyParams + CountryInfoDict: + properties: + name: + type: string + title: Name + alpha2: + type: string + title: Alpha2 + type: object + required: + - name + - alpha2 + title: CountryInfoDict + CreatePricingPlanBodyParams: + properties: + displayName: + type: string + title: Displayname + description: + type: string + title: Description + classification: + $ref: '#/components/schemas/PricingPlanClassification' + pricingPlanKey: + type: string + title: Pricingplankey + type: object + required: + - displayName + - description + - classification + - pricingPlanKey + title: CreatePricingPlanBodyParams + CreatePricingUnitBodyParams: + properties: + unitName: + type: string + title: Unitname + unitExtraInfo: + $ref: '#/components/schemas/UnitExtraInfo-Input' + default: + type: boolean + title: Default + specificInfo: + $ref: '#/components/schemas/SpecificInfo' + costPerUnit: + anyOf: + - type: number + - type: string + title: Costperunit + comment: + type: string + title: Comment + type: object + required: + - unitName + - unitExtraInfo + - default + - specificInfo + - costPerUnit + - comment + title: CreatePricingUnitBodyParams + CreateWalletBodyParams: + properties: + name: + type: string + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + - type: 'null' + title: Thumbnail + type: object + required: + - name + title: CreateWalletBodyParams + CreateWalletPayment: + properties: + priceDollars: + anyOf: + - type: number + exclusiveMaximum: true + exclusiveMinimum: true + maximum: 1000000.0 + minimum: 0.0 + - type: string + title: Pricedollars + comment: + anyOf: + - type: string + maxLength: 100 + - type: 'null' + title: Comment + type: object + required: + - priceDollars + title: CreateWalletPayment + DatCoreFileLink: + properties: + store: + type: integer + title: Store + description: 'The store identifier: 0 for simcore S3, 1 for datcore' + path: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: Path + description: The path to the file in the storage provider domain + label: + type: string + title: Label + description: The real file name + eTag: + anyOf: + - type: string + - type: 'null' + title: Etag + description: Entity tag that uniquely represents the file. The method to + generate the tag is not specified (black box). + dataset: + type: string + title: Dataset + description: Unique identifier to access the dataset on datcore (REQUIRED + for datcore) + additionalProperties: false + type: object + required: + - store + - path + - label + - dataset + title: DatCoreFileLink + description: I/O port type to hold a link to a file in DATCORE storage + DatasetMetaData: + properties: + dataset_id: + anyOf: + - type: string + - type: 'null' + title: Dataset Id + display_name: + anyOf: + - type: string + - type: 'null' + title: Display Name + type: object + title: DatasetMetaData + example: + dataset_id: N:id-aaaa + display_name: simcore-testing + DictModel_str_Annotated_float__Gt__: + additionalProperties: + type: number + exclusiveMinimum: true + minimum: 0.0 + type: object + title: DictModel[str, Annotated[float, Gt]] + DownloadLink: + properties: + downloadLink: + type: string + title: Downloadlink + label: + anyOf: + - type: string + - type: 'null' + title: Label + description: Display name + additionalProperties: false + type: object + required: + - downloadLink + title: DownloadLink + description: I/O port type to hold a generic download link to a file (e.g. S3 + pre-signed link, etc) + EmailTestFailed: + properties: + test_name: + type: string + title: Test Name + error_type: + type: string + title: Error Type + error_message: + type: string + title: Error Message + traceback: + type: string + title: Traceback + type: object + required: + - test_name + - error_type + - error_message + - traceback + title: EmailTestFailed + EmailTestPassed: + properties: + fixtures: + type: object + title: Fixtures + info: + type: object + title: Info + type: object + required: + - fixtures + - info + title: EmailTestPassed + EmptyModel: + properties: {} + additionalProperties: false + type: object + title: EmptyModel + Envelope_AppStatusCheck_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/AppStatusCheck' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[AppStatusCheck] + Envelope_CatalogServiceGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/CatalogServiceGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[CatalogServiceGet] + Envelope_CheckpointApiModel_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/CheckpointApiModel' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[CheckpointApiModel] + Envelope_ClusterDetails_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ClusterDetails' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ClusterDetails] + Envelope_ClusterGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ClusterGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ClusterGet] + Envelope_ComputationTaskGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ComputationTaskGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ComputationTaskGet] + Envelope_FileMetaDataGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileMetaDataGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileMetaDataGet] + Envelope_FileUploadCompleteFutureResponse_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompleteFutureResponse' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompleteFutureResponse] + Envelope_FileUploadCompleteResponse_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompleteResponse' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompleteResponse] + Envelope_FileUploadCompletionBody_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadCompletionBody' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadCompletionBody] + Envelope_FileUploadSchema_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FileUploadSchema' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FileUploadSchema] + Envelope_FolderGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/FolderGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[FolderGet] + Envelope_GetCreditPrice_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GetCreditPrice' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GetCreditPrice] + Envelope_GetProduct_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GetProduct' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GetProduct] + Envelope_GetProjectInactivityResponse_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GetProjectInactivityResponse' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GetProjectInactivityResponse] + Envelope_GetWalletAutoRecharge_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GetWalletAutoRecharge' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GetWalletAutoRecharge] + Envelope_GroupGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GroupGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GroupGet] + Envelope_GroupUserGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/GroupUserGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[GroupUserGet] + Envelope_HealthInfoDict_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/HealthInfoDict' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[HealthInfoDict] + Envelope_InvitationGenerated_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/InvitationGenerated' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[InvitationGenerated] + Envelope_InvitationInfo_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/InvitationInfo' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[InvitationInfo] + Envelope_Log_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/Log' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Log] + Envelope_LoginNextPage_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/LoginNextPage' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[LoginNextPage] + Envelope_MyGroupsGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/MyGroupsGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[MyGroupsGet] + Envelope_NodeCreated_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/NodeCreated' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[NodeCreated] + Envelope_NodeRetrieved_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/NodeRetrieved' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[NodeRetrieved] + Envelope_PaymentMethodGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PaymentMethodGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PaymentMethodGet] + Envelope_PaymentMethodInitiated_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PaymentMethodInitiated' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PaymentMethodInitiated] + Envelope_PresignedLink_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PresignedLink' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PresignedLink] + Envelope_PricingPlanAdminGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PricingPlanAdminGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PricingPlanAdminGet] + Envelope_PricingPlanToServiceAdminGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PricingPlanToServiceAdminGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PricingPlanToServiceAdminGet] + Envelope_PricingUnitAdminGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PricingUnitAdminGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PricingUnitAdminGet] + Envelope_PricingUnitGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PricingUnitGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[PricingUnitGet] + Envelope_ProfileGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProfileGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProfileGet] + Envelope_ProjectGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProjectGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProjectGet] + Envelope_ProjectGroupGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProjectGroupGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProjectGroupGet] + Envelope_ProjectMetadataGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProjectMetadataGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProjectMetadataGet] + Envelope_ProjectState_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProjectState' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProjectState] + Envelope_ProjectsCommentsAPI_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ProjectsCommentsAPI' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ProjectsCommentsAPI] + Envelope_RegisterPhoneNextPage_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/RegisterPhoneNextPage' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[RegisterPhoneNextPage] + Envelope_ResearchResource_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ResearchResource' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ResearchResource] + Envelope_ServiceInputGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ServiceInputGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ServiceInputGet] + Envelope_ServicePricingPlanGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ServicePricingPlanGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ServicePricingPlanGet] + Envelope_StatusDiagnosticsGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/StatusDiagnosticsGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[StatusDiagnosticsGet] + Envelope_TableSynchronisation_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TableSynchronisation' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TableSynchronisation] + Envelope_TagGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TagGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TagGet] + Envelope_TaskGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TaskGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TaskGet] + Envelope_TaskStatus_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/TaskStatus' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[TaskStatus] + Envelope_ThirdPartyToken_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/ThirdPartyToken' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[ThirdPartyToken] + Envelope_Union_EmailTestFailed__EmailTestPassed__: + properties: + data: + anyOf: + - $ref: '#/components/schemas/EmailTestFailed' + - $ref: '#/components/schemas/EmailTestPassed' + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Union[EmailTestFailed, EmailTestPassed]] + Envelope_Union_NodeGetIdle__NodeGetUnknown__RunningDynamicServiceDetails__NodeGet__: + properties: + data: + anyOf: + - $ref: '#/components/schemas/NodeGetIdle' + - $ref: '#/components/schemas/NodeGetUnknown' + - $ref: '#/components/schemas/RunningDynamicServiceDetails' + - $ref: '#/components/schemas/NodeGet' + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Union[NodeGetIdle, NodeGetUnknown, RunningDynamicServiceDetails, + NodeGet]] + Envelope_Union_PricingUnitGet__NoneType__: + properties: + data: + anyOf: + - $ref: '#/components/schemas/PricingUnitGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Union[PricingUnitGet, NoneType]] + Envelope_Union_WalletGet__NoneType__: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WalletGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Union[WalletGet, NoneType]] + Envelope_Url_: + properties: + data: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[Url] + Envelope_UserProfile_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/UserProfile' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[UserProfile] + Envelope_WalletGetWithAvailableCredits_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WalletGetWithAvailableCredits' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WalletGetWithAvailableCredits] + Envelope_WalletGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WalletGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WalletGet] + Envelope_WalletGroupGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WalletGroupGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WalletGroupGet] + Envelope_WalletPaymentInitiated_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WalletPaymentInitiated' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WalletPaymentInitiated] + Envelope_WorkbenchViewApiModel_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WorkbenchViewApiModel' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WorkbenchViewApiModel] + Envelope_WorkspaceGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WorkspaceGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WorkspaceGet] + Envelope_WorkspaceGroupGet_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/WorkspaceGroupGet' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[WorkspaceGroupGet] + Envelope__ComputationStarted_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/_ComputationStarted' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[_ComputationStarted] + Envelope__ProjectGroupAccess_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/_ProjectGroupAccess' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[_ProjectGroupAccess] + Envelope__ProjectNodePreview_: + properties: + data: + anyOf: + - $ref: '#/components/schemas/_ProjectNodePreview' + - type: 'null' + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[_ProjectNodePreview] + Envelope_dict_Annotated_str__StringConstraints___ImageResources__: + properties: + data: + anyOf: + - type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[Annotated[str, StringConstraints], ImageResources]] + Envelope_dict_Literal__comment_id____Annotated_int__Gt___: + properties: + data: + anyOf: + - additionalProperties: + type: integer + exclusiveMinimum: true + minimum: 0 + type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[Literal['comment_id'], Annotated[int, Gt]]] + Envelope_dict_UUID__Activity__: + properties: + data: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/Activity' + type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[UUID, Activity]] + Envelope_dict_UUID__ProjectInputGet__: + properties: + data: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/ProjectInputGet' + type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[UUID, ProjectInputGet]] + Envelope_dict_UUID__ProjectOutputGet__: + properties: + data: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/ProjectOutputGet' + type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[UUID, ProjectOutputGet]] + Envelope_dict_str__Any__: + properties: + data: + anyOf: + - type: object + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[dict[str, Any]] + Envelope_list_Annotated_str__StringConstraints___: + properties: + data: + anyOf: + - items: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[Annotated[str, StringConstraints]]] + Envelope_list_Announcement__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/Announcement' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[Announcement]] + Envelope_list_ClusterGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ClusterGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ClusterGet]] + Envelope_list_DatasetMetaData__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/DatasetMetaData' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[DatasetMetaData]] + Envelope_list_FileMetaDataGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/FileMetaDataGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[FileMetaDataGet]] + Envelope_list_FolderGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/FolderGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[FolderGet]] + Envelope_list_GroupUserGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/GroupUserGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[GroupUserGet]] + Envelope_list_OsparcCreditsAggregatedByServiceGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/OsparcCreditsAggregatedByServiceGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[OsparcCreditsAggregatedByServiceGet]] + Envelope_list_PaymentMethodGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/PaymentMethodGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[PaymentMethodGet]] + Envelope_list_PermissionGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/PermissionGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[PermissionGet]] + Envelope_list_PricingPlanAdminGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/PricingPlanAdminGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[PricingPlanAdminGet]] + Envelope_list_PricingPlanToServiceAdminGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/PricingPlanToServiceAdminGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[PricingPlanToServiceAdminGet]] + Envelope_list_ProjectGroupGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ProjectGroupGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ProjectGroupGet]] + Envelope_list_ProjectMetadataPortGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ProjectMetadataPortGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ProjectMetadataPortGet]] + Envelope_list_ProjectsCommentsAPI__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ProjectsCommentsAPI' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ProjectsCommentsAPI]] + Envelope_list_ResourceHit__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ResourceHit' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ResourceHit]] + Envelope_list_ServiceGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ServiceGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ServiceGet]] + Envelope_list_ServiceInputGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ServiceInputGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ServiceInputGet]] + Envelope_list_ServiceOutputGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ServiceOutputGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ServiceOutputGet]] + Envelope_list_ServiceRunGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ServiceRunGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ServiceRunGet]] + Envelope_list_TagGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/TagGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[TagGet]] + Envelope_list_TagGroupGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/TagGroupGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[TagGroupGet]] + Envelope_list_TaskGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/TaskGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[TaskGet]] + Envelope_list_ThirdPartyToken__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/ThirdPartyToken' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[ThirdPartyToken]] + Envelope_list_UserNotification__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/UserNotification' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[UserNotification]] + Envelope_list_UserProfile__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/UserProfile' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[UserProfile]] + Envelope_list_Viewer__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/Viewer' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[Viewer]] + Envelope_list_WalletGetWithAvailableCredits__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/WalletGetWithAvailableCredits' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[WalletGetWithAvailableCredits]] + Envelope_list_WalletGroupGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/WalletGroupGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[WalletGroupGet]] + Envelope_list_WorkspaceGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/WorkspaceGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[WorkspaceGet]] + Envelope_list_WorkspaceGroupGet__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/WorkspaceGroupGet' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[WorkspaceGroupGet]] + Envelope_list__ProjectNodePreview__: + properties: + data: + anyOf: + - items: + $ref: '#/components/schemas/_ProjectNodePreview' + type: array + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[list[_ProjectNodePreview]] + Envelope_str_: + properties: + data: + anyOf: + - type: string + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[str] + EnvelopedError: + properties: + data: + type: 'null' + title: Data + error: + $ref: '#/components/schemas/ErrorGet' + type: object + required: + - error + title: EnvelopedError + ErrorGet: + properties: + message: + type: string + minLength: 5 + title: Message + description: Message displayed to the user + supportId: + anyOf: + - type: string + maxLength: 100 + minLength: 1 + - type: 'null' + title: Supportid + description: ID to track the incident during support + status: + type: integer + title: Status + default: 400 + deprecated: true + errors: + items: + $ref: '#/components/schemas/ErrorItemType' + type: array + title: Errors + default: [] + deprecated: true + logs: + items: + $ref: '#/components/schemas/LogMessageType' + type: array + title: Logs + default: [] + deprecated: true + type: object + required: + - message + title: ErrorGet + ErrorItemType: + properties: + code: + type: string + title: Code + message: + type: string + title: Message + resource: + anyOf: + - type: string + - type: 'null' + title: Resource + field: + anyOf: + - type: string + - type: 'null' + title: Field + type: object + required: + - code + - message + - resource + - field + title: ErrorItemType + ExtractedResults: + properties: + progress: + type: object + title: Progress + description: Progress in each computational node + labels: + type: object + title: Labels + description: Maps captured node with a label + values: + type: object + title: Values + description: Captured outputs per node + type: object + required: + - progress + - labels + - values + title: ExtractedResults + example: + labels: + 0f1e38c9-dcb7-443c-a745-91b97ac28ccc: Integer iterator + 2d0ce8b9-c9c3-43ce-ad2f-ad493898de37: Probe Sensor - Integer + 445b44d1-59b3-425c-ac48-7c13e0f2ea5b: Probe Sensor - Integer_2 + d76fca06-f050-4790-88a8-0aac10c87b39: Boolean Parameter + progress: + 4c08265a-427b-4ac3-9eab-1d11c822ada4: 0 + e33c6880-1b1d-4419-82d7-270197738aa9: 100 + values: + 0f1e38c9-dcb7-443c-a745-91b97ac28ccc: + out_1: 1 + out_2: + - 3 + - 4 + 2d0ce8b9-c9c3-43ce-ad2f-ad493898de37: + in_1: 7 + 445b44d1-59b3-425c-ac48-7c13e0f2ea5b: + in_1: 1 + d76fca06-f050-4790-88a8-0aac10c87b39: + out_1: true + FileMetaData: + properties: + file_uuid: + anyOf: + - type: string + - type: 'null' + title: File Uuid + location_id: + anyOf: + - type: string + - type: 'null' + title: Location Id + project_name: + anyOf: + - type: string + - type: 'null' + title: Project Name + node_name: + anyOf: + - type: string + - type: 'null' + title: Node Name + file_name: + anyOf: + - type: string + - type: 'null' + title: File Name + file_id: + anyOf: + - type: string + - type: 'null' + title: File Id + created_at: + anyOf: + - type: string + - type: 'null' + title: Created At + last_modified: + anyOf: + - type: string + - type: 'null' + title: Last Modified + file_size: + anyOf: + - type: integer + - type: 'null' + title: File Size + entity_tag: + anyOf: + - type: string + - type: 'null' + title: Entity Tag + is_directory: + anyOf: + - type: boolean + - type: 'null' + title: Is Directory + type: object + title: FileMetaData + example: + created_at: '2019-06-19T12:29:03.308611Z' + entity_tag: a87ff679a2f3e71d9181a67b7542122c + file_id: N:package:e263da07-2d89-45a6-8b0f-61061b913873 + file_name: example.txt + file_size: 73 + file_uuid: simcore-testing/105/1000/3 + is_directory: false + last_modified: '2019-06-19T12:29:03.78852Z' + location_id: '0' + node_name: alpha + project_name: futurology + FileMetaDataGet: + properties: + file_uuid: + type: string + title: File Uuid + description: NOT a unique ID, like (api|uuid)/uuid/file_name or DATCORE + folder structure + location_id: + type: integer + title: Location Id + description: Storage location + project_name: + anyOf: + - type: string + - type: 'null' + title: Project Name + description: optional project name, used by frontend to display path + node_name: + anyOf: + - type: string + - type: 'null' + title: Node Name + description: optional node name, used by frontend to display path + file_name: + type: string + title: File Name + description: Display name for a file + file_id: + anyOf: + - type: string + pattern: ^(api|([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}))\/([0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12})\/(.+)$ + - type: string + pattern: ^N:package:[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{4}-?[0-9a-fA-F]{12}$ + title: File Id + description: THIS IS the unique ID for the file. either (api|project_id)/node_id/file_name.ext + for S3 and N:package:UUID for datcore + created_at: + type: string + format: date-time + title: Created At + last_modified: + type: string + format: date-time + title: Last Modified + file_size: + anyOf: + - type: integer + enum: + - -1 + const: -1 + - type: integer + minimum: 0 + title: File Size + description: File size in bytes (-1 means invalid) + default: -1 + entity_tag: + anyOf: + - type: string + - type: 'null' + title: Entity Tag + description: Entity tag (or ETag), represents a specific version of the + file, None if invalid upload or datcore + is_soft_link: + type: boolean + title: Is Soft Link + description: If true, this file is a soft link.i.e. is another entry with + the same object_name + default: false + is_directory: + type: boolean + title: Is Directory + description: if True this is a directory + default: false + sha256_checksum: + anyOf: + - type: string + pattern: ^[a-fA-F0-9]{64}$ + - type: 'null' + title: Sha256 Checksum + description: 'SHA256 message digest of the file content. Main purpose: cheap + lookup.' + type: object + required: + - file_uuid + - location_id + - file_name + - file_id + - created_at + - last_modified + title: FileMetaDataGet + FileUploadCompleteFutureResponse: + properties: + state: + $ref: '#/components/schemas/FileUploadCompleteState' + e_tag: + anyOf: + - type: string + - type: 'null' + title: E Tag + type: object + required: + - state + title: FileUploadCompleteFutureResponse + FileUploadCompleteLinks: + properties: + state: + type: string + minLength: 1 + format: uri + title: State + type: object + required: + - state + title: FileUploadCompleteLinks + FileUploadCompleteResponse: + properties: + links: + $ref: '#/components/schemas/FileUploadCompleteLinks' + type: object + required: + - links + title: FileUploadCompleteResponse + FileUploadCompleteState: + type: string + enum: + - ok + - nok + title: FileUploadCompleteState + FileUploadCompletionBody: + properties: + parts: + items: + $ref: '#/components/schemas/UploadedPart' + type: array + title: Parts + type: object + required: + - parts + title: FileUploadCompletionBody + FileUploadLinks: + properties: + abort_upload: + type: string + minLength: 1 + format: uri + title: Abort Upload + complete_upload: + type: string + minLength: 1 + format: uri + title: Complete Upload + type: object + required: + - abort_upload + - complete_upload + title: FileUploadLinks + FileUploadSchema: + properties: + chunk_size: + type: integer + minimum: 0 + title: Chunk Size + urls: + items: + type: string + minLength: 1 + format: uri + type: array + title: Urls + links: + $ref: '#/components/schemas/FileUploadLinks' + type: object + required: + - chunk_size + - urls + - links + title: FileUploadSchema + FolderCreateBodyParams: + properties: + name: + type: string + maxLength: 100 + minLength: 1 + title: Name + parentFolderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Parentfolderid + workspaceId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspaceid + additionalProperties: false + type: object + required: + - name + title: FolderCreateBodyParams + FolderGet: + properties: + folderId: + type: integer + exclusiveMinimum: true + title: Folderid + minimum: 0 + parentFolderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Parentfolderid + name: + type: string + title: Name + createdAt: + type: string + format: date-time + title: Createdat + modifiedAt: + type: string + format: date-time + title: Modifiedat + trashedAt: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Trashedat + owner: + type: integer + exclusiveMinimum: true + title: Owner + minimum: 0 + workspaceId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspaceid + myAccessRights: + $ref: '#/components/schemas/AccessRights' + type: object + required: + - folderId + - name + - createdAt + - modifiedAt + - trashedAt + - owner + - workspaceId + - myAccessRights + title: FolderGet + FolderReplaceBodyParams: + properties: + name: + type: string + maxLength: 100 + minLength: 1 + title: Name + parentFolderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Parentfolderid + additionalProperties: false + type: object + required: + - name + title: FolderReplaceBodyParams + GenerateInvitation: + properties: + guest: + type: string + format: email + title: Guest + trialAccountDays: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Trialaccountdays + extraCreditsInUsd: + anyOf: + - type: integer + exclusiveMaximum: true + minimum: 0 + maximum: 500 + - type: 'null' + title: Extracreditsinusd + type: object + required: + - guest + title: GenerateInvitation + GetCreditPrice: + properties: + productName: + type: string + title: Productname + usdPerCredit: + anyOf: + - type: number + minimum: 0.0 + - type: 'null' + title: Usdpercredit + description: Price of a credit in USD. If None, then this product's price + is UNDEFINED + minPaymentAmountUsd: + anyOf: + - type: integer + minimum: 0 + - type: 'null' + title: Minpaymentamountusd + description: Minimum amount (included) in USD that can be paid for this + productCan be None if this product's price is UNDEFINED + type: object + required: + - productName + - usdPerCredit + - minPaymentAmountUsd + title: GetCreditPrice + GetProduct: + properties: + name: + type: string + title: Name + displayName: + type: string + title: Displayname + shortName: + anyOf: + - type: string + - type: 'null' + title: Shortname + description: Short display name for SMS + vendor: + anyOf: + - type: object + - type: 'null' + title: Vendor + description: vendor attributes + issues: + anyOf: + - items: + type: object + type: array + - type: 'null' + title: Issues + description: Reference to issues tracker + manuals: + anyOf: + - items: + type: object + type: array + - type: 'null' + title: Manuals + description: List of manuals + support: + anyOf: + - items: + type: object + type: array + - type: 'null' + title: Support + description: List of support resources + loginSettings: + type: object + title: Loginsettings + maxOpenStudiesPerUser: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Maxopenstudiesperuser + isPaymentEnabled: + type: boolean + title: Ispaymentenabled + creditsPerUsd: + anyOf: + - type: string + - type: 'null' + title: Creditsperusd + templates: + items: + $ref: '#/components/schemas/GetProductTemplate' + type: array + title: Templates + description: List of templates available to this product for communications + (e.g. emails, sms, etc) + type: object + required: + - name + - displayName + - loginSettings + - maxOpenStudiesPerUser + - isPaymentEnabled + - creditsPerUsd + title: GetProduct + GetProductTemplate: + properties: + id: + type: string + maxLength: 100 + minLength: 1 + title: Id + content: + type: string + title: Content + type: object + required: + - id + - content + title: GetProductTemplate + GetProjectInactivityResponse: + properties: + is_inactive: + type: boolean + title: Is Inactive + type: object + required: + - is_inactive + title: GetProjectInactivityResponse + GetWalletAutoRecharge: + properties: + enabled: + type: boolean + title: Enabled + description: Enables/disables auto-recharge trigger in this wallet + default: false + paymentMethodId: + anyOf: + - type: string + maxLength: 100 + minLength: 1 + - type: 'null' + title: Paymentmethodid + description: Payment method in the wallet used to perform the auto-recharge + payments or None if still undefined + minBalanceInCredits: + type: string + title: Minbalanceincredits + description: Minimum balance in credits that triggers an auto-recharge [Read + only] + topUpAmountInUsd: + type: string + title: Topupamountinusd + description: Amount in USD payed when auto-recharge condition is satisfied + monthlyLimitInUsd: + anyOf: + - type: string + - type: 'null' + title: Monthlylimitinusd + description: Maximum amount in USD charged within a natural month.None indicates + no limit. + type: object + required: + - paymentMethodId + - minBalanceInCredits + - topUpAmountInUsd + - monthlyLimitInUsd + title: GetWalletAutoRecharge + GroupAccessRights: + properties: + read: + type: boolean + title: Read + write: + type: boolean + title: Write + delete: + type: boolean + title: Delete + type: object + required: + - read + - write + - delete + title: GroupAccessRights + description: defines acesss rights for the user + GroupCreate: + properties: + label: + type: string + title: Label + description: + type: string + title: Description + thumbnail: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + type: object + required: + - label + - description + title: GroupCreate + GroupGet: + properties: + gid: + type: integer + title: Gid + description: the group ID + label: + type: string + title: Label + description: the group name + description: + type: string + title: Description + description: the group description + thumbnail: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + description: url to the group thumbnail + accessRights: + $ref: '#/components/schemas/GroupAccessRights' + inclusionRules: + additionalProperties: + type: string + type: object + title: Inclusionrules + description: Maps user's column and regular expression + type: object + required: + - gid + - label + - description + - accessRights + title: GroupGet + GroupUpdate: + properties: + label: + anyOf: + - type: string + - type: 'null' + title: Label + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + type: object + title: GroupUpdate + GroupUserAdd: + properties: + uid: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Uid + email: + anyOf: + - type: string + format: email + - type: 'null' + title: Email + type: object + title: GroupUserAdd + description: "Identify the user with either `email` or `uid` \u2014 only one." + GroupUserGet: + properties: + id: + anyOf: + - type: string + - type: 'null' + title: Id + description: the user id + login: + anyOf: + - type: string + format: email + - type: 'null' + title: Login + description: the user login email + first_name: + anyOf: + - type: string + - type: 'null' + title: First Name + description: the user first name + last_name: + anyOf: + - type: string + - type: 'null' + title: Last Name + description: the user last name + gravatar_id: + anyOf: + - type: string + - type: 'null' + title: Gravatar Id + description: the user gravatar id hash + gid: + anyOf: + - type: string + - type: 'null' + title: Gid + description: the user primary gid + accessRights: + $ref: '#/components/schemas/GroupAccessRights' + type: object + required: + - accessRights + title: GroupUserGet + example: + accessRights: + delete: false + read: true + write: false + first_name: Mr + gid: '3' + gravatar_id: a1af5c6ecc38e81f29695f01d6ceb540 + id: '1' + last_name: Smith + login: mr.smith@matrix.com + GroupUserUpdate: + properties: + accessRights: + $ref: '#/components/schemas/GroupAccessRights' + type: object + required: + - accessRights + title: GroupUserUpdate + example: + accessRights: + delete: false + read: true + write: false + HardwareInfo: + properties: + aws_ec2_instances: + items: + type: string + type: array + title: Aws Ec2 Instances + type: object + required: + - aws_ec2_instances + title: HardwareInfo + HealthInfoDict: + properties: + name: + type: string + title: Name + version: + type: string + title: Version + api_version: + type: string + title: Api Version + type: object + required: + - name + - version + - api_version + title: HealthInfoDict + ImageResources: + properties: + image: + type: string + pattern: ^(?:([a-z0-9-]+(?:\.[a-z0-9-]+)+(?::\d+)?|[a-z0-9-]+:\d+)/)?((?:[a-z0-9][a-z0-9_.-]*/)*[a-z0-9-_]+[a-z0-9])(?::([\w][\w.-]{0,127}))?(\@sha256:[a-fA-F0-9]{32,64})?$ + title: Image + description: Used by the frontend to provide a context for the users.Services + with a docker-compose spec will have multiple entries.Using the `image:version` + instead of the docker-compose spec is more helpful for the end user. + resources: + additionalProperties: + $ref: '#/components/schemas/ResourceValue' + type: object + title: Resources + boot_modes: + items: + $ref: '#/components/schemas/BootMode' + type: array + title: Boot Modes + description: describe how a service shall be booted, using CPU, MPI, openMP + or GPU + default: + - CPU + type: object + required: + - image + - resources + title: ImageResources + example: + image: simcore/service/dynamic/pretty-intense:1.0.0 + resources: + AIRAM: + limit: 1 + reservation: 1 + ANY_resource: + limit: some_value + reservation: some_value + CPU: + limit: 4 + reservation: 0.1 + RAM: + limit: 103079215104 + reservation: 536870912 + VRAM: + limit: 1 + reservation: 1 + InvitationCheck: + properties: + invitation: + type: string + title: Invitation + description: Invitation code + additionalProperties: false + type: object + required: + - invitation + title: InvitationCheck + InvitationGenerated: + properties: + productName: + type: string + title: Productname + issuer: + type: string + title: Issuer + guest: + type: string + format: email + title: Guest + trialAccountDays: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Trialaccountdays + extraCreditsInUsd: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Extracreditsinusd + created: + type: string + format: date-time + title: Created + invitationLink: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Invitationlink + type: object + required: + - productName + - issuer + - guest + - created + - invitationLink + title: InvitationGenerated + InvitationInfo: + properties: + email: + anyOf: + - type: string + format: email + - type: 'null' + title: Email + description: Email associated to invitation or None + additionalProperties: false + type: object + title: InvitationInfo + JupyterHubTokenAuthentication: + properties: + type: + type: string + enum: + - jupyterhub + const: jupyterhub + title: Type + default: jupyterhub + api_token: + type: string + title: Api Token + additionalProperties: false + type: object + required: + - api_token + title: JupyterHubTokenAuthentication + KerberosAuthentication: + properties: + type: + type: string + enum: + - kerberos + const: kerberos + title: Type + default: kerberos + additionalProperties: false + type: object + title: KerberosAuthentication + Limits: + properties: + cpus: + type: number + exclusiveMinimum: true + title: Cpus + minimum: 0.0 + mem: + type: number + exclusiveMinimum: true + title: Mem + minimum: 0.0 + type: object + required: + - cpus + - mem + title: Limits + LinkType: + type: string + enum: + - PRESIGNED + - S3 + title: LinkType + Log: + properties: + level: + anyOf: + - $ref: '#/components/schemas/LogLevel' + - type: 'null' + description: log level + default: INFO + message: + type: string + title: Message + description: log message. If logger is USER, then it MUST be human readable + logger: + anyOf: + - type: string + - type: 'null' + title: Logger + description: name of the logger receiving this message + type: object + required: + - message + title: Log + example: + level: INFO + logger: user-logger + message: Hi there, Mr user + LogLevel: + type: string + enum: + - DEBUG + - INFO + - WARNING + - ERROR + title: LogLevel + LogMessageType: + properties: + message: + type: string + title: Message + level: + type: string + title: Level + default: INFO + logger: + type: string + title: Logger + default: user + type: object + required: + - message + title: LogMessageType + LoginBody: + properties: + email: + type: string + format: email + title: Email + password: + type: string + format: password + title: Password + writeOnly: true + additionalProperties: false + type: object + required: + - email + - password + title: LoginBody + LoginNextPage: + properties: + name: + type: string + title: Name + description: Code name to the front-end page. Ideally a PageStr + parameters: + anyOf: + - $ref: '#/components/schemas/CodePageParams' + - type: 'null' + type: object + required: + - name + title: LoginNextPage + LoginTwoFactorAuthBody: + properties: + email: + type: string + format: email + title: Email + code: + type: string + format: password + title: Code + writeOnly: true + additionalProperties: false + type: object + required: + - email + - code + title: LoginTwoFactorAuthBody + LogoutBody: + properties: + client_session_id: + anyOf: + - type: string + - type: 'null' + title: Client Session Id + additionalProperties: false + type: object + title: LogoutBody + Marker: + properties: + color: + type: string + format: color + title: Color + additionalProperties: false + type: object + required: + - color + title: Marker + MyGroupsGet: + properties: + me: + $ref: '#/components/schemas/GroupGet' + organizations: + anyOf: + - items: + $ref: '#/components/schemas/GroupGet' + type: array + - type: 'null' + title: Organizations + all: + $ref: '#/components/schemas/GroupGet' + product: + anyOf: + - $ref: '#/components/schemas/GroupGet' + - type: 'null' + type: object + required: + - me + - all + title: MyGroupsGet + example: + all: + accessRights: + delete: false + read: true + write: false + description: Open to all users + gid: '0' + label: All + me: + accessRights: + delete: true + read: true + write: true + description: A very special user + gid: '27' + label: A user + organizations: + - accessRights: + delete: false + read: true + write: false + description: The Foundation for Research on Information Technologies in + Society + gid: '15' + label: ITIS Foundation + - accessRights: + delete: false + read: true + write: false + description: Some foundation + gid: '16' + label: Blue Fundation + NoAuthentication: + properties: + type: + type: string + enum: + - none + const: none + title: Type + default: none + additionalProperties: false + type: object + title: NoAuthentication + Node-Input: + properties: + key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Key + description: distinctive name for the node based on the docker registry + path + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + description: semantic version number of the node + label: + type: string + title: Label + description: The short name of the node + progress: + anyOf: + - type: number + maximum: 100.0 + minimum: 0.0 + - type: 'null' + title: Progress + description: the node progress value (deprecated in DB, still used for API + only) + deprecated: true + thumbnail: + anyOf: + - type: string + - type: 'null' + title: Thumbnail + description: url of the latest screenshot of the node + runHash: + anyOf: + - type: string + - type: 'null' + title: Runhash + description: the hex digest of the resolved inputs +outputs hash at the + time when the last outputs were generated + nullable: true + inputs: + anyOf: + - type: object + - type: 'null' + title: Inputs + description: values of input properties + inputsRequired: + items: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + type: array + title: Inputsrequired + description: Defines inputs that are required in order to run the service + inputsUnits: + anyOf: + - type: object + - type: 'null' + title: Inputsunits + description: Overrides default unit (if any) defined in the service for + each port + inputAccess: + anyOf: + - type: object + - type: 'null' + title: Inputaccess + description: map with key - access level pairs + inputNodes: + anyOf: + - items: + type: string + format: uuid + type: array + - type: 'null' + title: Inputnodes + description: node IDs of where the node is connected to + outputs: + anyOf: + - type: object + - type: 'null' + title: Outputs + description: values of output properties + outputNode: + anyOf: + - type: boolean + - type: 'null' + title: Outputnode + deprecated: true + outputNodes: + anyOf: + - items: + type: string + format: uuid + type: array + - type: 'null' + title: Outputnodes + description: Used in group-nodes. Node IDs of those connected to the output + parent: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Parent + description: Parent's (group-nodes') node ID s. Used to group + nullable: true + position: + anyOf: + - $ref: '#/components/schemas/Position' + - type: 'null' + description: Use projects_ui.WorkbenchUI.position instead + deprecated: true + state: + anyOf: + - $ref: '#/components/schemas/NodeState' + - type: 'null' + description: The node's state object + bootOptions: + anyOf: + - type: object + - type: 'null' + title: Bootoptions + description: Some services provide alternative parameters to be injected + at boot time. The user selection should be stored here, and it will overwrite + the services's defaults. + additionalProperties: false + type: object + required: + - key + - version + - label + title: Node + Node-Output: + properties: + key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Key + description: distinctive name for the node based on the docker registry + path + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + description: semantic version number of the node + label: + type: string + title: Label + description: The short name of the node + progress: + anyOf: + - type: number + maximum: 100.0 + minimum: 0.0 + - type: 'null' + title: Progress + description: the node progress value (deprecated in DB, still used for API + only) + deprecated: true + thumbnail: + anyOf: + - type: string + - type: 'null' + title: Thumbnail + description: url of the latest screenshot of the node + runHash: + anyOf: + - type: string + - type: 'null' + title: Runhash + description: the hex digest of the resolved inputs +outputs hash at the + time when the last outputs were generated + nullable: true + inputs: + anyOf: + - type: object + - type: 'null' + title: Inputs + description: values of input properties + inputsRequired: + items: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + type: array + title: Inputsrequired + description: Defines inputs that are required in order to run the service + inputsUnits: + anyOf: + - type: object + - type: 'null' + title: Inputsunits + description: Overrides default unit (if any) defined in the service for + each port + inputAccess: + anyOf: + - type: object + - type: 'null' + title: Inputaccess + description: map with key - access level pairs + inputNodes: + anyOf: + - items: + type: string + format: uuid + type: array + - type: 'null' + title: Inputnodes + description: node IDs of where the node is connected to + outputs: + anyOf: + - type: object + - type: 'null' + title: Outputs + description: values of output properties + outputNode: + anyOf: + - type: boolean + - type: 'null' + title: Outputnode + deprecated: true + outputNodes: + anyOf: + - items: + type: string + format: uuid + type: array + - type: 'null' + title: Outputnodes + description: Used in group-nodes. Node IDs of those connected to the output + parent: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Parent + description: Parent's (group-nodes') node ID s. Used to group + nullable: true + position: + anyOf: + - $ref: '#/components/schemas/Position' + - type: 'null' + description: Use projects_ui.WorkbenchUI.position instead + deprecated: true + state: + anyOf: + - $ref: '#/components/schemas/NodeState' + - type: 'null' + description: The node's state object + bootOptions: + anyOf: + - type: object + - type: 'null' + title: Bootoptions + description: Some services provide alternative parameters to be injected + at boot time. The user selection should be stored here, and it will overwrite + the services's defaults. + additionalProperties: false + type: object + required: + - key + - version + - label + title: Node + NodeCreate: + properties: + service_key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + service_version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + service_id: + anyOf: + - type: string + - type: 'null' + title: Service Id + type: object + required: + - service_key + - service_version + title: NodeCreate + NodeCreated: + properties: + nodeId: + type: string + format: uuid + title: Nodeid + type: object + required: + - nodeId + title: NodeCreated + NodeGet: + properties: + publishedPort: + anyOf: + - type: integer + exclusiveMaximum: true + exclusiveMinimum: true + maximum: 65535 + minimum: 0 + - type: 'null' + title: Publishedport + description: The ports where the service provides its interface + entryPoint: + anyOf: + - type: string + - type: 'null' + title: Entrypoint + description: The entry point where the service provides its interface if + specified + serviceUuid: + type: string + title: Serviceuuid + description: The UUID attached to this service + serviceKey: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Servicekey + description: distinctive name for the node based on the docker registry + path + serviceVersion: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Serviceversion + description: semantic version number + serviceHost: + type: string + title: Servicehost + description: service host name within the network + servicePort: + type: integer + exclusiveMaximum: true + exclusiveMinimum: true + title: Serviceport + description: port to access the service within the network + maximum: 65535 + minimum: 0 + serviceBasepath: + anyOf: + - type: string + - type: 'null' + title: Servicebasepath + description: different base path where current service is mounted otherwise + defaults to root + default: '' + serviceState: + $ref: '#/components/schemas/ServiceState' + description: 'the service state * ''pending'' - The service is waiting for + resources to start * ''pulling'' - The service is being pulled from the + registry * ''starting'' - The service is starting * ''running'' - The + service is running * ''complete'' - The service completed * ''failed'' + - The service failed to start + + ' + serviceMessage: + anyOf: + - type: string + - type: 'null' + title: Servicemessage + description: the service message + userId: + type: string + title: Userid + description: the user that started the service + type: object + required: + - publishedPort + - serviceUuid + - serviceKey + - serviceVersion + - serviceHost + - servicePort + - serviceState + - userId + title: NodeGet + NodeGetIdle: + properties: + serviceState: + type: string + enum: + - idle + const: idle + title: Servicestate + serviceUuid: + type: string + format: uuid + title: Serviceuuid + type: object + required: + - serviceState + - serviceUuid + title: NodeGetIdle + example: + service_state: idle + service_uuid: 3fa85f64-5717-4562-b3fc-2c963f66afa6 + NodeGetUnknown: + properties: + serviceState: + type: string + enum: + - unknown + const: unknown + title: Servicestate + serviceUuid: + type: string + format: uuid + title: Serviceuuid + type: object + required: + - serviceState + - serviceUuid + title: NodeGetUnknown + example: + service_state: unknown + service_uuid: 3fa85f64-5717-4562-b3fc-2c963f66afa6 + NodeOutputs: + properties: + outputs: + type: object + title: Outputs + type: object + required: + - outputs + title: NodeOutputs + NodePatch: + properties: + key: + anyOf: + - type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + - type: 'null' + title: Key + version: + anyOf: + - type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + - type: 'null' + title: Version + label: + anyOf: + - type: string + - type: 'null' + title: Label + inputs: + type: object + title: Inputs + inputsRequired: + anyOf: + - items: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + type: array + - type: 'null' + title: Inputsrequired + inputNodes: + anyOf: + - items: + type: string + format: uuid + type: array + - type: 'null' + title: Inputnodes + progress: + anyOf: + - type: number + maximum: 100.0 + minimum: 0.0 + - type: 'null' + title: Progress + bootOptions: + anyOf: + - type: object + - type: 'null' + title: Bootoptions + outputs: + anyOf: + - type: object + - type: 'null' + title: Outputs + type: object + title: NodePatch + NodeRetrieve: + properties: + port_keys: + items: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + type: array + title: Port Keys + default: [] + type: object + title: NodeRetrieve + NodeRetrieved: + properties: + sizeBytes: + type: integer + minimum: 0 + title: Sizebytes + description: The amount of data transferred by the retrieve call + type: object + required: + - sizeBytes + title: NodeRetrieved + NodeScreenshot: + properties: + thumbnail_url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Thumbnail Url + file_url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: File Url + mimetype: + anyOf: + - type: string + - type: 'null' + title: Mimetype + description: File's media type or None if unknown. SEE https://www.iana.org/assignments/media-types/media-types.xhtml + type: object + required: + - thumbnail_url + - file_url + title: NodeScreenshot + NodeState: + properties: + modified: + type: boolean + title: Modified + description: true if the node's outputs need to be re-computed + default: true + dependencies: + items: + type: string + format: uuid + type: array + uniqueItems: true + title: Dependencies + description: contains the node inputs dependencies if they need to be computed + first + currentStatus: + $ref: '#/components/schemas/RunningState' + description: the node's current state + default: NOT_STARTED + progress: + anyOf: + - type: number + maximum: 1.0 + minimum: 0.0 + - type: 'null' + title: Progress + description: current progress of the task if available (None if not started + or not a computational task) + default: 0 + additionalProperties: false + type: object + title: NodeState + NotificationCategory: + type: string + enum: + - NEW_ORGANIZATION + - STUDY_SHARED + - TEMPLATE_SHARED + - ANNOTATION_NOTE + - WALLET_SHARED + title: NotificationCategory + OsparcCreditsAggregatedByServiceGet: + properties: + osparc_credits: + type: string + title: Osparc Credits + service_key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + running_time_in_hours: + type: string + title: Running Time In Hours + type: object + required: + - osparc_credits + - service_key + - running_time_in_hours + title: OsparcCreditsAggregatedByServiceGet + Owner: + properties: + user_id: + type: integer + exclusiveMinimum: true + title: User Id + description: Owner's user id + minimum: 0 + first_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: First Name + description: Owner's first name + last_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: Last Name + description: Owner's last name + additionalProperties: false + type: object + required: + - user_id + - first_name + - last_name + title: Owner + PageLinks: + properties: + self: + type: string + title: Self + first: + type: string + title: First + prev: + anyOf: + - type: string + - type: 'null' + title: Prev + next: + anyOf: + - type: string + - type: 'null' + title: Next + last: + type: string + title: Last + additionalProperties: false + type: object + required: + - self + - first + - prev + - next + - last + title: PageLinks + PageMetaInfoLimitOffset: + properties: + limit: + type: integer + exclusiveMinimum: true + title: Limit + default: 20 + minimum: 0 + total: + type: integer + minimum: 0 + title: Total + offset: + type: integer + minimum: 0 + title: Offset + default: 0 + count: + type: integer + minimum: 0 + title: Count + additionalProperties: false + type: object + required: + - total + - count + title: PageMetaInfoLimitOffset + Page_CatalogServiceGet_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/CatalogServiceGet' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[CatalogServiceGet] + Page_CheckpointApiModel_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/CheckpointApiModel' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[CheckpointApiModel] + Page_PaymentTransaction_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/PaymentTransaction' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[PaymentTransaction] + Page_ProjectIterationItem_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/ProjectIterationItem' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[ProjectIterationItem] + Page_ProjectIterationResultItem_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/ProjectIterationResultItem' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[ProjectIterationResultItem] + Page_ProjectListItem_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/ProjectListItem' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[ProjectListItem] + Page_RepoApiModel_: + properties: + _meta: + $ref: '#/components/schemas/PageMetaInfoLimitOffset' + _links: + $ref: '#/components/schemas/PageLinks' + data: + items: + $ref: '#/components/schemas/RepoApiModel' + type: array + title: Data + additionalProperties: false + type: object + required: + - _meta + - _links + - data + title: Page[RepoApiModel] + ParentMetaProjectRef: + properties: + project_id: + type: string + format: uuid + title: Project Id + ref_id: + type: integer + exclusiveMinimum: true + title: Ref Id + minimum: 0 + type: object + required: + - project_id + - ref_id + title: ParentMetaProjectRef + PatchRequestBody: + properties: + value: + title: Value + type: object + required: + - value + title: PatchRequestBody + PaymentMethodGet: + properties: + idr: + type: string + maxLength: 100 + minLength: 1 + title: Idr + walletId: + type: integer + exclusiveMinimum: true + title: Walletid + minimum: 0 + cardHolderName: + anyOf: + - type: string + - type: 'null' + title: Cardholdername + cardNumberMasked: + anyOf: + - type: string + - type: 'null' + title: Cardnumbermasked + cardType: + anyOf: + - type: string + - type: 'null' + title: Cardtype + expirationMonth: + anyOf: + - type: integer + - type: 'null' + title: Expirationmonth + expirationYear: + anyOf: + - type: integer + - type: 'null' + title: Expirationyear + created: + type: string + format: date-time + title: Created + autoRecharge: + type: boolean + title: Autorecharge + description: If true, this payment-method is used for auto-recharge + default: false + type: object + required: + - idr + - walletId + - created + title: PaymentMethodGet + PaymentMethodInitiated: + properties: + walletId: + type: integer + exclusiveMinimum: true + title: Walletid + minimum: 0 + paymentMethodId: + type: string + maxLength: 100 + minLength: 1 + title: Paymentmethodid + paymentMethodFormUrl: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Paymentmethodformurl + description: Link to external site that holds the payment submission form + type: object + required: + - walletId + - paymentMethodId + - paymentMethodFormUrl + title: PaymentMethodInitiated + PaymentTransaction: + properties: + paymentId: + type: string + maxLength: 100 + minLength: 1 + title: Paymentid + priceDollars: + type: string + title: Pricedollars + walletId: + type: integer + exclusiveMinimum: true + title: Walletid + minimum: 0 + osparcCredits: + type: string + title: Osparccredits + comment: + anyOf: + - type: string + - type: 'null' + title: Comment + createdAt: + type: string + format: date-time + title: Createdat + completedAt: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Completedat + completedStatus: + type: string + enum: + - PENDING + - SUCCESS + - FAILED + - CANCELED + title: Completedstatus + stateMessage: + anyOf: + - type: string + - type: 'null' + title: Statemessage + invoiceUrl: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Invoiceurl + type: object + required: + - paymentId + - priceDollars + - walletId + - osparcCredits + - createdAt + - completedAt + - completedStatus + title: PaymentTransaction + PermissionGet: + properties: + name: + type: string + title: Name + allowed: + type: boolean + title: Allowed + type: object + required: + - name + - allowed + title: PermissionGet + PhoneConfirmationBody: + properties: + email: + type: string + format: email + title: Email + phone: + type: string + title: Phone + description: Phone number E.164, needed on the deployments with 2FA + code: + type: string + format: password + title: Code + writeOnly: true + additionalProperties: false + type: object + required: + - email + - phone + - code + title: PhoneConfirmationBody + PortLink: + properties: + nodeUuid: + type: string + format: uuid + title: Nodeuuid + description: The node to get the port output from + output: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Output + description: The port key in the node given by nodeUuid + additionalProperties: false + type: object + required: + - nodeUuid + - output + title: PortLink + description: I/O port type to reference to an output port of another node in + the same project + Position: + properties: + x: + type: integer + title: X + description: The x position + y: + type: integer + title: Y + description: The y position + additionalProperties: false + type: object + required: + - x + - y + title: Position + PreUserProfile: + properties: + firstName: + type: string + title: Firstname + lastName: + type: string + title: Lastname + email: + type: string + format: email + title: Email + institution: + anyOf: + - type: string + - type: 'null' + title: Institution + description: company, university, ... + phone: + anyOf: + - type: string + - type: 'null' + title: Phone + address: + type: string + title: Address + city: + type: string + title: City + state: + anyOf: + - type: string + - type: 'null' + title: State + postalCode: + type: string + title: Postalcode + country: + type: string + title: Country + extras: + type: object + title: Extras + description: Keeps extra information provided in the request form. At most + MAX_NUM_EXTRAS fields + type: object + required: + - firstName + - lastName + - email + - phone + - address + - city + - postalCode + - country + title: PreUserProfile + Preference: + properties: + defaultValue: + title: Defaultvalue + description: used by the frontend + value: + title: Value + description: preference value + type: object + required: + - defaultValue + - value + title: Preference + PresignedLink: + properties: + link: + type: string + minLength: 1 + format: uri + title: Link + type: object + required: + - link + title: PresignedLink + PricingPlanAdminGet: + properties: + pricingPlanId: + type: integer + exclusiveMinimum: true + title: Pricingplanid + minimum: 0 + displayName: + type: string + title: Displayname + description: + type: string + title: Description + classification: + $ref: '#/components/schemas/PricingPlanClassification' + createdAt: + type: string + format: date-time + title: Createdat + pricingPlanKey: + type: string + title: Pricingplankey + pricingUnits: + anyOf: + - items: + $ref: '#/components/schemas/PricingUnitGet' + type: array + - type: 'null' + title: Pricingunits + isActive: + type: boolean + title: Isactive + type: object + required: + - pricingPlanId + - displayName + - description + - classification + - createdAt + - pricingPlanKey + - pricingUnits + - isActive + title: PricingPlanAdminGet + PricingPlanClassification: + type: string + enum: + - TIER + const: TIER + title: PricingPlanClassification + PricingPlanToServiceAdminGet: + properties: + pricingPlanId: + type: integer + exclusiveMinimum: true + title: Pricingplanid + minimum: 0 + serviceKey: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Servicekey + serviceVersion: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Serviceversion + created: + type: string + format: date-time + title: Created + type: object + required: + - pricingPlanId + - serviceKey + - serviceVersion + - created + title: PricingPlanToServiceAdminGet + PricingUnitAdminGet: + properties: + pricingUnitId: + type: integer + exclusiveMinimum: true + title: Pricingunitid + minimum: 0 + unitName: + type: string + title: Unitname + unitExtraInfo: + $ref: '#/components/schemas/UnitExtraInfo-Output' + currentCostPerUnit: + type: number + title: Currentcostperunit + default: + type: boolean + title: Default + specificInfo: + $ref: '#/components/schemas/HardwareInfo' + type: object + required: + - pricingUnitId + - unitName + - unitExtraInfo + - currentCostPerUnit + - default + - specificInfo + title: PricingUnitAdminGet + PricingUnitCostUpdate: + properties: + cost_per_unit: + anyOf: + - type: number + - type: string + title: Cost Per Unit + comment: + type: string + title: Comment + type: object + required: + - cost_per_unit + - comment + title: PricingUnitCostUpdate + PricingUnitGet: + properties: + pricingUnitId: + type: integer + exclusiveMinimum: true + title: Pricingunitid + minimum: 0 + unitName: + type: string + title: Unitname + unitExtraInfo: + $ref: '#/components/schemas/UnitExtraInfo-Output' + currentCostPerUnit: + type: number + title: Currentcostperunit + default: + type: boolean + title: Default + type: object + required: + - pricingUnitId + - unitName + - unitExtraInfo + - currentCostPerUnit + - default + title: PricingUnitGet + ProfileGet: + properties: + id: + type: integer + exclusiveMinimum: true + title: Id + minimum: 0 + first_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: First Name + last_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: Last Name + login: + type: string + format: email + title: Login + role: + type: string + enum: + - ANONYMOUS + - GUEST + - USER + - TESTER + - PRODUCT_OWNER + - ADMIN + title: Role + groups: + anyOf: + - $ref: '#/components/schemas/MyGroupsGet' + - type: 'null' + gravatar_id: + anyOf: + - type: string + - type: 'null' + title: Gravatar Id + expirationDate: + anyOf: + - type: string + format: date + - type: 'null' + title: Expirationdate + description: If user has a trial account, it sets the expiration date, otherwise + None + preferences: + additionalProperties: + $ref: '#/components/schemas/Preference' + type: object + title: Preferences + type: object + required: + - id + - login + - role + - preferences + title: ProfileGet + ProfileUpdate: + properties: + first_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: First Name + last_name: + anyOf: + - type: string + maxLength: 255 + - type: 'null' + title: Last Name + type: object + title: ProfileUpdate + example: + first_name: Pedro + last_name: Crespo + ProjectCopyOverride: + properties: + name: + type: string + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + prjOwner: + type: string + format: email + title: Prjowner + type: object + required: + - name + - prjOwner + title: ProjectCopyOverride + ProjectCreateNew: + properties: + uuid: + anyOf: + - type: string + format: uuid + - type: 'null' + title: Uuid + name: + type: string + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + workbench: + type: object + title: Workbench + accessRights: + additionalProperties: + $ref: '#/components/schemas/AccessRights' + type: object + title: Accessrights + tags: + items: + type: integer + type: array + title: Tags + classifiers: + items: + type: string + type: array + title: Classifiers + ui: + anyOf: + - $ref: '#/components/schemas/StudyUI-Input' + - type: 'null' + workspaceId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspaceid + folderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folderid + type: object + required: + - name + - workbench + - accessRights + title: ProjectCreateNew + ProjectGet: + properties: + uuid: + type: string + format: uuid + title: Uuid + name: + type: string + title: Name + description: + type: string + title: Description + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: string + enum: + - '' + const: '' + title: Thumbnail + creationDate: + type: string + pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z + title: Creationdate + lastChangeDate: + type: string + pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z + title: Lastchangedate + workbench: + type: object + title: Workbench + prjOwner: + type: string + format: email + title: Prjowner + accessRights: + additionalProperties: + $ref: '#/components/schemas/AccessRights' + type: object + title: Accessrights + tags: + items: + type: integer + type: array + title: Tags + classifiers: + items: + type: string + type: array + title: Classifiers + default: [] + state: + anyOf: + - $ref: '#/components/schemas/ProjectState' + - type: 'null' + ui: + anyOf: + - $ref: '#/components/schemas/EmptyModel' + - $ref: '#/components/schemas/StudyUI-Output' + - type: 'null' + title: Ui + quality: + type: object + title: Quality + default: {} + dev: + anyOf: + - type: object + - type: 'null' + title: Dev + permalink: + anyOf: + - $ref: '#/components/schemas/ProjectPermalink' + - type: 'null' + workspaceId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspaceid + folderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folderid + trashedAt: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Trashedat + type: object + required: + - uuid + - name + - description + - thumbnail + - creationDate + - lastChangeDate + - workbench + - prjOwner + - accessRights + - tags + - dev + - workspaceId + - folderId + - trashedAt + title: ProjectGet + ProjectGroupGet: + properties: + gid: + type: integer + exclusiveMinimum: true + title: Gid + minimum: 0 + read: + type: boolean + title: Read + write: + type: boolean + title: Write + delete: + type: boolean + title: Delete + created: + type: string + format: date-time + title: Created + modified: + type: string + format: date-time + title: Modified + type: object + required: + - gid + - read + - write + - delete + - created + - modified + title: ProjectGroupGet + ProjectInputGet: + properties: + key: + type: string + format: uuid + title: Key + description: Project port's unique identifer. Same as the UUID of the associated + port node + value: + title: Value + description: Value assigned to this i/o port + label: + type: string + title: Label + type: object + required: + - key + - value + - label + title: ProjectInputGet + ProjectInputUpdate: + properties: + key: + type: string + format: uuid + title: Key + description: Project port's unique identifer. Same as the UUID of the associated + port node + value: + title: Value + description: Value assigned to this i/o port + type: object + required: + - key + - value + title: ProjectInputUpdate + ProjectIterationItem: + properties: + name: + type: string + title: Name + description: Iteration's resource API name + parent: + $ref: '#/components/schemas/ParentMetaProjectRef' + description: Reference to the the meta-project that created this iteration + iteration_index: + type: integer + exclusiveMinimum: true + title: Iteration Index + minimum: 0 + workcopy_project_id: + type: string + format: uuid + title: Workcopy Project Id + description: ID to this iteration's working copy.A working copy is a real + project where this iteration is run + workcopy_project_url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Workcopy Project Url + description: reference to a working copy project + type: object + required: + - name + - parent + - iteration_index + - workcopy_project_id + - workcopy_project_url + title: ProjectIterationItem + ProjectIterationResultItem: + properties: + name: + type: string + title: Name + description: Iteration's resource API name + parent: + $ref: '#/components/schemas/ParentMetaProjectRef' + description: Reference to the the meta-project that created this iteration + iteration_index: + type: integer + exclusiveMinimum: true + title: Iteration Index + minimum: 0 + workcopy_project_id: + type: string + format: uuid + title: Workcopy Project Id + description: ID to this iteration's working copy.A working copy is a real + project where this iteration is run + workcopy_project_url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Workcopy Project Url + description: reference to a working copy project + results: + $ref: '#/components/schemas/ExtractedResults' + type: object + required: + - name + - parent + - iteration_index + - workcopy_project_id + - workcopy_project_url + - results + title: ProjectIterationResultItem + ProjectListItem: + properties: + uuid: + type: string + format: uuid + title: Uuid + name: + type: string + title: Name + description: + type: string + title: Description + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: string + enum: + - '' + const: '' + title: Thumbnail + creationDate: + type: string + pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z + title: Creationdate + lastChangeDate: + type: string + pattern: \d{4}-(12|11|10|0?[1-9])-(31|30|[0-2]?\d)T(2[0-3]|1\d|0?[0-9])(:(\d|[0-5]\d)){2}(\.\d{3})?Z + title: Lastchangedate + workbench: + type: object + title: Workbench + prjOwner: + type: string + format: email + title: Prjowner + accessRights: + additionalProperties: + $ref: '#/components/schemas/AccessRights' + type: object + title: Accessrights + tags: + items: + type: integer + type: array + title: Tags + classifiers: + items: + type: string + type: array + title: Classifiers + default: [] + state: + anyOf: + - $ref: '#/components/schemas/ProjectState' + - type: 'null' + ui: + anyOf: + - $ref: '#/components/schemas/EmptyModel' + - $ref: '#/components/schemas/StudyUI-Output' + - type: 'null' + title: Ui + quality: + type: object + title: Quality + default: {} + dev: + anyOf: + - type: object + - type: 'null' + title: Dev + permalink: + anyOf: + - $ref: '#/components/schemas/ProjectPermalink' + - type: 'null' + workspaceId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Workspaceid + folderId: + anyOf: + - type: integer + exclusiveMinimum: true + minimum: 0 + - type: 'null' + title: Folderid + trashedAt: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Trashedat + type: object + required: + - uuid + - name + - description + - thumbnail + - creationDate + - lastChangeDate + - workbench + - prjOwner + - accessRights + - tags + - dev + - workspaceId + - folderId + - trashedAt + title: ProjectListItem + ProjectLocked: + properties: + value: + type: boolean + title: Value + description: True if the project is locked + status: + $ref: '#/components/schemas/ProjectStatus' + description: The status of the project + owner: + anyOf: + - $ref: '#/components/schemas/Owner' + - type: 'null' + description: If locked, the user that owns the lock + additionalProperties: false + type: object + required: + - value + - status + title: ProjectLocked + ProjectMetadataGet: + properties: + projectUuid: + type: string + format: uuid + title: Projectuuid + custom: + additionalProperties: + anyOf: + - type: boolean + - type: integer + - type: number + - type: string + type: object + title: Custom + description: Custom key-value map + type: object + required: + - projectUuid + title: ProjectMetadataGet + ProjectMetadataPortGet: + properties: + key: + type: string + format: uuid + title: Key + description: Project port's unique identifer. Same as the UUID of the associated + port node + kind: + type: string + enum: + - input + - output + title: Kind + content_schema: + anyOf: + - type: object + - type: 'null' + title: Content Schema + description: jsonschema for the port's value. SEE https://json-schema.org/understanding-json-schema/ + type: object + required: + - key + - kind + title: ProjectMetadataPortGet + ProjectMetadataUpdate: + properties: + custom: + additionalProperties: + anyOf: + - type: boolean + - type: integer + - type: number + - type: string + type: object + title: Custom + type: object + required: + - custom + title: ProjectMetadataUpdate + ProjectOutputGet: + properties: + key: + type: string + format: uuid + title: Key + description: Project port's unique identifer. Same as the UUID of the associated + port node + value: + title: Value + description: Value assigned to this i/o port + label: + type: string + title: Label + type: object + required: + - key + - value + - label + title: ProjectOutputGet + ProjectPatch: + properties: + name: + anyOf: + - type: string + - type: 'null' + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + maxLength: 2083 + minLength: 1 + format: uri + - type: 'null' + title: Thumbnail + accessRights: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/AccessRights' + type: object + - type: 'null' + title: Accessrights + classifiers: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Classifiers + dev: + anyOf: + - type: object + - type: 'null' + title: Dev + ui: + anyOf: + - $ref: '#/components/schemas/StudyUI-Input' + - type: 'null' + quality: + anyOf: + - type: object + - type: 'null' + title: Quality + type: object + title: ProjectPatch + ProjectPermalink: + properties: + url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Url + is_public: + type: boolean + title: Is Public + type: object + required: + - url + - is_public + title: ProjectPermalink + ProjectRunningState: + properties: + value: + $ref: '#/components/schemas/RunningState' + description: The running state of the project + additionalProperties: false + type: object + required: + - value + title: ProjectRunningState + ProjectState: + properties: + locked: + $ref: '#/components/schemas/ProjectLocked' + description: The project lock state + state: + $ref: '#/components/schemas/ProjectRunningState' + description: The project running state + additionalProperties: false + type: object + required: + - locked + - state + title: ProjectState + ProjectStatus: + type: string + enum: + - CLOSED + - CLOSING + - CLONING + - EXPORTING + - OPENING + - OPENED + - MAINTAINING + title: ProjectStatus + ProjectTypeAPI: + type: string + enum: + - all + - template + - user + title: ProjectTypeAPI + ProjectsCommentsAPI: + properties: + comment_id: + type: integer + exclusiveMinimum: true + title: Comment Id + description: Primary key, identifies the comment + minimum: 0 + project_uuid: + type: string + format: uuid + title: Project Uuid + description: project reference for this table + user_id: + type: integer + exclusiveMinimum: true + title: User Id + description: user reference for this table + minimum: 0 + contents: + type: string + title: Contents + description: Contents of the comment + created: + type: string + format: date-time + title: Created + description: Timestamp on creation + modified: + type: string + format: date-time + title: Modified + description: Timestamp with last update + additionalProperties: false + type: object + required: + - comment_id + - project_uuid + - user_id + - contents + - created + - modified + title: ProjectsCommentsAPI + PutWalletBodyParams: + properties: + name: + type: string + title: Name + description: + anyOf: + - type: string + - type: 'null' + title: Description + thumbnail: + anyOf: + - type: string + - type: 'null' + title: Thumbnail + status: + $ref: '#/components/schemas/WalletStatus' + type: object + required: + - name + - description + - thumbnail + - status + title: PutWalletBodyParams + RegisterBody: + properties: + email: + type: string + format: email + title: Email + password: + type: string + format: password + title: Password + writeOnly: true + confirm: + anyOf: + - type: string + format: password + writeOnly: true + - type: 'null' + title: Confirm + description: Password confirmation + invitation: + anyOf: + - type: string + - type: 'null' + title: Invitation + description: Invitation code + additionalProperties: false + type: object + required: + - email + - password + title: RegisterBody + RegisterPhoneBody: + properties: + email: + type: string + format: email + title: Email + phone: + type: string + title: Phone + description: Phone number E.164, needed on the deployments with 2FA + additionalProperties: false + type: object + required: + - email + - phone + title: RegisterPhoneBody + RegisterPhoneNextPage: + properties: + name: + type: string + title: Name + description: Code name to the front-end page. Ideally a PageStr + parameters: + anyOf: + - $ref: '#/components/schemas/_PageParams' + - type: 'null' + logger: + type: string + title: Logger + default: user + deprecated: true + level: + type: string + enum: + - INFO + - WARNING + - ERROR + title: Level + default: INFO + message: + type: string + title: Message + type: object + required: + - name + - message + title: RegisterPhoneNextPage + ReplaceWalletAutoRecharge: + properties: + enabled: + type: boolean + title: Enabled + paymentMethodId: + type: string + maxLength: 100 + minLength: 1 + title: Paymentmethodid + topUpAmountInUsd: + anyOf: + - type: number + minimum: 0.0 + - type: string + title: Topupamountinusd + monthlyLimitInUsd: + anyOf: + - type: number + minimum: 0.0 + - type: string + - type: 'null' + title: Monthlylimitinusd + type: object + required: + - enabled + - paymentMethodId + - topUpAmountInUsd + - monthlyLimitInUsd + title: ReplaceWalletAutoRecharge + RepoApiModel: + properties: + project_uuid: + type: string + format: uuid + title: Project Uuid + url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Url + type: object + required: + - project_uuid + - url + title: RepoApiModel + ResearchResource: + properties: + rrid: + type: string + pattern: ^(RRID:)([^_\s]{1,30})_(\S{1,30})$ + title: Rrid + description: Unique identifier used as classifier, i.e. to tag studies and + services + name: + type: string + title: Name + description: + type: string + title: Description + type: object + required: + - rrid + - name + - description + title: ResearchResource + Resend2faBody: + properties: + email: + type: string + format: email + title: Email + description: User email (identifier) + via: + type: string + enum: + - SMS + - Email + title: Via + default: SMS + additionalProperties: false + type: object + required: + - email + title: Resend2faBody + ResetPasswordBody: + properties: + email: + type: string + title: Email + additionalProperties: false + type: object + required: + - email + title: ResetPasswordBody + ResetPasswordConfirmation: + properties: + password: + type: string + format: password + title: Password + writeOnly: true + confirm: + type: string + format: password + title: Confirm + writeOnly: true + additionalProperties: false + type: object + required: + - password + - confirm + title: ResetPasswordConfirmation + ResourceHit: + properties: + rid: + type: string + title: Rid + name: + type: string + title: Name + type: object + required: + - rid + - name + title: ResourceHit + ResourceValue: + properties: + limit: + anyOf: + - type: integer + - type: number + - type: string + title: Limit + reservation: + anyOf: + - type: integer + - type: number + - type: string + title: Reservation + type: object + required: + - limit + - reservation + title: ResourceValue + RunningDynamicServiceDetails: + properties: + service_key: + type: string + pattern: ^simcore/services/dynamic/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Service Key + description: distinctive name for the node based on the docker registry + path + service_version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Service Version + description: semantic version number of the node + user_id: + type: integer + exclusiveMinimum: true + title: User Id + minimum: 0 + project_id: + type: string + format: uuid + title: Project Id + service_uuid: + type: string + format: uuid + title: Service Uuid + service_basepath: + anyOf: + - type: string + format: path + - type: 'null' + title: Service Basepath + description: predefined path where the dynamic service should be served. + If empty, the service shall use the root endpoint. + boot_type: + $ref: '#/components/schemas/ServiceBootType' + description: Describes how the dynamic services was started (legacy=V0, + modern=V2).Since legacy services do not have this label it defaults to + V0. + default: V0 + service_host: + type: string + title: Service Host + description: the service swarm internal host name + service_port: + type: integer + exclusiveMaximum: true + exclusiveMinimum: true + title: Service Port + description: the service swarm internal port + maximum: 65535 + minimum: 0 + published_port: + anyOf: + - type: integer + exclusiveMaximum: true + exclusiveMinimum: true + maximum: 65535 + minimum: 0 + - type: 'null' + title: Published Port + description: the service swarm published port if any + deprecated: true + entry_point: + anyOf: + - type: string + - type: 'null' + title: Entry Point + description: if empty the service entrypoint is on the root endpoint. + deprecated: true + service_state: + $ref: '#/components/schemas/ServiceState' + description: service current state + service_message: + anyOf: + - type: string + - type: 'null' + title: Service Message + description: additional information related to service state + type: object + required: + - service_key + - service_version + - user_id + - project_id + - service_uuid + - service_host + - service_port + - service_state + title: RunningDynamicServiceDetails + RunningState: + type: string + enum: + - UNKNOWN + - PUBLISHED + - NOT_STARTED + - PENDING + - WAITING_FOR_RESOURCES + - STARTED + - SUCCESS + - FAILED + - ABORTED + - WAITING_FOR_CLUSTER + title: RunningState + description: 'State of execution of a project''s computational workflow + + + SEE StateType for task state' + Scheduler: + properties: + status: + type: string + title: Status + description: The running status of the scheduler + workers: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/Worker' + type: object + - type: 'null' + title: Workers + type: object + required: + - status + title: Scheduler + SelectBox: + properties: + structure: + items: + $ref: '#/components/schemas/Structure' + type: array + minItems: 1 + title: Structure + additionalProperties: false + type: object + required: + - structure + title: SelectBox + ServiceBootType: + type: string + enum: + - V0 + - V2 + title: ServiceBootType + ServiceGet: + properties: + key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Key + description: Service key ID + title: + type: string + title: Title + description: Service name for display + description: + type: string + title: Description + description: Long description of the service + thumbnail: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: Thumbnail + description: Url to service thumbnail + file_extensions: + items: + type: string + type: array + title: File Extensions + description: File extensions that this service can process + view_url: + type: string + maxLength: 2083 + minLength: 1 + format: uri + title: View Url + description: Redirection to open a service in osparc (see /view) + type: object + required: + - key + - title + - description + - thumbnail + - view_url + title: ServiceGet + example: + description: It is also sim4life for the web + file_extensions: + - smash + - h5 + key: simcore/services/dynamic/sim4life + thumbnail: https://via.placeholder.com/170x120.png + title: Sim4Life Mattermost + view_url: https://host.com/view?viewer_key=simcore/services/dynamic/raw-graphs&viewer_version=1.2.3 + ServiceGroupAccessRightsV2: + properties: + execute: + type: boolean + title: Execute + default: false + write: + type: boolean + title: Write + default: false + additionalProperties: false + type: object + title: ServiceGroupAccessRightsV2 + ServiceInputGet: + properties: + unitLong: + anyOf: + - type: string + - type: 'null' + title: Unitlong + description: Long name of the unit for display (html-compatible), if available + unitShort: + anyOf: + - type: string + - type: 'null' + title: Unitshort + description: Short name for the unit for display (html-compatible), if available + displayOrder: + anyOf: + - type: number + - type: 'null' + title: Displayorder + description: 'DEPRECATED: new display order is taken from the item position. + This will be removed.' + deprecated: true + label: + type: string + title: Label + description: short name for the property + description: + type: string + title: Description + description: description of the property + type: + type: string + pattern: ^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$ + title: Type + description: data type expected on this input glob matching for data type + is allowed + contentSchema: + anyOf: + - type: object + - type: 'null' + title: Contentschema + description: jsonschema of this input/output. Required when type='ref_contentSchema' + fileToKeyMap: + anyOf: + - type: object + - type: 'null' + title: Filetokeymap + description: Place the data associated with the named keys in files + unit: + anyOf: + - type: string + - type: 'null' + title: Unit + description: Units, when it refers to a physical quantity + deprecated: true + defaultValue: + anyOf: + - type: boolean + - type: integer + - type: number + - type: string + - type: 'null' + title: Defaultvalue + deprecated: true + widget: + anyOf: + - $ref: '#/components/schemas/Widget' + - type: 'null' + description: custom widget to use instead of the default one determined + from the data-type + keyId: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Keyid + description: Unique name identifier for this input + additionalProperties: false + type: object + required: + - label + - description + - type + - keyId + title: ServiceInputGet + description: Extends fields of api_schemas_catalog.services.ServiceGet.outputs[*] + example: + defaultValue: 0 + description: Time to wait before completion + displayOrder: 2 + keyId: input_2 + label: Sleep Time + type: number + unit: second + unitLong: seconds + unitShort: sec + widget: + details: + minHeight: 1 + type: TextArea + ServiceKeyVersion: + properties: + key: + type: string + pattern: ^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$ + title: Key + description: distinctive name for the node based on the docker registry + path + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + description: service version number + type: object + required: + - key + - version + title: ServiceKeyVersion + description: Service `key-version` pair uniquely identifies a service + ServiceOutputGet: + properties: + unitLong: + anyOf: + - type: string + - type: 'null' + title: Unitlong + description: Long name of the unit for display (html-compatible), if available + unitShort: + anyOf: + - type: string + - type: 'null' + title: Unitshort + description: Short name for the unit for display (html-compatible), if available + displayOrder: + anyOf: + - type: number + - type: 'null' + title: Displayorder + description: 'DEPRECATED: new display order is taken from the item position. + This will be removed.' + deprecated: true + label: + type: string + title: Label + description: short name for the property + description: + type: string + title: Description + description: description of the property + type: + type: string + pattern: ^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$ + title: Type + description: data type expected on this input glob matching for data type + is allowed + contentSchema: + anyOf: + - type: object + - type: 'null' + title: Contentschema + description: jsonschema of this input/output. Required when type='ref_contentSchema' + fileToKeyMap: + anyOf: + - type: object + - type: 'null' + title: Filetokeymap + description: Place the data associated with the named keys in files + unit: + anyOf: + - type: string + - type: 'null' + title: Unit + description: Units, when it refers to a physical quantity + deprecated: true + widget: + anyOf: + - $ref: '#/components/schemas/Widget' + - type: 'null' + description: custom widget to use instead of the default one determined + from the data-type + deprecated: true + keyId: + type: string + pattern: ^[-_a-zA-Z0-9]+$ + title: Keyid + description: Unique name identifier for this input + additionalProperties: false + type: object + required: + - label + - description + - type + - keyId + title: ServiceOutputGet + description: Extends fields of api_schemas_catalog.services.ServiceGet.outputs[*] + example: + description: Time the service waited before completion + displayOrder: 2 + keyId: output_2 + label: Time Slept + type: number + unit: second + unitLong: seconds + unitShort: sec + ServicePricingPlanGet: + properties: + pricingPlanId: + type: integer + exclusiveMinimum: true + title: Pricingplanid + minimum: 0 + displayName: + type: string + title: Displayname + description: + type: string + title: Description + classification: + $ref: '#/components/schemas/PricingPlanClassification' + createdAt: + type: string + format: date-time + title: Createdat + pricingPlanKey: + type: string + title: Pricingplankey + pricingUnits: + items: + $ref: '#/components/schemas/PricingUnitGet' + type: array + title: Pricingunits + type: object + required: + - pricingPlanId + - displayName + - description + - classification + - createdAt + - pricingPlanKey + - pricingUnits + title: ServicePricingPlanGet + ServiceRelease: + properties: + version: + type: string + pattern: ^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$ + title: Version + versionDisplay: + anyOf: + - type: string + - type: 'null' + title: Versiondisplay + description: If None, then display `version` + released: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Released + description: When provided, it indicates the release timestamp + retired: + anyOf: + - type: string + format: date-time + - type: 'null' + title: Retired + description: 'whether this service is planned to be retired. If None, the + service is still active. If now Date: Tue, 3 Dec 2024 05:47:51 +0100 Subject: [PATCH 20/79] readd openapi specs for director --- .../api/v0/openapi.yaml | 2851 +++++++++++++++++ 1 file changed, 2851 insertions(+) create mode 100644 services/director/src/simcore_service_director/api/v0/openapi.yaml diff --git a/services/director/src/simcore_service_director/api/v0/openapi.yaml b/services/director/src/simcore_service_director/api/v0/openapi.yaml new file mode 100644 index 00000000000..daf98532f4d --- /dev/null +++ b/services/director/src/simcore_service_director/api/v0/openapi.yaml @@ -0,0 +1,2851 @@ +openapi: 3.0.0 +info: + description: This is the oSparc's director API + version: 0.1.0 + title: Director API + contact: + name: IT'IS Foundation + email: support@simcore.com + license: + name: MIT + url: 'https://github.com/ITISFoundation/osparc-simcore/blob/master/LICENSE' +servers: + - description: Development server + url: 'http://{host}:{port}/{version}' + variables: + host: + default: localhost + port: + default: '8080' + version: + default: v0 + enum: + - v0 + - description: Production server + url: 'http://director:{port}/{version}' + variables: + port: + default: '8080' + version: + default: v0 + enum: + - v0 +tags: + - name: admins + description: Secured Admin-only calls + - name: developers + description: Operations available to regular developers + - name: users + description: Operations available to regular users +paths: + /: + get: + tags: + - users + summary: Service health-check endpoint + description: Some general information on the API and state of the service behind + operationId: root_get + responses: + '200': + description: Service information + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + properties: + name: + type: string + example: director service + status: + type: string + example: SERVICE_RUNNING + api_version: + type: string + example: 1.0.0-dev + version: + type: string + example: 1dfcfdc + error: + nullable: true + default: null + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + /services: + get: + tags: + - users + summary: Lists available services in the oSparc platform + description: Lists available services in the oSparc platform + operationId: services_get + parameters: + - in: query + name: service_type + description: | + The service type: + * computational - a computational service + * interactive - an interactive service + required: false + schema: + type: string + enum: + - computational + - interactive + example: computational + responses: + '200': + description: 'Success, returns the list of available services' + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + title: simcore node + description: Description of a simcore node 'class' with input and output + type: object + additionalProperties: false + required: + - key + - version + - type + - name + - description + - authors + - contact + - inputs + - outputs + properties: + key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' + example: simcore/services/comp/itis/sleeper + integration-version: + type: string + description: integration version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + version: + type: string + description: service version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + type: + type: string + description: service type + enum: + - frontend + - computational + - dynamic + example: computational + name: + type: string + description: 'short, human readable name for the node' + example: Fast Counter + thumbnail: + type: string + description: url to the thumbnail + example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' + badges: + type: array + items: + type: object + required: + - name + - image + - url + additionalProperties: false + properties: + name: + type: string + description: Name of the subject + example: travis-ci + image: + type: string + description: Url to the shield + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' + url: + type: string + description: Link to status + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' + description: + type: string + description: human readable description of the purpose of the node + example: Our best node type + authors: + type: array + minItems: 1 + items: + type: object + required: + - name + - email + additionalProperties: false + properties: + name: + type: string + description: Name of the author + example: Sun Bak + email: + description: Email address + type: string + format: email + example: sun@sense.eight + affiliation: + description: Affiliation of the author + type: string + example: Sense8 + contact: + type: string + format: email + description: email to correspond to the authors about the node + example: lab@net.flix + inputs: + type: object + description: definition of the inputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the input configurable for this service + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' + deprecated: true + type: number + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' + description: data type expected on this input glob matching for data type is allowed + example: + - number + - boolean + - 'data:*/*' + - 'data:text/*' + - 'data:[image/jpeg,image/png]' + - 'data:application/json' + - 'data:application/json;schema=https://my-schema/not/really/schema.json' + - 'data:application/vnd.ms-excel' + - 'data:text/plain' + - 'data:application/hdf5' + - 'data:application/edu.ucdavis@ceclancy.xyz' + contentSchema: + title: Content Schema + description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data associated with the named keys in files + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + defaultValue: + description: initial value for this input + type: + - string + - number + - integer + - boolean + example: + - Dog + - true + unit: + title: Unit + description: 'Units of this input value, if a physical quantity' + type: string + widget: + description: custom widget to use instead of the default one determined from the data-type + anyOf: + - type: object + additionalProperties: false + required: + - type + properties: + type: + description: type of the property + type: string + enum: + - TextArea + minHeight: + description: minimum Height of the textarea + type: integer + minimum: 1 + - type: object + additionalProperties: false + required: + - type + - structure + properties: + type: + description: type of the property + type: string + enum: + - SelectBox + structure: + type: array + minItems: 1 + items: + type: object + additionalProperties: false + required: + - key + - label + properties: + key: + type: + - string + - boolean + - number + label: + type: string + example: + - - key: rat + label: The Rat + - key: dog + label: Bello the Dog + additionalProperties: true + outputs: + type: object + description: definition of the outputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the output produced by this node + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + type: number + description: use this to numerically sort the properties for display + example: + - 1 + - -0.2 + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' + description: data type expected on this output + example: + - number + - integer + - boolean + - string + - 'data:application/json' + - 'data:application/vnd.ms-excel ' + - 'data:text/plain' + - 'data:application/hdf5' + contentSchema: + title: Content Schema + description: jsonschema of this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + unit: + title: Unit + description: 'Units of the output value, if a physical quantity' + type: string + additionalProperties: true + boot-options: + title: Boot Options + description: Service defined boot options. These get injected in the service as env variables. + type: object + x-patternProperties: + '^[_a-zA-Z0-9]+$': + title: BootOptionMode + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + default: + title: Default + type: string + items: + title: Items + type: object + additionalProperties: + title: BootOptionItem + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + required: + - label + - description + required: + - label + - description + - default + - items + additionalProperties: true + image_digest: + title: Image Manifest digest + description: Provides a unique footprint (hash) of the image manifest + type: string + example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 + error: + nullable: true + default: null + '401': + description: Unauthorized access + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '/services/{service_key}/{service_version}': + get: + tags: + - users + summary: Returns details of the selected service if available in the oSparc platform + description: Returns details of the selected service if available in the oSparc platform + operationId: services_by_key_version_get + parameters: + - in: path + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + - in: path + name: service_version + description: The tag/version of the service + required: true + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + responses: + '200': + description: 'Success, returns the details of the service' + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + title: simcore node + description: Description of a simcore node 'class' with input and output + type: object + additionalProperties: false + required: + - key + - version + - type + - name + - description + - authors + - contact + - inputs + - outputs + properties: + key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' + example: simcore/services/comp/itis/sleeper + integration-version: + type: string + description: integration version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + version: + type: string + description: service version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + type: + type: string + description: service type + enum: + - frontend + - computational + - dynamic + example: computational + name: + type: string + description: 'short, human readable name for the node' + example: Fast Counter + thumbnail: + type: string + description: url to the thumbnail + example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' + badges: + type: array + items: + type: object + required: + - name + - image + - url + additionalProperties: false + properties: + name: + type: string + description: Name of the subject + example: travis-ci + image: + type: string + description: Url to the shield + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' + url: + type: string + description: Link to status + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' + description: + type: string + description: human readable description of the purpose of the node + example: Our best node type + authors: + type: array + minItems: 1 + items: + type: object + required: + - name + - email + additionalProperties: false + properties: + name: + type: string + description: Name of the author + example: Sun Bak + email: + description: Email address + type: string + format: email + example: sun@sense.eight + affiliation: + description: Affiliation of the author + type: string + example: Sense8 + contact: + type: string + format: email + description: email to correspond to the authors about the node + example: lab@net.flix + inputs: + type: object + description: definition of the inputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the input configurable for this service + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' + deprecated: true + type: number + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' + description: data type expected on this input glob matching for data type is allowed + example: + - number + - boolean + - 'data:*/*' + - 'data:text/*' + - 'data:[image/jpeg,image/png]' + - 'data:application/json' + - 'data:application/json;schema=https://my-schema/not/really/schema.json' + - 'data:application/vnd.ms-excel' + - 'data:text/plain' + - 'data:application/hdf5' + - 'data:application/edu.ucdavis@ceclancy.xyz' + contentSchema: + title: Content Schema + description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data associated with the named keys in files + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + defaultValue: + description: initial value for this input + type: + - string + - number + - integer + - boolean + example: + - Dog + - true + unit: + title: Unit + description: 'Units of this input value, if a physical quantity' + type: string + widget: + description: custom widget to use instead of the default one determined from the data-type + anyOf: + - type: object + additionalProperties: false + required: + - type + properties: + type: + description: type of the property + type: string + enum: + - TextArea + minHeight: + description: minimum Height of the textarea + type: integer + minimum: 1 + - type: object + additionalProperties: false + required: + - type + - structure + properties: + type: + description: type of the property + type: string + enum: + - SelectBox + structure: + type: array + minItems: 1 + items: + type: object + additionalProperties: false + required: + - key + - label + properties: + key: + type: + - string + - boolean + - number + label: + type: string + example: + - - key: rat + label: The Rat + - key: dog + label: Bello the Dog + additionalProperties: true + outputs: + type: object + description: definition of the outputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the output produced by this node + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + type: number + description: use this to numerically sort the properties for display + example: + - 1 + - -0.2 + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' + description: data type expected on this output + example: + - number + - integer + - boolean + - string + - 'data:application/json' + - 'data:application/vnd.ms-excel ' + - 'data:text/plain' + - 'data:application/hdf5' + contentSchema: + title: Content Schema + description: jsonschema of this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + unit: + title: Unit + description: 'Units of the output value, if a physical quantity' + type: string + additionalProperties: true + boot-options: + title: Boot Options + description: Service defined boot options. These get injected in the service as env variables. + type: object + x-patternProperties: + '^[_a-zA-Z0-9]+$': + title: BootOptionMode + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + default: + title: Default + type: string + items: + title: Items + type: object + additionalProperties: + title: BootOptionItem + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + required: + - label + - description + required: + - label + - description + - default + - items + additionalProperties: true + image_digest: + title: Image Manifest digest + description: Provides a unique footprint (hash) of the image manifest + type: string + example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 + error: + nullable: true + default: null + '401': + description: Unauthorized access + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '/services/{service_key}/{service_version}/labels': + get: + tags: + - users + summary: Returns the list of tags attached to a service + operationId: get_service_labels + parameters: + - in: path + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + - in: path + name: service_version + description: The tag/version of the service + required: true + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + responses: + '200': + description: 'Success, returns the details of the service' + content: + application/json: + schema: + type: object + additionalProperties: + type: string + '401': + description: Unauthorized access + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '/service_extras/{service_key}/{service_version}': + get: + tags: + - users + summary: Returns the service's details which should be hidden from the user defined as extras. + description: Currently returns the node_requirements an array of resoruces needed for scheduling. + operationId: service_extras_by_key_version_get + parameters: + - in: path + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + - in: path + name: service_version + description: The tag/version of the service + required: true + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + responses: + '200': + description: 'Success, returns an object containing details hidden from the user' + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + required: + - node_requirements + properties: + node_requirements: + type: object + required: + - CPU + - RAM + properties: + CPU: + type: number + default: 1 + minimum: 1 + GPU: + type: integer + minimum: 0 + RAM: + type: integer + format: int64 + minimum: 1024 + MPI: + type: integer + maximum: 1 + service_build_details: + type: object + properties: + build_date: + type: string + vcs_ref: + type: string + vcs_url: + type: string + container_spec: + type: object + properties: + command: + type: array + items: + type: string + error: + nullable: true + default: null + '401': + description: Unauthorized access + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + /running_interactive_services: + get: + tags: + - users + summary: Returns a list of interactive services + operationId: running_interactive_services_list_get + parameters: + - in: query + name: user_id + required: false + schema: + type: string + - in: query + name: project_id + required: false + schema: + type: string + responses: + '200': + description: Returns the running services instances + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: array + items: + type: object + required: + - published_port + - service_uuid + - service_key + - service_version + - service_host + - service_port + - service_state + - user_id + properties: + published_port: + description: The ports where the service provides its interface + type: integer + format: int32 + minimum: 1 + example: 30000 + entry_point: + description: The entry point where the service provides its interface if specified + type: string + example: /the/entry/point/is/here + service_uuid: + description: The UUID attached to this service + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + service_key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + service_version: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + service_host: + description: service host name within the network + type: string + example: jupyter_E1O2E-LAH + service_port: + description: port to access the service within the network + type: integer + minimum: 1 + example: 8081 + service_basepath: + description: different base path where current service is mounted otherwise defaults to root + type: string + example: /x/E1O2E-LAH + default: '' + service_state: + description: | + the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start + type: string + enum: + - pending + - pulling + - starting + - running + - complete + - failed + service_message: + description: the service message + type: string + example: no suitable node (insufficient resources on 1 node) + user_id: + description: the user that started the service + type: string + example: '123' + error: + nullable: true + default: null + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + post: + tags: + - users + summary: Starts an interactive service in the oSparc platform + operationId: running_interactive_services_post + parameters: + - in: query + name: user_id + description: The ID of the user that starts the service + required: true + schema: + type: string + example: asdfgj233 + - in: query + name: project_id + description: The ID of the project in which the service starts + required: true + schema: + type: string + example: asdfgj233 + - in: query + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + - in: query + name: service_tag + description: The tag/version of the service + required: false + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + - in: query + name: service_uuid + description: The uuid to assign the service with + required: true + schema: + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + - in: query + name: service_basepath + description: predefined basepath for the backend service otherwise uses root + required: false + schema: + type: string + example: /x/EycCXbU0H/ + default: '' + responses: + '201': + description: Succesfully created the service in the oSparc platform. Returns the location where the service runs. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + required: + - published_port + - service_uuid + - service_key + - service_version + - service_host + - service_port + - service_state + - user_id + properties: + published_port: + description: The ports where the service provides its interface + type: integer + format: int32 + minimum: 1 + example: 30000 + entry_point: + description: The entry point where the service provides its interface if specified + type: string + example: /the/entry/point/is/here + service_uuid: + description: The UUID attached to this service + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + service_key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + service_version: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + service_host: + description: service host name within the network + type: string + example: jupyter_E1O2E-LAH + service_port: + description: port to access the service within the network + type: integer + minimum: 1 + example: 8081 + service_basepath: + description: different base path where current service is mounted otherwise defaults to root + type: string + example: /x/E1O2E-LAH + default: '' + service_state: + description: | + the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start + type: string + enum: + - pending + - pulling + - starting + - running + - complete + - failed + service_message: + description: the service message + type: string + example: no suitable node (insufficient resources on 1 node) + user_id: + description: the user that started the service + type: string + example: '123' + error: + nullable: true + default: null + '400': + description: 'Malformed function call, missing field' + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '401': + description: Unauthorized access + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '409': + description: A service with the same uuid already exists + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '/running_interactive_services/{service_uuid}': + get: + tags: + - users + summary: Succesfully returns if a service with the defined uuid is up and running + description: Succesfully returns if a service with the defined uuid is up and running + operationId: running_interactive_services_get + parameters: + - in: path + name: service_uuid + description: The uuid of the service + required: true + schema: + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + responses: + '200': + description: OK service exists and runs. Returns service location. + content: + application/json: + schema: + type: object + required: + - data + properties: + data: + type: object + required: + - published_port + - service_uuid + - service_key + - service_version + - service_host + - service_port + - service_state + - user_id + properties: + published_port: + description: The ports where the service provides its interface + type: integer + format: int32 + minimum: 1 + example: 30000 + entry_point: + description: The entry point where the service provides its interface if specified + type: string + example: /the/entry/point/is/here + service_uuid: + description: The UUID attached to this service + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + service_key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + service_version: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + service_host: + description: service host name within the network + type: string + example: jupyter_E1O2E-LAH + service_port: + description: port to access the service within the network + type: integer + minimum: 1 + example: 8081 + service_basepath: + description: different base path where current service is mounted otherwise defaults to root + type: string + example: /x/E1O2E-LAH + default: '' + service_state: + description: | + the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start + type: string + enum: + - pending + - pulling + - starting + - running + - complete + - failed + service_message: + description: the service message + type: string + example: no suitable node (insufficient resources on 1 node) + user_id: + description: the user that started the service + type: string + example: '123' + error: + nullable: true + default: null + '400': + description: 'Malformed function call, missing field' + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + delete: + tags: + - users + summary: Stops and removes an interactive service from the oSparc platform + description: Stops and removes an interactive service from the oSparc platform + operationId: running_interactive_services_delete + parameters: + - in: path + name: service_uuid + description: The uuid of the service + required: true + schema: + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + - in: query + name: save_state + description: Save the state prior to removing the service + required: false + schema: + type: boolean + default: true + responses: + '204': + description: Succesfully stopped and removed the service from the oSparc platform + '400': + description: 'Malformed function call, missing field' + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + '404': + description: Service not found + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + default: + description: Unexpected error + content: + application/json: + schema: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 +components: + parameters: + UserId: + in: query + name: user_id + description: The ID of the user that starts the service + required: true + schema: + type: string + example: asdfgj233 + ProjectId: + in: query + name: project_id + description: The ID of the project in which the service starts + required: true + schema: + type: string + example: asdfgj233 + AssignmentUuid: + in: query + name: service_uuid + description: The uuid to assign the service with + required: true + schema: + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + ServiceKeyPath: + in: path + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + ServiceKey: + in: query + name: service_key + description: The key (url) of the service + required: true + schema: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + ServiceType: + in: query + name: service_type + description: | + The service type: + * computational - a computational service + * interactive - an interactive service + required: false + schema: + type: string + enum: + - computational + - interactive + example: computational + ServiceBasePath: + in: query + name: service_basepath + description: predefined basepath for the backend service otherwise uses root + required: false + schema: + type: string + example: /x/EycCXbU0H/ + default: '' + ServiceUuid: + in: path + name: service_uuid + description: The uuid of the service + required: true + schema: + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + ServiceVersionPath: + in: path + name: service_version + description: The tag/version of the service + required: true + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + ServiceVersion: + in: query + name: service_tag + description: The tag/version of the service + required: false + schema: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + SaveState: + in: query + name: save_state + description: Save the state prior to removing the service + required: false + schema: + type: boolean + default: true + schemas: + ErrorEnveloped: + type: object + required: + - error + properties: + data: + nullable: true + default: null + error: + type: object + required: + - status + - message + properties: + message: + description: Error message + type: string + example: Unexpected error + errors: + type: array + items: + properties: + code: + type: string + description: Server Exception + example: ServiceUUIDNotFoundError + status: + description: Error code + type: integer + example: 404 + RunningServiceEnveloped: + type: object + required: + - data + properties: + data: + type: object + required: + - published_port + - service_uuid + - service_key + - service_version + - service_host + - service_port + - service_state + - user_id + properties: + published_port: + description: The ports where the service provides its interface + type: integer + format: int32 + minimum: 1 + example: 30000 + entry_point: + description: The entry point where the service provides its interface if specified + type: string + example: /the/entry/point/is/here + service_uuid: + description: The UUID attached to this service + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + service_key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + service_version: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + service_host: + description: service host name within the network + type: string + example: jupyter_E1O2E-LAH + service_port: + description: port to access the service within the network + type: integer + minimum: 1 + example: 8081 + service_basepath: + description: different base path where current service is mounted otherwise defaults to root + type: string + example: /x/E1O2E-LAH + default: '' + service_state: + description: | + the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start + type: string + enum: + - pending + - pulling + - starting + - running + - complete + - failed + service_message: + description: the service message + type: string + example: no suitable node (insufficient resources on 1 node) + user_id: + description: the user that started the service + type: string + example: '123' + error: + nullable: true + default: null + RunningServicesEnveloped: + type: object + required: + - data + properties: + data: + type: array + items: + type: object + required: + - published_port + - service_uuid + - service_key + - service_version + - service_host + - service_port + - service_state + - user_id + properties: + published_port: + description: The ports where the service provides its interface + type: integer + format: int32 + minimum: 1 + example: 30000 + entry_point: + description: The entry point where the service provides its interface if specified + type: string + example: /the/entry/point/is/here + service_uuid: + description: The UUID attached to this service + type: string + example: 123e4567-e89b-12d3-a456-426655440000 + service_key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic)(/[\w/-]+)+$' + example: + - simcore/services/comp/itis/sleeper + - simcore/services/dynamic/3dviewer + service_version: + type: string + description: semantic version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: + - 1.0.0 + - 0.0.1 + service_host: + description: service host name within the network + type: string + example: jupyter_E1O2E-LAH + service_port: + description: port to access the service within the network + type: integer + minimum: 1 + example: 8081 + service_basepath: + description: different base path where current service is mounted otherwise defaults to root + type: string + example: /x/E1O2E-LAH + default: '' + service_state: + description: | + the service state * 'pending' - The service is waiting for resources to start * 'pulling' - The service is being pulled from the registry * 'starting' - The service is starting * 'running' - The service is running * 'complete' - The service completed * 'failed' - The service failed to start + type: string + enum: + - pending + - pulling + - starting + - running + - complete + - failed + service_message: + description: the service message + type: string + example: no suitable node (insufficient resources on 1 node) + user_id: + description: the user that started the service + type: string + example: '123' + error: + nullable: true + default: null + ServicesEnveloped: + type: object + required: + - data + properties: + data: + type: array + items: + title: simcore node + description: Description of a simcore node 'class' with input and output + type: object + additionalProperties: false + required: + - key + - version + - type + - name + - description + - authors + - contact + - inputs + - outputs + properties: + key: + type: string + description: distinctive name for the node based on the docker registry path + pattern: '^(simcore)/(services)/(comp|dynamic|frontend)(/[\w/-]+)+$' + example: simcore/services/comp/itis/sleeper + integration-version: + type: string + description: integration version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + version: + type: string + description: service version number + pattern: '^(0|[1-9]\d*)(\.(0|[1-9]\d*)){2}(-(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*)(\.(0|[1-9]\d*|\d*[-a-zA-Z][-\da-zA-Z]*))*)?(\+[-\da-zA-Z]+(\.[-\da-zA-Z-]+)*)?$' + example: 1.0.0 + type: + type: string + description: service type + enum: + - frontend + - computational + - dynamic + example: computational + name: + type: string + description: 'short, human readable name for the node' + example: Fast Counter + thumbnail: + type: string + description: url to the thumbnail + example: 'https://user-images.githubusercontent.com/32800795/61083844-ff48fb00-a42c-11e9-8e63-fa2d709c8baf.png' + badges: + type: array + items: + type: object + required: + - name + - image + - url + additionalProperties: false + properties: + name: + type: string + description: Name of the subject + example: travis-ci + image: + type: string + description: Url to the shield + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore.svg?branch=master' + url: + type: string + description: Link to status + example: 'https://travis-ci.org/ITISFoundation/osparc-simcore ''State of CI: build, test and pushing images''' + description: + type: string + description: human readable description of the purpose of the node + example: Our best node type + authors: + type: array + minItems: 1 + items: + type: object + required: + - name + - email + additionalProperties: false + properties: + name: + type: string + description: Name of the author + example: Sun Bak + email: + description: Email address + type: string + format: email + example: sun@sense.eight + affiliation: + description: Affiliation of the author + type: string + example: Sense8 + contact: + type: string + format: email + description: email to correspond to the authors about the node + example: lab@net.flix + inputs: + type: object + description: definition of the inputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the input configurable for this service + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + description: 'DEPRECATED: new display order is taken from the item position. This property will be removed.' + deprecated: true + type: number + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:([^/\s,]+/[^/\s,]+|\[[^/\s,]+/[^/\s,]+(,[^/\s]+/[^/,\s]+)*\]))$' + description: data type expected on this input glob matching for data type is allowed + example: + - number + - boolean + - 'data:*/*' + - 'data:text/*' + - 'data:[image/jpeg,image/png]' + - 'data:application/json' + - 'data:application/json;schema=https://my-schema/not/really/schema.json' + - 'data:application/vnd.ms-excel' + - 'data:text/plain' + - 'data:application/hdf5' + - 'data:application/edu.ucdavis@ceclancy.xyz' + contentSchema: + title: Content Schema + description: jsonschema of the content at this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data associated with the named keys in files + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + defaultValue: + description: initial value for this input + type: + - string + - number + - integer + - boolean + example: + - Dog + - true + unit: + title: Unit + description: 'Units of this input value, if a physical quantity' + type: string + widget: + description: custom widget to use instead of the default one determined from the data-type + anyOf: + - type: object + additionalProperties: false + required: + - type + properties: + type: + description: type of the property + type: string + enum: + - TextArea + minHeight: + description: minimum Height of the textarea + type: integer + minimum: 1 + - type: object + additionalProperties: false + required: + - type + - structure + properties: + type: + description: type of the property + type: string + enum: + - SelectBox + structure: + type: array + minItems: 1 + items: + type: object + additionalProperties: false + required: + - key + - label + properties: + key: + type: + - string + - boolean + - number + label: + type: string + example: + - - key: rat + label: The Rat + - key: dog + label: Bello the Dog + additionalProperties: true + outputs: + type: object + description: definition of the outputs of this node + x-patternProperties: + '^[-_a-zA-Z0-9]+$': + type: object + description: all the output produced by this node + additionalProperties: false + required: + - displayOrder + - label + - description + - type + properties: + displayOrder: + type: number + description: use this to numerically sort the properties for display + example: + - 1 + - -0.2 + label: + type: string + description: short name for the property + example: + - Age + description: + type: string + description: description of the property + example: + - Age in seconds since 1970 + type: + type: string + pattern: '^(number|integer|boolean|string|ref_contentSchema|data:[^/\s,]+/[^/\s,]+)$' + description: data type expected on this output + example: + - number + - integer + - boolean + - string + - 'data:application/json' + - 'data:application/vnd.ms-excel ' + - 'data:text/plain' + - 'data:application/hdf5' + contentSchema: + title: Content Schema + description: jsonschema of this input/output. Required when type='ref_contentSchema' + type: object + fileToKeyMap: + description: Place the data stored in the named files and store it in the locations pointed to by the respective output key. + type: object + patternProperties: + .+: + type: string + pattern: '^[-_a-zA-Z0-9]+$' + example: + - dir/input1.txt: key_1 + dir33/input2.txt: key2 + unit: + title: Unit + description: 'Units of the output value, if a physical quantity' + type: string + additionalProperties: true + boot-options: + title: Boot Options + description: Service defined boot options. These get injected in the service as env variables. + type: object + x-patternProperties: + '^[_a-zA-Z0-9]+$': + title: BootOptionMode + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + default: + title: Default + type: string + items: + title: Items + type: object + additionalProperties: + title: BootOptionItem + type: object + properties: + label: + title: Label + type: string + description: + title: Description + type: string + required: + - label + - description + required: + - label + - description + - default + - items + additionalProperties: true + image_digest: + title: Image Manifest digest + description: Provides a unique footprint (hash) of the image manifest + type: string + example: sha256:b7c8f6a401cb12d7fe36970b6927e03cb429b395fc9f2b0104291e12b81a5100 + + error: + nullable: true + default: null + ServiceExtrasEnveloped: + type: object + required: + - data + properties: + data: + type: object + required: + - node_requirements + properties: + node_requirements: + type: object + required: + - CPU + - RAM + properties: + CPU: + type: number + default: 1 + minimum: 1 + GPU: + type: integer + minimum: 0 + RAM: + type: integer + format: int64 + minimum: 1024 + MPI: + type: integer + maximum: 1 + service_build_details: + type: object + properties: + build_date: + type: string + vcs_ref: + type: string + vcs_url: + type: string + container_spec: + type: object + properties: + command: + type: array + items: + type: string + error: + nullable: true + default: null + HealthCheckEnveloped: + type: object + required: + - data + properties: + data: + type: object + properties: + name: + type: string + example: director service + status: + type: string + example: SERVICE_RUNNING + api_version: + type: string + example: 1.0.0-dev + version: + type: string + example: 1dfcfdc + error: + nullable: true + default: null From db35a67658516b266dc235ae36fdf830b95b89ae Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 05:49:48 +0100 Subject: [PATCH 21/79] minor fix --- .github/workflows/ci-testing-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 3fe0c65b7ba..9d57a93f911 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2890,8 +2890,8 @@ jobs: uses: actions/checkout@v4 with: path: target - repository: github.event.pull_request.base.repo.full_name - ref: github.event.pull_request.base.ref + repository: ${{ github.event.pull_request.base.repo.full_name }} + ref: ${{ github.event.pull_request.base.ref }} - name: Generate target openapi specs run: | cd target From d4734296d85e0f7f25cef3898480f723dd096d5d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:06:49 +0100 Subject: [PATCH 22/79] add github workflow job to ensure openapi specs are up to date --- .github/workflows/ci-testing-deploy.yml | 42 ++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 9d57a93f911..24b85db3703 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2865,7 +2865,39 @@ jobs: TAG_PREFIX: hotfix-staging-github run: ./ci/deploy/dockerhub-deploy.bash -n - api-server-api-spec-backwards-compatible: + check-api-specs-updated: + needs: [changes] + if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} + timeout-minutes: 10 + name: Check api-specs are up to date + runs-on: ubuntu-latest + steps: + - name: setup python environment + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: install uv + uses: astral-sh/setup-uv@v4 + with: + version: "0.4.x" + enable-cache: false + cache-dependency-glob: "**/service-library/requirements/ci*.txt" + - name: checkout source branch + uses: actions/checkout@v4 + with: + path: source + - name: Regenerate specs and check + run: | + uv venv .venv && source .venv/bin/activate + make openapi-specs + changed_files=$(git diff --name-only) + if echo ${changed_files} | grep -qE '^(openapi\.json|openapi\.yaml)$'; then + echo "${changed_files}" && echo "Run make openapi-specs and commit changes" + exit 1 + fi + + + api-spec-backwards-compatible: needs: [changes] if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} timeout-minutes: 10 @@ -2892,13 +2924,13 @@ jobs: path: target repository: ${{ github.event.pull_request.base.repo.full_name }} ref: ${{ github.event.pull_request.base.ref }} - - name: Generate target openapi specs + - name: Generate source openapi-specs run: | - cd target + cd source uv venv .venv && source .venv/bin/activate make openapi-specs - - name: Generate source openapi-specs and compare + - name: Generate target openapi specs run: | - cd source + cd target uv venv .venv && source .venv/bin/activate make openapi-specs From b8f9fcb7a4f0bf94d70039aa6ec81b7c1a47501d Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:11:32 +0100 Subject: [PATCH 23/79] minor fix --- .github/workflows/ci-testing-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 24b85db3703..299bcaef01a 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2888,6 +2888,7 @@ jobs: path: source - name: Regenerate specs and check run: | + cd ${{ github.event.repository.name }} uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only) From 800a3a88c2bca0e984fb97a2e3913bd1d84b19cc Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:13:38 +0100 Subject: [PATCH 24/79] yet another minor fix --- .github/workflows/ci-testing-deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 299bcaef01a..6202b10d0e0 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2884,8 +2884,6 @@ jobs: cache-dependency-glob: "**/service-library/requirements/ci*.txt" - name: checkout source branch uses: actions/checkout@v4 - with: - path: source - name: Regenerate specs and check run: | cd ${{ github.event.repository.name }} From c79a0a6b46003caa9284c397e6a77ce8261da5ce Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:17:02 +0100 Subject: [PATCH 25/79] fix --- .github/workflows/ci-testing-deploy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 6202b10d0e0..ec008197efa 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2886,7 +2886,6 @@ jobs: uses: actions/checkout@v4 - name: Regenerate specs and check run: | - cd ${{ github.event.repository.name }} uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only) From eb233098053759b2e3e9f2fa0cead8b7775726a3 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:22:33 +0100 Subject: [PATCH 26/79] manual testing --- .github/workflows/ci-testing-deploy.yml | 5 ++--- services/api-server/openapi.json | 7 ------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index ec008197efa..6d0116d54dd 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2888,10 +2888,9 @@ jobs: run: | uv venv .venv && source .venv/bin/activate make openapi-specs - changed_files=$(git diff --name-only) + changed_files=$(git diff --name-only | tee /dev/tty) if echo ${changed_files} | grep -qE '^(openapi\.json|openapi\.yaml)$'; then - echo "${changed_files}" && echo "Run make openapi-specs and commit changes" - exit 1 + echo "Run make openapi-specs and commit changes" && exit 1 fi diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 29d7dda206b..462bf4ee6f2 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -7,13 +7,6 @@ }, "paths": { "/v0/meta": { - "get": { - "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata", - "responses": { "200": { "description": "Successful Response", "content": { From 1ca4b67621ff061d31e293f20af4cba7428ac99b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:27:09 +0100 Subject: [PATCH 27/79] fix --- .github/workflows/ci-testing-deploy.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 6d0116d54dd..18d34d07c72 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2869,7 +2869,7 @@ jobs: needs: [changes] if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} timeout-minutes: 10 - name: Check api-specs are up to date + name: check api-specs are up to date runs-on: ubuntu-latest steps: - name: setup python environment @@ -2888,7 +2888,8 @@ jobs: run: | uv venv .venv && source .venv/bin/activate make openapi-specs - changed_files=$(git diff --name-only | tee /dev/tty) + changed_files=$(git diff --name-only) + echo "${changed_files}" if echo ${changed_files} | grep -qE '^(openapi\.json|openapi\.yaml)$'; then echo "Run make openapi-specs and commit changes" && exit 1 fi From f3eaea2253bdf96af1a1c0843e3ecec0e61a3307 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:34:17 +0100 Subject: [PATCH 28/79] fix --- .github/workflows/ci-testing-deploy.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 18d34d07c72..fc5df6b4266 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2888,11 +2888,8 @@ jobs: run: | uv venv .venv && source .venv/bin/activate make openapi-specs - changed_files=$(git diff --name-only) - echo "${changed_files}" - if echo ${changed_files} | grep -qE '^(openapi\.json|openapi\.yaml)$'; then - echo "Run make openapi-specs and commit changes" && exit 1 - fi + changed_files=$(git diff --name-only | awk '{$1=$1};1') + [ -z "${changed_files}" ] && echo "${changed_files}" && exit 1 api-spec-backwards-compatible: From 8fc6f0e98943404ef0c6d24ea5332baf3a3ec87f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:38:31 +0100 Subject: [PATCH 29/79] yet another fix --- .github/workflows/ci-testing-deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index fc5df6b4266..01132112e05 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2889,7 +2889,8 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') - [ -z "${changed_files}" ] && echo "${changed_files}" && exit 1 + echo "files which changed: ${changed_files}" + [ -z "${changed_files}" ] && exit 1 api-spec-backwards-compatible: From 7f1bd6036735a2cb9a32cc2719677a3fe403557e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:51:57 +0100 Subject: [PATCH 30/79] improve error message --- .github/workflows/ci-testing-deploy.yml | 2 +- services/api-server/openapi.json | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 01132112e05..63b4ade1870 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2889,7 +2889,7 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') - echo "files which changed: ${changed_files}" + echo "Changes (run 'make openapi-specs' to update): \n${changed_files}" [ -z "${changed_files}" ] && exit 1 diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 462bf4ee6f2..29d7dda206b 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -7,6 +7,13 @@ }, "paths": { "/v0/meta": { + "get": { + "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata", + "responses": { "200": { "description": "Successful Response", "content": { From 2f061059555cf65ccb02ce4c278af994b1ae535e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 06:56:38 +0100 Subject: [PATCH 31/79] test --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 63b4ade1870..f8315af1a3b 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2890,7 +2890,7 @@ jobs: make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') echo "Changes (run 'make openapi-specs' to update): \n${changed_files}" - [ -z "${changed_files}" ] && exit 1 + [[ -z "${changed_files}" ]] && exit 1 api-spec-backwards-compatible: From 933d9887a9ff7b9e82b28095ba5a93e8c02d44d5 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:01:05 +0100 Subject: [PATCH 32/79] update error message --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index f8315af1a3b..035e7758269 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2889,7 +2889,7 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') - echo "Changes (run 'make openapi-specs' to update): \n${changed_files}" + echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" [[ -z "${changed_files}" ]] && exit 1 From 316ab664b5170898cebf9294f41b42553596ca53 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:02:50 +0100 Subject: [PATCH 33/79] update webserver specs --- .../server/src/simcore_service_webserver/api/v0/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 9cca4bafd06..33979c6bf3d 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -4540,7 +4540,7 @@ paths: '403': description: ProjectInvalidRightsError '404': - description: ProjectNotFoundError, UserDefaultWalletNotFoundError + description: UserDefaultWalletNotFoundError, ProjectNotFoundError '409': description: ProjectTooManyProjectOpenedError '422': From 8b6e9f819b29787847c09b2252549897c67cbe23 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:07:58 +0100 Subject: [PATCH 34/79] fix webserver openapi specs --- .../server/src/simcore_service_webserver/api/v0/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 33979c6bf3d..9cca4bafd06 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -4540,7 +4540,7 @@ paths: '403': description: ProjectInvalidRightsError '404': - description: UserDefaultWalletNotFoundError, ProjectNotFoundError + description: ProjectNotFoundError, UserDefaultWalletNotFoundError '409': description: ProjectTooManyProjectOpenedError '422': From 46589146bdb36cba6fcc18bf13277d7efef467cc Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:09:54 +0100 Subject: [PATCH 35/79] yet again webserver --- .../server/src/simcore_service_webserver/api/v0/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 9cca4bafd06..33979c6bf3d 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -4540,7 +4540,7 @@ paths: '403': description: ProjectInvalidRightsError '404': - description: ProjectNotFoundError, UserDefaultWalletNotFoundError + description: UserDefaultWalletNotFoundError, ProjectNotFoundError '409': description: ProjectTooManyProjectOpenedError '422': From b8d4d38e102cabbe2737370ea791e6745aaf3a24 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:13:00 +0100 Subject: [PATCH 36/79] fix --- .../server/src/simcore_service_webserver/api/v0/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 33979c6bf3d..9cca4bafd06 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -4540,7 +4540,7 @@ paths: '403': description: ProjectInvalidRightsError '404': - description: UserDefaultWalletNotFoundError, ProjectNotFoundError + description: ProjectNotFoundError, UserDefaultWalletNotFoundError '409': description: ProjectTooManyProjectOpenedError '422': From 7dc7b11c5b6157d3b86157345ab6e1a1bb1e0c07 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:20:33 +0100 Subject: [PATCH 37/79] fix randomness in openapi-spec generation in webserver --- api/specs/web-server/_projects_states.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/api/specs/web-server/_projects_states.py b/api/specs/web-server/_projects_states.py index 0c737062285..1547e8f3b35 100644 --- a/api/specs/web-server/_projects_states.py +++ b/api/specs/web-server/_projects_states.py @@ -34,8 +34,8 @@ ) -def to_desc(exceptions: set[type[Exception]] | type[Exception]): - exc_classes = {exceptions} if not isinstance(exceptions, set) else exceptions +def to_desc(exceptions: list[type[Exception]] | type[Exception]): + exc_classes = [exceptions] if not isinstance(exceptions, list) else exceptions return ", ".join(f"{cls.__name__}" for cls in exc_classes) @@ -43,26 +43,26 @@ def to_desc(exceptions: set[type[Exception]] | type[Exception]): "/projects/{project_id}:open", response_model=Envelope[ProjectGet], responses={ - status.HTTP_400_BAD_REQUEST: {"description": to_desc({ValidationError})}, + status.HTTP_400_BAD_REQUEST: {"description": to_desc([ValidationError])}, status.HTTP_402_PAYMENT_REQUIRED: { - "description": to_desc({WalletNotEnoughCreditsError}) + "description": to_desc([WalletNotEnoughCreditsError]) }, status.HTTP_403_FORBIDDEN: { - "description": to_desc({ProjectInvalidRightsError}) + "description": to_desc([ProjectInvalidRightsError]) }, status.HTTP_404_NOT_FOUND: { "description": to_desc( - {ProjectNotFoundError, UserDefaultWalletNotFoundError} + [ProjectNotFoundError, UserDefaultWalletNotFoundError] ) }, status.HTTP_409_CONFLICT: { - "description": to_desc({ProjectTooManyProjectOpenedError}), + "description": to_desc([ProjectTooManyProjectOpenedError]), }, status.HTTP_422_UNPROCESSABLE_ENTITY: { - "description": to_desc({ValidationError}) + "description": to_desc([ValidationError]) }, status.HTTP_503_SERVICE_UNAVAILABLE: { - "description": to_desc({DirectorServiceError}) + "description": to_desc([DirectorServiceError]) }, }, ) From 59c304920129dd980bd060fdda9edfffc4223460 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:39:51 +0100 Subject: [PATCH 38/79] test --- .github/workflows/ci-testing-deploy.yml | 3 +-- services/api-server/openapi.json | 4 ---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 035e7758269..cac9cfcee21 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2889,8 +2889,7 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') - echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" - [[ -z "${changed_files}" ]] && exit 1 + [[ -n "${changed_files}" ]] && echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" && exit 1 api-spec-backwards-compatible: diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 29d7dda206b..dfd1d23b6b8 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -9,10 +9,6 @@ "/v0/meta": { "get": { "tags": [ - "meta" - ], - "summary": "Get Service Metadata", - "operationId": "get_service_metadata", "responses": { "200": { "description": "Successful Response", From 71ebf58b063e77847cc5790672586ac2a8fbd89a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:44:41 +0100 Subject: [PATCH 39/79] update api server specs --- services/api-server/openapi.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index dfd1d23b6b8..29d7dda206b 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -9,6 +9,10 @@ "/v0/meta": { "get": { "tags": [ + "meta" + ], + "summary": "Get Service Metadata", + "operationId": "get_service_metadata", "responses": { "200": { "description": "Successful Response", From e942c8d07b57aa233e531029b4c64bd81d39c487 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:49:36 +0100 Subject: [PATCH 40/79] update gh workflow --- .github/workflows/ci-testing-deploy.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index cac9cfcee21..afdcb082dc8 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2889,7 +2889,10 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs changed_files=$(git diff --name-only | awk '{$1=$1};1') - [[ -n "${changed_files}" ]] && echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" && exit 1 + if [[ -n "${changed_files}" ]]; then + echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" + exit 1 + fi api-spec-backwards-compatible: From 5139b9807517ffe34d8c8fd4fde30c8079eeabfb Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:53:01 +0100 Subject: [PATCH 41/79] test --- services/api-server/openapi.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 29d7dda206b..58f47149f6d 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -12,15 +12,6 @@ "meta" ], "summary": "Get Service Metadata", - "operationId": "get_service_metadata", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Meta" - } } } } From 23d9e32f9a7080592ed48019d47ef8d2ec804cea Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 07:57:45 +0100 Subject: [PATCH 42/79] update api-server specs --- services/api-server/openapi.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 58f47149f6d..29d7dda206b 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -12,6 +12,15 @@ "meta" ], "summary": "Get Service Metadata", + "operationId": "get_service_metadata", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Meta" + } } } } From 6b04eeb54157d475d7383378d77f51b64ad4d7b5 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 08:04:26 +0100 Subject: [PATCH 43/79] start developing backwards compatibility check --- .github/workflows/ci-testing-deploy.yml | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index afdcb082dc8..c8e5bc2ff85 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2912,23 +2912,10 @@ jobs: version: "0.4.x" enable-cache: false cache-dependency-glob: "**/service-library/requirements/ci*.txt" - - name: checkout source branch - uses: actions/checkout@v4 - with: - path: source - - name: checkout target branch + - name: checkout uses: actions/checkout@v4 - with: - path: target - repository: ${{ github.event.pull_request.base.repo.full_name }} - ref: ${{ github.event.pull_request.base.ref }} - - name: Generate source openapi-specs + - name: Check openapi-specs backwards compatibility run: | cd source uv venv .venv && source .venv/bin/activate make openapi-specs - - name: Generate target openapi specs - run: | - cd target - uv venv .venv && source .venv/bin/activate - make openapi-specs From cb9a46d5fe785ccb280028acc5c2fc45fc3681bb Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 14:01:11 +0100 Subject: [PATCH 44/79] add script for comparing openapi specs --- ...openapi-specs-backwards-compatibility.bash | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 ci/github/helpers/openapi-specs-backwards-compatibility.bash diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash new file mode 100755 index 00000000000..cbec1d3ea29 --- /dev/null +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -0,0 +1,24 @@ +#!/bin/bash + +# Recursively checks if all openapi specs within a local osparc-simcore clone are backwards compatible with a remote clone +# Example: bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash \ +# https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master +# ./osparc-simcore/ + +base_remote=$1 +revision_local=$2 + +repo_base_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")/../../..") +openapi_specs=$(find "${revision_local}" -type f \( -name 'openapi.json' -o -name 'openapi.yaml' \) -not -path '*/.*' -exec realpath --relative-to="${revision_local}" {} \;) + +cd "${revision_local}" || exit 1 # required to mount correct dir for diff tool + +exit_status=0 +for spec in ${openapi_specs}; do + echo "Comparing ${spec}" + "${repo_base_dir}/scripts/openapi-diff.bash" breaking --fail-on ERR "${base_remote}/${spec}" "/specs/${spec}" + exit_status=$(("${exit_status}" + $?)) + printf "%0.s=" {1..100} && printf "\n" +done + +exit "${exit_status}" From ba6216ce750209c0416df598e9d59f0c8596ab02 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 14:05:44 +0100 Subject: [PATCH 45/79] add test in ci workflow --- .github/workflows/ci-testing-deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index c8e5bc2ff85..cf9c36c828a 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2916,6 +2916,6 @@ jobs: uses: actions/checkout@v4 - name: Check openapi-specs backwards compatibility run: | - cd source - uv venv .venv && source .venv/bin/activate - make openapi-specs + bash ci/github/helpers/openapi-specs-backwards-compatibility.bash \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ + . From ad1c3e21697cb472d2818d4289239a1ca2c2dfaa Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 14:14:43 +0100 Subject: [PATCH 46/79] improve docs --- ci/github/helpers/openapi-specs-backwards-compatibility.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index cbec1d3ea29..73f8d31b438 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -1,6 +1,6 @@ #!/bin/bash -# Recursively checks if all openapi specs within a local osparc-simcore clone are backwards compatible with a remote clone +# Recursively checks if all openapi specs within a local osparc-simcore revision are backwards compatible with a remote base # Example: bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash \ # https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master # ./osparc-simcore/ From 66f96b2670733bfcb84c7acbd20d7515a3c8fe7a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 15:11:19 +0100 Subject: [PATCH 47/79] ensure api servers price model is independent --- .../api/routes/credits.py | 4 ++-- .../models/schemas/backwards_compatibility.py | 20 ++++++++++++++++--- .../services/webserver.py | 6 +++--- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/services/api-server/src/simcore_service_api_server/api/routes/credits.py b/services/api-server/src/simcore_service_api_server/api/routes/credits.py index 27a82eea787..5c6fa0e9e68 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/credits.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/credits.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, status -from ...models.schemas.backwards_compatibility import GetCreditPriceApiServer +from ...models.schemas.backwards_compatibility import GetCreditPrice from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION @@ -12,7 +12,7 @@ @router.get( "/price", status_code=status.HTTP_200_OK, - response_model=GetCreditPriceApiServer, + response_model=GetCreditPrice, description=FMSG_CHANGELOG_NEW_IN_VERSION.format("0.6.0"), ) async def get_credits_price( diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py index 1dde6ff63cf..45b88029387 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py @@ -2,12 +2,16 @@ from typing import Annotated -from models_library.api_schemas_webserver.product import GetCreditPrice +from models_library.api_schemas_webserver._base import OutputSchema +from models_library.api_schemas_webserver.product import ( + GetCreditPrice as _GetCreditPrice, +) from models_library.basic_types import NonNegativeDecimal -from pydantic import Field, NonNegativeFloat, PlainSerializer +from pydantic import Field, NonNegativeFloat, NonNegativeInt, PlainSerializer -class GetCreditPriceApiServer(GetCreditPrice): +class GetCreditPrice(OutputSchema): + product_name: str usd_per_credit: Annotated[ NonNegativeDecimal, PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"), @@ -16,3 +20,13 @@ class GetCreditPriceApiServer(GetCreditPrice): description="Price of a credit in USD. " "If None, then this product's price is UNDEFINED", ) + min_payment_amount_usd: NonNegativeInt | None = Field( + ..., + description="Minimum amount (included) in USD that can be paid for this product" + "Can be None if this product's price is UNDEFINED", + ) + + +assert set(GetCreditPrice.model_fields.keys()) == set( + _GetCreditPrice.model_fields.keys() +) diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index 33e37ca0060..20ca00b9db0 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -64,7 +64,7 @@ WalletNotFoundError, ) from simcore_service_api_server.models.schemas.backwards_compatibility import ( - GetCreditPriceApiServer, + GetCreditPrice, ) from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying @@ -575,13 +575,13 @@ async def get_project_wallet(self, *, project_id: ProjectID) -> WalletGet: # PRODUCTS ------------------------------------------------- @_exception_mapper({status.HTTP_404_NOT_FOUND: ProductPriceNotFoundError}) - async def get_product_price(self) -> GetCreditPriceApiServer: + async def get_product_price(self) -> GetCreditPrice: response = await self.client.get( "/credits-price", cookies=self.session_cookies, ) response.raise_for_status() - data = Envelope[GetCreditPriceApiServer].model_validate_json(response.text).data + data = Envelope[GetCreditPrice].model_validate_json(response.text).data assert data is not None # nosec return data From 56c2f9249d26584f6f1726e175b92a89d8ccd52f Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Tue, 3 Dec 2024 15:14:03 +0100 Subject: [PATCH 48/79] update api server openapi.json --- services/api-server/openapi.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 29d7dda206b..a62cf20b918 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -5332,7 +5332,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GetCreditPriceApiServer" + "$ref": "#/components/schemas/GetCreditPrice" } } } @@ -5563,7 +5563,7 @@ ], "title": "FileUploadData" }, - "GetCreditPriceApiServer": { + "GetCreditPrice": { "properties": { "productName": { "type": "string", @@ -5602,7 +5602,7 @@ "usdPerCredit", "minPaymentAmountUsd" ], - "title": "GetCreditPriceApiServer" + "title": "GetCreditPrice" }, "Groups": { "properties": { From 80499adf16fed77d297ebb07b782a3e89a81d48b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 06:56:12 +0100 Subject: [PATCH 49/79] @sanderegg long options names for .SHELLFLAGS --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c333814d1f3..9727f2891f2 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ .DEFAULT_GOAL := help SHELL := /bin/bash -.SHELLFLAGS := -e -o pipefail -c +.SHELLFLAGS := -o errexit -o pipefail -c MAKE_C := $(MAKE) --no-print-directory --directory # Operating system @@ -579,7 +579,7 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an .PHONY: openapi-specs -openapi-specs: .env _check_venv_active ## bundles and validates openapi specifications and schemas of ALL service's API +openapi-specs: .env _check_venv_active ## generates and validates openapi specifications and schemas of ALL service's API @for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ echo "Generating openapi-specs using $${makefile}"; \ $(MAKE_C) $$(dirname $${makefile}) install-dev && $(MAKE_C) $$(dirname $${makefile}) $@; \ From f143b0cfab55f9caebd62c88becff94bc6610b25 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 06:58:33 +0100 Subject: [PATCH 50/79] remove glob from ci uv cache @sanderegg --- .github/workflows/ci-testing-deploy.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 83cfe3b822a..305fbfc66de 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2881,7 +2881,6 @@ jobs: with: version: "0.4.x" enable-cache: false - cache-dependency-glob: "**/service-library/requirements/ci*.txt" - name: checkout source branch uses: actions/checkout@v4 - name: Regenerate specs and check @@ -2911,7 +2910,6 @@ jobs: with: version: "0.4.x" enable-cache: false - cache-dependency-glob: "**/service-library/requirements/ci*.txt" - name: checkout uses: actions/checkout@v4 - name: Check openapi-specs backwards compatibility From 1cb4386c3cf48399c8e38fe336ad921bad6daa1b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 07:02:58 +0100 Subject: [PATCH 51/79] needs.changes.outputs.anything -> needs.changes.outputs.anything-py --- .github/workflows/ci-testing-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 305fbfc66de..c819c0ff6d3 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2867,7 +2867,7 @@ jobs: check-api-specs-updated: needs: [changes] - if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} + if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} timeout-minutes: 10 name: check api-specs are up to date runs-on: ubuntu-latest @@ -2896,7 +2896,7 @@ jobs: api-spec-backwards-compatible: needs: [changes] - if: ${{ needs.changes.outputs.anything == 'true' || github.event_name == 'push' }} + if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} timeout-minutes: 10 name: "api-specs-backwards-compatibility" runs-on: ubuntu-latest From f8cac9be873f0f21ad4e6c724211e37e3c4a1746 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 09:48:08 +0100 Subject: [PATCH 52/79] trigger warnings in pr --- .../helpers/openapi-specs-backwards-compatibility.bash | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index 73f8d31b438..9f8da8e3725 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -16,8 +16,10 @@ cd "${revision_local}" || exit 1 # required to mount correct dir for diff tool exit_status=0 for spec in ${openapi_specs}; do echo "Comparing ${spec}" - "${repo_base_dir}/scripts/openapi-diff.bash" breaking --fail-on ERR "${base_remote}/${spec}" "/specs/${spec}" - exit_status=$(("${exit_status}" + $?)) + if ! "${repo_base_dir}/scripts/openapi-diff.bash" breaking --fail-on ERR "${base_remote}/${spec}" "/specs/${spec}"; then + echo "::warning file=${spec}::Is not backwards compatible" + exit_status=$(("${exit_status}" + "1")) + fi printf "%0.s=" {1..100} && printf "\n" done From 5d807d987e34c5197eb619840fcf73bddd5ba747 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 10:50:05 +0100 Subject: [PATCH 53/79] update openapi.jsons after merge --- services/director-v2/openapi.json | 1462 ++--------------- services/dynamic-scheduler/openapi.json | 4 +- .../api/v0/openapi.yaml | 2 +- 3 files changed, 151 insertions(+), 1317 deletions(-) diff --git a/services/director-v2/openapi.json b/services/director-v2/openapi.json index 77322b58882..c1b38416efe 100644 --- a/services/director-v2/openapi.json +++ b/services/director-v2/openapi.json @@ -852,23 +852,22 @@ } } }, - "/v2/clusters": { - "post": { + "/v2/dynamic_scheduler/services/{node_uuid}/observation": { + "patch": { "tags": [ "dynamic scheduler" ], - "summary": "Create a new cluster for a user", - "operationId": "create_cluster_v2_clusters_post", + "summary": "Enable/disable observation of the service", + "operationId": "update_service_observation_v2_dynamic_scheduler_services__node_uuid__observation_patch", "parameters": [ { - "name": "user_id", - "in": "query", + "name": "node_uuid", + "in": "path", "required": true, "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], @@ -877,19 +876,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClusterCreate" - } - } - } - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterGet" - } + "$ref": "#/components/schemas/ObservationItem" } } } @@ -909,37 +896,35 @@ } } } - }, - "get": { + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/containers": { + "delete": { "tags": [ "dynamic scheduler" ], - "summary": "Lists clusters for user", - "operationId": "list_clusters_v2_clusters_get", + "summary": "Removes the service's user services", + "operationId": "delete_service_containers_v2_dynamic_scheduler_services__node_uuid__containers_delete", "parameters": [ { - "name": "user_id", - "in": "query", + "name": "node_uuid", + "in": "path", "required": true, "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], "responses": { - "200": { + "202": { "description": "Successful Response", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ClusterGet" - }, - "title": "Response List Clusters V2 Clusters Get" + "type": "string", + "title": "Response Delete Service Containers V2 Dynamic Scheduler Services Node Uuid Containers Delete" } } } @@ -969,24 +954,13 @@ "operationId": "get_service_state_v2_dynamic_scheduler_services__node_uuid__state_get", "parameters": [ { - "name": "cluster_id", + "name": "node_uuid", "in": "path", "required": true, "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], @@ -1012,101 +986,41 @@ } } } - }, - "patch": { + } + }, + "/v2/dynamic_scheduler/services/{node_uuid}/state:save": { + "post": { "tags": [ "dynamic scheduler" ], - "summary": "Modify a cluster for user", - "operationId": "update_cluster_v2_clusters__cluster_id__patch", + "summary": "Starts the saving of the state for the service", + "operationId": "save_service_state_v2_dynamic_scheduler_services__node_uuid__state_save_post", "parameters": [ { - "name": "cluster_id", + "name": "node_uuid", "in": "path", "required": true, "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterPatch" - } - } - } - }, "responses": { - "200": { + "202": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClusterGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "type": "string", + "title": "Response Save Service State V2 Dynamic Scheduler Services Node Uuid State Save Post" } } } - } - } - }, - "delete": { - "tags": [ - "clusters" - ], - "summary": "Remove a cluster for user", - "operationId": "delete_cluster_v2_clusters__cluster_id__delete", - "parameters": [ - { - "name": "cluster_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - } }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - } - } - ], - "responses": { - "204": { - "description": "Successful Response" + "409": { + "description": "Task already running, cannot start a new one" }, "422": { "description": "Validation Error", @@ -1121,37 +1035,40 @@ } } }, - "/v2/clusters/default/details": { - "get": { + "/v2/dynamic_scheduler/services/{node_uuid}/outputs:push": { + "post": { "tags": [ - "clusters" + "dynamic scheduler" ], - "summary": "Returns the cluster details", - "operationId": "get_default_cluster_details_v2_clusters_default_details_get", + "summary": "Starts the pushing of the outputs for the service", + "operationId": "push_service_outputs_v2_dynamic_scheduler_services__node_uuid__outputs_push_post", "parameters": [ { - "name": "user_id", - "in": "query", + "name": "node_uuid", + "in": "path", "required": true, "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], "responses": { - "200": { + "202": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClusterDetailsGet" + "type": "string", + "title": "Response Push Service Outputs V2 Dynamic Scheduler Services Node Uuid Outputs Push Post" } } } }, + "409": { + "description": "Task already running, cannot start a new one" + }, "422": { "description": "Validation Error", "content": { @@ -1165,80 +1082,39 @@ } } }, - "/v2/clusters/{cluster_id}/details": { - "get": { + "/v2/dynamic_scheduler/services/{node_uuid}/docker-resources": { + "delete": { "tags": [ - "clusters" + "dynamic scheduler" ], - "summary": "Returns the cluster details", - "operationId": "get_cluster_details_v2_clusters__cluster_id__details_get", + "summary": "Removes the service's sidecar, proxy and docker networks & volumes", + "operationId": "delete_service_docker_resources_v2_dynamic_scheduler_services__node_uuid__docker_resources_delete", "parameters": [ { - "name": "cluster_id", + "name": "node_uuid", "in": "path", "required": true, "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 + "type": "string", + "format": "uuid", + "title": "Node Uuid" } } ], "responses": { - "200": { + "202": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ClusterDetailsGet" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "type": "string", + "title": "Response Delete Service Docker Resources V2 Dynamic Scheduler Services Node Uuid Docker Resources Delete" } } } - } - } - } - }, - "/v2/clusters:ping": { - "post": { - "tags": [ - "clusters" - ], - "summary": "Test cluster connection", - "operationId": "test_cluster_connection_v2_clusters_ping_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ClusterPing" - } - } }, - "required": true - }, - "responses": { - "204": { - "description": "Successful Response" + "409": { + "description": "Task already running, cannot start a new one" }, "422": { "description": "Validation Error", @@ -1253,829 +1129,62 @@ } } }, - "/v2/clusters/default:ping": { - "post": { - "tags": [ - "clusters" - ], - "summary": "Test cluster connection", - "operationId": "test_default_cluster_connection_v2_clusters_default_ping_post", - "responses": { - "204": { - "description": "Successful Response" - } - } - } - }, - "/v2/clusters/{cluster_id}:ping": { + "/v2/dynamic_scheduler/services/{node_uuid}/disk/reserved:free": { "post": { "tags": [ - "clusters" + "dynamic scheduler" ], - "summary": "Test cluster connection", - "operationId": "test_specific_cluster_connection_v2_clusters__cluster_id__ping_post", - "parameters": [ - { - "name": "cluster_id", - "in": "path", - "required": true, - "schema": { - "type": "integer", - "minimum": 0, - "title": "Cluster Id" - } - }, - { - "name": "user_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "exclusiveMinimum": true, - "title": "User Id", - "minimum": 0 - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/observation": { - "patch": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Enable/disable observation of the service", - "operationId": "update_service_observation_v2_dynamic_scheduler_services__node_uuid__observation_patch", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ObservationItem" - } - } - } - }, - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/containers": { - "delete": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Removes the service's user services", - "operationId": "delete_service_containers_v2_dynamic_scheduler_services__node_uuid__containers_delete", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Delete Service Containers V2 Dynamic Scheduler Services Node Uuid Containers Delete" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/state": { - "get": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Returns the internals of the scheduler for the given service", - "operationId": "get_service_state_v2_dynamic_scheduler_services__node_uuid__state_get", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SchedulerData" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/state:save": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Starts the saving of the state for the service", - "operationId": "save_service_state_v2_dynamic_scheduler_services__node_uuid__state_save_post", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Save Service State V2 Dynamic Scheduler Services Node Uuid State Save Post" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/outputs:push": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Starts the pushing of the outputs for the service", - "operationId": "push_service_outputs_v2_dynamic_scheduler_services__node_uuid__outputs_push_post", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Push Service Outputs V2 Dynamic Scheduler Services Node Uuid Outputs Push Post" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/docker-resources": { - "delete": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Removes the service's sidecar, proxy and docker networks & volumes", - "operationId": "delete_service_docker_resources_v2_dynamic_scheduler_services__node_uuid__docker_resources_delete", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "string", - "title": "Response Delete Service Docker Resources V2 Dynamic Scheduler Services Node Uuid Docker Resources Delete" - } - } - } - }, - "409": { - "description": "Task already running, cannot start a new one" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v2/dynamic_scheduler/services/{node_uuid}/disk/reserved:free": { - "post": { - "tags": [ - "dynamic scheduler" - ], - "summary": "Free up reserved disk space", - "operationId": "free_reserved_disk_space_v2_dynamic_scheduler_services__node_uuid__disk_reserved_free_post", - "parameters": [ - { - "name": "node_uuid", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Node Uuid" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "BaseMeta": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "version": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", - "title": "Version" - }, - "released": { - "anyOf": [ - { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Released", - "description": "Maps every route's path tag with a released version" - } - }, - "type": "object", - "required": [ - "name", - "version" - ], - "title": "BaseMeta", - "example": { - "name": "simcore_service_foo", - "released": { - "v1": "1.3.4", - "v2": "2.4.45" - }, - "version": "2.4.45" - } - }, - "BootMode": { - "type": "string", - "enum": [ - "CPU", - "GPU", - "MPI" - ], - "title": "BootMode" - }, - "CallbacksMapping": { - "properties": { - "metrics": { - "anyOf": [ - { - "$ref": "#/components/schemas/UserServiceCommand" - }, - { - "type": "null" - } - ], - "description": "command to recover prometheus metrics from a specific user service" - }, - "before_shutdown": { - "items": { - "$ref": "#/components/schemas/UserServiceCommand" - }, - "type": "array", - "title": "Before Shutdown", - "description": "commands to run before shutting down the user servicescommands get executed first to last, multiple commands for the sameuser services are allowed" - }, - "inactivity": { - "anyOf": [ - { - "$ref": "#/components/schemas/UserServiceCommand" - }, - { - "type": "null" - } - ], - "description": "command used to figure out for how much time the user service(s) were inactive for" - } - }, - "additionalProperties": false, - "type": "object", - "title": "CallbacksMapping" - }, - "ClusterAccessRights": { - "properties": { - "read": { - "type": "boolean", - "title": "Read", - "description": "allows to run pipelines on that cluster" - }, - "write": { - "type": "boolean", - "title": "Write", - "description": "allows to modify the cluster" - }, - "delete": { - "type": "boolean", - "title": "Delete", - "description": "allows to delete a cluster" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "read", - "write", - "delete" - ], - "title": "ClusterAccessRights" - }, - "ClusterCreate": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "The human readable name of the cluster" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "type": { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - "owner": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Owner" - }, - "thumbnail": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Thumbnail", - "description": "url to the image describing this cluster" - }, - "endpoint": { - "type": "string", - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "oneOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - } - ], - "title": "Authentication", - "discriminator": { - "propertyName": "type", - "mapping": { - "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", - "kerberos": "#/components/schemas/KerberosAuthentication", - "simple": "#/components/schemas/SimpleAuthentication" - } - } - }, - "accessRights": { - "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" - }, - "type": "object", - "title": "Accessrights" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "type", - "endpoint", - "authentication" - ], - "title": "ClusterCreate" - }, - "ClusterDetailsGet": { - "properties": { - "scheduler": { - "$ref": "#/components/schemas/Scheduler", - "description": "This contains dask scheduler information given by the underlying dask library" - }, - "dashboard_link": { - "type": "string", - "minLength": 1, - "format": "uri", - "title": "Dashboard Link", - "description": "Link to this scheduler's dashboard" - } - }, - "type": "object", - "required": [ - "scheduler", - "dashboard_link" - ], - "title": "ClusterDetailsGet" - }, - "ClusterGet": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "The human readable name of the cluster" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "type": { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - "owner": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Owner", - "minimum": 0 - }, - "thumbnail": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Thumbnail", - "description": "url to the image describing this cluster" - }, - "endpoint": { - "type": "string", - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "oneOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - }, - { - "$ref": "#/components/schemas/NoAuthentication" - }, - { - "$ref": "#/components/schemas/TLSAuthentication" - } - ], - "title": "Authentication", - "description": "Dask gateway authentication", - "discriminator": { - "propertyName": "type", - "mapping": { - "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", - "kerberos": "#/components/schemas/KerberosAuthentication", - "none": "#/components/schemas/NoAuthentication", - "simple": "#/components/schemas/SimpleAuthentication", - "tls": "#/components/schemas/TLSAuthentication" - } - } - }, - "accessRights": { - "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" - }, - "type": "object", - "title": "Accessrights", - "default": {} - }, - "id": { - "type": "integer", - "minimum": 0, - "title": "Id", - "description": "The cluster ID" - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "name", - "type", - "owner", - "endpoint", - "authentication", - "id" - ], - "title": "ClusterGet" - }, - "ClusterPatch": { - "properties": { - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description" - }, - "type": { - "anyOf": [ - { - "$ref": "#/components/schemas/ClusterTypeInModel" - }, - { - "type": "null" - } - ] - }, - "owner": { - "anyOf": [ - { - "type": "integer", - "exclusiveMinimum": true, - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Owner" - }, - "thumbnail": { - "anyOf": [ - { - "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Thumbnail" - }, - "endpoint": { - "anyOf": [ - { - "type": "string", - "minLength": 1, - "format": "uri" - }, - { - "type": "null" - } - ], - "title": "Endpoint" + "summary": "Free up reserved disk space", + "operationId": "free_reserved_disk_space_v2_dynamic_scheduler_services__node_uuid__disk_reserved_free_post", + "parameters": [ + { + "name": "node_uuid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Node Uuid" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" }, - "authentication": { - "anyOf": [ - { - "oneOf": [ - { - "$ref": "#/components/schemas/SimpleAuthentication" - }, - { - "$ref": "#/components/schemas/KerberosAuthentication" - }, - { - "$ref": "#/components/schemas/JupyterHubTokenAuthentication" - } - ], - "discriminator": { - "propertyName": "type", - "mapping": { - "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", - "kerberos": "#/components/schemas/KerberosAuthentication", - "simple": "#/components/schemas/SimpleAuthentication" - } + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - }, - { - "type": "null" } - ], - "title": "Authentication" + } + } + } + } + } + }, + "components": { + "schemas": { + "BaseMeta": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$", + "title": "Version" }, - "accessRights": { + "released": { "anyOf": [ { "additionalProperties": { - "$ref": "#/components/schemas/ClusterAccessRights" + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" }, "type": "object" }, @@ -2083,23 +1192,38 @@ "type": "null" } ], - "title": "Accessrights" + "title": "Released", + "description": "Maps every route's path tag with a released version" } }, - "additionalProperties": false, "type": "object", - "title": "ClusterPatch" + "required": [ + "name", + "version" + ], + "title": "BaseMeta", + "example": { + "name": "simcore_service_foo", + "released": { + "v1": "1.3.4", + "v2": "2.4.45" + }, + "version": "2.4.45" + } + }, + "BootMode": { + "type": "string", + "enum": [ + "CPU", + "GPU", + "MPI" + ], + "title": "BootMode" }, - "ClusterPing": { + "CallbacksMapping": { "properties": { - "endpoint": { - "type": "string", - "minLength": 1, - "format": "uri", - "title": "Endpoint" - }, - "authentication": { - "oneOf": [ + "metrics": { + "anyOf": [ { "$ref": "#/components/schemas/UserServiceCommand" }, @@ -2126,36 +1250,12 @@ "type": "null" } ], - "title": "Authentication", - "description": "Dask gateway authentication", - "discriminator": { - "propertyName": "type", - "mapping": { - "jupyterhub": "#/components/schemas/JupyterHubTokenAuthentication", - "kerberos": "#/components/schemas/KerberosAuthentication", - "none": "#/components/schemas/NoAuthentication", - "simple": "#/components/schemas/SimpleAuthentication", - "tls": "#/components/schemas/TLSAuthentication" - } - } + "description": "command used to figure out for how much time the user service(s) were inactive for" } }, "additionalProperties": false, "type": "object", - "required": [ - "endpoint", - "authentication" - ], - "title": "ClusterPing" - }, - "ClusterTypeInModel": { - "type": "string", - "enum": [ - "AWS", - "ON_PREMISE", - "ON_DEMAND" - ], - "title": "ClusterTypeInModel" + "title": "CallbacksMapping" }, "ComputationCreate": { "properties": { @@ -2216,19 +1316,6 @@ "description": "if True will force re-running all dependent nodes", "default": false }, - "cluster_id": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Cluster Id", - "description": "the computation shall use the cluster described by its id, 0 is the default cluster" - }, "simcore_user_agent": { "type": "string", "title": "Simcore User Agent", @@ -2330,19 +1417,6 @@ "title": "Iteration", "description": "the iteration id of the computation task (none if no task ran yet)" }, - "cluster_id": { - "anyOf": [ - { - "type": "integer", - "minimum": 0 - }, - { - "type": "null" - } - ], - "title": "Cluster Id", - "description": "the cluster on which the computaional task runs/ran (none if no task ran yet)" - }, "started": { "anyOf": [ { @@ -2634,15 +1708,6 @@ "title": "DelayedExceptionHandler", "description": "Allows to ignore an exception for an established\nperiod of time after which it is raised.\n\nThis use case most commonly occurs when dealing with\nexternal systems.\nFor example, due to poor network performance or\nnetwork congestion, an external system which is healthy,\ncurrently is not reachable any longer.\nA possible solution:\n- ignore exceptions for an interval in which the\n system usually is reachable again by not\n raising the error\n- if the error persist give up and raise it\n\nExample code usage:\n\n delayed_handler_external_service = DelayedExceptionHandler(\n delay_for=60\n )\n try:\n function_called_periodically_accessing_external_service()\n except TargetException as e:\n delayed_handler_external_service.try_to_raise(e)\n else:\n delayed_handler_external_service.else_reset()" }, - "DictModel_str_Annotated_float__Gt__": { - "additionalProperties": { - "type": "number", - "exclusiveMinimum": true, - "minimum": 0.0 - }, - "type": "object", - "title": "DictModel[str, Annotated[float, Gt]]" - }, "DockerContainerInspect": { "properties": { "container_state": { @@ -3203,45 +2268,6 @@ } } }, - "JupyterHubTokenAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "jupyterhub" - ], - "const": "jupyterhub", - "title": "Type", - "default": "jupyterhub" - }, - "api_token": { - "type": "string", - "title": "Api Token" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "api_token" - ], - "title": "JupyterHubTokenAuthentication" - }, - "KerberosAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "kerberos" - ], - "const": "kerberos", - "title": "Type", - "default": "kerberos" - } - }, - "additionalProperties": false, - "type": "object", - "title": "KerberosAuthentication" - }, "NATRule": { "properties": { "hostname": { @@ -3291,22 +2317,6 @@ "title": "NATRule", "description": "Content of \"simcore.service.containers-allowed-outgoing-permit-list\" label" }, - "NoAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "none" - ], - "const": "none", - "title": "Type", - "default": "none" - } - }, - "additionalProperties": false, - "type": "object", - "title": "NoAuthentication" - }, "NodeState": { "properties": { "modified": { @@ -3732,34 +2742,6 @@ "title": "RunningState", "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" }, - "Scheduler": { - "properties": { - "status": { - "type": "string", - "title": "Status", - "description": "The running status of the scheduler" - }, - "workers": { - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/components/schemas/Worker" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Workers" - } - }, - "type": "object", - "required": [ - "status" - ], - "title": "Scheduler" - }, "SchedulerData": { "properties": { "paths_mapping": { @@ -4100,36 +3082,6 @@ "type": "object", "title": "ServicesInstrumentation" }, - "SimpleAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "simple" - ], - "const": "simple", - "title": "Type", - "default": "simple" - }, - "username": { - "type": "string", - "title": "Username" - }, - "password": { - "type": "string", - "format": "password", - "title": "Password", - "writeOnly": true - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "username", - "password" - ], - "title": "SimpleAuthentication" - }, "Status2": { "type": "string", "enum": [ @@ -4144,63 +3096,6 @@ "title": "Status2", "description": "String representation of the container state. Can be one of \"created\",\n\"running\", \"paused\", \"restarting\", \"removing\", \"exited\", or \"dead\"." }, - "TLSAuthentication": { - "properties": { - "type": { - "type": "string", - "enum": [ - "tls" - ], - "const": "tls", - "title": "Type", - "default": "tls" - }, - "tls_ca_file": { - "type": "string", - "format": "path", - "title": "Tls Ca File" - }, - "tls_client_cert": { - "type": "string", - "format": "path", - "title": "Tls Client Cert" - }, - "tls_client_key": { - "type": "string", - "format": "path", - "title": "Tls Client Key" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "tls_ca_file", - "tls_client_cert", - "tls_client_key" - ], - "title": "TLSAuthentication" - }, - "TaskCounts": { - "properties": { - "error": { - "type": "integer", - "title": "Error", - "default": 0 - }, - "memory": { - "type": "integer", - "title": "Memory", - "default": 0 - }, - "executing": { - "type": "integer", - "title": "Executing", - "default": 0 - } - }, - "type": "object", - "title": "TaskCounts" - }, "TaskLogFileGet": { "properties": { "task_id": { @@ -4390,67 +3285,6 @@ ], "title": "WalletInfo" }, - "Worker": { - "properties": { - "id": { - "type": "string", - "title": "Id" - }, - "name": { - "type": "string", - "title": "Name" - }, - "resources": { - "$ref": "#/components/schemas/DictModel_str_Annotated_float__Gt__" - }, - "used_resources": { - "$ref": "#/components/schemas/UsedResources" - }, - "memory_limit": { - "type": "integer", - "minimum": 0, - "title": "Memory Limit" - }, - "metrics": { - "$ref": "#/components/schemas/WorkerMetrics" - } - }, - "type": "object", - "required": [ - "id", - "name", - "resources", - "used_resources", - "memory_limit", - "metrics" - ], - "title": "Worker" - }, - "WorkerMetrics": { - "properties": { - "wallet_id": { - "type": "integer", - "minimum": 0, - "title": "Memory", - "description": "consumed memory" - }, - "wallet_name": { - "type": "string", - "title": "Wallet Name" - }, - "task_counts": { - "$ref": "#/components/schemas/TaskCounts", - "description": "task details" - } - }, - "type": "object", - "required": [ - "wallet_id", - "wallet_name", - "wallet_credit_amount" - ], - "title": "WalletInfo" - }, "_PortRange": { "properties": { "lower": { diff --git a/services/dynamic-scheduler/openapi.json b/services/dynamic-scheduler/openapi.json index add75b123d2..0b593da90d1 100644 --- a/services/dynamic-scheduler/openapi.json +++ b/services/dynamic-scheduler/openapi.json @@ -6,10 +6,10 @@ "version": "1.0.0" }, "paths": { - "/": { + "/health": { "get": { "summary": "Healthcheck", - "operationId": "healthcheck__get", + "operationId": "healthcheck_health_get", "responses": { "200": { "description": "Successful Response", diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 49278e0f128..4b3bd315a3d 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -4444,7 +4444,7 @@ paths: '403': description: ProjectInvalidRightsError '404': - description: UserDefaultWalletNotFoundError, ProjectNotFoundError + description: ProjectNotFoundError, UserDefaultWalletNotFoundError '409': description: ProjectTooManyProjectOpenedError '422': From 0be51fc69dfb3776ee46d9893d6d5cfc97fe3316 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 11:04:31 +0100 Subject: [PATCH 54/79] test check if pure warnings are displayed --- ci/github/helpers/openapi-specs-backwards-compatibility.bash | 2 -- 1 file changed, 2 deletions(-) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index 9f8da8e3725..4d9a767994d 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -22,5 +22,3 @@ for spec in ${openapi_specs}; do fi printf "%0.s=" {1..100} && printf "\n" done - -exit "${exit_status}" From 12cfc9084805dd36d4175b486401ae3c9fca6556 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 11:13:29 +0100 Subject: [PATCH 55/79] test with error message --- ci/github/helpers/openapi-specs-backwards-compatibility.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index 4d9a767994d..3b795579b49 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -17,7 +17,7 @@ exit_status=0 for spec in ${openapi_specs}; do echo "Comparing ${spec}" if ! "${repo_base_dir}/scripts/openapi-diff.bash" breaking --fail-on ERR "${base_remote}/${spec}" "/specs/${spec}"; then - echo "::warning file=${spec}::Is not backwards compatible" + echo "::error file=${spec}::${spec} is not backwards compatible with ${base_remote}/${spec}" exit_status=$(("${exit_status}" + "1")) fi printf "%0.s=" {1..100} && printf "\n" From 0da732cbee37bf9142f210f0a87e86c6a4f42068 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 11:21:40 +0100 Subject: [PATCH 56/79] try out continue on error --- .github/workflows/ci-testing-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index f401369569a..1c9725df5d2 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2752,6 +2752,7 @@ jobs: api-spec-backwards-compatible: needs: [changes] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} + continue-on-error: true timeout-minutes: 10 name: "api-specs-backwards-compatibility" runs-on: ubuntu-latest From 7033543575ae8e5af5e1117b815cbc0730935f72 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 12:07:36 +0100 Subject: [PATCH 57/79] fail in case of failures --- ci/github/helpers/openapi-specs-backwards-compatibility.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index 3b795579b49..e9976420508 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -22,3 +22,5 @@ for spec in ${openapi_specs}; do fi printf "%0.s=" {1..100} && printf "\n" done + +exit "${exit_status}" From 864d19024fe4b1f50ce17f76f52f5995f6666d9e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 13:47:52 +0100 Subject: [PATCH 58/79] improve ci script --- ...openapi-specs-backwards-compatibility.bash | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-backwards-compatibility.bash index e9976420508..a0aa803616f 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-backwards-compatibility.bash @@ -1,26 +1,47 @@ #!/bin/bash -# Recursively checks if all openapi specs within a local osparc-simcore revision are backwards compatible with a remote base -# Example: bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash \ -# https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master -# ./osparc-simcore/ +# Recursively checks if all openapi specs within a local osparc-simcore revision are different/backwards compatible with a remote base +# Example: +# bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash diff \ +# https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master \ +# ./osparc-simcore/ +# or +# bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ +# https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master \ +# ./osparc-simcore/ +# +# The script generates github error annotations for better being able to locate issues. -base_remote=$1 -revision_local=$2 +operation=$1 +base_remote=$2 +revision_local=$3 repo_base_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")/../../..") openapi_specs=$(find "${revision_local}" -type f \( -name 'openapi.json' -o -name 'openapi.yaml' \) -not -path '*/.*' -exec realpath --relative-to="${revision_local}" {} \;) cd "${revision_local}" || exit 1 # required to mount correct dir for diff tool -exit_status=0 -for spec in ${openapi_specs}; do - echo "Comparing ${spec}" - if ! "${repo_base_dir}/scripts/openapi-diff.bash" breaking --fail-on ERR "${base_remote}/${spec}" "/specs/${spec}"; then - echo "::error file=${spec}::${spec} is not backwards compatible with ${base_remote}/${spec}" - exit_status=$(("${exit_status}" + "1")) - fi - printf "%0.s=" {1..100} && printf "\n" -done - -exit "${exit_status}" + +function run_diff_tool() { + exit_status=0 + for spec in ${openapi_specs}; do + echo "Comparing ${spec}" + if ! "${repo_base_dir}/scripts/openapi-diff.bash" "$@" "${base_remote}/${spec}" "/specs/${spec}"; then + echo "::error file=${spec}:: Error when checking ${spec}" + exit_status=$(("${exit_status}" + "1")) + fi + printf "%0.s=" {1..100} && printf "\n" + done + + exit "${exit_status}" +} + + +if [[ "${operation}" == "diff" ]]; then + run_diff_tool "diff" "--fail-on-diff" +elif [[ "${operation}" == "breaking" ]]; then + run_diff_tool "breaking" "--fail-on" "ERR" +else + echo "the operation '${operation}' is not supported" + exit 1 +fi From 7779f13abab025849a02531c6d39954293fa9dd9 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 13:50:22 +0100 Subject: [PATCH 59/79] use ci script @gitHK --- .github/workflows/ci-testing-deploy.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 1c9725df5d2..c6db4544b2e 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2742,11 +2742,9 @@ jobs: run: | uv venv .venv && source .venv/bin/activate make openapi-specs - changed_files=$(git diff --name-only | awk '{$1=$1};1') - if [[ -n "${changed_files}" ]]; then - echo -e "Run 'make openapi-specs' to update the following specs: \n${changed_files}" - exit 1 - fi + ./ci/github/helpers/openapi-specs-backwards-compatibility.bash diff \ + https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/${{ github.ref }} \ + . api-spec-backwards-compatible: @@ -2770,6 +2768,6 @@ jobs: uses: actions/checkout@v4 - name: Check openapi-specs backwards compatibility run: | - bash ci/github/helpers/openapi-specs-backwards-compatibility.bash \ + ./ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ . From c32fff6e15d92a614f30e50493ad920da1e4e50c Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 13:54:52 +0100 Subject: [PATCH 60/79] add required gh workflow for api-server backwards compatibility --- .github/workflows/ci-testing-deploy.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index c6db4544b2e..22e07edb5c4 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2771,3 +2771,27 @@ jobs: ./ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ . + + api-server-backwards-compatible: + needs: [changes] + if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} + timeout-minutes: 10 + name: "api-server-backwards-compatibility" + runs-on: ubuntu-latest + steps: + - name: setup python environment + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: install uv + uses: astral-sh/setup-uv@v4 + with: + version: "0.4.x" + enable-cache: false + - name: checkout + uses: actions/checkout@v4 + - name: Check api-server backwards compatibility + run: | + ./scripts/openapi-diff.bash breaking --fail-on ERR\ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json \ + ./services/api-server/openapi.json From 306e62fe2e234bd92934aa06645f7b06458f9394 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 13:58:52 +0100 Subject: [PATCH 61/79] bugfix --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 22e07edb5c4..bf611e791bf 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2794,4 +2794,4 @@ jobs: run: | ./scripts/openapi-diff.bash breaking --fail-on ERR\ https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json \ - ./services/api-server/openapi.json + /specs/services/api-server/openapi.json From 80ec30baca37ba59f22075d3bb766a2a32313ead Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:01:06 +0100 Subject: [PATCH 62/79] @pcrespov delete empty script --- scripts/openapi-specs.bash | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 scripts/openapi-specs.bash diff --git a/scripts/openapi-specs.bash b/scripts/openapi-specs.bash deleted file mode 100644 index 17efa23ff68..00000000000 --- a/scripts/openapi-specs.bash +++ /dev/null @@ -1,4 +0,0 @@ - - -directory=$1 -echo "${directory}" From 4f42a25185c665491a81ef83a3848550b7bf9aa2 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:17:39 +0100 Subject: [PATCH 63/79] ensure ci workflows are required --- .github/workflows/ci-testing-deploy.yml | 31 +++++++++++++------------ 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index bf611e791bf..b2887d0c245 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2655,6 +2655,8 @@ jobs: system-test-environment-setup, system-test-public-api, system-test-swarm-deploy, + system-api-specs, + system-backwards-compatibility ] runs-on: ubuntu-latest steps: @@ -2720,7 +2722,7 @@ jobs: TAG_PREFIX: hotfix-staging-github run: ./ci/deploy/dockerhub-deploy.bash -n - check-api-specs-updated: + system-api-specs: needs: [changes] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} timeout-minutes: 10 @@ -2746,13 +2748,11 @@ jobs: https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/${{ github.ref }} \ . - - api-spec-backwards-compatible: + system-backwards-compatibility: needs: [changes] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} - continue-on-error: true timeout-minutes: 10 - name: "api-specs-backwards-compatibility" + name: "[sys] api-server backwards compatibility" runs-on: ubuntu-latest steps: - name: setup python environment @@ -2766,17 +2766,18 @@ jobs: enable-cache: false - name: checkout uses: actions/checkout@v4 - - name: Check openapi-specs backwards compatibility + - name: sheck api-server backwards compatibility run: | - ./ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ - . + ./scripts/openapi-diff.bash breaking --fail-on ERR\ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json \ + /specs/services/api-server/openapi.json - api-server-backwards-compatible: + api-spec-backwards-compatibility: needs: [changes] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} + continue-on-error: true timeout-minutes: 10 - name: "api-server-backwards-compatibility" + name: "api-specs-backwards-compatibility" runs-on: ubuntu-latest steps: - name: setup python environment @@ -2790,8 +2791,8 @@ jobs: enable-cache: false - name: checkout uses: actions/checkout@v4 - - name: Check api-server backwards compatibility + - name: Check openapi-specs backwards compatibility run: | - ./scripts/openapi-diff.bash breaking --fail-on ERR\ - https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json \ - /specs/services/api-server/openapi.json + ./ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ + https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ + . From 8fbcd5b437c6abe0bdcfe7627d2622dc08be3300 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:18:55 +0100 Subject: [PATCH 64/79] only run compatibility checks when specs up to date --- .github/workflows/ci-testing-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index b2887d0c245..70510846d85 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2749,7 +2749,7 @@ jobs: . system-backwards-compatibility: - needs: [changes] + needs: [changes, system-api-specs] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} timeout-minutes: 10 name: "[sys] api-server backwards compatibility" @@ -2773,7 +2773,7 @@ jobs: /specs/services/api-server/openapi.json api-spec-backwards-compatibility: - needs: [changes] + needs: [changes, system-api-specs] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} continue-on-error: true timeout-minutes: 10 From b0058f9bf0fac0a01d0d16d5a3a2b0e83baee8de Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:27:50 +0100 Subject: [PATCH 65/79] fix --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 70510846d85..0d0b29a4050 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2745,7 +2745,7 @@ jobs: uv venv .venv && source .venv/bin/activate make openapi-specs ./ci/github/helpers/openapi-specs-backwards-compatibility.bash diff \ - https://raw.githubusercontent.com/${{ github.repository }}/refs/heads/${{ github.ref }} \ + https://raw.githubusercontent.com/${{ github.event.pull_request.head.repo.full_name }}/refs/heads/${{ github.event.pull_request.head.ref }} \ . system-backwards-compatibility: From 5bc19ff853c010bf2ec3a8a23b74fd3305680b7b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:34:57 +0100 Subject: [PATCH 66/79] split make commands @pcrespov --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index feaabd80b9b..1ecccd09739 100644 --- a/Makefile +++ b/Makefile @@ -582,7 +582,8 @@ new-service: .venv ## Bakes a new project from cookiecutter-simcore-pyservice an openapi-specs: .env _check_venv_active ## generates and validates openapi specifications and schemas of ALL service's API @for makefile in $(MAKEFILES_WITH_OPENAPI_SPECS); do \ echo "Generating openapi-specs using $${makefile}"; \ - $(MAKE_C) $$(dirname $${makefile}) install-dev && $(MAKE_C) $$(dirname $${makefile}) $@; \ + $(MAKE_C) $$(dirname $${makefile}) install-dev; \ + $(MAKE_C) $$(dirname $${makefile}) $@; \ printf "%0.s=" {1..100} && printf "\n"; \ done From a09c444f48791922b098d489470c60972063832e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:39:51 +0100 Subject: [PATCH 67/79] minor fix --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 0d0b29a4050..25f03c3f8a2 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2726,7 +2726,7 @@ jobs: needs: [changes] if: ${{ needs.changes.outputs.anything-py == 'true' || github.event_name == 'push' }} timeout-minutes: 10 - name: check api-specs are up to date + name: "[sys] check api-specs are up to date" runs-on: ubuntu-latest steps: - name: setup python environment From a30635d9a90e35d51ac27565b6a7f1797e96a78c Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 14:59:02 +0100 Subject: [PATCH 68/79] update openapi specs --- services/api-server/openapi.json | 2 -- services/resource-usage-tracker/openapi.json | 2 +- .../server/src/simcore_service_webserver/api/v0/openapi.yaml | 4 ---- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 30a2331dd95..db61c23c259 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -7094,9 +7094,7 @@ "required": [ "walletId", "name", - "description", "owner", - "thumbnail", "status", "created", "modified", diff --git a/services/resource-usage-tracker/openapi.json b/services/resource-usage-tracker/openapi.json index 6aa53c7118c..dc1e068861e 100644 --- a/services/resource-usage-tracker/openapi.json +++ b/services/resource-usage-tracker/openapi.json @@ -459,7 +459,7 @@ "$ref": "#/components/schemas/UnitExtraInfo" }, "current_cost_per_unit": { - "type": "number", + "type": "string", "title": "Current Cost Per Unit" }, "current_cost_per_unit_id": { diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 6265fd8f0af..21036dafd51 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -14034,9 +14034,7 @@ components: required: - walletId - name - - description - owner - - thumbnail - status - created - modified @@ -14085,9 +14083,7 @@ components: required: - walletId - name - - description - owner - - thumbnail - status - created - modified From 8fb19142d01045a05266c85b294a52276cee30c5 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 16:12:12 +0100 Subject: [PATCH 69/79] make PricingUnitget backwards compatible --- services/api-server/openapi.json | 107 ++++++++++++------ .../api/routes/solvers_jobs_getters.py | 2 +- .../models/schemas/backwards_compatibility.py | 20 ++++ .../services/webserver.py | 6 +- .../tests/unit/test_api_solver_jobs.py | 4 +- 5 files changed, 97 insertions(+), 42 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index db61c23c259..f0cebafeda0 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -3928,7 +3928,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PricingUnitGet" + "$ref": "#/components/schemas/simcore_service_api_server__models__schemas__backwards_compatibility__PricingUnitGet" } } } @@ -6469,40 +6469,6 @@ "const": "TIER", "title": "PricingPlanClassification" }, - "PricingUnitGet": { - "properties": { - "pricingUnitId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricingunitid", - "minimum": 0 - }, - "unitName": { - "type": "string", - "title": "Unitname" - }, - "unitExtraInfo": { - "$ref": "#/components/schemas/UnitExtraInfo" - }, - "currentCostPerUnit": { - "type": "string", - "title": "Currentcostperunit" - }, - "default": { - "type": "boolean", - "title": "Default" - } - }, - "type": "object", - "required": [ - "pricingUnitId", - "unitName", - "unitExtraInfo", - "currentCostPerUnit", - "default" - ], - "title": "PricingUnitGet" - }, "Profile": { "properties": { "first_name": { @@ -6673,7 +6639,7 @@ }, "pricingUnits": { "items": { - "$ref": "#/components/schemas/PricingUnitGet" + "$ref": "#/components/schemas/models_library__api_schemas_webserver__resource_usage__PricingUnitGet" }, "type": "array", "title": "Pricingunits" @@ -7109,6 +7075,75 @@ "INACTIVE" ], "title": "WalletStatus" + }, + "models_library__api_schemas_webserver__resource_usage__PricingUnitGet": { + "properties": { + "pricingUnitId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricingunitid", + "minimum": 0 + }, + "unitName": { + "type": "string", + "title": "Unitname" + }, + "unitExtraInfo": { + "$ref": "#/components/schemas/UnitExtraInfo" + }, + "currentCostPerUnit": { + "type": "string", + "title": "Currentcostperunit" + }, + "default": { + "type": "boolean", + "title": "Default" + } + }, + "type": "object", + "required": [ + "pricingUnitId", + "unitName", + "unitExtraInfo", + "currentCostPerUnit", + "default" + ], + "title": "PricingUnitGet" + }, + "simcore_service_api_server__models__schemas__backwards_compatibility__PricingUnitGet": { + "properties": { + "pricingUnitId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricingunitid", + "minimum": 0 + }, + "unitName": { + "type": "string", + "title": "Unitname" + }, + "unitExtraInfo": { + "$ref": "#/components/schemas/UnitExtraInfo" + }, + "currentCostPerUnit": { + "type": "number", + "minimum": 0.0, + "title": "Currentcostperunit" + }, + "default": { + "type": "boolean", + "title": "Default" + } + }, + "type": "object", + "required": [ + "pricingUnitId", + "unitName", + "unitExtraInfo", + "currentCostPerUnit", + "default" + ], + "title": "PricingUnitGet" } }, "securitySchemes": { diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py index 708b9871a68..ebbb4fcdbf9 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py @@ -11,7 +11,6 @@ from fastapi.responses import RedirectResponse from fastapi_pagination.api import create_page from models_library.api_schemas_webserver.projects import ProjectGet -from models_library.api_schemas_webserver.resource_usage import PricingUnitGet from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from models_library.projects_nodes_io import BaseFileLink from models_library.users import UserID @@ -25,6 +24,7 @@ from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.basic_types import LogStreamingResponse, VersionStr from ...models.pagination import Page, PaginationParams +from ...models.schemas.backwards_compatibility import PricingUnitGet from ...models.schemas.errors import ErrorGet from ...models.schemas.files import File from ...models.schemas.jobs import ( diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py index 45b88029387..614a721553c 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py @@ -1,12 +1,17 @@ # Models added here "cover" models from within the deployment in order to restore backwards compatibility +from decimal import Decimal from typing import Annotated from models_library.api_schemas_webserver._base import OutputSchema from models_library.api_schemas_webserver.product import ( GetCreditPrice as _GetCreditPrice, ) +from models_library.api_schemas_webserver.resource_usage import ( + PricingUnitGet as _PricingUnitGet, +) from models_library.basic_types import NonNegativeDecimal +from models_library.resource_tracker import PricingUnitId, UnitExtraInfo from pydantic import Field, NonNegativeFloat, NonNegativeInt, PlainSerializer @@ -30,3 +35,18 @@ class GetCreditPrice(OutputSchema): assert set(GetCreditPrice.model_fields.keys()) == set( _GetCreditPrice.model_fields.keys() ) + + +class PricingUnitGet(OutputSchema): + pricing_unit_id: PricingUnitId + unit_name: str + unit_extra_info: UnitExtraInfo + current_cost_per_unit: Annotated[ + Decimal, PlainSerializer(float, return_type=NonNegativeFloat, when_used="json") + ] + default: bool + + +assert set(PricingUnitGet.model_fields.keys()) == set( + _PricingUnitGet.model_fields.keys() +) diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index 147fb0e3317..38c2a77b335 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -28,10 +28,7 @@ ProjectInputGet, ProjectInputUpdate, ) -from models_library.api_schemas_webserver.resource_usage import ( - PricingPlanGet, - PricingUnitGet, -) +from models_library.api_schemas_webserver.resource_usage import PricingPlanGet from models_library.api_schemas_webserver.wallets import ( WalletGet, WalletGetWithAvailableCredits, @@ -80,6 +77,7 @@ ) from ..models.basic_types import VersionStr from ..models.pagination import MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE +from ..models.schemas.backwards_compatibility import PricingUnitGet from ..models.schemas.jobs import MetaValueType from ..models.schemas.profiles import Profile, ProfileUpdate from ..models.schemas.solvers import SolverKeyId diff --git a/services/api-server/tests/unit/test_api_solver_jobs.py b/services/api-server/tests/unit/test_api_solver_jobs.py index 3f1e642a6ad..e313e806daf 100644 --- a/services/api-server/tests/unit/test_api_solver_jobs.py +++ b/services/api-server/tests/unit/test_api_solver_jobs.py @@ -14,7 +14,6 @@ from fastapi import status from fastapi.encoders import jsonable_encoder from httpx import AsyncClient -from models_library.api_schemas_webserver.resource_usage import PricingUnitGet from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from models_library.generics import Envelope from pydantic import TypeAdapter @@ -24,6 +23,9 @@ SideEffectCallback, ) from simcore_service_api_server._meta import API_VTAG +from simcore_service_api_server.models.schemas.backwards_compatibility import ( + PricingUnitGet, +) from simcore_service_api_server.models.schemas.jobs import Job, JobStatus from simcore_service_api_server.models.schemas.solvers import Solver from simcore_service_api_server.services.director_v2 import ComputationTaskGet From b7616e949aa7a4c3063c468dcf53b5820a749e8a Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 16:20:34 +0100 Subject: [PATCH 70/79] update wallet get --- .../models/schemas/backwards_compatibility.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py index 614a721553c..84a22667614 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py @@ -10,6 +10,10 @@ from models_library.api_schemas_webserver.resource_usage import ( PricingUnitGet as _PricingUnitGet, ) +from models_library.api_schemas_webserver.wallets import WalletGet +from models_library.api_schemas_webserver.wallets import ( + WalletGetWithAvailableCredits as _WalletGetWithAvailableCredits, +) from models_library.basic_types import NonNegativeDecimal from models_library.resource_tracker import PricingUnitId, UnitExtraInfo from pydantic import Field, NonNegativeFloat, NonNegativeInt, PlainSerializer @@ -50,3 +54,14 @@ class PricingUnitGet(OutputSchema): assert set(PricingUnitGet.model_fields.keys()) == set( _PricingUnitGet.model_fields.keys() ) + + +class WalletGetWithAvailableCredits(WalletGet): + available_credits: Annotated[ + Decimal, PlainSerializer(float, return_type=NonNegativeFloat, when_used="json") + ] + + +assert set(WalletGetWithAvailableCredits.model_fields.keys()) == set( + _WalletGetWithAvailableCredits.model_fields.keys() +) From 050e5851c33e5f1f3cf836d74dbf0c09ac1a3f27 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Wed, 4 Dec 2024 16:24:32 +0100 Subject: [PATCH 71/79] handle WalletGetWithAvailableCredits --- services/api-server/openapi.json | 3 ++- .../api/routes/solvers_jobs_getters.py | 6 ++++-- .../simcore_service_api_server/api/routes/wallets.py | 2 +- .../simcore_service_api_server/services/webserver.py | 10 +++++----- .../api-server/tests/unit/_with_db/test_product.py | 4 +++- services/api-server/tests/unit/test_api_solver_jobs.py | 2 +- services/api-server/tests/unit/test_api_wallets.py | 4 +++- 7 files changed, 19 insertions(+), 12 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index f0cebafeda0..42d58075705 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -7052,7 +7052,8 @@ "title": "Modified" }, "availableCredits": { - "type": "string", + "type": "number", + "minimum": 0.0, "title": "Availablecredits" } }, diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py index ebbb4fcdbf9..adbbdfced03 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py @@ -11,7 +11,6 @@ from fastapi.responses import RedirectResponse from fastapi_pagination.api import create_page from models_library.api_schemas_webserver.projects import ProjectGet -from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from models_library.projects_nodes_io import BaseFileLink from models_library.users import UserID from models_library.wallets import ZERO_CREDITS @@ -24,7 +23,10 @@ from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.basic_types import LogStreamingResponse, VersionStr from ...models.pagination import Page, PaginationParams -from ...models.schemas.backwards_compatibility import PricingUnitGet +from ...models.schemas.backwards_compatibility import ( + PricingUnitGet, + WalletGetWithAvailableCredits, +) from ...models.schemas.errors import ErrorGet from ...models.schemas.files import File from ...models.schemas.jobs import ( diff --git a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py index 0b3df66b1d5..59397d89d35 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py @@ -2,9 +2,9 @@ from typing import Annotated, Any from fastapi import APIRouter, Depends, status -from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES +from ...models.schemas.backwards_compatibility import WalletGetWithAvailableCredits from ...models.schemas.errors import ErrorGet from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index 38c2a77b335..0b0314bf7e7 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -29,10 +29,7 @@ ProjectInputUpdate, ) from models_library.api_schemas_webserver.resource_usage import PricingPlanGet -from models_library.api_schemas_webserver.wallets import ( - WalletGet, - WalletGetWithAvailableCredits, -) +from models_library.api_schemas_webserver.wallets import WalletGet from models_library.generics import Envelope from models_library.projects import ProjectID from models_library.projects_nodes_io import NodeID @@ -77,7 +74,10 @@ ) from ..models.basic_types import VersionStr from ..models.pagination import MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE -from ..models.schemas.backwards_compatibility import PricingUnitGet +from ..models.schemas.backwards_compatibility import ( + PricingUnitGet, + WalletGetWithAvailableCredits, +) from ..models.schemas.jobs import MetaValueType from ..models.schemas.profiles import Profile, ProfileUpdate from ..models.schemas.solvers import SolverKeyId diff --git a/services/api-server/tests/unit/_with_db/test_product.py b/services/api-server/tests/unit/_with_db/test_product.py index bd14faf087e..1b089e3ff6b 100644 --- a/services/api-server/tests/unit/_with_db/test_product.py +++ b/services/api-server/tests/unit/_with_db/test_product.py @@ -14,12 +14,14 @@ from fastapi import status from fastapi.encoders import jsonable_encoder from models_library.api_schemas_api_server.api_keys import ApiKeyInDB -from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from models_library.generics import Envelope from models_library.users import UserID from models_library.wallets import WalletStatus from pydantic import PositiveInt from simcore_service_api_server._meta import API_VTAG +from simcore_service_api_server.models.schemas.backwards_compatibility import ( + WalletGetWithAvailableCredits, +) async def test_product_webserver( diff --git a/services/api-server/tests/unit/test_api_solver_jobs.py b/services/api-server/tests/unit/test_api_solver_jobs.py index e313e806daf..0640c355a24 100644 --- a/services/api-server/tests/unit/test_api_solver_jobs.py +++ b/services/api-server/tests/unit/test_api_solver_jobs.py @@ -14,7 +14,6 @@ from fastapi import status from fastapi.encoders import jsonable_encoder from httpx import AsyncClient -from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from models_library.generics import Envelope from pydantic import TypeAdapter from pytest_simcore.helpers.httpx_calls_capture_models import ( @@ -25,6 +24,7 @@ from simcore_service_api_server._meta import API_VTAG from simcore_service_api_server.models.schemas.backwards_compatibility import ( PricingUnitGet, + WalletGetWithAvailableCredits, ) from simcore_service_api_server.models.schemas.jobs import Job, JobStatus from simcore_service_api_server.models.schemas.solvers import Solver diff --git a/services/api-server/tests/unit/test_api_wallets.py b/services/api-server/tests/unit/test_api_wallets.py index cad3bf5e285..f5bc27ed428 100644 --- a/services/api-server/tests/unit/test_api_wallets.py +++ b/services/api-server/tests/unit/test_api_wallets.py @@ -10,12 +10,14 @@ import pytest from fastapi import status from httpx import AsyncClient -from models_library.api_schemas_webserver.wallets import WalletGetWithAvailableCredits from pytest_simcore.helpers.httpx_calls_capture_models import ( CreateRespxMockCallback, HttpApiCallCaptureModel, ) from simcore_service_api_server._meta import API_VTAG +from simcore_service_api_server.models.schemas.backwards_compatibility import ( + WalletGetWithAvailableCredits, +) @pytest.mark.parametrize( From 597c375a7dabbf54ccb5dc50ea286574a70a8a24 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 09:02:27 +0100 Subject: [PATCH 72/79] fix pricing plan endpoint --- services/api-server/openapi.json | 108 ++++++------------ .../api/routes/solvers.py | 2 +- .../models/schemas/backwards_compatibility.py | 26 ++++- 3 files changed, 63 insertions(+), 73 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 42d58075705..2cbc0140af9 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -3928,7 +3928,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/simcore_service_api_server__models__schemas__backwards_compatibility__PricingUnitGet" + "$ref": "#/components/schemas/PricingUnitGet" } } } @@ -6469,6 +6469,41 @@ "const": "TIER", "title": "PricingPlanClassification" }, + "PricingUnitGet": { + "properties": { + "pricingUnitId": { + "type": "integer", + "exclusiveMinimum": true, + "title": "Pricingunitid", + "minimum": 0 + }, + "unitName": { + "type": "string", + "title": "Unitname" + }, + "unitExtraInfo": { + "$ref": "#/components/schemas/UnitExtraInfo" + }, + "currentCostPerUnit": { + "type": "number", + "minimum": 0.0, + "title": "Currentcostperunit" + }, + "default": { + "type": "boolean", + "title": "Default" + } + }, + "type": "object", + "required": [ + "pricingUnitId", + "unitName", + "unitExtraInfo", + "currentCostPerUnit", + "default" + ], + "title": "PricingUnitGet" + }, "Profile": { "properties": { "first_name": { @@ -6639,7 +6674,7 @@ }, "pricingUnits": { "items": { - "$ref": "#/components/schemas/models_library__api_schemas_webserver__resource_usage__PricingUnitGet" + "$ref": "#/components/schemas/PricingUnitGet" }, "type": "array", "title": "Pricingunits" @@ -7076,75 +7111,6 @@ "INACTIVE" ], "title": "WalletStatus" - }, - "models_library__api_schemas_webserver__resource_usage__PricingUnitGet": { - "properties": { - "pricingUnitId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricingunitid", - "minimum": 0 - }, - "unitName": { - "type": "string", - "title": "Unitname" - }, - "unitExtraInfo": { - "$ref": "#/components/schemas/UnitExtraInfo" - }, - "currentCostPerUnit": { - "type": "string", - "title": "Currentcostperunit" - }, - "default": { - "type": "boolean", - "title": "Default" - } - }, - "type": "object", - "required": [ - "pricingUnitId", - "unitName", - "unitExtraInfo", - "currentCostPerUnit", - "default" - ], - "title": "PricingUnitGet" - }, - "simcore_service_api_server__models__schemas__backwards_compatibility__PricingUnitGet": { - "properties": { - "pricingUnitId": { - "type": "integer", - "exclusiveMinimum": true, - "title": "Pricingunitid", - "minimum": 0 - }, - "unitName": { - "type": "string", - "title": "Unitname" - }, - "unitExtraInfo": { - "$ref": "#/components/schemas/UnitExtraInfo" - }, - "currentCostPerUnit": { - "type": "number", - "minimum": 0.0, - "title": "Currentcostperunit" - }, - "default": { - "type": "boolean", - "title": "Default" - } - }, - "type": "object", - "required": [ - "pricingUnitId", - "unitName", - "unitExtraInfo", - "currentCostPerUnit", - "default" - ], - "title": "PricingUnitGet" } }, "securitySchemes": { diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py index c172000bd9e..c876b98cf51 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py @@ -5,12 +5,12 @@ from fastapi import APIRouter, Depends, HTTPException, status from httpx import HTTPStatusError -from models_library.api_schemas_api_server.pricing_plans import ServicePricingPlanGet from pydantic import ValidationError from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.basic_types import VersionStr from ...models.pagination import OnePage, Page, PaginationParams +from ...models.schemas.backwards_compatibility import ServicePricingPlanGet from ...models.schemas.errors import ErrorGet from ...models.schemas.solvers import Solver, SolverKeyId, SolverPort from ...services.catalog import CatalogApi diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py index 84a22667614..bc52b3f3880 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py @@ -1,8 +1,12 @@ # Models added here "cover" models from within the deployment in order to restore backwards compatibility +from datetime import datetime from decimal import Decimal from typing import Annotated +from models_library.api_schemas_api_server.pricing_plans import ( + ServicePricingPlanGet as _ServicePricingPlanGet, +) from models_library.api_schemas_webserver._base import OutputSchema from models_library.api_schemas_webserver.product import ( GetCreditPrice as _GetCreditPrice, @@ -15,7 +19,12 @@ WalletGetWithAvailableCredits as _WalletGetWithAvailableCredits, ) from models_library.basic_types import NonNegativeDecimal -from models_library.resource_tracker import PricingUnitId, UnitExtraInfo +from models_library.resource_tracker import ( + PricingPlanClassification, + PricingPlanId, + PricingUnitId, + UnitExtraInfo, +) from pydantic import Field, NonNegativeFloat, NonNegativeInt, PlainSerializer @@ -65,3 +74,18 @@ class WalletGetWithAvailableCredits(WalletGet): assert set(WalletGetWithAvailableCredits.model_fields.keys()) == set( _WalletGetWithAvailableCredits.model_fields.keys() ) + + +class ServicePricingPlanGet(OutputSchema): + pricing_plan_id: PricingPlanId + display_name: str + description: str + classification: PricingPlanClassification + created_at: datetime + pricing_plan_key: str + pricing_units: list[PricingUnitGet] + + +assert set(ServicePricingPlanGet.model_fields.keys()) == set( + _ServicePricingPlanGet.model_fields.keys() +) From a60bcdf4f4212652287acd82ac2e7ce397c0cbe2 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 09:42:01 +0100 Subject: [PATCH 73/79] fix typo --- .github/workflows/ci-testing-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 25f03c3f8a2..0e4bec13b91 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2766,7 +2766,7 @@ jobs: enable-cache: false - name: checkout uses: actions/checkout@v4 - - name: sheck api-server backwards compatibility + - name: check api-server backwards compatibility run: | ./scripts/openapi-diff.bash breaking --fail-on ERR\ https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }}/services/api-server/openapi.json \ From b7e09b4bcc6dc1401be2f45d201adbe3d0b29484 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 10:06:40 +0100 Subject: [PATCH 74/79] update api specs --- services/api-server/openapi.json | 19 +- services/catalog/openapi.json | 11 +- services/director-v2/openapi.json | 37 +++- .../api/v0/openapi.yaml | 190 +++++------------- 4 files changed, 97 insertions(+), 160 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index b6d7838bc38..dae0d71da28 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -2650,6 +2650,7 @@ "type": "null" } ], + "deprecated": true, "title": "Cluster Id" }, "deprecated": true @@ -4628,6 +4629,7 @@ "type": "null" } ], + "deprecated": true, "title": "Cluster Id" }, "deprecated": true @@ -6182,11 +6184,18 @@ "title": "Version" }, "released": { - "additionalProperties": { - "type": "string", - "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" - }, - "type": "object", + "anyOf": [ + { + "additionalProperties": { + "type": "string", + "pattern": "^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){2}(-(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*)(\\.(0|[1-9]\\d*|\\d*[-a-zA-Z][-\\da-zA-Z]*))*)?(\\+[-\\da-zA-Z]+(\\.[-\\da-zA-Z-]+)*)?$" + }, + "type": "object" + }, + { + "type": "null" + } + ], "title": "Released", "description": "Maps every route's path tag with a released version" }, diff --git a/services/catalog/openapi.json b/services/catalog/openapi.json index 15f417f4f79..5f5204053cd 100644 --- a/services/catalog/openapi.json +++ b/services/catalog/openapi.json @@ -628,17 +628,11 @@ }, "image": { "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", "title": "Image", "description": "Url to the badge" }, "url": { "type": "string", - "maxLength": 2083, - "minLength": 1, - "format": "uri", "title": "Url", "description": "Link to the status" } @@ -3550,7 +3544,10 @@ "thumbnail": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" }, { "type": "null" diff --git a/services/director-v2/openapi.json b/services/director-v2/openapi.json index c1b38416efe..63418baabe5 100644 --- a/services/director-v2/openapi.json +++ b/services/director-v2/openapi.json @@ -1458,17 +1458,13 @@ }, "url": { "type": "string", - "minLength": 1, - "format": "uri", "title": "Url", "description": "the link where to get the status of the task" }, "stop_url": { "anyOf": [ { - "type": "string", - "minLength": 1, - "format": "uri" + "type": "string" }, { "type": "null" @@ -2447,6 +2443,9 @@ }, "type": "array" }, + "propertyNames": { + "format": "uuid" + }, "type": "object", "title": "Adjacency List", "description": "The adjacency list of the current pipeline in terms of {NodeID: [successor NodeID]}" @@ -2469,6 +2468,9 @@ "additionalProperties": { "$ref": "#/components/schemas/NodeState" }, + "propertyNames": { + "format": "uuid" + }, "type": "object", "title": "Node States", "description": "The states of each of the computational nodes in the pipeline" @@ -2978,9 +2980,16 @@ "description": "contains harware information so we know on which hardware to run the service" }, "product_name": { - "type": "string", + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], "title": "Product Name", - "description": "Current product upon which this service is scheduled. If set to None, the current product is undefined. Mostly for backwards compatibility" + "description": "Current product upon which this service is scheduledIf set to None, the current product is undefined. Mostly for backwards compatibility" } }, "additionalProperties": true, @@ -3000,7 +3009,8 @@ "service_resources", "request_dns", "request_scheme", - "request_simcore_user_agent" + "request_simcore_user_agent", + "proxy_service_name" ], "title": "SchedulerData" }, @@ -3106,9 +3116,7 @@ "download_link": { "anyOf": [ { - "type": "string", - "minLength": 1, - "format": "uri" + "type": "string" }, { "type": "null" @@ -3128,8 +3136,15 @@ "properties": { "nodes_outputs": { "additionalProperties": { + "propertyNames": { + "maxLength": 100, + "minLength": 1 + }, "type": "object" }, + "propertyNames": { + "format": "uuid" + }, "type": "object", "title": "Nodes Outputs" } diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 21036dafd51..7e603f42607 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -711,8 +711,6 @@ paths: in: query required: false schema: - enum: - - std const: std type: string default: std @@ -1010,9 +1008,7 @@ paths: - type: string minLength: 1 maxLength: 100 - - enum: - - current - const: current + - const: current type: string title: Product Name responses: @@ -1038,9 +1034,7 @@ paths: - type: string minLength: 1 maxLength: 100 - - enum: - - current - const: current + - const: current type: string title: Product Name - name: template_id @@ -5350,7 +5344,7 @@ paths: schema: anyOf: - $ref: '#/components/schemas/Envelope_FileUploadSchema_' - - $ref: '#/components/schemas/Envelope_Url_' + - $ref: '#/components/schemas/Envelope_AnyUrl_' title: Response Upload File delete: tags: @@ -5738,9 +5732,7 @@ paths: anyOf: - type: integer - type: string - - enum: - - HEAD - const: HEAD + - const: HEAD type: string title: Ref Id - name: project_uuid @@ -6524,7 +6516,9 @@ components: limits: $ref: '#/components/schemas/Limits' queued: - type: boolean + anyOf: + - type: boolean + - type: 'null' title: Queued type: object required: @@ -6664,16 +6658,12 @@ components: url: anyOf: - type: string - minLength: 1 - format: uri - type: 'null' title: Url description: Link to current resource diagnostics_url: anyOf: - type: string - minLength: 1 - format: uri - type: 'null' title: Diagnostics Url description: Link to diagnostics report sub-resource. This MIGHT take some @@ -6774,9 +6764,6 @@ components: thumbnail: anyOf: - type: string - maxLength: 2083 - minLength: 1 - format: uri - type: 'null' title: Thumbnail description: @@ -7067,9 +7054,6 @@ components: title: Parents Ids url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Url type: object required: @@ -7195,15 +7179,11 @@ components: task url: type: string - minLength: 1 - format: uri title: Url description: the link where to get the status of the task stop_url: anyOf: - type: string - minLength: 1 - format: uri - type: 'null' title: Stop Url description: the link where to stop the task @@ -7463,6 +7443,20 @@ components: additionalProperties: false type: object title: EmptyModel + Envelope_AnyUrl_: + properties: + data: + anyOf: + - type: string + - type: 'null' + title: Data + error: + anyOf: + - {} + - type: 'null' + title: Error + type: object + title: Envelope[AnyUrl] Envelope_AppStatusCheck_: properties: data: @@ -8133,22 +8127,6 @@ components: title: Error type: object title: Envelope[Union[WalletGet, NoneType]] - Envelope_Url_: - properties: - data: - anyOf: - - type: string - minLength: 1 - format: uri - - type: 'null' - title: Data - error: - anyOf: - - {} - - type: 'null' - title: Error - type: object - title: Envelope[Url] Envelope_UserProfile_: properties: data: @@ -8314,6 +8292,8 @@ components: type: integer exclusiveMinimum: true minimum: 0 + propertyNames: + const: comment_id type: object - type: 'null' title: Data @@ -8330,6 +8310,8 @@ components: anyOf: - additionalProperties: $ref: '#/components/schemas/Activity' + propertyNames: + format: uuid type: object - type: 'null' title: Data @@ -8346,6 +8328,8 @@ components: anyOf: - additionalProperties: $ref: '#/components/schemas/ProjectInputGet' + propertyNames: + format: uuid type: object - type: 'null' title: Data @@ -8362,6 +8346,8 @@ components: anyOf: - additionalProperties: $ref: '#/components/schemas/ProjectOutputGet' + propertyNames: + format: uuid type: object - type: 'null' title: Data @@ -9130,8 +9116,6 @@ components: file_size: anyOf: - type: integer - enum: - - -1 const: -1 - type: integer minimum: 0 @@ -9190,8 +9174,6 @@ components: properties: state: type: string - minLength: 1 - format: uri title: State type: object required: @@ -9226,13 +9208,9 @@ components: properties: abort_upload: type: string - minLength: 1 - format: uri title: Abort Upload complete_upload: type: string - minLength: 1 - format: uri title: Complete Upload type: object required: @@ -9248,8 +9226,6 @@ components: urls: items: type: string - minLength: 1 - format: uri type: array title: Urls links: @@ -9609,8 +9585,6 @@ components: thumbnail: anyOf: - type: string - minLength: 1 - format: uri - type: 'null' title: Thumbnail description: url to the group thumbnail @@ -9854,9 +9828,6 @@ components: title: Created invitationLink: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Invitationlink type: object required: @@ -10106,6 +10077,10 @@ components: thumbnail: anyOf: - type: string + - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Thumbnail description: url of the latest screenshot of the node @@ -10116,7 +10091,6 @@ components: title: Runhash description: the hex digest of the resolved inputs +outputs hash at the time when the last outputs were generated - nullable: true inputs: anyOf: - type: object @@ -10180,7 +10154,6 @@ components: - type: 'null' title: Parent description: Parent's (group-nodes') node ID s. Used to group - nullable: true position: anyOf: - $ref: '#/components/schemas/Position' @@ -10247,7 +10220,6 @@ components: title: Runhash description: the hex digest of the resolved inputs +outputs hash at the time when the last outputs were generated - nullable: true inputs: anyOf: - type: object @@ -10311,7 +10283,6 @@ components: - type: 'null' title: Parent description: Parent's (group-nodes') node ID s. Used to group - nullable: true position: anyOf: - $ref: '#/components/schemas/Position' @@ -10412,6 +10383,7 @@ components: exclusiveMinimum: true title: Serviceport description: port to access the service within the network + default: 8080 maximum: 65535 minimum: 0 serviceBasepath: @@ -10448,7 +10420,6 @@ components: - serviceKey - serviceVersion - serviceHost - - servicePort - serviceState - userId title: NodeGet @@ -10456,8 +10427,6 @@ components: properties: serviceState: type: string - enum: - - idle const: idle title: Servicestate serviceUuid: @@ -10476,8 +10445,6 @@ components: properties: serviceState: type: string - enum: - - unknown const: unknown title: Servicestate serviceUuid: @@ -10523,6 +10490,7 @@ components: inputs: type: object title: Inputs + default: {} inputsRequired: anyOf: - items: @@ -10584,15 +10552,9 @@ components: properties: thumbnail_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Thumbnail Url file_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: File Url mimetype: anyOf: @@ -10967,9 +10929,6 @@ components: title: Paymentmethodid paymentMethodFormUrl: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Paymentmethodformurl description: Link to external site that holds the payment submission form type: object @@ -11027,9 +10986,6 @@ components: invoiceUrl: anyOf: - type: string - maxLength: 2083 - minLength: 1 - format: uri - type: 'null' title: Invoiceurl type: object @@ -11085,6 +11041,8 @@ components: type: string format: uuid type: array + propertyNames: + format: uuid type: object title: Adjacency List description: 'The adjacency list of the current pipeline in terms of {NodeID: @@ -11101,6 +11059,8 @@ components: node_states: additionalProperties: $ref: '#/components/schemas/NodeState' + propertyNames: + format: uuid type: object title: Node States description: The states of each of the computational nodes in the pipeline @@ -11219,8 +11179,6 @@ components: properties: link: type: string - minLength: 1 - format: uri title: Link type: object required: @@ -11273,7 +11231,6 @@ components: type: string enum: - TIER - const: TIER title: PricingPlanClassification PricingPlanToServiceAdminGet: properties: @@ -11509,6 +11466,9 @@ components: accessRights: additionalProperties: $ref: '#/components/schemas/AccessRights' + propertyNames: + maxLength: 100 + minLength: 1 type: object title: Accessrights tags: @@ -11560,12 +11520,7 @@ components: thumbnail: anyOf: - type: string - maxLength: 2083 - minLength: 1 - format: uri - type: string - enum: - - '' const: '' title: Thumbnail creationDate: @@ -11586,6 +11541,9 @@ components: accessRights: additionalProperties: $ref: '#/components/schemas/AccessRights' + propertyNames: + maxLength: 100 + minLength: 1 type: object title: Accessrights tags: @@ -11750,9 +11708,6 @@ components: project where this iteration is run workcopy_project_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Workcopy Project Url description: reference to a working copy project type: object @@ -11785,9 +11740,6 @@ components: project where this iteration is run workcopy_project_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Workcopy Project Url description: reference to a working copy project results: @@ -11816,12 +11768,7 @@ components: thumbnail: anyOf: - type: string - maxLength: 2083 - minLength: 1 - format: uri - type: string - enum: - - '' const: '' title: Thumbnail creationDate: @@ -11842,6 +11789,9 @@ components: accessRights: additionalProperties: $ref: '#/components/schemas/AccessRights' + propertyNames: + maxLength: 100 + minLength: 1 type: object title: Accessrights tags: @@ -12039,6 +11989,9 @@ components: anyOf: - additionalProperties: $ref: '#/components/schemas/AccessRights' + propertyNames: + maxLength: 100 + minLength: 1 type: object - type: 'null' title: Accessrights @@ -12069,9 +12022,6 @@ components: properties: url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Url is_public: type: boolean @@ -12306,9 +12256,6 @@ components: title: Project Uuid url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Url type: object required: @@ -12464,6 +12411,7 @@ components: exclusiveMinimum: true title: Service Port description: the service swarm internal port + default: 8080 maximum: 65535 minimum: 0 published_port: @@ -12501,7 +12449,6 @@ components: - project_id - service_uuid - service_host - - service_port - service_state title: RunningDynamicServiceDetails RunningState: @@ -12558,9 +12505,6 @@ components: description: Long description of the service thumbnail: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Thumbnail description: Url to service thumbnail file_extensions: @@ -12571,9 +12515,6 @@ components: description: File extensions that this service can process view_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: View Url description: Redirection to open a service in osparc (see /view) type: object @@ -13005,7 +12946,6 @@ components: type: string enum: - services - const: services title: ServicesAggregatedUsagesType SimCoreFileLink: properties: @@ -13484,7 +13424,7 @@ components: - type: string format: email - type: 'null' - title: 'From ' + title: From description: Email sender to: type: string @@ -13753,8 +13693,6 @@ components: product: anyOf: - type: string - enum: - - UNDEFINED const: UNDEFINED - type: string title: Product @@ -13762,8 +13700,6 @@ components: resource_id: anyOf: - type: string - enum: - - '' const: '' - type: string title: Resource Id @@ -13771,8 +13707,6 @@ components: user_from_id: anyOf: - type: 'null' - enum: - - null - type: integer exclusiveMinimum: true minimum: 0 @@ -13819,8 +13753,6 @@ components: product: anyOf: - type: string - enum: - - UNDEFINED const: UNDEFINED - type: string title: Product @@ -13828,8 +13760,6 @@ components: resource_id: anyOf: - type: string - enum: - - '' const: '' - type: string title: Resource Id @@ -13837,8 +13767,6 @@ components: user_from_id: anyOf: - type: 'null' - enum: - - null - type: integer exclusiveMinimum: true minimum: 0 @@ -13974,9 +13902,6 @@ components: description: Identifier for the file type view_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: View Url description: Base url to execute viewer. Needs appending file_size,[file_name] and download_link as query parameters @@ -14132,9 +14057,6 @@ components: paymentFormUrl: anyOf: - type: string - maxLength: 2083 - minLength: 1 - format: uri - type: 'null' title: Paymentformurl description: Link to external site that holds the payment submission form.None @@ -14198,15 +14120,9 @@ components: default: {} url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Url checkpoint_url: type: string - maxLength: 2083 - minLength: 1 - format: uri title: Checkpoint Url type: object required: From 794cbf39297783c2f35449fce8e3b9ebaec23ebf Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 10:20:00 +0100 Subject: [PATCH 75/79] backwards_compatibility.py -> model_adapter.py --- .../src/simcore_service_api_server/api/routes/credits.py | 2 +- .../src/simcore_service_api_server/api/routes/solvers.py | 2 +- .../api/routes/solvers_jobs_getters.py | 8 ++++---- .../src/simcore_service_api_server/api/routes/wallets.py | 2 +- .../{backwards_compatibility.py => model_adapter.py} | 0 .../src/simcore_service_api_server/services/webserver.py | 9 ++------- services/api-server/tests/unit/_with_db/test_product.py | 2 +- services/api-server/tests/unit/test_api_solver_jobs.py | 4 ++-- services/api-server/tests/unit/test_api_wallets.py | 2 +- 9 files changed, 13 insertions(+), 18 deletions(-) rename services/api-server/src/simcore_service_api_server/models/schemas/{backwards_compatibility.py => model_adapter.py} (100%) diff --git a/services/api-server/src/simcore_service_api_server/api/routes/credits.py b/services/api-server/src/simcore_service_api_server/api/routes/credits.py index 5c6fa0e9e68..1f89440ab2a 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/credits.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/credits.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, status -from ...models.schemas.backwards_compatibility import GetCreditPrice +from ...models.schemas.model_adapter import GetCreditPrice from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py index b4917d2f665..bb7b0b9d414 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py @@ -10,8 +10,8 @@ from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.basic_types import VersionStr from ...models.pagination import OnePage, Page, PaginationParams -from ...models.schemas.backwards_compatibility import ServicePricingPlanGet from ...models.schemas.errors import ErrorGet +from ...models.schemas.model_adapter import ServicePricingPlanGet from ...models.schemas.solvers import Solver, SolverKeyId, SolverPort from ...services.catalog import CatalogApi from ..dependencies.application import get_reverse_url_mapper diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py index adbbdfced03..5902998ada0 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py @@ -23,10 +23,6 @@ from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.basic_types import LogStreamingResponse, VersionStr from ...models.pagination import Page, PaginationParams -from ...models.schemas.backwards_compatibility import ( - PricingUnitGet, - WalletGetWithAvailableCredits, -) from ...models.schemas.errors import ErrorGet from ...models.schemas.files import File from ...models.schemas.jobs import ( @@ -37,6 +33,10 @@ JobMetadata, JobOutputs, ) +from ...models.schemas.model_adapter import ( + PricingUnitGet, + WalletGetWithAvailableCredits, +) from ...models.schemas.solvers import SolverKeyId from ...services.catalog import CatalogApi from ...services.director_v2 import DirectorV2Api diff --git a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py index 59397d89d35..b10f8d4382f 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py @@ -4,8 +4,8 @@ from fastapi import APIRouter, Depends, status from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES -from ...models.schemas.backwards_compatibility import WalletGetWithAvailableCredits from ...models.schemas.errors import ErrorGet +from ...models.schemas.model_adapter import WalletGetWithAvailableCredits from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py b/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py similarity index 100% rename from services/api-server/src/simcore_service_api_server/models/schemas/backwards_compatibility.py rename to services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index 1b67c4a43ee..1f5c6289708 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -57,9 +57,7 @@ SolverOutputNotFoundError, WalletNotFoundError, ) -from simcore_service_api_server.models.schemas.backwards_compatibility import ( - GetCreditPrice, -) +from simcore_service_api_server.models.schemas.model_adapter import GetCreditPrice from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying from tenacity.before_sleep import before_sleep_log @@ -74,11 +72,8 @@ ) from ..models.basic_types import VersionStr from ..models.pagination import MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE -from ..models.schemas.backwards_compatibility import ( - PricingUnitGet, - WalletGetWithAvailableCredits, -) from ..models.schemas.jobs import MetaValueType +from ..models.schemas.model_adapter import PricingUnitGet, WalletGetWithAvailableCredits from ..models.schemas.profiles import Profile, ProfileUpdate from ..models.schemas.solvers import SolverKeyId from ..models.schemas.studies import StudyPort diff --git a/services/api-server/tests/unit/_with_db/test_product.py b/services/api-server/tests/unit/_with_db/test_product.py index 1b089e3ff6b..60df845989a 100644 --- a/services/api-server/tests/unit/_with_db/test_product.py +++ b/services/api-server/tests/unit/_with_db/test_product.py @@ -19,7 +19,7 @@ from models_library.wallets import WalletStatus from pydantic import PositiveInt from simcore_service_api_server._meta import API_VTAG -from simcore_service_api_server.models.schemas.backwards_compatibility import ( +from simcore_service_api_server.models.schemas.model_adapter import ( WalletGetWithAvailableCredits, ) diff --git a/services/api-server/tests/unit/test_api_solver_jobs.py b/services/api-server/tests/unit/test_api_solver_jobs.py index 0640c355a24..c1c2fe3334c 100644 --- a/services/api-server/tests/unit/test_api_solver_jobs.py +++ b/services/api-server/tests/unit/test_api_solver_jobs.py @@ -22,11 +22,11 @@ SideEffectCallback, ) from simcore_service_api_server._meta import API_VTAG -from simcore_service_api_server.models.schemas.backwards_compatibility import ( +from simcore_service_api_server.models.schemas.jobs import Job, JobStatus +from simcore_service_api_server.models.schemas.model_adapter import ( PricingUnitGet, WalletGetWithAvailableCredits, ) -from simcore_service_api_server.models.schemas.jobs import Job, JobStatus from simcore_service_api_server.models.schemas.solvers import Solver from simcore_service_api_server.services.director_v2 import ComputationTaskGet diff --git a/services/api-server/tests/unit/test_api_wallets.py b/services/api-server/tests/unit/test_api_wallets.py index f5bc27ed428..9ef1592fdf3 100644 --- a/services/api-server/tests/unit/test_api_wallets.py +++ b/services/api-server/tests/unit/test_api_wallets.py @@ -15,7 +15,7 @@ HttpApiCallCaptureModel, ) from simcore_service_api_server._meta import API_VTAG -from simcore_service_api_server.models.schemas.backwards_compatibility import ( +from simcore_service_api_server.models.schemas.model_adapter import ( WalletGetWithAvailableCredits, ) From fe310526fd34f2d4c6e20585bce169325936529e Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 11:54:24 +0100 Subject: [PATCH 76/79] change name of diff script --- .github/workflows/ci-testing-deploy.yml | 4 ++-- ...s-backwards-compatibility.bash => openapi-specs-diff.bash} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename ci/github/helpers/{openapi-specs-backwards-compatibility.bash => openapi-specs-diff.bash} (88%) diff --git a/.github/workflows/ci-testing-deploy.yml b/.github/workflows/ci-testing-deploy.yml index 0e4bec13b91..63623a2c521 100644 --- a/.github/workflows/ci-testing-deploy.yml +++ b/.github/workflows/ci-testing-deploy.yml @@ -2744,7 +2744,7 @@ jobs: run: | uv venv .venv && source .venv/bin/activate make openapi-specs - ./ci/github/helpers/openapi-specs-backwards-compatibility.bash diff \ + ./ci/github/helpers/openapi-specs-diff.bash diff \ https://raw.githubusercontent.com/${{ github.event.pull_request.head.repo.full_name }}/refs/heads/${{ github.event.pull_request.head.ref }} \ . @@ -2793,6 +2793,6 @@ jobs: uses: actions/checkout@v4 - name: Check openapi-specs backwards compatibility run: | - ./ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ + ./ci/github/helpers/openapi-specs-diff.bash breaking \ https://raw.githubusercontent.com/${{ github.event.pull_request.base.repo.full_name }}/refs/heads/${{ github.event.pull_request.base.ref }} \ . diff --git a/ci/github/helpers/openapi-specs-backwards-compatibility.bash b/ci/github/helpers/openapi-specs-diff.bash similarity index 88% rename from ci/github/helpers/openapi-specs-backwards-compatibility.bash rename to ci/github/helpers/openapi-specs-diff.bash index a0aa803616f..b4409c174a8 100755 --- a/ci/github/helpers/openapi-specs-backwards-compatibility.bash +++ b/ci/github/helpers/openapi-specs-diff.bash @@ -2,11 +2,11 @@ # Recursively checks if all openapi specs within a local osparc-simcore revision are different/backwards compatible with a remote base # Example: -# bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash diff \ +# bash osparc-simcore/ci/github/helpers/openapi-specs-diff.bash diff \ # https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master \ # ./osparc-simcore/ # or -# bash osparc-simcore/ci/github/helpers/openapi-specs-backwards-compatibility.bash breaking \ +# bash osparc-simcore/ci/github/helpers/openapi-specs-diff.bash breaking \ # https://raw.githubusercontent.com/ITISFoundation/osparc-simcore/refs/heads/master \ # ./osparc-simcore/ # From 9f209615bfeb5c7504cda4453f7cb23ae5491f06 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 14:51:21 +0100 Subject: [PATCH 77/79] move to legacy notation --- services/api-server/openapi.json | 30 ++++---- .../api/routes/credits.py | 4 +- .../api/routes/solvers.py | 4 +- .../api/routes/solvers_jobs_getters.py | 10 +-- .../api/routes/wallets.py | 6 +- .../models/schemas/model_adapter.py | 71 +++++++++++-------- .../services/webserver.py | 25 ++++--- .../tests/unit/_with_db/test_product.py | 6 +- .../tests/unit/test_api_solver_jobs.py | 10 +-- .../api-server/tests/unit/test_api_wallets.py | 8 +-- 10 files changed, 96 insertions(+), 78 deletions(-) diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index dae0d71da28..e04d4b41d32 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -1931,7 +1931,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServicePricingPlanGet" + "$ref": "#/components/schemas/ServicePricingPlanGetLegacy" } } } @@ -3790,7 +3790,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + "$ref": "#/components/schemas/WalletGetWithAvailableCreditsLegacy" } } } @@ -3929,7 +3929,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PricingUnitGet" + "$ref": "#/components/schemas/PricingUnitGetLegacy" } } } @@ -5121,7 +5121,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + "$ref": "#/components/schemas/WalletGetWithAvailableCreditsLegacy" } } } @@ -5234,7 +5234,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/WalletGetWithAvailableCredits" + "$ref": "#/components/schemas/WalletGetWithAvailableCreditsLegacy" } } } @@ -5336,7 +5336,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GetCreditPrice" + "$ref": "#/components/schemas/GetCreditPriceLegacy" } } } @@ -5565,7 +5565,7 @@ ], "title": "FileUploadData" }, - "GetCreditPrice": { + "GetCreditPriceLegacy": { "properties": { "productName": { "type": "string", @@ -5604,7 +5604,7 @@ "usdPerCredit", "minPaymentAmountUsd" ], - "title": "GetCreditPrice" + "title": "GetCreditPriceLegacy" }, "Groups": { "properties": { @@ -6473,7 +6473,7 @@ ], "title": "PricingPlanClassification" }, - "PricingUnitGet": { + "PricingUnitGetLegacy": { "properties": { "pricingUnitId": { "type": "integer", @@ -6506,7 +6506,7 @@ "currentCostPerUnit", "default" ], - "title": "PricingUnitGet" + "title": "PricingUnitGetLegacy" }, "Profile": { "properties": { @@ -6648,7 +6648,7 @@ "title": "RunningState", "description": "State of execution of a project's computational workflow\n\nSEE StateType for task state" }, - "ServicePricingPlanGet": { + "ServicePricingPlanGetLegacy": { "properties": { "pricingPlanId": { "type": "integer", @@ -6678,7 +6678,7 @@ }, "pricingUnits": { "items": { - "$ref": "#/components/schemas/PricingUnitGet" + "$ref": "#/components/schemas/PricingUnitGetLegacy" }, "type": "array", "title": "Pricingunits" @@ -6694,7 +6694,7 @@ "pricingPlanKey", "pricingUnits" ], - "title": "ServicePricingPlanGet" + "title": "ServicePricingPlanGetLegacy" }, "Solver": { "properties": { @@ -7035,7 +7035,7 @@ ], "title": "ValidationError" }, - "WalletGetWithAvailableCredits": { + "WalletGetWithAvailableCreditsLegacy": { "properties": { "walletId": { "type": "integer", @@ -7106,7 +7106,7 @@ "modified", "availableCredits" ], - "title": "WalletGetWithAvailableCredits" + "title": "WalletGetWithAvailableCreditsLegacy" }, "WalletStatus": { "type": "string", diff --git a/services/api-server/src/simcore_service_api_server/api/routes/credits.py b/services/api-server/src/simcore_service_api_server/api/routes/credits.py index 1f89440ab2a..5b5258cfb01 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/credits.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/credits.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Depends, status -from ...models.schemas.model_adapter import GetCreditPrice +from ...models.schemas.model_adapter import GetCreditPriceLegacy from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION @@ -12,7 +12,7 @@ @router.get( "/price", status_code=status.HTTP_200_OK, - response_model=GetCreditPrice, + response_model=GetCreditPriceLegacy, description=FMSG_CHANGELOG_NEW_IN_VERSION.format("0.6.0"), ) async def get_credits_price( diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py index bb7b0b9d414..c85b8b39baf 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers.py @@ -11,7 +11,7 @@ from ...models.basic_types import VersionStr from ...models.pagination import OnePage, Page, PaginationParams from ...models.schemas.errors import ErrorGet -from ...models.schemas.model_adapter import ServicePricingPlanGet +from ...models.schemas.model_adapter import ServicePricingPlanGetLegacy from ...models.schemas.solvers import Solver, SolverKeyId, SolverPort from ...services.catalog import CatalogApi from ..dependencies.application import get_reverse_url_mapper @@ -262,7 +262,7 @@ async def list_solver_ports( @router.get( "/{solver_key:path}/releases/{version}/pricing_plan", - response_model=ServicePricingPlanGet, + response_model=ServicePricingPlanGetLegacy, description="Gets solver pricing plan\n\n" + FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7"), responses=_SOLVER_STATUS_CODES, diff --git a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py index 5902998ada0..4903d1cb815 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/solvers_jobs_getters.py @@ -34,8 +34,8 @@ JobOutputs, ) from ...models.schemas.model_adapter import ( - PricingUnitGet, - WalletGetWithAvailableCredits, + PricingUnitGetLegacy, + WalletGetWithAvailableCreditsLegacy, ) from ...models.schemas.solvers import SolverKeyId from ...services.catalog import CatalogApi @@ -378,7 +378,7 @@ async def get_job_custom_metadata( @router.get( "/{solver_key:path}/releases/{version}/jobs/{job_id:uuid}/wallet", - response_model=WalletGetWithAvailableCredits, + response_model=WalletGetWithAvailableCreditsLegacy, responses=WALLET_STATUS_CODES, description=("Get job wallet\n\n" + FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7")), ) @@ -387,7 +387,7 @@ async def get_job_wallet( version: VersionStr, job_id: JobID, webserver_api: Annotated[AuthSession, Depends(get_webserver_session)], -) -> WalletGetWithAvailableCredits: +) -> WalletGetWithAvailableCreditsLegacy: job_name = _compose_job_resource_name(solver_key, version, job_id) _logger.debug("Getting wallet for job '%s'", job_name) @@ -398,7 +398,7 @@ async def get_job_wallet( @router.get( "/{solver_key:path}/releases/{version}/jobs/{job_id:uuid}/pricing_unit", - response_model=PricingUnitGet, + response_model=PricingUnitGetLegacy, responses=_PRICING_UNITS_STATUS_CODES, description=( "Get job pricing unit\n\n" + FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7") diff --git a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py index b10f8d4382f..40e2233fce0 100644 --- a/services/api-server/src/simcore_service_api_server/api/routes/wallets.py +++ b/services/api-server/src/simcore_service_api_server/api/routes/wallets.py @@ -5,7 +5,7 @@ from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES from ...models.schemas.errors import ErrorGet -from ...models.schemas.model_adapter import WalletGetWithAvailableCredits +from ...models.schemas.model_adapter import WalletGetWithAvailableCreditsLegacy from ..dependencies.webserver import AuthSession, get_webserver_session from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION @@ -29,7 +29,7 @@ @router.get( "/default", description="Get default wallet\n\n" + FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7"), - response_model=WalletGetWithAvailableCredits, + response_model=WalletGetWithAvailableCreditsLegacy, responses=WALLET_STATUS_CODES, ) async def get_default_wallet( @@ -40,7 +40,7 @@ async def get_default_wallet( @router.get( "/{wallet_id}", - response_model=WalletGetWithAvailableCredits, + response_model=WalletGetWithAvailableCreditsLegacy, responses=WALLET_STATUS_CODES, description="Get wallet\n\n" + FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7"), ) diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py b/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py index bc52b3f3880..d769d90e041 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py @@ -7,85 +7,98 @@ from models_library.api_schemas_api_server.pricing_plans import ( ServicePricingPlanGet as _ServicePricingPlanGet, ) -from models_library.api_schemas_webserver._base import OutputSchema from models_library.api_schemas_webserver.product import ( GetCreditPrice as _GetCreditPrice, ) from models_library.api_schemas_webserver.resource_usage import ( PricingUnitGet as _PricingUnitGet, ) -from models_library.api_schemas_webserver.wallets import WalletGet from models_library.api_schemas_webserver.wallets import ( WalletGetWithAvailableCredits as _WalletGetWithAvailableCredits, ) -from models_library.basic_types import NonNegativeDecimal +from models_library.basic_types import IDStr, NonNegativeDecimal from models_library.resource_tracker import ( PricingPlanClassification, PricingPlanId, PricingUnitId, UnitExtraInfo, ) -from pydantic import Field, NonNegativeFloat, NonNegativeInt, PlainSerializer - - -class GetCreditPrice(OutputSchema): - product_name: str - usd_per_credit: Annotated[ - NonNegativeDecimal, - PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"), - ] | None = Field( +from models_library.users import GroupID +from models_library.wallets import WalletID, WalletStatus +from pydantic import BaseModel, Field, NonNegativeFloat, NonNegativeInt, PlainSerializer + + +class GetCreditPriceLegacy(BaseModel): + product_name: str = Field(alias="productName") + usd_per_credit: ( + Annotated[ + NonNegativeDecimal, + PlainSerializer(float, return_type=NonNegativeFloat, when_used="json"), + ] + | None + ) = Field( ..., description="Price of a credit in USD. " "If None, then this product's price is UNDEFINED", + alias="usdPerCredit", ) min_payment_amount_usd: NonNegativeInt | None = Field( ..., description="Minimum amount (included) in USD that can be paid for this product" "Can be None if this product's price is UNDEFINED", + alias="minPaymentAmountUsd", ) -assert set(GetCreditPrice.model_fields.keys()) == set( +assert set(GetCreditPriceLegacy.model_fields.keys()) == set( _GetCreditPrice.model_fields.keys() ) -class PricingUnitGet(OutputSchema): - pricing_unit_id: PricingUnitId - unit_name: str - unit_extra_info: UnitExtraInfo +class PricingUnitGetLegacy(BaseModel): + pricing_unit_id: PricingUnitId = Field(alias="pricingUnitId") + unit_name: str = Field(alias="unitName") + unit_extra_info: UnitExtraInfo = Field(alias="unitExtraInfo") current_cost_per_unit: Annotated[ Decimal, PlainSerializer(float, return_type=NonNegativeFloat, when_used="json") - ] + ] = Field(alias="currentCostPerUnit") default: bool -assert set(PricingUnitGet.model_fields.keys()) == set( +assert set(PricingUnitGetLegacy.model_fields.keys()) == set( _PricingUnitGet.model_fields.keys() ) -class WalletGetWithAvailableCredits(WalletGet): +class WalletGetWithAvailableCreditsLegacy(BaseModel): + wallet_id: WalletID = Field(alias="walletId") + name: IDStr + description: str | None = None + owner: GroupID + thumbnail: str | None = None + status: WalletStatus + created: datetime + modified: datetime available_credits: Annotated[ Decimal, PlainSerializer(float, return_type=NonNegativeFloat, when_used="json") - ] + ] = Field(alias="availableCredits") -assert set(WalletGetWithAvailableCredits.model_fields.keys()) == set( +assert set(WalletGetWithAvailableCreditsLegacy.model_fields.keys()) == set( _WalletGetWithAvailableCredits.model_fields.keys() ) -class ServicePricingPlanGet(OutputSchema): - pricing_plan_id: PricingPlanId - display_name: str +class ServicePricingPlanGetLegacy(BaseModel): + pricing_plan_id: PricingPlanId = Field(alias="pricingPlanId") + display_name: str = Field(alias="displayName") description: str classification: PricingPlanClassification - created_at: datetime - pricing_plan_key: str - pricing_units: list[PricingUnitGet] + created_at: datetime = Field(alias="createdAt") + pricing_plan_key: str = Field(alias="pricingPlanKey") + pricing_units: list[PricingUnitGetLegacy] = Field(alias="pricingUnits") -assert set(ServicePricingPlanGet.model_fields.keys()) == set( +assert set(ServicePricingPlanGetLegacy.model_fields.keys()) == set( _ServicePricingPlanGet.model_fields.keys() ) diff --git a/services/api-server/src/simcore_service_api_server/services/webserver.py b/services/api-server/src/simcore_service_api_server/services/webserver.py index 1f5c6289708..cba31689654 100644 --- a/services/api-server/src/simcore_service_api_server/services/webserver.py +++ b/services/api-server/src/simcore_service_api_server/services/webserver.py @@ -57,7 +57,7 @@ SolverOutputNotFoundError, WalletNotFoundError, ) -from simcore_service_api_server.models.schemas.model_adapter import GetCreditPrice +from simcore_service_api_server.models.schemas.model_adapter import GetCreditPriceLegacy from tenacity import TryAgain from tenacity.asyncio import AsyncRetrying from tenacity.before_sleep import before_sleep_log @@ -73,7 +73,10 @@ from ..models.basic_types import VersionStr from ..models.pagination import MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE from ..models.schemas.jobs import MetaValueType -from ..models.schemas.model_adapter import PricingUnitGet, WalletGetWithAvailableCredits +from ..models.schemas.model_adapter import ( + PricingUnitGetLegacy, + WalletGetWithAvailableCreditsLegacy, +) from ..models.schemas.profiles import Profile, ProfileUpdate from ..models.schemas.solvers import SolverKeyId from ..models.schemas.studies import StudyPort @@ -404,14 +407,14 @@ async def update_project_metadata( @_exception_mapper({status.HTTP_404_NOT_FOUND: PricingUnitNotFoundError}) async def get_project_node_pricing_unit( self, *, project_id: UUID, node_id: UUID - ) -> PricingUnitGet: + ) -> PricingUnitGetLegacy: response = await self.client.get( f"/projects/{project_id}/nodes/{node_id}/pricing-unit", cookies=self.session_cookies, ) response.raise_for_status() - data = Envelope[PricingUnitGet].model_validate_json(response.text).data + data = Envelope[PricingUnitGetLegacy].model_validate_json(response.text).data assert data is not None # nosec return data @@ -526,14 +529,14 @@ async def update_node_outputs( # WALLETS ------------------------------------------------- @_exception_mapper(_WALLET_STATUS_MAP) - async def get_default_wallet(self) -> WalletGetWithAvailableCredits: + async def get_default_wallet(self) -> WalletGetWithAvailableCreditsLegacy: response = await self.client.get( "/wallets/default", cookies=self.session_cookies, ) response.raise_for_status() data = ( - Envelope[WalletGetWithAvailableCredits] + Envelope[WalletGetWithAvailableCreditsLegacy] .model_validate_json(response.text) .data ) @@ -541,14 +544,16 @@ async def get_default_wallet(self) -> WalletGetWithAvailableCredits: return data @_exception_mapper(_WALLET_STATUS_MAP) - async def get_wallet(self, *, wallet_id: int) -> WalletGetWithAvailableCredits: + async def get_wallet( + self, *, wallet_id: int + ) -> WalletGetWithAvailableCreditsLegacy: response = await self.client.get( f"/wallets/{wallet_id}", cookies=self.session_cookies, ) response.raise_for_status() data = ( - Envelope[WalletGetWithAvailableCredits] + Envelope[WalletGetWithAvailableCreditsLegacy] .model_validate_json(response.text) .data ) @@ -569,13 +574,13 @@ async def get_project_wallet(self, *, project_id: ProjectID) -> WalletGet: # PRODUCTS ------------------------------------------------- @_exception_mapper({status.HTTP_404_NOT_FOUND: ProductPriceNotFoundError}) - async def get_product_price(self) -> GetCreditPrice: + async def get_product_price(self) -> GetCreditPriceLegacy: response = await self.client.get( "/credits-price", cookies=self.session_cookies, ) response.raise_for_status() - data = Envelope[GetCreditPrice].model_validate_json(response.text).data + data = Envelope[GetCreditPriceLegacy].model_validate_json(response.text).data assert data is not None # nosec return data diff --git a/services/api-server/tests/unit/_with_db/test_product.py b/services/api-server/tests/unit/_with_db/test_product.py index 60df845989a..274869d094a 100644 --- a/services/api-server/tests/unit/_with_db/test_product.py +++ b/services/api-server/tests/unit/_with_db/test_product.py @@ -20,7 +20,7 @@ from pydantic import PositiveInt from simcore_service_api_server._meta import API_VTAG from simcore_service_api_server.models.schemas.model_adapter import ( - WalletGetWithAvailableCredits, + WalletGetWithAvailableCreditsLegacy, ) @@ -48,8 +48,8 @@ def _check_key_product_compatibility(request: httpx.Request, **kwargs): return httpx.Response( status.HTTP_200_OK, json=jsonable_encoder( - Envelope[WalletGetWithAvailableCredits]( - data=WalletGetWithAvailableCredits( + Envelope[WalletGetWithAvailableCreditsLegacy]( + data=WalletGetWithAvailableCreditsLegacy( wallet_id=wallet_id, name="my_wallet", description="this is my wallet", diff --git a/services/api-server/tests/unit/test_api_solver_jobs.py b/services/api-server/tests/unit/test_api_solver_jobs.py index c1c2fe3334c..4ed52877cfa 100644 --- a/services/api-server/tests/unit/test_api_solver_jobs.py +++ b/services/api-server/tests/unit/test_api_solver_jobs.py @@ -24,8 +24,8 @@ from simcore_service_api_server._meta import API_VTAG from simcore_service_api_server.models.schemas.jobs import Job, JobStatus from simcore_service_api_server.models.schemas.model_adapter import ( - PricingUnitGet, - WalletGetWithAvailableCredits, + PricingUnitGetLegacy, + WalletGetWithAvailableCreditsLegacy, ) from simcore_service_api_server.models.schemas.solvers import Solver from simcore_service_api_server.services.director_v2 import ComputationTaskGet @@ -184,7 +184,7 @@ def _get_pricing_unit_side_effect( ) if capture_file == "get_job_pricing_unit_success.json": assert response.status_code == status.HTTP_200_OK - _ = TypeAdapter(PricingUnitGet).validate_python(response.json()) + _ = TypeAdapter(PricingUnitGetLegacy).validate_python(response.json()) elif capture_file == "get_job_pricing_unit_invalid_job.json": assert response.status_code == status.HTTP_404_NOT_FOUND elif capture_file == "get_job_pricing_unit_invalid_solver.json": @@ -419,7 +419,7 @@ def _wallet_side_effect( capture: HttpApiCallCaptureModel, ): wallet = ( - TypeAdapter(Envelope[WalletGetWithAvailableCredits]) + TypeAdapter(Envelope[WalletGetWithAvailableCreditsLegacy]) .validate_python(capture.response_body) .data ) @@ -427,7 +427,7 @@ def _wallet_side_effect( wallet.available_credits = ( Decimal(10.0) if sufficient_credits else Decimal(-10.0) ) - envelope = Envelope[WalletGetWithAvailableCredits]() + envelope = Envelope[WalletGetWithAvailableCreditsLegacy]() envelope.data = wallet return jsonable_encoder(envelope) diff --git a/services/api-server/tests/unit/test_api_wallets.py b/services/api-server/tests/unit/test_api_wallets.py index 9ef1592fdf3..bf6f7167f23 100644 --- a/services/api-server/tests/unit/test_api_wallets.py +++ b/services/api-server/tests/unit/test_api_wallets.py @@ -16,7 +16,7 @@ ) from simcore_service_api_server._meta import API_VTAG from simcore_service_api_server.models.schemas.model_adapter import ( - WalletGetWithAvailableCredits, + WalletGetWithAvailableCreditsLegacy, ) @@ -54,8 +54,8 @@ def _get_wallet_side_effect( response = await client.get(f"{API_VTAG}/wallets/{wallet_id}", auth=auth) if "success" in capture: assert response.status_code == 200 - wallet: WalletGetWithAvailableCredits = ( - WalletGetWithAvailableCredits.model_validate(response.json()) + wallet: WalletGetWithAvailableCreditsLegacy = ( + WalletGetWithAvailableCreditsLegacy.model_validate(response.json()) ) assert wallet.wallet_id == wallet_id elif "failure" in capture: @@ -79,4 +79,4 @@ async def test_get_default_wallet( response = await client.get(f"{API_VTAG}/wallets/default", auth=auth) assert response.status_code == status.HTTP_200_OK - _ = WalletGetWithAvailableCredits.model_validate(response.json()) + _ = WalletGetWithAvailableCreditsLegacy.model_validate(response.json()) From 947ffd8531bb021b1c4e0d26545481fc6b10ff67 Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 15:04:18 +0100 Subject: [PATCH 78/79] update openapi specs --- .../web/server/src/simcore_service_webserver/api/v0/openapi.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 88166295726..485fb15c931 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -10033,7 +10033,6 @@ components: type: string enum: - VIP_MODEL - const: VIP_MODEL title: LicensedResourceType Limits: properties: From f7c82c29f221feeea569e027b8da45e0d325103b Mon Sep 17 00:00:00 2001 From: Mads Bisgaard Date: Thu, 5 Dec 2024 15:11:54 +0100 Subject: [PATCH 79/79] allow to populate cover models by name --- .../models/schemas/model_adapter.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py b/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py index d769d90e041..9cc8b768d45 100644 --- a/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py +++ b/services/api-server/src/simcore_service_api_server/models/schemas/model_adapter.py @@ -25,10 +25,20 @@ ) from models_library.users import GroupID from models_library.wallets import WalletID, WalletStatus -from pydantic import BaseModel, Field, NonNegativeFloat, NonNegativeInt, PlainSerializer +from pydantic import ( + BaseModel, + ConfigDict, + Field, + NonNegativeFloat, + NonNegativeInt, + PlainSerializer, +) class GetCreditPriceLegacy(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) product_name: str = Field(alias="productName") usd_per_credit: ( Annotated[ @@ -56,6 +66,9 @@ class GetCreditPriceLegacy(BaseModel): class PricingUnitGetLegacy(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) pricing_unit_id: PricingUnitId = Field(alias="pricingUnitId") unit_name: str = Field(alias="unitName") unit_extra_info: UnitExtraInfo = Field(alias="unitExtraInfo") @@ -71,6 +84,9 @@ class PricingUnitGetLegacy(BaseModel): class WalletGetWithAvailableCreditsLegacy(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) wallet_id: WalletID = Field(alias="walletId") name: IDStr description: str | None = None @@ -90,6 +106,9 @@ class WalletGetWithAvailableCreditsLegacy(BaseModel): class ServicePricingPlanGetLegacy(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) pricing_plan_id: PricingPlanId = Field(alias="pricingPlanId") display_name: str = Field(alias="displayName") description: str