Skip to content

Commit 74e63ad

Browse files
committed
use catalog_service in ports listing
1 parent 0135da6 commit 74e63ad

File tree

3 files changed

+21
-65
lines changed

3 files changed

+21
-65
lines changed

services/api-server/src/simcore_service_api_server/api/routes/solvers.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@
2020
from ...models.schemas.errors import ErrorGet
2121
from ...models.schemas.model_adapter import ServicePricingPlanGetLegacy
2222
from ...models.schemas.solvers import Solver, SolverKeyId, SolverPort
23-
from ...services_http.catalog import CatalogApi
2423
from ..dependencies.application import get_reverse_url_mapper
2524
from ..dependencies.authentication import get_current_user_id, get_product_name
26-
from ..dependencies.services import get_api_client
2725
from ..dependencies.webserver_http import AuthSession, get_webserver_session
2826
from ._constants import (
2927
FMSG_CHANGELOG_NEW_IN_VERSION,
@@ -336,16 +334,17 @@ async def list_solver_ports(
336334
solver_key: SolverKeyId,
337335
version: VersionStr,
338336
user_id: Annotated[int, Depends(get_current_user_id)],
339-
catalog_client: Annotated[CatalogApi, Depends(get_api_client(CatalogApi))],
337+
catalog_service: Annotated[CatalogService, Depends()],
340338
product_name: Annotated[str, Depends(get_product_name)],
341339
):
342-
ports = await catalog_client.get_service_ports(
340+
ports = await catalog_service.get_service_ports(
343341
user_id=user_id,
344342
name=solver_key,
345343
version=version,
346344
product_name=product_name,
347345
)
348346

347+
ports = [SolverPort.model_validate(port.model_dump()) for port in ports]
349348
return OnePage[SolverPort].model_validate(dict(items=ports))
350349

351350

services/api-server/src/simcore_service_api_server/services_http/catalog.py

Lines changed: 1 addition & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
import asyncio
21
import logging
32
import urllib.parse
4-
from collections.abc import Callable
53
from dataclasses import dataclass
64
from functools import partial
75
from typing import Final, Literal
86

97
from fastapi import FastAPI, status
108
from models_library.emails import LowerCaseEmailStr
119
from models_library.products import ProductName
12-
from models_library.services import ServiceMetaDataPublished, ServiceType
10+
from models_library.services import ServiceMetaDataPublished
1311
from models_library.users import UserID
1412
from pydantic import ConfigDict, TypeAdapter
1513
from settings_library.catalog import CatalogSettings
1614
from settings_library.tracing import TracingSettings
1715

1816
from ..exceptions.backend_errors import (
19-
ListSolversOrStudiesError,
2017
ProgramOrSolverOrStudyNotFoundError,
2118
)
2219
from ..exceptions.service_errors_utils import service_exception_mapper
@@ -107,43 +104,6 @@ class CatalogApi(BaseServiceClientApi):
107104
SEE osparc-simcore/services/catalog/openapi.json
108105
"""
109106

110-
@_exception_mapper(
111-
http_status_map={status.HTTP_404_NOT_FOUND: ListSolversOrStudiesError}
112-
)
113-
async def list_services(
114-
self,
115-
*,
116-
user_id: int,
117-
product_name: str,
118-
predicate: Callable[[TruncatedCatalogServiceOut], bool] | None = None,
119-
type_filter: ServiceTypes,
120-
) -> list[TruncatedCatalogServiceOut]:
121-
122-
response = await self.client.get(
123-
"/services",
124-
params={"user_id": user_id, "details": True},
125-
headers={"x-simcore-products-name": product_name},
126-
)
127-
response.raise_for_status()
128-
129-
services: list[
130-
TruncatedCatalogServiceOut
131-
] = await asyncio.get_event_loop().run_in_executor(
132-
None,
133-
_parse_response,
134-
TruncatedCatalogServiceOutListAdapter,
135-
response,
136-
)
137-
138-
services = [
139-
service
140-
for service in services
141-
if service.service_type == ServiceType[type_filter]
142-
]
143-
if predicate is not None:
144-
services = [service for service in services if predicate(service)]
145-
return services
146-
147107
@_exception_mapper(
148108
http_status_map={status.HTTP_404_NOT_FOUND: ProgramOrSolverOrStudyNotFoundError}
149109
)
@@ -171,25 +131,6 @@ async def get_service_ports(
171131

172132
return TypeAdapter(list[SolverPort]).validate_python(response.json())
173133

174-
async def list_service_releases(
175-
self,
176-
*,
177-
user_id: int,
178-
solver_key: SolverKeyId,
179-
product_name: str,
180-
) -> list[Solver]:
181-
def _this_solver(solver: Solver) -> bool:
182-
return solver.id == solver_key
183-
184-
services = await self.list_services(
185-
user_id=user_id,
186-
predicate=None,
187-
product_name=product_name,
188-
type_filter="COMPUTATIONAL",
189-
)
190-
solvers = [service.to_solver() for service in services]
191-
return [solver for solver in solvers if _this_solver(solver)]
192-
193134

194135
# MODULES APP SETUP -------------------------------------------------------------
195136

services/api-server/tests/unit/api_solvers/test_api_routers_solvers.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import httpx
99
import pytest
1010
import simcore_service_api_server.api.routes.solvers
11+
from pydantic import TypeAdapter
1112
from pytest_mock import MockFixture
1213
from respx import MockRouter
1314
from simcore_service_api_server._meta import API_VTAG
14-
from simcore_service_api_server.models.schemas.solvers import Solver
15+
from simcore_service_api_server.models.pagination import OnePage
16+
from simcore_service_api_server.models.schemas.solvers import Solver, SolverPort
1517
from starlette import status
1618

1719

@@ -140,3 +142,17 @@ async def test_list_solver_releases_with_mocked_catalog(
140142
solver_key = "simcore/services/comp/itis/sleeper"
141143
response = await client.get(f"/{API_VTAG}/solvers/{solver_key}/releases", auth=auth)
142144
assert response.status_code == status.HTTP_200_OK
145+
146+
147+
async def test_list_solver_ports_with_mocked_catalog(
148+
client: httpx.AsyncClient,
149+
mocked_rpc_catalog_service_api: dict,
150+
auth: httpx.BasicAuth,
151+
):
152+
solver_key = "simcore/services/comp/itis/sleeper"
153+
solver_version = "3.2.1"
154+
response = await client.get(
155+
f"/{API_VTAG}/solvers/{solver_key}/releases/{solver_version}/ports", auth=auth
156+
)
157+
assert response.status_code == status.HTTP_200_OK
158+
assert TypeAdapter(OnePage[SolverPort]).validate_python(response.json())

0 commit comments

Comments
 (0)