Skip to content

Commit 01c090f

Browse files
authored
♻️ Refactor simcore_service_catalog: Apply Layered Architecture and Initialization Cleanup (#7491)
1 parent cc560d3 commit 01c090f

File tree

68 files changed

+649
-538
lines changed

Some content is hidden

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

68 files changed

+649
-538
lines changed

packages/models-library/src/models_library/api_schemas_directorv2/services.py

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Final
22

3-
from pydantic import BaseModel, ConfigDict, Field, field_validator
3+
from pydantic import BaseModel, ConfigDict, Field, JsonValue, field_validator
4+
from pydantic.config import JsonDict
45
from pydantic.types import ByteSize, NonNegativeInt
56

67
from ..service_settings_labels import ContainerSpec
@@ -63,36 +64,43 @@ class ServiceExtras(BaseModel):
6364
service_build_details: ServiceBuildDetails | None = None
6465
container_spec: ContainerSpec | None = None
6566

67+
@staticmethod
68+
def _update_json_schema_extra(schema: JsonDict) -> None:
69+
70+
node_requirements_examples = NodeRequirements.model_json_schema()["examples"]
71+
72+
examples: list[JsonValue] = [
73+
{"node_requirements": node_example}
74+
for node_example in node_requirements_examples
75+
]
76+
examples += [
77+
{
78+
"node_requirements": node_example,
79+
"service_build_details": {
80+
"build_date": "2021-08-13T12:56:28Z",
81+
"vcs_ref": "8251ade",
82+
"vcs_url": "[email protected]:ITISFoundation/osparc-simcore.git",
83+
},
84+
}
85+
for node_example in node_requirements_examples
86+
]
87+
examples += [
88+
{
89+
"node_requirements": node_example,
90+
"service_build_details": {
91+
"build_date": "2021-08-13T12:56:28Z",
92+
"vcs_ref": "8251ade",
93+
"vcs_url": "[email protected]:ITISFoundation/osparc-simcore.git",
94+
},
95+
"container_spec": {"Command": ["run", "subcommand"]},
96+
}
97+
for node_example in node_requirements_examples
98+
]
99+
100+
schema.update({"examples": examples})
101+
66102
model_config = ConfigDict(
67-
json_schema_extra={
68-
"examples": [
69-
{"node_requirements": node_example}
70-
for node_example in NodeRequirements.model_json_schema()["examples"]
71-
]
72-
+ [
73-
{
74-
"node_requirements": node_example,
75-
"service_build_details": {
76-
"build_date": "2021-08-13T12:56:28Z",
77-
"vcs_ref": "8251ade",
78-
"vcs_url": "[email protected]:ITISFoundation/osparc-simcore.git",
79-
},
80-
}
81-
for node_example in NodeRequirements.model_json_schema()["examples"]
82-
]
83-
+ [
84-
{
85-
"node_requirements": node_example,
86-
"service_build_details": {
87-
"build_date": "2021-08-13T12:56:28Z",
88-
"vcs_ref": "8251ade",
89-
"vcs_url": "[email protected]:ITISFoundation/osparc-simcore.git",
90-
},
91-
"container_spec": {"Command": ["run", "subcommand"]},
92-
}
93-
for node_example in NodeRequirements.model_json_schema()["examples"]
94-
]
95-
}
103+
json_schema_extra=_update_json_schema_extra,
96104
)
97105

98106

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/catalog/errors.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ class CatalogApiBaseError(OsparcErrorMixin, Exception):
55
pass
66

77

8+
class CatalogInconsistentError(CatalogApiBaseError):
9+
msg_template = "Catalog is inconsistent: The following services are in the database but missing in the registry manifest {missing_services}"
10+
11+
812
class CatalogItemNotFoundError(CatalogApiBaseError):
913
msg_template = "{name} was not found"
1014

services/catalog/src/simcore_service_catalog/api/dependencies/director.py renamed to services/catalog/src/simcore_service_catalog/api/_dependencies/director.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
from fastapi import Depends, FastAPI
44
from servicelib.fastapi.dependencies import get_app
55

6-
from ...services.director import DirectorApi
6+
from ...clients.director import DirectorClient
77

88

9-
def get_director_api(
9+
def get_director_client(
1010
app: Annotated[FastAPI, Depends(get_app)],
11-
) -> DirectorApi:
12-
director: DirectorApi = app.state.director_api
11+
) -> DirectorClient:
12+
director: DirectorClient = app.state.director_api
1313
return director

services/catalog/src/simcore_service_catalog/api/dependencies/database.py renamed to services/catalog/src/simcore_service_catalog/api/_dependencies/repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from fastapi.requests import Request
77
from sqlalchemy.ext.asyncio import AsyncEngine
88

9-
from ...db.repositories._base import BaseRepository
9+
from ...repository._base import BaseRepository
1010

1111
_logger = logging.getLogger(__name__)
1212

services/catalog/src/simcore_service_catalog/api/dependencies/services.py renamed to services/catalog/src/simcore_service_catalog/api/_dependencies/services.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212
from pydantic import ValidationError
1313
from servicelib.fastapi.dependencies import get_app
1414

15+
from ...clients.director import DirectorClient
1516
from ...core.settings import ApplicationSettings
16-
from ...db.repositories.groups import GroupsRepository
17-
from ...db.repositories.services import ServicesRepository
18-
from ...services import manifest
19-
from ...services.director import DirectorApi
20-
from .database import get_repository
21-
from .director import get_director_api
17+
from ...repository.groups import GroupsRepository
18+
from ...repository.services import ServicesRepository
19+
from ...service import manifest
20+
from .director import get_director_client
21+
from .repository import get_repository
2222

2323
_logger = logging.getLogger(__name__)
2424

2525

2626
def get_default_service_resources(
27-
app: Annotated[FastAPI, Depends(get_app)]
27+
app: Annotated[FastAPI, Depends(get_app)],
2828
) -> ResourcesDict:
2929
app_settings: ApplicationSettings = app.state.settings
3030
return app_settings.CATALOG_SERVICES_DEFAULT_RESOURCES
3131

3232

3333
def get_default_service_specifications(
34-
app: Annotated[FastAPI, Depends(get_app)]
34+
app: Annotated[FastAPI, Depends(get_app)],
3535
) -> ServiceSpecifications:
3636
app_settings: ApplicationSettings = app.state.settings
3737
return app_settings.CATALOG_SERVICES_DEFAULT_SPECIFICATIONS
@@ -86,7 +86,7 @@ async def check_service_read_access(
8686
async def get_service_from_manifest(
8787
service_key: ServiceKey,
8888
service_version: ServiceVersion,
89-
director_client: Annotated[DirectorApi, Depends(get_director_api)],
89+
director_client: Annotated[DirectorClient, Depends(get_director_client)],
9090
) -> ServiceMetaDataPublished:
9191
"""
9292
Retrieves service metadata from the docker registry via the director

services/catalog/src/simcore_service_catalog/api/dependencies/user_groups.py renamed to services/catalog/src/simcore_service_catalog/api/_dependencies/user_groups.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
from models_library.groups import GroupAtDB
55
from models_library.users import UserID
66

7-
from ...db.repositories.groups import GroupsRepository
8-
from .database import get_repository
7+
from ...repository.groups import GroupsRepository
8+
from .repository import get_repository
99

1010

1111
async def list_user_groups(
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from fastapi import FastAPI
2+
3+
from .errors import setup_rest_api_error_handlers
4+
from .routes import setup_rest_api_routes
5+
6+
7+
def initialize_rest_api(app: FastAPI):
8+
9+
setup_rest_api_routes(app)
10+
setup_rest_api_error_handlers(app)

services/catalog/src/simcore_service_catalog/api/rest/_services.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
LIST_SERVICES_CACHING_TTL,
2121
RESPONSE_MODEL_POLICY,
2222
)
23-
from ...db.repositories.groups import GroupsRepository
24-
from ...db.repositories.services import ServicesRepository
23+
from ...clients.director import DirectorClient
2524
from ...models.services_db import ServiceAccessRightsAtDB, ServiceMetaDataDBGet
26-
from ...services.director import DirectorApi
27-
from ..dependencies.database import get_repository
28-
from ..dependencies.director import get_director_api
29-
from ..dependencies.services import get_service_from_manifest
25+
from ...repository.groups import GroupsRepository
26+
from ...repository.services import ServicesRepository
27+
from .._dependencies.director import get_director_client
28+
from .._dependencies.repository import get_repository
29+
from .._dependencies.services import get_service_from_manifest
3030

3131
_logger = logging.getLogger(__name__)
3232

@@ -86,7 +86,7 @@ async def list_services(
8686
request: Request, # pylint:disable=unused-argument
8787
*,
8888
user_id: PositiveInt,
89-
director_client: Annotated[DirectorApi, Depends(get_director_api)],
89+
director_client: Annotated[DirectorClient, Depends(get_director_client)],
9090
groups_repository: Annotated[
9191
GroupsRepository, Depends(get_repository(GroupsRepository))
9292
],

services/catalog/src/simcore_service_catalog/api/rest/_services_access_rights.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88
from models_library.services import ServiceKey, ServiceVersion
99

1010
from ..._constants import RESPONSE_MODEL_POLICY
11-
from ...db.repositories.services import ServicesRepository
12-
from ...models.services_db import ServiceAccessRightsAtDB
13-
from ..dependencies.database import get_repository
14-
from ..dependencies.services import AccessInfo, check_service_read_access
11+
from ...repository.services import ServicesRepository
12+
from .._dependencies.repository import get_repository
13+
from .._dependencies.services import AccessInfo, check_service_read_access
1514

1615
_logger = logging.getLogger(__name__)
1716

@@ -33,10 +32,10 @@ async def get_service_access_rights(
3332
],
3433
x_simcore_products_name: Annotated[str, Header(...)],
3534
):
36-
service_access_rights: list[
37-
ServiceAccessRightsAtDB
38-
] = await services_repo.get_service_access_rights(
39-
key=service_key, version=service_version, product_name=x_simcore_products_name
35+
service_access_rights = await services_repo.get_service_access_rights(
36+
key=service_key,
37+
version=service_version,
38+
product_name=x_simcore_products_name,
4039
)
4140

4241
gids_with_access_rights = {}

0 commit comments

Comments
 (0)