Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

AMALTHEA_JS_VERSION ?= 0.11.0
AMALTHEA_SESSIONS_VERSION ?= 0.0.1-new-operator-chart
codegen_params = --input-file-type openapi --output-model-type pydantic_v2.BaseModel --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --set-default-enum-member --openapi-scopes schemas paths parameters --set-default-enum-member --use-one-literal-as-default --use-default

define test_apispec_up_to_date
$(eval $@_NAME=$(1))
cp "components/renku_data_services/${$@_NAME}/apispec.py" "/tmp/apispec_orig.py"
poetry run datamodel-codegen --input components/renku_data_services/${$@_NAME}/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/${$@_NAME}/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.${$@_NAME}.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/${$@_NAME}/api.spec.yaml --output components/renku_data_services/${$@_NAME}/apispec.py --base-class renku_data_services.${$@_NAME}.apispec_base.BaseAPISpec $(codegen_params)
diff -I "^# timestamp\: " "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
@RESULT=$?
cp "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
Expand All @@ -16,29 +17,29 @@ endef
all: help

components/renku_data_services/crc/apispec.py: components/renku_data_services/crc/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/crc/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/crc/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.crc.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/crc/api.spec.yaml --output components/renku_data_services/crc/apispec.py --base-class renku_data_services.crc.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/storage/apispec.py: components/renku_data_services/storage/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/storage/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/storage/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.storage.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/storage/api.spec.yaml --output components/renku_data_services/storage/apispec.py --base-class renku_data_services.storage.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/users/apispec.py: components/renku_data_services/users/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/users/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/users/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.users.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/users/api.spec.yaml --output components/renku_data_services/users/apispec.py --base-class renku_data_services.users.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/project/apispec.py: components/renku_data_services/project/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/project/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/project/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.project.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/project/api.spec.yaml --output components/renku_data_services/project/apispec.py --base-class renku_data_services.project.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/session/apispec.py: components/renku_data_services/session/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/session/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/session/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.session.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/session/api.spec.yaml --output components/renku_data_services/session/apispec.py --base-class renku_data_services.session.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/user_preferences/apispec.py: components/renku_data_services/user_preferences/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/user_preferences/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/user_preferences/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.user_preferences.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/user_preferences/api.spec.yaml --output components/renku_data_services/user_preferences/apispec.py --base-class renku_data_services.user_preferences.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/namespace/apispec.py: components/renku_data_services/namespace/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/namespace/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/namespace/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.namespace.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/namespace/api.spec.yaml --output components/renku_data_services/namespace/apispec.py --base-class renku_data_services.namespace.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/secrets/apispec.py: components/renku_data_services/secrets/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/secrets/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/secrets/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.secrets.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/secrets/api.spec.yaml --output components/renku_data_services/secrets/apispec.py --base-class renku_data_services.secrets.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/connected_services/apispec.py: components/renku_data_services/connected_services/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/connected_services/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/connected_services/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.connected_services.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/connected_services/api.spec.yaml --output components/renku_data_services/connected_services/apispec.py --base-class renku_data_services.connected_services.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/repositories/apispec.py: components/renku_data_services/repositories/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/repositories/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/repositories/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.repositories.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/repositories/api.spec.yaml --output components/renku_data_services/repositories/apispec.py --base-class renku_data_services.repositories.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/notebooks/apispec.py: components/renku_data_services/notebooks/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/notebooks/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/notebooks/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.notebooks.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/notebooks/api.spec.yaml --output components/renku_data_services/notebooks/apispec.py --base-class renku_data_services.notebooks.apispec_base.BaseAPISpec $(codegen_params)
components/renku_data_services/platform/apispec.py: components/renku_data_services/platform/api.spec.yaml
poetry run datamodel-codegen --input components/renku_data_services/platform/api.spec.yaml --input-file-type openapi --output-model-type pydantic_v2.BaseModel --output components/renku_data_services/platform/apispec.py --use-double-quotes --target-python-version 3.12 --collapse-root-models --field-constraints --strict-nullable --base-class renku_data_services.platform.apispec_base.BaseAPISpec --set-default-enum-member
poetry run datamodel-codegen --input components/renku_data_services/platform/api.spec.yaml --output components/renku_data_services/platform/apispec.py --base-class renku_data_services.platform.apispec_base.BaseAPISpec $(codegen_params)

##@ Apispec

Expand Down
13 changes: 10 additions & 3 deletions components/renku_data_services/connected_services/api.spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,17 @@ paths:
schema:
type: string
- in: query
name: next_url
description: query parameters
name: authorize_params
style: form
explode: true
schema:
description: The URL to redirect the user to once the authorization flow has been completed.
type: string
type: object
additionalProperties: false
properties:
next_url:
description: The URL to redirect the user to once the authorization flow has been completed.
type: string
responses:
"302":
description: The authorization URL for this OAuth2 Client.
Expand Down
16 changes: 15 additions & 1 deletion components/renku_data_services/connected_services/apispec.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: api.spec.yaml
# timestamp: 2024-06-17T17:31:13+00:00
# timestamp: 2024-08-06T05:55:35+00:00

from __future__ import annotations

Expand Down Expand Up @@ -33,6 +33,20 @@ class ErrorResponse(BaseAPISpec):
error: Error


class AuthorizeParams(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
)
next_url: Optional[str] = Field(
None,
description="The URL to redirect the user to once the authorization flow has been completed.",
)


class Oauth2ProvidersProviderIdAuthorizeGetParametersQuery(BaseAPISpec):
authorize_params: Optional[AuthorizeParams] = None


