Skip to content

Commit c97244f

Browse files
fix S3BucketName validation
1 parent 2c18b4f commit c97244f

File tree

6 files changed

+23
-15
lines changed

6 files changed

+23
-15
lines changed

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/modules/s3.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from aws_library.s3 import S3NotConnectedError, SimcoreS3API
55
from fastapi import FastAPI
66
from models_library.api_schemas_storage import S3BucketName
7+
from pydantic import TypeAdapter
78
from settings_library.s3 import S3Settings
89
from tenacity import (
910
AsyncRetrying,
@@ -36,7 +37,9 @@ async def on_startup() -> None:
3637
):
3738
with attempt:
3839
connected = await client.http_check_bucket_connected(
39-
bucket=S3BucketName(settings.S3_BUCKET_NAME)
40+
bucket=TypeAdapter(S3BucketName).validate_python(
41+
settings.S3_BUCKET_NAME
42+
)
4043
)
4144
if not connected:
4245
raise S3NotConnectedError # pragma: no cover

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/resource_tracker_service_runs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from models_library.rest_ordering import OrderBy
1919
from models_library.users import UserID
2020
from models_library.wallets import WalletID
21-
from pydantic import AnyUrl, PositiveInt
21+
from pydantic import AnyUrl, PositiveInt, TypeAdapter
2222
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
2323
CustomResourceUsageTrackerError,
2424
)
@@ -158,7 +158,7 @@ async def export_service_runs(
158158
started_until = filters.started_at.until if filters else None
159159

160160
# Create S3 key name
161-
s3_bucket_name = S3BucketName(bucket_name)
161+
s3_bucket_name = TypeAdapter(S3BucketName).validate_python(bucket_name)
162162
# NOTE: su stands for "service usage"
163163
file_name = f"su_{shortuuid.uuid()}.csv"
164164
s3_object_key = f"resource-usage-tracker-service-runs/{datetime.now(tz=timezone.utc).date()}/{file_name}"

services/storage/src/simcore_service_storage/handlers_health.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from models_library.api_schemas_storage import HealthCheck, S3BucketName
1212
from models_library.app_diagnostics import AppStatusCheck
1313
from models_library.utils.json_serialization import json_dumps
14+
from pydantic import TypeAdapter
1415
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
1516

1617
from ._meta import API_VERSION, API_VTAG, PROJECT_NAME, VERSION
@@ -53,7 +54,9 @@ async def get_status(request: web.Request) -> web.Response:
5354
s3_state = (
5455
"connected"
5556
if await get_s3_client(request.app).bucket_exists(
56-
bucket=S3BucketName(app_settings.STORAGE_S3.S3_BUCKET_NAME)
57+
bucket=TypeAdapter(S3BucketName).validate_python(
58+
app_settings.STORAGE_S3.S3_BUCKET_NAME
59+
)
5760
)
5861
else "no access to S3 bucket"
5962
)

services/storage/tests/unit/test_dsm_soft_links.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from models_library.projects_nodes_io import SimcoreS3FileID
1414
from models_library.users import UserID
1515
from models_library.utils.fastapi_encoders import jsonable_encoder
16-
from pydantic import ByteSize
16+
from pydantic import ByteSize, TypeAdapter
1717
from simcore_postgres_database.storage_models import file_meta_data
1818
from simcore_service_storage.models import FileMetaData, FileMetaDataAtDB
1919
from simcore_service_storage.simcore_s3_dsm import SimcoreS3DataManager
@@ -34,7 +34,7 @@ async def output_file(
3434
file = FileMetaData.from_simcore_node(
3535
user_id=user_id,
3636
file_id=SimcoreS3FileID(f"{project_id}/{node_id}/filename.txt"),
37-
bucket=S3BucketName("master-simcore"),
37+
bucket=TypeAdapter(S3BucketName).validate_python("master-simcore"),
3838
location_id=SimcoreS3DataManager.get_location_id(),
3939
location_name=SimcoreS3DataManager.get_location_name(),
4040
sha256_checksum=faker.sha256(),

services/storage/tests/unit/test_models.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from models_library.api_schemas_storage import S3BucketName
55
from models_library.projects import ProjectID
66
from models_library.projects_nodes_io import NodeID, SimcoreS3FileID, StorageFileID
7-
from pydantic import ValidationError, parse_obj_as
7+
from pydantic import TypeAdapter, ValidationError
88
from simcore_service_storage.models import FileMetaData
99
from simcore_service_storage.simcore_s3_dsm import SimcoreS3DataManager
1010

@@ -15,7 +15,7 @@
1515
)
1616
def test_file_id_raises_error(file_id: str):
1717
with pytest.raises(ValidationError):
18-
parse_obj_as(StorageFileID, file_id)
18+
TypeAdapter(StorageFileID).validate_python(file_id)
1919

2020

2121
@pytest.mark.parametrize(
@@ -38,17 +38,17 @@ def test_file_id_raises_error(file_id: str):
3838
],
3939
)
4040
def test_file_id(file_id: str):
41-
parsed_file_id = parse_obj_as(StorageFileID, file_id)
41+
parsed_file_id = TypeAdapter(StorageFileID).validate_python(file_id)
4242
assert parsed_file_id
4343
assert parsed_file_id == file_id
4444

4545

4646
def test_fmd_build():
47-
file_id = parse_obj_as(SimcoreS3FileID, f"api/{uuid.uuid4()}/xx.dat")
47+
file_id = TypeAdapter(SimcoreS3FileID).validate_python(f"api/{uuid.uuid4()}/xx.dat")
4848
fmd = FileMetaData.from_simcore_node(
4949
user_id=12,
5050
file_id=file_id,
51-
bucket=S3BucketName("test-bucket"),
51+
bucket=TypeAdapter(S3BucketName).validate_python("test-bucket"),
5252
location_id=SimcoreS3DataManager.get_location_id(),
5353
location_name=SimcoreS3DataManager.get_location_name(),
5454
sha256_checksum=None,
@@ -64,11 +64,13 @@ def test_fmd_build():
6464
assert fmd.location_id == SimcoreS3DataManager.get_location_id()
6565
assert fmd.bucket_name == "test-bucket"
6666

67-
file_id = parse_obj_as(SimcoreS3FileID, f"{uuid.uuid4()}/{uuid.uuid4()}/xx.dat")
67+
file_id = TypeAdapter(SimcoreS3FileID).validate_python(
68+
f"{uuid.uuid4()}/{uuid.uuid4()}/xx.dat"
69+
)
6870
fmd = FileMetaData.from_simcore_node(
6971
user_id=12,
7072
file_id=file_id,
71-
bucket=S3BucketName("test-bucket"),
73+
bucket=TypeAdapter(S3BucketName).validate_python("test-bucket"),
7274
location_id=SimcoreS3DataManager.get_location_id(),
7375
location_name=SimcoreS3DataManager.get_location_name(),
7476
sha256_checksum=None,

services/storage/tests/unit/test_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from faker import Faker
1717
from models_library.projects import ProjectID
1818
from models_library.projects_nodes_io import NodeID, SimcoreS3FileID
19-
from pydantic import ByteSize, HttpUrl, parse_obj_as
19+
from pydantic import ByteSize, HttpUrl, TypeAdapter, parse_obj_as
2020
from simcore_service_storage.constants import S3_UNDEFINED_OR_EXTERNAL_MULTIPART_ID
2121
from simcore_service_storage.models import ETag, FileMetaData, S3BucketName, UploadID
2222
from simcore_service_storage.simcore_s3_dsm import SimcoreS3DataManager
@@ -79,7 +79,7 @@ def test_file_entry_valid(
7979
fmd = FileMetaData.from_simcore_node(
8080
user_id=faker.pyint(min_value=1),
8181
file_id=file_id,
82-
bucket=S3BucketName("pytest-bucket"),
82+
bucket=TypeAdapter(S3BucketName).validate_python("pytest-bucket"),
8383
location_id=SimcoreS3DataManager.get_location_id(),
8484
location_name=SimcoreS3DataManager.get_location_name(),
8585
sha256_checksum=None,

0 commit comments

Comments
 (0)