Skip to content

Commit 3816628

Browse files
committed
test: fix schemathesis query parameters test
1 parent d929327 commit 3816628

31 files changed

+492
-279
lines changed

Makefile

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
AMALTHEA_JS_VERSION ?= 0.11.0
44
AMALTHEA_SESSIONS_VERSION ?= 0.0.1-new-operator-chart
5+
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
56

67
define test_apispec_up_to_date
78
$(eval $@_NAME=$(1))
89
cp "components/renku_data_services/${$@_NAME}/apispec.py" "/tmp/apispec_orig.py"
9-
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
10+
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)
1011
diff -I "^# timestamp\: " "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
1112
@RESULT=$?
1213
cp "/tmp/apispec_orig.py" "components/renku_data_services/${$@_NAME}/apispec.py"
@@ -16,29 +17,29 @@ endef
1617
all: help
1718

1819
components/renku_data_services/crc/apispec.py: components/renku_data_services/crc/api.spec.yaml
19-
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
20+
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)
2021
components/renku_data_services/storage/apispec.py: components/renku_data_services/storage/api.spec.yaml
21-
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
22+
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)
2223
components/renku_data_services/users/apispec.py: components/renku_data_services/users/api.spec.yaml
23-
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
24+
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)
2425
components/renku_data_services/project/apispec.py: components/renku_data_services/project/api.spec.yaml
25-
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
26+
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)
2627
components/renku_data_services/session/apispec.py: components/renku_data_services/session/api.spec.yaml
27-
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
28+
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)
2829
components/renku_data_services/user_preferences/apispec.py: components/renku_data_services/user_preferences/api.spec.yaml
29-
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
30+
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)
3031
components/renku_data_services/namespace/apispec.py: components/renku_data_services/namespace/api.spec.yaml
31-
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
32+
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)
3233
components/renku_data_services/secrets/apispec.py: components/renku_data_services/secrets/api.spec.yaml
33-
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
34+
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)
3435
components/renku_data_services/connected_services/apispec.py: components/renku_data_services/connected_services/api.spec.yaml
35-
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
36+
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)
3637
components/renku_data_services/repositories/apispec.py: components/renku_data_services/repositories/api.spec.yaml
37-
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
38+
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)
3839
components/renku_data_services/notebooks/apispec.py: components/renku_data_services/notebooks/api.spec.yaml
39-
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
40+
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)
4041
components/renku_data_services/platform/apispec.py: components/renku_data_services/platform/api.spec.yaml
41-
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
42+
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)
4243

4344
##@ Apispec
4445

components/renku_data_services/connected_services/api.spec.yaml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,17 @@ paths:
123123
schema:
124124
type: string
125125
- in: query
126-
name: next_url
126+
description: query parameters
127+
name: authorize_params
128+
style: form
129+
explode: true
127130
schema:
128-
description: The URL to redirect the user to once the authorization flow has been completed.
129-
type: string
131+
type: object
132+
additionalProperties: false
133+
properties:
134+
next_url:
135+
description: The URL to redirect the user to once the authorization flow has been completed.
136+
type: string
130137
responses:
131138
"302":
132139
description: The authorization URL for this OAuth2 Client.

components/renku_data_services/connected_services/apispec.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2024-06-17T17:31:13+00:00
3+
# timestamp: 2024-08-06T05:55:35+00:00
44

55
from __future__ import annotations
66

@@ -33,6 +33,20 @@ class ErrorResponse(BaseAPISpec):
3333
error: Error
3434

3535

