Skip to content

Commit cf5546b

Browse files
giancarloromeosanderegg
authored andcommitted
Upgrade resource usage tracker (Pydantic v2) (#6517)
1 parent 64293f0 commit cf5546b

30 files changed

+259
-184
lines changed

packages/models-library/src/models_library/api_schemas_resource_usage_tracker/credit_transactions.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from datetime import datetime
22
from decimal import Decimal
3+
from typing import Annotated
34

4-
from pydantic import BaseModel, field_validator
5+
from pydantic import BaseModel, BeforeValidator, PlainSerializer
56

67
from ..products import ProductName
78
from ..resource_tracker import CreditTransactionId
@@ -11,12 +12,11 @@
1112

1213
class WalletTotalCredits(BaseModel):
1314
wallet_id: WalletID
14-
available_osparc_credits: Decimal
15-
16-
@field_validator("available_osparc_credits")
17-
@classmethod
18-
def ensure_rounded(cls, v):
19-
return round(v, 2)
15+
available_osparc_credits: Annotated[
16+
Decimal,
17+
BeforeValidator(lambda x: round(x, 2)),
18+
PlainSerializer(float, return_type=float, when_used="json"),
19+
]
2020

2121

2222
class CreditTransactionCreateBody(BaseModel):

packages/models-library/src/models_library/api_schemas_resource_usage_tracker/pricing_plans.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from datetime import datetime
22
from decimal import Decimal
3+
from typing import Annotated
34

4-
from pydantic import BaseModel, ConfigDict
5+
from pydantic import BaseModel, ConfigDict, PlainSerializer
56

67
from ..resource_tracker import (
78
HardwareInfo,
@@ -18,7 +19,9 @@ class PricingUnitGet(BaseModel):
1819
pricing_unit_id: PricingUnitId
1920
unit_name: str
2021
unit_extra_info: UnitExtraInfo
21-
current_cost_per_unit: Decimal
22+
current_cost_per_unit: Annotated[
23+
Decimal, PlainSerializer(float, return_type=float, when_used="json")
24+
]
2225
current_cost_per_unit_id: PricingUnitCostId
2326
default: bool
2427
specific_info: HardwareInfo

packages/settings-library/src/settings_library/base.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from common_library.pydantic_fields_extension import get_type, is_literal, is_nullable
66
from pydantic import ValidationInfo, field_validator
77
from pydantic.fields import FieldInfo
8-
from pydantic_core import PydanticUndefined, ValidationError
8+
from pydantic_core import ValidationError
99
from pydantic_settings import BaseSettings, SettingsConfigDict
1010

1111
_logger = logging.getLogger(__name__)
@@ -102,9 +102,6 @@ def __pydantic_init_subclass__(cls, **kwargs: Any):
102102
and issubclass(field_type, BaseCustomSettings)
103103
):
104104
if auto_default_from_env:
105-
assert field.default is PydanticUndefined
106-
assert field.default_factory is None
107-
108105
# Transform it into something like `Field(default_factory=create_settings_from_env(field))`
109106
field.default_factory = _create_settings_from_env(name, field)
110107
field.default = None

services/resource-usage-tracker/openapi.json

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,24 @@
5454
"operationId": "get_credit_transactions_sum_v1_credit_transactions_credits_sum_post",
5555
"parameters": [
5656
{
57+
"name": "product_name",
58+
"in": "query",
5759
"required": true,
5860
"schema": {
5961
"type": "string",
6062
"title": "Product Name"
61-
},
62-
"name": "product_name",
63-
"in": "query"
63+
}
6464
},
6565
{
66+
"name": "wallet_id",
67+
"in": "query",
6668
"required": true,
6769
"schema": {
6870
"type": "integer",
6971
"exclusiveMinimum": true,
7072
"title": "Wallet Id",
7173
"minimum": 0
72-
},
73-
"name": "wallet_id",
74-
"in": "query"
74+
}
7575
}
7676
],
7777
"responses": {
@@ -149,33 +149,33 @@
149149
"operationId": "get_service_default_pricing_plan",
150150
"parameters": [
151151
{
152+
"name": "service_key",
153+
"in": "path",
152154
"required": true,
153155
"schema": {
154156
"type": "string",
155157
"pattern": "^simcore/services/((comp|dynamic|frontend))/([a-z0-9][a-z0-9_.-]*/)*([a-z0-9-_]+[a-z0-9])$",
156158
"title": "Service Key"
157-
},
158-
"name": "service_key",
159-
"in": "path"
159+
}
160160
},
161161
{
162+
"name": "service_version",
163+
"in": "path",
162164
"required": true,
163165
"schema": {
164166
"type": "string",
165167
"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-]+)*)?$",
166168
"title": "Service Version"
167-
},
168-
"name": "service_version",
169-
"in": "path"
169+
}
170170
},
171171
{
172+
"name": "product_name",
173+
"in": "query",
172174
"required": true,
173175
"schema": {
174176
"type": "string",
175177
"title": "Product Name"
176-
},
177-
"name": "product_name",
178-
"in": "query"
178+
}
179179
}
180180
],
181181
"responses": {
@@ -212,35 +212,35 @@
212212
"operationId": "list_service_pricing_plans",
213213
"parameters": [
214214
{
215+
"name": "pricing_plan_id",
216+
"in": "path",
215217
"required": true,
216218
"schema": {
217219
"type": "integer",
218220
"exclusiveMinimum": true,
219221
"title": "Pricing Plan Id",
220222
"minimum": 0
221-
},
222-
"name": "pricing_plan_id",
223-
"in": "path"
223+
}
224224
},
225225
{
226+
"name": "pricing_unit_id",
227+
"in": "path",
226228
"required": true,
227229
"schema": {
228230
"type": "integer",
229231
"exclusiveMinimum": true,
230232
"title": "Pricing Unit Id",
231233
"minimum": 0
232-
},
233-
"name": "pricing_unit_id",
234-
"in": "path"
234+
}
235235
},
236236
{
237+
"name": "product_name",
238+
"in": "query",
237239
"required": true,
238240
"schema": {
239241
"type": "string",
240242
"title": "Product Name"
241-
},
242-
"name": "product_name",
243-
"in": "query"
243+
}
244244
}
245245
],
246246
"responses": {
@@ -297,7 +297,14 @@
297297
"title": "User Email"
298298
},
299299
"osparc_credits": {
300-
"type": "number",
300+
"anyOf": [
301+
{
302+
"type": "number"
303+
},
304+
{
305+
"type": "string"
306+
}
307+
],
301308
"title": "Osparc Credits"
302309
},
303310
"payment_transaction_id": {
@@ -373,8 +380,8 @@
373380
"enum": [
374381
"TIER"
375382
],
376-
"title": "PricingPlanClassification",
377-
"description": "An enumeration."
383+
"const": "TIER",
384+
"title": "PricingPlanClassification"
378385
},
379386
"PricingPlanGet": {
380387
"properties": {
@@ -405,10 +412,17 @@
405412
"title": "Pricing Plan Key"
406413
},
407414
"pricing_units": {
408-
"items": {
409-
"$ref": "#/components/schemas/PricingUnitGet"
410-
},
411-
"type": "array",
415+
"anyOf": [
416+
{
417+
"items": {
418+
"$ref": "#/components/schemas/PricingUnitGet"
419+
},
420+
"type": "array"
421+
},
422+
{
423+
"type": "null"
424+
}
425+
],
412426
"title": "Pricing Units"
413427
},
414428
"is_active": {
@@ -424,6 +438,7 @@
424438
"classification",
425439
"created_at",
426440
"pricing_plan_key",
441+
"pricing_units",
427442
"is_active"
428443
],
429444
"title": "PricingPlanGet"
@@ -482,13 +497,16 @@
482497
},
483498
"RAM": {
484499
"type": "integer",
500+
"minimum": 0,
485501
"title": "Ram"
486502
},
487503
"VRAM": {
488504
"type": "integer",
505+
"minimum": 0,
489506
"title": "Vram"
490507
}
491508
},
509+
"additionalProperties": true,
492510
"type": "object",
493511
"required": [
494512
"CPU",

services/resource-usage-tracker/requirements/_base.txt

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ aiosignal==1.3.1
5050
# via aiohttp
5151
alembic==1.13.1
5252
# via -r requirements/../../../packages/postgres-database/requirements/_base.in
53+
annotated-types==0.7.0
54+
# via pydantic
5355
anyio==4.3.0
5456
# via
5557
# fast-depends
@@ -128,21 +130,8 @@ email-validator==2.1.1
128130
# via pydantic
129131
fast-depends==2.4.2
130132
# via faststream
131-
fastapi==0.99.1
133+
fastapi==0.115.0
132134
# via
133-
# -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
134-
# -c requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
135-
# -c requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
136-
# -c requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt
137-
# -c requirements/../../../packages/aws-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
138-
# -c requirements/../../../packages/aws-library/requirements/../../../requirements/constraints.txt
139-
# -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
140-
# -c requirements/../../../packages/postgres-database/requirements/../../../requirements/constraints.txt
141-
# -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
142-
# -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
143-
# -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt
144-
# -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
145-
# -c requirements/../../../requirements/constraints.txt
146135
# -r requirements/../../../packages/service-library/requirements/_fastapi.in
147136
# -r requirements/_base.in
148137
# prometheus-fastapi-instrumentator
@@ -353,7 +342,7 @@ psutil==6.0.0
353342
# -r requirements/../../../packages/service-library/requirements/_base.in
354343
psycopg2-binary==2.9.9
355344
# via sqlalchemy
356-
pydantic==1.10.14
345+
pydantic==2.9.2
357346
# via
358347
# -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
359348
# -c requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
@@ -365,7 +354,6 @@ pydantic==1.10.14
365354
# -c requirements/../../../packages/postgres-database/requirements/../../../requirements/constraints.txt
366355
# -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
367356
# -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
368-
# -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
369357
# -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt
370358
# -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
371359
# -c requirements/../../../requirements/constraints.txt
@@ -383,6 +371,26 @@ pydantic==1.10.14
383371
# -r requirements/../../../packages/settings-library/requirements/_base.in
384372
# fast-depends
385373
# fastapi
374+
# pydantic-extra-types
375+
# pydantic-settings
376+
pydantic-core==2.23.4
377+
# via pydantic
378+
pydantic-extra-types==2.9.0
379+
# via
380+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/_base.in
381+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
382+
# -r requirements/../../../packages/models-library/requirements/_base.in
383+
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
384+
pydantic-settings==2.5.2
385+
# via
386+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/_base.in
387+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
388+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
389+
# -r requirements/../../../packages/aws-library/requirements/../../../packages/settings-library/requirements/_base.in
390+
# -r requirements/../../../packages/models-library/requirements/_base.in
391+
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
392+
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
393+
# -r requirements/../../../packages/settings-library/requirements/_base.in
386394
pygments==2.17.2
387395
# via rich
388396
pyinstrument==4.6.2
@@ -399,7 +407,9 @@ python-dateutil==2.9.0.post0
399407
# matplotlib
400408
# pandas
401409
python-dotenv==1.0.1
402-
# via uvicorn
410+
# via
411+
# pydantic-settings
412+
# uvicorn
403413
pytz==2024.1
404414
# via
405415
# dateparser
@@ -500,7 +510,7 @@ sqlalchemy==1.4.52
500510
# -c requirements/../../../requirements/constraints.txt
501511
# -r requirements/../../../packages/postgres-database/requirements/_base.in
502512
# alembic
503-
starlette==0.27.0
513+
starlette==0.38.6
504514
# via
505515
# -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
506516
# -c requirements/../../../packages/aws-library/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
@@ -557,6 +567,7 @@ typing-extensions==4.10.0
557567
# faststream
558568
# opentelemetry-sdk
559569
# pydantic
570+
# pydantic-core
560571
# typer
561572
# types-aiobotocore
562573
# types-aiobotocore-ec2

0 commit comments

Comments
 (0)