Skip to content

Commit b7c211a

Browse files
committed
Merge branch 'storage/batchDelete' of github.com:sanderegg/osparc-simcore into feature/batch-delete-files
2 parents 00fe3e6 + 0bea039 commit b7c211a

File tree

5 files changed

+38
-39
lines changed

5 files changed

+38
-39
lines changed

packages/service-library/src/servicelib/fastapi/client_session.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1+
import datetime
2+
13
import httpx
24
from fastapi import FastAPI
35

46

5-
def setup_client_session(app: FastAPI, *, max_keepalive_connections: int = 20) -> None:
7+
def setup_client_session(
8+
app: FastAPI,
9+
*,
10+
default_timeout: datetime.timedelta = datetime.timedelta(seconds=20),
11+
max_keepalive_connections: int = 20
12+
) -> None:
613
async def on_startup() -> None:
714
session = httpx.AsyncClient(
815
transport=httpx.AsyncHTTPTransport(http2=True),
916
limits=httpx.Limits(max_keepalive_connections=max_keepalive_connections),
17+
timeout=default_timeout.total_seconds(),
1018
)
1119
app.state.aiohttp_client_session = session
1220

services/director/src/simcore_service_director/core/application.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ def create_app(settings: ApplicationSettings) -> FastAPI:
5656
setup_client_session(
5757
app,
5858
max_keepalive_connections=settings.DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS,
59+
default_timeout=settings.DIRECTOR_REGISTRY_CLIENT_TIMEOUT,
5960
)
6061
setup_registry(app)
6162

services/director/src/simcore_service_director/core/settings.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,21 @@ class ApplicationSettings(BaseApplicationSettings, MixinLoggingSettings):
112112
),
113113
)
114114

115-
DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS: NonNegativeInt = 0
115+
DIRECTOR_REGISTRY_CLIENT_MAX_KEEPALIVE_CONNECTIONS: NonNegativeInt = 5
116+
DIRECTOR_REGISTRY_CLIENT_TIMEOUT: datetime.timedelta = datetime.timedelta(
117+
seconds=20
118+
)
116119
DIRECTOR_REGISTRY_CLIENT_MAX_CONCURRENT_CALLS: PositiveInt = 20
117120
DIRECTOR_REGISTRY_CLIENT_MAX_NUMBER_OF_RETRIEVED_OBJECTS: PositiveInt = 30
118121

122+
@field_validator("DIRECTOR_REGISTRY_CLIENT_TIMEOUT")
123+
@classmethod
124+
def _check_positive(cls, value: datetime.timedelta) -> datetime.timedelta:
125+
if value.total_seconds() < 0:
126+
msg = "DIRECTOR_REGISTRY_CLIENT_TIMEOUT must be positive"
127+
raise ValueError(msg)
128+
return value
129+
119130
@field_validator("DIRECTOR_GENERIC_RESOURCE_PLACEMENT_CONSTRAINTS_SUBSTITUTIONS")
120131
@classmethod
121132
def _validate_substitutions(cls, v):

services/director/tests/unit/test_core_settings.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
# pylint: disable=too-many-arguments
55

66

7+
import datetime
8+
79
import pytest
10+
from pydantic import ValidationError
811
from pytest_simcore.helpers.monkeypatch_envs import (
912
setenvs_from_dict,
1013
setenvs_from_envfile,
@@ -37,6 +40,16 @@ def test_valid_web_application_settings(app_environment: EnvVarsDict):
3740
)
3841

3942

43+
def test_invalid_client_timeout_raises(
44+
app_environment: EnvVarsDict, monkeypatch: pytest.MonkeyPatch
45+
):
46+
monkeypatch.setenv(
47+
"DIRECTOR_REGISTRY_CLIENT_TIMEOUT", f"{datetime.timedelta(seconds=-10)}"
48+
)
49+
with pytest.raises(ValidationError):
50+
ApplicationSettings.create_from_envs()
51+
52+
4053
def test_docker_container_env_sample(monkeypatch: pytest.MonkeyPatch):
4154
monkeypatch.delenv("DIRECTOR_DEFAULT_MAX_MEMORY", raising=False)
4255

services/web/server/src/simcore_service_webserver/storage/_rest.py

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,11 @@ def _create_data_response_from_async_job(
182182
request: web.Request,
183183
async_job: AsyncJobGet,
184184
) -> web.Response:
185+
async_job_id = f"{async_job.job_id}"
185186
return create_data_response(
186187
TaskGet(
187-
task_id=f"{async_job.job_id}",
188-
task_name=f"{async_job.job_id}",
188+
task_id=async_job_id,
189+
task_name=async_job_id,
189190
status_href=f"{request.url.with_path(str(request.app.router['get_async_job_status'].url_for(task_id=async_job_id)))}",
190191
abort_href=f"{request.url.with_path(str(request.app.router['abort_async_job'].url_for(task_id=async_job_id)))}",
191192
result_href=f"{request.url.with_path(str(request.app.router['get_async_job_result'].url_for(task_id=async_job_id)))}",
@@ -240,41 +241,6 @@ async def batch_delete_paths(request: web.Request):
240241
return _create_data_response_from_async_job(request, async_job)
241242

242243

243-
@routes.post(
244-
f"{_storage_locations_prefix}/{{location_id}}/-/paths:batchDelete",
245-
name="batch_delete_paths",
246-
)
247-
@login_required
248-
@permission_required("storage.files.*")
249-
async def batch_delete_paths(
250-
request: web.Request,
251-
):
252-
req_ctx = RequestContext.model_validate(request)
253-
path_params = parse_request_path_parameters_as(StorageLocationPathParams, request)
254-
body = await parse_request_body_as(BatchDeletePathsBodyParams, request)
255-
256-
rabbitmq_rpc_client = get_rabbitmq_rpc_client(request.app)
257-
async_job, _ = await remote_delete_paths(
258-
rabbitmq_rpc_client,
259-
user_id=req_ctx.user_id,
260-
product_name=req_ctx.product_name,
261-
location_id=path_params.location_id,
262-
paths=body.paths,
263-
)
264-
265-
_job_id = f"{async_job.job_id}"
266-
return create_data_response(
267-
TaskGet(
268-
task_id=_job_id,
269-
task_name=_job_id,
270-
status_href=f"{request.url.with_path(str(request.app.router['get_async_job_status'].url_for(task_id=_job_id)))}",
271-
abort_href=f"{request.url.with_path(str(request.app.router['abort_async_job'].url_for(task_id=_job_id)))}",
272-
result_href=f"{request.url.with_path(str(request.app.router['get_async_job_result'].url_for(task_id=_job_id)))}",
273-
),
274-
status=status.HTTP_202_ACCEPTED,
275-
)
276-
277-
278244
@routes.get(
279245
_storage_locations_prefix + "/{location_id}/datasets", name="list_datasets_metadata"
280246
)

0 commit comments

Comments
 (0)