class Provider(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import renku_data_services.base_models as base_models
from renku_data_services.base_api.auth import authenticate, only_admins, only_authenticated
from renku_data_services.base_api.blueprint import BlueprintFactoryResponse, CustomBlueprint
from renku_data_services.base_api.misc import validate_query
from renku_data_services.connected_services import apispec
from renku_data_services.connected_services.apispec_base import AuthorizeParams, CallbackParams
from renku_data_services.connected_services.db import ConnectedServicesRepository
Expand Down Expand Up @@ -90,11 +91,13 @@ def authorize(self) -> BlueprintFactoryResponse:

@authenticate(self.authenticator)
@only_authenticated
async def _authorize(request: Request, user: base_models.APIUser, provider_id: str) -> HTTPResponse:
params = AuthorizeParams.model_validate(dict(request.query_args))
@validate_query(query=apispec.AuthorizeParams)
async def _authorize(
request: Request, user: base_models.APIUser, provider_id: str, query: AuthorizeParams
) -> HTTPResponse:
callback_url = self._get_callback_url(request)
url = await self.connected_services_repo.authorize_client(
provider_id=provider_id, user=user, callback_url=callback_url, next_url=params.next_url
provider_id=provider_id, user=user, callback_url=callback_url, next_url=query.next_url
)
return redirect(to=url)

Expand Down
65 changes: 36 additions & 29 deletions components/renku_data_services/crc/api.spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,26 @@ paths:
summary: Get all resource pool definitions
parameters:
- in: query
name: cpu
required: false
description: Filter for classes that meet or exceed the number of cpu cores
description: query parameters
name: resource_pools_params
style: form
explode: true
schema:
$ref: "#/components/schemas/CpuFilter"
- in: query
name: gpu
required: false
description: Filter for classes that meet or exceed the number of gpus
schema:
$ref: "#/components/schemas/Gpu"
- in: query
name: memory
required: false
description: Filter for classes that meet or exceed the amount of memory in gigabytes
schema:
$ref: "#/components/schemas/MemoryFilter"
- in: query
name: max_storage
required: false
description: Filter for classes that meet or exceed the amount of max_storage in gigabytes
schema:
$ref: "#/components/schemas/StorageFilter"
type: object
additionalProperties: false
properties:
cpu:
$ref: "#/components/schemas/CpuFilter"
default: 0.0
gpu:
$ref: "#/components/schemas/Gpu"
default: 0
memory:
$ref: "#/components/schemas/MemoryFilter"
default: 0
max_storage:
$ref: "#/components/schemas/StorageFilter"
default: 0
responses:
"200":
description: The resource pool definitions
Expand Down Expand Up @@ -330,10 +327,15 @@ paths:
type: integer
- in: query
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
name: name
name: resource_class_params
style: form
explode: true
schema:
$ref: "#/components/schemas/Name"
required: false
type: object
additionalProperties: false
properties:
name:
$ref: "#/components/schemas/Name"
responses:
"200":
description: The resource class in the specific pool
Expand Down Expand Up @@ -719,11 +721,16 @@ paths:
schema:
type: string
- in: query
description: Filter for resource pools based on the provided name as a prefix. Omitting this parameter returns all resource pools.
name: name
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
name: user_resource_params
style: form
explode: true
schema:
$ref: "#/components/schemas/Name"
required: false
type: object
additionalProperties: false
properties:
name:
$ref: "#/components/schemas/Name"
responses:
"200":
description: The resource pools that the user has access to
Expand Down
86 changes: 61 additions & 25 deletions components/renku_data_services/crc/apispec.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: api.spec.yaml
# timestamp: 2024-07-02T12:20:59+00:00
# timestamp: 2024-08-06T07:19:45+00:00

from __future__ import annotations

Expand Down Expand Up @@ -34,30 +34,6 @@ class Version(BaseAPISpec):
version: str


class CpuFilter(RootModel[float]):
root: float = Field(..., description="Number of cpu cores", example=10, ge=0.0)


class MemoryFilter(RootModel[int]):
root: int = Field(
...,
description="Number of gigabytes of memory",
example=4,
ge=0,
le=9223372036854775807,
)


class StorageFilter(RootModel[int]):
root: int = Field(
...,
description="Number of gigabytes of storage",
example=100,
ge=0,
le=9223372036854775807,
)


class IntegerIds(RootModel[List[int]]):
root: List[int] = Field(..., example=[1, 3, 5], min_length=1)

Expand Down Expand Up @@ -100,6 +76,66 @@ class ErrorResponse(BaseAPISpec):
error: Error


class ResourcePoolsParams(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
)
cpu: float = Field(0.0, description="Number of cpu cores", example=10, ge=0.0)
gpu: int = Field(
0, description="Number of GPUs", example=8, ge=0, le=9223372036854775807
)
memory: int = Field(
0,
description="Number of gigabytes of memory",
example=4,
ge=0,
le=9223372036854775807,
)
max_storage: int = Field(
0,
description="Number of gigabytes of storage",
example=100,
ge=0,
le=9223372036854775807,
)


class ResourcePoolsGetParametersQuery(BaseAPISpec):
resource_pools_params: Optional[ResourcePoolsParams] = None


class ResourceClassParams(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
)
name: Optional[str] = Field(
None,
description="A name for a specific resource",
example="the name of a resource",
min_length=5,
)


class ResourcePoolsResourcePoolIdClassesGetParametersQuery(BaseAPISpec):
resource_class_params: Optional[ResourceClassParams] = None


class UserResourceParams(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
)
name: Optional[str] = Field(
None,
description="A name for a specific resource",
example="the name of a resource",
min_length=5,
)


class UsersUserIdResourcePoolsGetParametersQuery(BaseAPISpec):
user_resource_params: Optional[UserResourceParams] = None


class PoolUserWithId(BaseAPISpec):
model_config = ConfigDict(
extra="forbid",
Expand Down
Loading