Skip to content

Commit b5f84ad

Browse files
committed
storage code change
1 parent 8478bfa commit b5f84ad

File tree

17 files changed

+1052
-93
lines changed

17 files changed

+1052
-93
lines changed

services/storage/src/simcore_service_storage/api/rest/_files.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ async def get_file_metadata(
8181
user_agent: Annotated[str | None, Header()],
8282
request: Request,
8383
):
84+
# NOTE: Used by legacy dynamic services -> MUST BE BACKWARDS COMPATIBLE
8485
dsm = get_dsm_provider(request.app).get(location_id)
8586
try:
8687
data = await dsm.get_file(
@@ -133,6 +134,7 @@ async def download_file(
133134
query_params: Annotated[FileDownloadQueryParams, Depends()],
134135
request: Request,
135136
) -> Envelope[FileDownloadResponse]:
137+
# NOTE: Used by legacy dynamic services -> MUST BE BACKWARDS COMPATIBLE
136138
dsm = get_dsm_provider(request.app).get(location_id)
137139
link = await dsm.create_file_download_link(
138140
query_params.user_id, file_id, query_params.link_type
@@ -178,6 +180,7 @@ async def upload_file(
178180
Use-case v2.2: if query.file_size > 0 and query.link_type=presigned or None, returns 1 or more presigned links depending on the file size (limited to a single 5TB file)
179181
Use-case v2.3: if query.link_type=s3 and query.file_size>=0, returns a single s3 direct link (limited to a single 5TB file)
180182
"""
183+
# NOTE: Used by legacy dynamic services with single presigned link -> MUST BE BACKWARDS COMPATIBLE
181184
dsm = get_dsm_provider(request.app).get(location_id)
182185
links: UploadLinks = await dsm.create_file_upload_links(
183186
user_id=query_params.user_id,

services/storage/src/simcore_service_storage/api/rest/_locations.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from models_library.api_schemas_storage.storage_schemas import FileLocation
66
from models_library.generics import Envelope
77

8-
# Exclusive for simcore-s3 storage -----------------------
98
from ...dsm import get_dsm_provider
109
from ...models import StorageQueryParamsBase
1110

@@ -16,7 +15,6 @@
1615
)
1716

1817

19-
# HANDLERS ---------------------------------------------------
2018
@router.get(
2119
"/locations",
2220
status_code=status.HTTP_200_OK,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import logging
2+
from pathlib import Path
3+
from typing import Annotated
4+
5+
from fastapi import APIRouter, Depends
6+
from fastapi_pagination import create_page
7+
from fastapi_pagination.cursor import CursorPage, CursorParams
8+
from models_library.api_schemas_storage.storage_schemas import PathMetaDataGet
9+
from models_library.users import UserID
10+
11+
from ...dsm_factory import BaseDataManager
12+
from .dependencies.dsm_prodiver import get_data_manager
13+
14+
_logger = logging.getLogger(__name__)
15+
16+
router = APIRouter(
17+
tags=[
18+
"files",
19+
],
20+
)
21+
22+
23+
@router.get(
24+
"/locations/{location_id}/paths",
25+
response_model=CursorPage[PathMetaDataGet],
26+
)
27+
async def list_paths(
28+
page_params: Annotated[CursorParams, Depends()],
29+
dsm: Annotated[BaseDataManager, Depends(get_data_manager)],
30+
user_id: UserID,
31+
file_filter: Path | None = None,
32+
):
33+
"""Returns one level of files (paginated)"""
34+
items, next_cursor, total_number = await dsm.list_paths(
35+
user_id=user_id,
36+
file_filter=file_filter,
37+
limit=page_params.size,
38+
cursor=page_params.to_raw_params().cursor,
39+
)
40+
return create_page(
41+
[_.to_api_model() for _ in items],
42+
total=total_number,
43+
params=page_params,
44+
next_=next_cursor,
45+
)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# mypy: disable-error-code=truthy-function
2+
from fastapi import Request
3+
from servicelib.fastapi.dependencies import get_app, get_reverse_url_mapper
4+
5+
from ....core.settings import ApplicationSettings, get_application_settings
6+
7+
8+
def get_settings(request: Request) -> ApplicationSettings:
9+
return get_application_settings(request.app)
10+
11+
12+
assert get_reverse_url_mapper # nosec
13+
assert get_app # nosec
14+
15+
__all__: tuple[str, ...] = (
16+
"get_app",
17+
"get_reverse_url_mapper",
18+
)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import Annotated
2+
3+
from fastapi import Depends, FastAPI
4+
from models_library.projects_nodes_io import LocationID
5+
from servicelib.fastapi.dependencies import get_app
6+
from simcore_service_storage.dsm import get_dsm_provider
7+
from simcore_service_storage.dsm_factory import BaseDataManager, DataManagerProvider
8+
9+
10+
def get_data_manager_provider(
11+
app: Annotated[FastAPI, Depends(get_app)],
12+
) -> DataManagerProvider:
13+
return get_dsm_provider(app)
14+
15+
16+
async def get_data_manager(
17+
location_id: LocationID,
18+
data_manager_provider: Annotated[
19+
DataManagerProvider, Depends(get_data_manager_provider)
20+
],
21+
) -> BaseDataManager:
22+
return data_manager_provider.get(location_id)

services/storage/src/simcore_service_storage/api/rest/routes.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
11
from fastapi import APIRouter, FastAPI
22

3-
from . import _datasets, _files, _health, _locations, _simcore_s3
3+
from . import _datasets, _files, _health, _locations, _paths, _simcore_s3
44

55
v0_router = APIRouter()
66

7-
# health
87
health_router = _health.router
98
v0_router.include_router(_health.router)
10-
11-
# locations
129
v0_router.include_router(_locations.router)
13-
14-
# datasets
1510
v0_router.include_router(_datasets.router)
16-
17-
# files
1811
v0_router.include_router(_files.router)
19-
20-
# simcore-s3
12+
v0_router.include_router(_paths.router)
2113
v0_router.include_router(_simcore_s3.router)
2214

2315

services/storage/src/simcore_service_storage/core/application.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from common_library.basic_types import BootModeEnum
99
from fastapi import FastAPI
1010
from fastapi.middleware.gzip import GZipMiddleware
11+
from fastapi_pagination import add_pagination
1112
from servicelib.fastapi import timing_middleware
1213
from servicelib.fastapi.client_session import setup_client_session
1314
from servicelib.fastapi.openapi import override_fastapi_openapi_method
@@ -64,13 +65,14 @@ def create_app(settings: ApplicationSettings) -> FastAPI:
6465
debug=settings.SC_BOOT_MODE
6566
in [BootModeEnum.DEBUG, BootModeEnum.DEVELOPMENT, BootModeEnum.LOCAL],
6667
title=APP_NAME,
67-
description="Service to auto-scale swarm",
68+
description="Service that manages osparc storage backend",
6869
version=API_VERSION,
6970
openapi_url=f"/api/{API_VTAG}/openapi.json",
7071
docs_url="/dev/doc",
7172
redoc_url=None, # default disabled
7273
)
7374
override_fastapi_openapi_method(app)
75+
add_pagination(app)
7476

7577
# STATE
7678
app.state.settings = settings

0 commit comments

Comments
 (0)