36+
class AuthorizeParams(BaseAPISpec):
37+
model_config = ConfigDict(
38+
extra="forbid",
39+
)
40+
next_url: Optional[str] = Field(
41+
None,
42+
description="The URL to redirect the user to once the authorization flow has been completed.",
43+
)
44+
45+
46+
class Oauth2ProvidersProviderIdAuthorizeGetParametersQuery(BaseAPISpec):
47+
authorize_params: Optional[AuthorizeParams] = None
48+
49+
3650
class Provider(BaseAPISpec):
3751
model_config = ConfigDict(
3852
extra="forbid",

components/renku_data_services/connected_services/blueprints.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import renku_data_services.base_models as base_models
1212
from renku_data_services.base_api.auth import authenticate, only_admins, only_authenticated
1313
from renku_data_services.base_api.blueprint import BlueprintFactoryResponse, CustomBlueprint
14+
from renku_data_services.base_api.misc import validate_query
1415
from renku_data_services.connected_services import apispec
1516
from renku_data_services.connected_services.apispec_base import AuthorizeParams, CallbackParams
1617
from renku_data_services.connected_services.db import ConnectedServicesRepository
@@ -90,11 +91,13 @@ def authorize(self) -> BlueprintFactoryResponse:
9091

9192
@authenticate(self.authenticator)
9293
@only_authenticated
93-
async def _authorize(request: Request, user: base_models.APIUser, provider_id: str) -> HTTPResponse:
94-
params = AuthorizeParams.model_validate(dict(request.query_args))
94+
@validate_query(query=apispec.AuthorizeParams)
95+
async def _authorize(
96+
request: Request, user: base_models.APIUser, provider_id: str, query: AuthorizeParams
97+
) -> HTTPResponse:
9598
callback_url = self._get_callback_url(request)
9699
url = await self.connected_services_repo.authorize_client(
97-
provider_id=provider_id, user=user, callback_url=callback_url, next_url=params.next_url
100+
provider_id=provider_id, user=user, callback_url=callback_url, next_url=query.next_url
98101
)
99102
return redirect(to=url)
100103

components/renku_data_services/crc/api.spec.yaml

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,26 @@ paths:
1515
summary: Get all resource pool definitions
1616
parameters:
1717
- in: query
18-
name: cpu
19-
required: false
20-
description: Filter for classes that meet or exceed the number of cpu cores
18+
description: query parameters
19+
name: resource_pools_params
20+
style: form
21+
explode: true
2122
schema:
22-
$ref: "#/components/schemas/CpuFilter"
23-
- in: query
24-
name: gpu
25-
required: false
26-
description: Filter for classes that meet or exceed the number of gpus
27-
schema:
28-
$ref: "#/components/schemas/Gpu"
29-
- in: query
30-
name: memory
31-
required: false
32-
description: Filter for classes that meet or exceed the amount of memory in gigabytes
33-
schema:
34-
$ref: "#/components/schemas/MemoryFilter"
35-
- in: query
36-
name: max_storage
37-
required: false
38-
description: Filter for classes that meet or exceed the amount of max_storage in gigabytes
39-
schema:
40-
$ref: "#/components/schemas/StorageFilter"
23+
type: object
24+
additionalProperties: false
25+
properties:
26+
cpu:
27+
$ref: "#/components/schemas/CpuFilter"
28+
default: 0.0
29+
gpu:
30+
$ref: "#/components/schemas/Gpu"
31+
default: 0
32+
memory:
33+
$ref: "#/components/schemas/MemoryFilter"
34+
default: 0
35+
max_storage:
36+
$ref: "#/components/schemas/StorageFilter"
37+
default: 0
4138
responses:
4239
"200":
4340
description: The resource pool definitions
@@ -330,10 +327,15 @@ paths:
330327
type: integer
331328
- in: query
332329
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
333-
name: name
330+
name: resource_class_params
331+
style: form
332+
explode: true
334333
schema:
335-
$ref: "#/components/schemas/Name"
336-
required: false
334+
type: object
335+
additionalProperties: false
336+
properties:
337+
name:
338+
$ref: "#/components/schemas/Name"
337339
responses:
338340
"200":
339341
description: The resource class in the specific pool
@@ -719,11 +721,16 @@ paths:
719721
schema:
720722
type: string
721723
- in: query
722-
description: Filter for resource pools based on the provided name as a prefix. Omitting this parameter returns all resource pools.
723-
name: name
724+
description: Filter for resource classes based on the provided name as a prefix. Omitting this parameter returns all classes.
725+
name: user_resource_params
726+
style: form
727+
explode: true
724728
schema:
725-
$ref: "#/components/schemas/Name"
726-
required: false
729+
type: object
730+
additionalProperties: false
731+
properties:
732+
name:
733+
$ref: "#/components/schemas/Name"
727734
responses:
728735
"200":
729736
description: The resource pools that the user has access to

components/renku_data_services/crc/apispec.py

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# generated by datamodel-codegen:
22
# filename: api.spec.yaml
3-
# timestamp: 2024-07-02T12:20:59+00:00
3+
# timestamp: 2024-08-06T07:19:45+00:00
44

55
from __future__ import annotations
66

@@ -34,30 +34,6 @@ class Version(BaseAPISpec):
3434
version: str
3535

3636

37-
class CpuFilter(RootModel[float]):
38-
root: float = Field(..., description="Number of cpu cores", example=10, ge=0.0)
39-
40-
41-
class MemoryFilter(RootModel[int]):
42-
root: int = Field(
43-
...,
44-
description="Number of gigabytes of memory",
45-
example=4,
46-
ge=0,
47-
le=9223372036854775807,
48-
)
49-
50-
51-
class StorageFilter(RootModel[int]):
52-
root: int = Field(
53-
...,
54-
description="Number of gigabytes of storage",
55-
example=100,
56-
ge=0,
57-
le=9223372036854775807,
58-
)
59-
60-
6137
class IntegerIds(RootModel[List[int]]):
6238
root: List[int] = Field(..., example=[1, 3, 5], min_length=1)
6339

@@ -100,6 +76,66 @@ class ErrorResponse(BaseAPISpec):
10076
error: Error
10177

10278

79+
class ResourcePoolsParams(BaseAPISpec):
80+
model_config = ConfigDict(
81+
extra="forbid",
82+
)
83+
cpu: float = Field(0.0, description="Number of cpu cores", example=10, ge=0.0)
84+
gpu: int = Field(
85+
0, description="Number of GPUs", example=8, ge=0, le=9223372036854775807
86+
)
87+
memory: int = Field(
88+
0,
89+
description="Number of gigabytes of memory",
90+
example=4,
91+
ge=0,
92+
le=9223372036854775807,
93+
)
94+
max_storage: int = Field(
95+
0,
96+
description="Number of gigabytes of storage",
97+
example=100,
98+
ge=0,
99+
le=9223372036854775807,
100+
)
101+
102+
103+
class ResourcePoolsGetParametersQuery(BaseAPISpec):
104+
resource_pools_params: Optional[ResourcePoolsParams] = None
105+
106+
107+
class ResourceClassParams(BaseAPISpec):
108+
model_config = ConfigDict(
109+
extra="forbid",
110+
)
111+
name: Optional[str] = Field(
112+
None,
113+
description="A name for a specific resource",
114+
example="the name of a resource",
115+
min_length=5,
116+
)
117+
118+
119+
class ResourcePoolsResourcePoolIdClassesGetParametersQuery(BaseAPISpec):
120+
resource_class_params: Optional[ResourceClassParams] = None
121+
122+
123+
class UserResourceParams(BaseAPISpec):
124+
model_config = ConfigDict(
125+
extra="forbid",
126+
)
127+
name: Optional[str] = Field(
128+
None,
129+
description="A name for a specific resource",
130+
example="the name of a resource",
131+
min_length=5,
132+
)
133+
134+
135+
class UsersUserIdResourcePoolsGetParametersQuery(BaseAPISpec):
136+
user_resource_params: Optional[UserResourceParams] = None
137+
138+
103139
class PoolUserWithId(BaseAPISpec):
104140
model_config = ConfigDict(
105141
extra="forbid",

0 commit comments

Comments
 (0)