Skip to content

Commit 22f672f

Browse files
committed
api tests passing
1 parent bab906f commit 22f672f

File tree

3 files changed

+47
-30
lines changed

3 files changed

+47
-30
lines changed

services/director/src/simcore_service_director/api/rest/_services.py

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from models_library.generics import Envelope
66
from models_library.services_enums import ServiceType
77
from models_library.services_types import ServiceKey, ServiceVersion
8+
from pydantic import BaseModel
89
from servicelib.fastapi.dependencies import get_app
910

1011
from ... import exceptions, registry_proxy
@@ -14,7 +15,24 @@
1415
log = logging.getLogger(__name__)
1516

1617

17-
@router.get("/services")
18+
class _ErrorMessage(BaseModel):
19+
message: str
20+
21+
22+
@router.get(
23+
"/services",
24+
response_model=Envelope[list[dict[str, Any]]],
25+
responses={
26+
status.HTTP_401_UNAUTHORIZED: {
27+
"model": _ErrorMessage,
28+
"description": "Could not connect with Docker Registry",
29+
},
30+
status.HTTP_500_INTERNAL_SERVER_ERROR: {
31+
"model": _ErrorMessage,
32+
"description": "Unexpected error",
33+
},
34+
},
35+
)
1836
async def list_services(
1937
the_app: Annotated[FastAPI, Depends(get_app)],
2038
service_type: ServiceType | None = None,
@@ -29,11 +47,11 @@ async def list_services(
2947
services = await registry_proxy.list_services(
3048
the_app, registry_proxy.ServiceType.ALL
3149
)
32-
elif "computational" in service_type:
50+
elif service_type is ServiceType.COMPUTATIONAL:
3351
services = await registry_proxy.list_services(
3452
the_app, registry_proxy.ServiceType.COMPUTATIONAL
3553
)
36-
elif "interactive" in service_type:
54+
elif service_type is ServiceType.DYNAMIC:
3755
services = await registry_proxy.list_services(
3856
the_app, registry_proxy.ServiceType.DYNAMIC
3957
)
@@ -47,56 +65,57 @@ async def list_services(
4765
) from err
4866

4967

50-
@router.get("/services/{service_key:path}/{service_version}")
51-
async def get_service(
68+
# NOTE: be careful that /labels must be defined before the more generic get_service
69+
@router.get("/services/{service_key:path}/{service_version}/labels")
70+
async def list_service_labels(
5271
the_app: Annotated[FastAPI, Depends(get_app)],
5372
service_key: ServiceKey,
5473
service_version: ServiceVersion,
55-
) -> Envelope[list[dict[str, Any]]]:
74+
) -> Envelope[dict[str, Any]]:
5675
log.debug(
57-
"Client does get_service with service_key %s, service_version %s",
76+
"Retrieving service labels with service_key %s, service_version %s",
5877
service_key,
5978
service_version,
6079
)
6180
try:
62-
services = [
63-
await registry_proxy.get_image_details(
64-
the_app, service_key, service_version
65-
)
66-
]
67-
return Envelope[list[dict[str, Any]]](data=services)
81+
service_labels, _ = await registry_proxy.get_image_labels(
82+
the_app, service_key, service_version
83+
)
84+
return Envelope[dict[str, Any]](data=service_labels)
85+
6886
except exceptions.ServiceNotAvailableError as err:
6987
raise HTTPException(
7088
status_code=status.HTTP_404_NOT_FOUND, detail=f"{err}"
7189
) from err
90+
7291
except exceptions.RegistryConnectionError as err:
7392
raise HTTPException(
7493
status_code=status.HTTP_401_UNAUTHORIZED, detail=f"{err}"
7594
) from err
7695

7796

78-
@router.get("/services/{service_key:path}/{service_version}/labels")
79-
async def list_service_labels(
97+
@router.get("/services/{service_key:path}/{service_version}")
98+
async def get_service(
8099
the_app: Annotated[FastAPI, Depends(get_app)],
81100
service_key: ServiceKey,
82101
service_version: ServiceVersion,
83-
) -> Envelope[dict[str, Any]]:
102+
) -> Envelope[list[dict[str, Any]]]:
84103
log.debug(
85-
"Retrieving service labels with service_key %s, service_version %s",
104+
"Client does get_service with service_key %s, service_version %s",
86105
service_key,
87106
service_version,
88107
)
89108
try:
90-
service_labels, _ = await registry_proxy.get_image_labels(
91-
the_app, service_key, service_version
92-
)
93-
return Envelope[dict[str, Any]](data=service_labels)
94-
109+
services = [
110+
await registry_proxy.get_image_details(
111+
the_app, service_key, service_version
112+
)
113+
]
114+
return Envelope[list[dict[str, Any]]](data=services)
95115
except exceptions.ServiceNotAvailableError as err:
96116
raise HTTPException(
97117
status_code=status.HTTP_404_NOT_FOUND, detail=f"{err}"
98118
) from err
99-
100119
except exceptions.RegistryConnectionError as err:
101120
raise HTTPException(
102121
status_code=status.HTTP_401_UNAUTHORIZED, detail=f"{err}"

services/director/tests/unit/api/test_rest_service_extras.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ async def test_get_services_extras_by_key_and_version_with_empty_registry(
3333
resp = await client.get(
3434
f"/{api_version_prefix}/service_extras/simcore/services/dynamic/something/someversion"
3535
)
36-
assert resp.status_code == status.HTTP_404_NOT_FOUND, f"Got f{resp.text}"
36+
assert resp.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY, f"Got f{resp.text}"
3737
resp = await client.get(
3838
f"/{api_version_prefix}/service_extras/simcore/services/dynamic/something/1.5.2"
3939
)

services/director/tests/unit/api/test_rest_services.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,7 @@ async def test_get_service_bad_request(
9494
resp = await client.get(f"/{api_version_prefix}/services?service_type=blahblah")
9595
assert resp.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY, f"Got f{resp.text}"
9696

97-
services, error = _assert_response_and_unwrap_envelope(resp)
98-
assert not services
99-
assert error
97+
# NOTE: only successful errors are enveloped
10098

10199

102100
async def test_list_services_by_service_type(
@@ -119,7 +117,7 @@ async def test_list_services_by_service_type(
119117
assert services
120118
assert len(services) == 3
121119

122-
resp = await client.get(f"/{api_version_prefix}/services?service_type=interactive")
120+
resp = await client.get(f"/{api_version_prefix}/services?service_type=dynamic")
123121
assert resp.status_code == status.HTTP_200_OK, f"Got f{resp.text}"
124122

125123
services, error = _assert_response_and_unwrap_envelope(resp)
@@ -137,12 +135,12 @@ async def test_get_services_by_key_and_version_with_empty_registry(
137135
assert resp.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY, f"Got f{resp.text}"
138136

139137
resp = await client.get(
140-
f"/{api_version_prefix}/services/simcore/services/dynamic/something/someversion"
138+
f"/{api_version_prefix}/simcore/services/dynamic/something/someversion"
141139
)
142140
assert resp.status_code == status.HTTP_404_NOT_FOUND, f"Got f{resp.text}"
143141

144142
resp = await client.get(
145-
f"/{api_version_prefix}/services/simcore/services/dynamic/something/1.5.2"
143+
f"/{api_version_prefix}/simcore/services/dynamic/something/1.5.2"
146144
)
147145
assert resp.status_code == status.HTTP_404_NOT_FOUND, f"Got f{resp.text}"
148146

0 commit comments

Comments
 (0)