77from common_library .json_serialization import json_dumps
88from fastapi import FastAPI
99from pydantic import TypeAdapter
10- from servicelib . logging_utils import log_context
10+ from tenacity import retry , wait_random_exponential
1111from tenacity .asyncio import AsyncRetrying
1212from tenacity .before_sleep import before_sleep_log
1313from tenacity .wait import wait_fixed
1414from types_aiobotocore_s3 .literals import BucketLocationConstraintType
1515
1616from ..constants import RETRY_WAIT_SECS
17- from ..core .settings import get_application_settings
17+ from ..core .settings import ApplicationSettings , get_application_settings
1818from ..exceptions .errors import ConfigurationError
1919
2020_logger = logging .getLogger (__name__ )
2121
2222
23+ @retry (
24+ wait = wait_random_exponential (),
25+ before_sleep = before_sleep_log (_logger , logging .WARNING ),
26+ reraise = True ,
27+ )
28+ async def _ensure_s3_bucket (
29+ client : SimcoreS3API , settings : ApplicationSettings
30+ ) -> None :
31+ assert settings .STORAGE_S3 # nosec
32+ if await client .bucket_exists (bucket = settings .STORAGE_S3 .S3_BUCKET_NAME ):
33+ _logger .info (
34+ "S3 bucket %s exists already, skipping creation" ,
35+ settings .STORAGE_S3 .S3_BUCKET_NAME ,
36+ )
37+ return
38+ await client .create_bucket (
39+ bucket = settings .STORAGE_S3 .S3_BUCKET_NAME ,
40+ region = TypeAdapter (
41+ BucketLocationConstraintType | Literal ["us-east-1" ]
42+ ).validate_python (settings .STORAGE_S3 .S3_REGION ),
43+ )
44+
45+
2346def setup_s3 (app : FastAPI ) -> None :
2447 async def _on_startup () -> None :
2548 app .state .s3_client = None
@@ -44,14 +67,7 @@ async def _on_startup() -> None:
4467 assert client # nosec
4568 app .state .s3_client = client
4669
47- with log_context (_logger , logging .DEBUG , msg = "setup.s3_bucket.cleanup_ctx" ):
48- assert settings .STORAGE_S3 # nosec
49- await client .create_bucket (
50- bucket = settings .STORAGE_S3 .S3_BUCKET_NAME ,
51- region = TypeAdapter (
52- BucketLocationConstraintType | Literal ["us-east-1" ]
53- ).validate_python (settings .STORAGE_S3 .S3_REGION ),
54- )
70+ await _ensure_s3_bucket (client , settings )
5571
5672 async def _on_shutdown () -> None :
5773 if app .state .s3_client :
0 commit comments