Skip to content

Commit 128c3d8

Browse files
committed
removed locations stuff
1 parent 6f91582 commit 128c3d8

File tree

5 files changed

+18
-154
lines changed

5 files changed

+18
-154
lines changed
Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,13 @@
1-
import asyncio
21
import logging
3-
from typing import Annotated, cast
2+
from typing import Annotated
43

5-
from fastapi import APIRouter, Depends, HTTPException, Request
4+
from fastapi import APIRouter, Depends, Request, status
65
from models_library.api_schemas_storage import FileLocation
76
from models_library.generics import Envelope
8-
from models_library.projects_nodes_io import LocationID, StorageFileID
9-
from servicelib.aiohttp import status
10-
from servicelib.aiohttp.application_keys import (
11-
APP_CONFIG_KEY,
12-
APP_FIRE_AND_FORGET_TASKS_KEY,
13-
)
14-
from servicelib.utils import fire_and_forget_task
157

168
# Exclusive for simcore-s3 storage -----------------------
17-
from ...core.settings import ApplicationSettings
189
from ...dsm import get_dsm_provider
19-
from ...models import (
20-
StorageQueryParamsBase,
21-
SyncMetadataQueryParams,
22-
SyncMetadataResponse,
23-
)
24-
from ...simcore_s3_dsm import SimcoreS3DataManager
10+
from ...models import StorageQueryParamsBase
2511

2612
_logger = logging.getLogger(__name__)
2713

