Skip to content

Commit e81328e

Browse files
author
Andrei Neagu
committed
Merge remote-tracking branch 'upstream/master' into pr-osparc-long-running-tasks-refactor-6
2 parents 9db9e83 + 5f20287 commit e81328e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+155
-154
lines changed

packages/service-library/src/servicelib/aiohttp/rest_middlewares.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def handle_aiohttp_web_http_error(
118118
exception.content_type = MIMETYPE_APPLICATION_JSON
119119
if exception.reason:
120120
exception.set_status(
121-
exception.status, safe_status_message(message=exception.reason)
121+
exception.status, reason=safe_status_message(message=exception.reason)
122122
)
123123

124124
if not exception.text or not is_enveloped_from_text(exception.text):
@@ -165,7 +165,7 @@ def _handle_aiohttp_web_http_successful(
165165
exception.content_type = MIMETYPE_APPLICATION_JSON
166166
if exception.reason:
167167
exception.set_status(
168-
exception.status, safe_status_message(message=exception.reason)
168+
exception.status, reason=safe_status_message(message=exception.reason)
169169
)
170170

171171
if exception.text and not is_enveloped_from_text(exception.text):

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/notifier/_notifier.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
)
1212
from models_library.api_schemas_webserver.projects_nodes import NodeGet, NodeGetIdle
1313
from models_library.api_schemas_webserver.socketio import SocketIORoomStr
14-
from models_library.users import UserID
14+
from models_library.projects import ProjectID
1515
from servicelib.fastapi.app_state import SingletonInAppStateMixin
1616
from servicelib.services_utils import get_status_as_dict
1717

@@ -23,20 +23,22 @@ def __init__(self, sio_manager: socketio.AsyncAioPikaManager):
2323
self._sio_manager = sio_manager
2424

2525
async def notify_service_status(
26-
self, user_id: UserID, status: NodeGet | DynamicServiceGet | NodeGetIdle
26+
self, project_id: ProjectID, status: NodeGet | DynamicServiceGet | NodeGetIdle
2727
) -> None:
2828
await self._sio_manager.emit(
2929
SOCKET_IO_SERVICE_STATUS_EVENT,
3030
data=jsonable_encoder(get_status_as_dict(status)),
31-
room=SocketIORoomStr.from_user_id(user_id),
31+
room=SocketIORoomStr.from_project_id(project_id),
3232
)
3333

3434

3535
async def notify_service_status_change(
36-
app: FastAPI, user_id: UserID, status: NodeGet | DynamicServiceGet | NodeGetIdle
36+
app: FastAPI,
37+
project_id: ProjectID,
38+
status: NodeGet | DynamicServiceGet | NodeGetIdle,
3739
) -> None:
3840
notifier: Notifier = Notifier.get_from_app_state(app)
39-
await notifier.notify_service_status(user_id=user_id, status=status)
41+
await notifier.notify_service_status(project_id=project_id, status=status)
4042

4143

4244
async def lifespan(app: FastAPI) -> AsyncIterator[State]:

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/service_tracker/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from ._api import (
22
NORMAL_RATE_POLL_INTERVAL,
33
get_all_tracked_services,
4+
get_project_id_for_service,
45
get_tracked_service,
5-
get_user_id_for_service,
66
remove_tracked_service,
77
set_frontend_notified_for_service,
88
set_if_status_changed_for_service,
@@ -17,11 +17,11 @@
1717

1818
__all__: tuple[str, ...] = (
1919
"get_all_tracked_services",
20+
"get_project_id_for_service",
2021
"get_tracked_service",
21-
"get_user_id_for_service",
22-
"service_tracker_lifespan",
2322
"NORMAL_RATE_POLL_INTERVAL",
2423
"remove_tracked_service",
24+
"service_tracker_lifespan",
2525
"set_frontend_notified_for_service",
2626
"set_if_status_changed_for_service",
2727
"set_request_as_running",

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/service_tracker/_api.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@
1111
DynamicServiceStop,
1212
)
1313
from models_library.api_schemas_webserver.projects_nodes import NodeGet, NodeGetIdle
14+
from models_library.projects import ProjectID
1415
from models_library.projects_nodes_io import NodeID
1516
from models_library.services_enums import ServiceState
16-
from models_library.users import UserID
1717
from servicelib.deferred_tasks import TaskUID
1818

19-
from ._models import SchedulerServiceState, TrackedServiceModel, UserRequestedState
19+
from ._models import (
20+
SchedulerServiceState,
21+
TrackedServiceModel,
22+
UserRequestedState,
23+
)
2024
from ._setup import get_tracker
2125

2226
_logger = logging.getLogger(__name__)
@@ -242,7 +246,7 @@ async def get_all_tracked_services(app: FastAPI) -> dict[NodeID, TrackedServiceM
242246
return await get_tracker(app).all()
243247

244248

245-
async def get_user_id_for_service(app: FastAPI, node_id: NodeID) -> UserID | None:
246-
"""returns user_id for the service"""
249+
async def get_project_id_for_service(app: FastAPI, node_id: NodeID) -> ProjectID | None:
250+
"""returns project_id for the service"""
247251
model: TrackedServiceModel | None = await get_tracker(app).load(node_id)
248-
return model.user_id if model else None
252+
return model.project_id if model else None

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/status_monitor/_deferred_get_status.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
RunningDynamicServiceDetails,
88
)
99
from models_library.api_schemas_webserver.projects_nodes import NodeGet, NodeGetIdle
10+
from models_library.projects import ProjectID
1011
from models_library.projects_nodes_io import NodeID
11-
from models_library.users import UserID
1212
from servicelib.deferred_tasks import BaseDeferredHandler, TaskUID
1313
from servicelib.deferred_tasks._base_deferred_handler import DeferredContext
1414

@@ -69,15 +69,15 @@ async def on_result(
6969
if await service_tracker.should_notify_frontend_for_service(
7070
app, node_id, status_changed=status_changed
7171
):
72-
user_id: UserID | None = await service_tracker.get_user_id_for_service(
73-
app, node_id
72+
project_id: ProjectID | None = (
73+
await service_tracker.get_project_id_for_service(app, node_id)
7474
)
75-
if user_id:
76-
await notify_service_status_change(app, user_id, result)
75+
if project_id:
76+
await notify_service_status_change(app, project_id, result)
7777
await service_tracker.set_frontend_notified_for_service(app, node_id)
7878
else:
7979
_logger.info(
80-
"Did not find a user for '%s', skipping status delivery of: %s",
80+
"Did not find a project for '%s', skipping status delivery of: %s",
8181
node_id,
8282
result,
8383
)

services/web/server/src/simcore_service_webserver/api_keys/_service.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ async def get_api_key(
7777
if api_key is not None:
7878
return api_key
7979

80-
raise ApiKeyNotFoundError(api_key_id=api_key_id)
80+
raise ApiKeyNotFoundError(
81+
api_key_id=api_key_id, product_name=product_name, user_id=user_id
82+
)
8183

8284

8385
async def list_api_keys(
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from ..errors import WebServerBaseError
22

33

4-
class ApiKeysValueError(WebServerBaseError, ValueError):
5-
...
4+
class ApiKeysValueError(WebServerBaseError, ValueError): ...
65

76

87
class ApiKeyDuplicatedDisplayNameError(ApiKeysValueError):
9-
msg_template = "API Key with display name '{display_name}' already exists. {reason}"
8+
msg_template = (
9+
"API Key with display name '{display_name}' already exists: {details}"
10+
)
1011

1112

1213
class ApiKeyNotFoundError(ApiKeysValueError):
13-
msg_template = "API Key with ID '{api_key_id}' not found. {reason}"
14+
msg_template = "API Key with ID '{api_key_id}' not found: {details}"

services/web/server/src/simcore_service_webserver/director_v2/_client_base.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import aiohttp
55
from aiohttp import ClientSession, ClientTimeout, web
66
from servicelib.aiohttp import status
7+
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
78
from tenacity import retry
89
from tenacity.before_sleep import before_sleep_log
910
from tenacity.stop import stop_after_attempt
@@ -36,13 +37,14 @@
3637

3738

3839
def _get_exception_from(
39-
status_code: int, on_error: _StatusToExceptionMapping | None, reason: str, url: URL
40+
status_code: int, on_error: _StatusToExceptionMapping | None, details: str, url: URL
4041
):
4142
if on_error and status_code in on_error:
42-
exc, exc_ctx = on_error[status_code]
43-
return exc(**exc_ctx, status=status_code, reason=reason)
43+
exc_cls, exc_ctx = on_error[status_code]
44+
return exc_cls(**exc_ctx, status=status_code, details=details)
45+
4446
# default
45-
return DirectorV2ServiceError(status=status_code, reason=reason, url=url)
47+
return DirectorV2ServiceError(status=status_code, details=details, url=url)
4648

4749

4850
@retry(**DEFAULT_RETRY_POLICY)
@@ -61,13 +63,13 @@ async def _make_request(
6163
) as response:
6264
payload: dict[str, Any] | list[dict[str, Any]] | None | str = (
6365
await response.json()
64-
if response.content_type == "application/json"
66+
if response.content_type == MIMETYPE_APPLICATION_JSON
6567
else await response.text()
6668
)
6769

6870
if response.status != expected_status.status_code:
6971
raise _get_exception_from(
70-
response.status, on_error, reason=f"{payload}", url=url
72+
response.status, on_error, details=f"{payload}", url=url
7173
)
7274
return payload
7375

@@ -99,13 +101,13 @@ async def request_director_v2(
99101
except TimeoutError as err:
100102
raise DirectorV2ServiceError(
101103
status=status.HTTP_503_SERVICE_UNAVAILABLE,
102-
reason=f"request to director-v2 timed-out: {err}",
104+
details=f"request to director-v2 timed-out: {err}",
103105
url=url,
104106
) from err
105107

106108
except aiohttp.ClientError as err:
107109
raise DirectorV2ServiceError(
108110
status=status.HTTP_503_SERVICE_UNAVAILABLE,
109-
reason=f"request to director-v2 service unexpected error {err}",
111+
details=f"request to director-v2 service unexpected error {err}",
110112
url=url,
111113
) from err

services/web/server/src/simcore_service_webserver/director_v2/_controller/_rest_exceptions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ async def _handler_director_service_error_as_503_or_4xx(
9595
WalletNotEnoughCreditsError: HttpErrorInfo(
9696
status.HTTP_402_PAYMENT_REQUIRED,
9797
user_message(
98-
"Your wallet does not have sufficient credits to run this computation. {reason}",
98+
"Your wallet does not have sufficient credits to run this computation: {details}",
9999
_version=1,
100100
),
101101
),

services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ async def start_computation(request: web.Request) -> web.Response:
9595
now = datetime.now(UTC)
9696
if now - created_at > timedelta(minutes=5):
9797
raise web.HTTPBadRequest(
98-
reason=(
98+
text=(
9999
"This client generated collection is not new, "
100100
"it was created more than 5 minutes ago. "
101101
"Therefore, the client is probably wrongly generating it."

0 commit comments

Comments
 (0)