Skip to content

Commit 23d1935

Browse files
authored
feat(s3): query minio metrics for free space (#293)
2 parents 4437574 + 359b604 commit 23d1935

17 files changed

Lines changed: 994 additions & 550 deletions

backend/api/.openapi-generator/FILES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,7 @@ src/openapi_server/models/http_validation_error.py
2828
src/openapi_server/models/internal_error.py
2929
src/openapi_server/models/presigned_url_body.py
3030
src/openapi_server/models/presigned_url_resp.py
31+
src/openapi_server/models/upload_request_body.py
32+
src/openapi_server/models/upload_request_resp.py
3133
src/openapi_server/models/validation_error.py
3234
src/openapi_server/models/validation_error_loc_inner.py

backend/api/.vscode/launch.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@
99
"type": "debugpy",
1010
"request": "launch",
1111
"env": {
12-
"PREFECT_API_URL": "http://localhost:4200/api",
12+
"PREFECT_API_URL": "https://scopem-openem2.ethz.ch/archiver/prefect/api",
1313
"PREFECT_LOGGING_LEVEL": "DEBUG",
1414
"MINIO_ENDPOINT": "scopem-openemdata.ethz.ch:9090",
1515
"SECRETS_DIR": "${workspaceFolder}/../../.secrets",
1616
"UVICORN_ROOT_PATH": "",
1717
"UVICORN_RELOAD": "true",
1818
"UVICORN_LOG_LEVEL": "debug",
1919
"UVICORN_PORT": "8888",
20-
"IDP_CLIENT_SECRET":"ASFD",
21-
"IDP_PASSWORD":"ASFD",
22-
"JOB_ENDPOINT_PASSWORD":"pw",
23-
"JOB_ENDPOINT_USERNAME":"username"
20+
"IDP_CLIENT_SECRET": "ASFD",
21+
"IDP_PASSWORD": "ASFD",
22+
"JOB_ENDPOINT_PASSWORD": "pw",
23+
"JOB_ENDPOINT_USERNAME": "username",
24+
"SCICAT_INGESTOR_GROUP": "ingestor"
2425
},
2526
"cwd": "${workspaceFolder}/src",
2627
"module": "openapi_server",

backend/api/openapi.yaml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,38 @@ paths:
138138
summary: Create Archiver Job
139139
tags:
140140
- archiving
141+
/s3/requestDatasetUpload:
142+
post:
143+
operationId: request_dataset_upload
144+
requestBody:
145+
content:
146+
application/json:
147+
schema:
148+
$ref: "#/components/schemas/UploadRequestBody"
149+
required: true
150+
responses:
151+
"201":
152+
content:
153+
application/json:
154+
schema:
155+
$ref: "#/components/schemas/UploadRequestResp"
156+
description: Upload requested
157+
"422":
158+
content:
159+
application/json:
160+
schema:
161+
$ref: "#/components/schemas/HTTPValidationError"
162+
description: Validation Error
163+
"500":
164+
content:
165+
application/json:
166+
schema:
167+
$ref: "#/components/schemas/InternalError"
168+
description: Internal Server Error
169+
summary: Request a new upload
170+
tags:
171+
- s3upload
172+
141173
/s3/presignedUrls:
142174
post:
143175
operationId: get_presigned_urls
@@ -562,6 +594,32 @@ components:
562594
- upload_id
563595
- urls
564596
title: PresignedUrlResp
597+
UploadRequestBody:
598+
example:
599+
DatasetPID:
600+
- dataset/pid
601+
TotalGigabytes: 1000
602+
properties:
603+
DatasetPID:
604+
title: DatasetPID
605+
type: string
606+
TotalGigabytes:
607+
title: TotalGigabytes
608+
type: integer
609+
required:
610+
- DatasetPID
611+
- TotalGigabytes
612+
title: UploadRequestBody
613+
UploadRequestResp:
614+
example:
615+
Ok: true
616+
properties:
617+
Ok:
618+
title: Ok
619+
type: boolean
620+
required:
621+
- Ok
622+
title: UploadRequestResp
565623
ValidationError:
566624
example:
567625
msg: msg

backend/api/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,6 @@ lint = [
6969
"mypy>=1.14.1",
7070
]
7171
dev = [
72+
"pytest-asyncio>=1.3.0",
7273
"requests-mock>=1.12.1",
7374
]

backend/api/src/openapi_server/__main__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"""
77

88
from importlib.metadata import version
9+
from logging import getLogger
910
import pathlib
1011
from fastapi import FastAPI
1112
from fastapi.middleware.cors import CORSMiddleware
@@ -18,7 +19,6 @@
1819
from starlette.middleware.base import BaseHTTPMiddleware
1920

2021
from .settings import GetSettings
21-
from logging import getLogger
2222

2323
__version__ = version("archiver-service-api")
2424

@@ -78,6 +78,10 @@ def create_app() -> FastAPI:
7878

7979
log_config = uvicorn.config.LOGGING_CONFIG
8080
log_config["loggers"]["uvicorn"]["level"] = settings.UVICORN_LOG_LEVEL.upper()
81+
log_config["formatters"]["default"]["fmt"] = (
82+
"%(asctime)s | " + log_config["formatters"]["default"]["fmt"]
83+
)
84+
log_config["formatters"]["access"]["fmt"] = "%(asctime)s | " + log_config["formatters"]["access"]["fmt"]
8185
uvi_config = uvicorn.Config(
8286
app,
8387
host="0.0.0.0",

backend/api/src/openapi_server/apis/s3upload_api.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
from openapi_server.models.internal_error import InternalError
3434
from openapi_server.models.presigned_url_body import PresignedUrlBody
3535
from openapi_server.models.presigned_url_resp import PresignedUrlResp
36+
from openapi_server.models.upload_request_body import UploadRequestBody
37+
from openapi_server.models.upload_request_resp import UploadRequestResp
3638
from openapi_server.security_api import get_token_BearerAuth
3739

3840
router = APIRouter()
@@ -128,3 +130,25 @@ async def get_presigned_urls(
128130
if not BaseS3uploadApi.subclasses:
129131
raise HTTPException(status_code=500, detail="Not implemented")
130132
return await BaseS3uploadApi.subclasses[0]().get_presigned_urls(presigned_url_body)
133+
134+
135+
@router.post(
136+
"/s3/requestDatasetUpload",
137+
responses={
138+
201: {"model": UploadRequestResp, "description": "Upload requested"},
139+
422: {"model": HTTPValidationError, "description": "Validation Error"},
140+
500: {"model": InternalError, "description": "Internal Server Error"},
141+
},
142+
tags=["s3upload"],
143+
summary="Request a new upload",
144+
response_model_by_alias=True,
145+
)
146+
async def request_dataset_upload(
147+
upload_request_body: UploadRequestBody = Body(None, description=""),
148+
token_BearerAuth: TokenModel = Security(
149+
get_token_BearerAuth
150+
),
151+
) -> UploadRequestResp:
152+
if not BaseS3uploadApi.subclasses:
153+
raise HTTPException(status_code=500, detail="Not implemented")
154+
return await BaseS3uploadApi.subclasses[0]().request_dataset_upload(upload_request_body)

backend/api/src/openapi_server/apis/s3upload_api_base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from openapi_server.models.internal_error import InternalError
1313
from openapi_server.models.presigned_url_body import PresignedUrlBody
1414
from openapi_server.models.presigned_url_resp import PresignedUrlResp
15+
from openapi_server.models.upload_request_body import UploadRequestBody
16+
from openapi_server.models.upload_request_resp import UploadRequestResp
1517
from openapi_server.security_api import get_token_BearerAuth
1618

1719
class BaseS3uploadApi:
@@ -46,3 +48,10 @@ async def get_presigned_urls(
4648
presigned_url_body: PresignedUrlBody,
4749
) -> PresignedUrlResp:
4850
...
51+
52+
53+
async def request_dataset_upload(
54+
self,
55+
upload_request_body: UploadRequestBody,
56+
) -> UploadRequestResp:
57+
...

0 commit comments

Comments
 (0)