@@ -47,52 +33,3 @@ async def list_storage_locations(
4733
if await dsm.authorized(query_params.user_id):
4834
locs.append(FileLocation(name=dsm.location_name, id=dsm.location_id))
4935
return Envelope[list[FileLocation]](data=locs)
50-
51-
52-
@router.post(
53-
"/locations/{location_id}:sync", response_model=Envelope[SyncMetadataResponse]
54-
)
55-
async def synchronise_meta_data_table(
56-
query_params: Annotated[SyncMetadataQueryParams, Depends()],
57-
location_id: LocationID,
58-
request: Request,
59-
):
60-
if not location_id == SimcoreS3DataManager.get_location_id():
61-
raise HTTPException(
62-
status.HTTP_400_BAD_REQUEST,
63-
detail="invalid call: cannot be called for other than simcore",
64-
)
65-
dsm = cast(
66-
SimcoreS3DataManager,
67-
get_dsm_provider(request.app).get(SimcoreS3DataManager.get_location_id()),
68-
)
69-
sync_results: list[StorageFileID] = []
70-
sync_coro = dsm.synchronise_meta_data_table(dry_run=query_params.dry_run)
71-
72-
if query_params.fire_and_forget:
73-
settings: ApplicationSettings = request.app[APP_CONFIG_KEY]
74-
75-
async def _go():
76-
timeout = settings.STORAGE_SYNC_METADATA_TIMEOUT
77-
try:
78-
result = await asyncio.wait_for(sync_coro, timeout=timeout)
79-
_logger.info(
80-
"Sync metadata table completed: %d entries removed",
81-
len(result),
82-
)
83-
except TimeoutError:
84-
_logger.exception("Sync metadata table timed out (%s seconds)", timeout)
85-
86-
fire_and_forget_task(
87-
_go(),
88-
task_suffix_name="synchronise_meta_data_table",
89-
fire_and_forget_tasks_collection=request.app[APP_FIRE_AND_FORGET_TASKS_KEY],
90-
)
91-
else:
92-
sync_results = await sync_coro
93-
response = SyncMetadataResponse(
94-
removed=sync_results,
95-
fire_and_forget=query_params.fire_and_forget,
96-
dry_run=query_params.dry_run,
97-
)
98-
return Envelope[SyncMetadataResponse](data=response)

services/storage/src/simcore_service_storage/modules/db/db_tokens.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,4 @@ async def get_api_token_and_secret(app: FastAPI, user_id: UserID) -> tuple[str,
3838
api_token = data.get("token_key", api_token)
3939
api_secret = data.get("token_secret", api_secret)
4040

41-
assert api_token is not None # nosec
42-
assert api_secret is not None # nosec
43-
4441
return api_token, api_secret

services/storage/src/simcore_service_storage/simcore_s3_dsm.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -784,34 +784,6 @@ async def create_soft_link(
784784
async with self.engine.connect() as conn:
785785
return convert_db_to_model(await db_file_meta_data.insert(conn, target))
786786

787-
async def synchronise_meta_data_table(
788-
self, *, dry_run: bool
789-
) -> list[StorageFileID]:
790-
async with self.engine.connect() as conn:
791-
_logger.warning(
792-
"Total number of entries to check %d",
793-
await db_file_meta_data.total(conn),
794-
)
795-
# iterate over all entries to check if there is a file in the S3 backend
796-
file_ids_to_remove = [
797-
fmd.file_id
798-
async for fmd in db_file_meta_data.list_valid_uploads(conn)
799-
if not await get_s3_client(self.app).object_exists(
800-
bucket=self.simcore_bucket_name, object_key=fmd.object_name
801-
)
802-
]
803-
804-
if not dry_run:
805-
await db_file_meta_data.delete(conn, file_ids_to_remove)
806-
807-
_logger.info(
808-
"%s %d entries ",
809-
"Would delete" if dry_run else "Deleted",
810-
len(file_ids_to_remove),
811-
)
812-
813-
return cast(list[StorageFileID], file_ids_to_remove)
814-
815787
async def _clean_pending_upload(
816788
self, conn: AsyncConnection, file_id: SimcoreS3FileID
817789
) -> None:

services/storage/tests/helpers/utils.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010

1111

1212
def has_datcore_tokens() -> bool:
13-
# TODO: activate tests against BF services in the CI.
14-
#
15-
# CI shall add BF_API_KEY, BF_API_SECRET environs as secrets
16-
#
17-
if not os.environ.get("BF_API_KEY") or not os.environ.get("BF_API_SECRET"):
13+
api_key = os.environ.get("BF_API_KEY")
14+
api_secret = os.environ.get("BF_API_SECRET")
15+
if not api_key or not api_secret:
1816
return False
19-
return True
17+
return not (api_key == "none" or api_secret == "none") # noqa: S105
2018

2119

2220
async def get_updated_project(

services/storage/tests/unit/test_handlers_locations.py

Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,70 +4,30 @@
44
# pylint:disable=too-many-arguments
55
# pylint:disable=no-name-in-module
66

7-
from typing import Any
87

98
import httpx
10-
import pytest
11-
from fastapi import FastAPI
9+
from fastapi import FastAPI, status
1210
from models_library.users import UserID
13-
from pytest_simcore.helpers.assert_checks import assert_status
14-
from servicelib.aiohttp import status
11+
from pytest_simcore.helpers.httpx_assert_checks import url_from_operation_id
1512
from tests.helpers.utils import has_datcore_tokens
1613

1714
pytest_simcore_core_services_selection = ["postgres"]
1815
pytest_simcore_ops_services_selection = ["adminer"]
1916

2017

21-
async def test_locations(client: httpx.AsyncClient, user_id: UserID):
22-
resp = await client.get(f"/v0/locations?user_id={user_id}")
18+
async def test_locations(
19+
initialized_app: FastAPI, client: httpx.AsyncClient, user_id: UserID
20+
):
21+
url = url_from_operation_id(
22+
client, initialized_app, "list_storage_locations"
23+
).with_query(user_id=user_id)
24+
resp = await client.get(f"{url}")
2325

24-
payload = await resp.json()
25-
assert resp.status == 200, str(payload)
26+
payload = resp.json()
27+
assert resp.status_code == status.HTTP_200_OK, str(payload)
2628

2729
data, error = tuple(payload.get(k) for k in ("data", "error"))
2830

2931
_locs = 2 if has_datcore_tokens() else 1
3032
assert len(data) == _locs
3133
assert not error
32-
33-
34-
@pytest.mark.parametrize(
35-
"dry_run, fire_and_forget, expected_removed",
36-
[
37-
(None, None, []),
38-
(True, False, []),
39-
(True, True, []),
40-
(False, True, []),
41-
(False, False, []),
42-
],
43-
)
44-
async def test_synchronise_meta_data_table(
45-
initialized_app: FastAPI,
46-
client: httpx.AsyncClient,
47-
location_id: int,
48-
user_id: UserID,
49-
dry_run: bool | None,
50-
fire_and_forget: bool | None,
51-
expected_removed: list,
52-
):
53-
query_params: dict[str, Any] = {"user_id": user_id}
54-
if dry_run:
55-
query_params["dry_run"] = f"{dry_run}"
56-
if fire_and_forget:
57-
query_params["fire_and_forget"] = f"{fire_and_forget}"
58-
url = (
59-
client.app.router["synchronise_meta_data_table"]
60-
.url_for(location_id=f"{location_id}")
61-
.with_query(**query_params)
62-
)
63-
resp = await client.post(
64-
f"{url}",
65-
)
66-
data, error = await assert_status(resp, status.HTTP_200_OK)
67-
assert not error
68-
assert data
69-
assert data["dry_run"] == (False if dry_run is None else dry_run)
70-
assert data["fire_and_forget"] == (
71-
False if fire_and_forget is None else fire_and_forget
72-
)
73-
assert data["removed"] == expected_removed

0 commit comments

Comments
 (0)