77
88
99import urllib .parse
10+ from collections .abc import Callable
1011from typing import Any
1112
13+ import httpx
1214import pytest
1315from fastapi import FastAPI
1416from models_library .services_metadata_published import ServiceMetaDataPublished
@@ -57,7 +59,6 @@ async def test_director_client_high_level_api(
5759 await director_api .get_service (expected_service .key , expected_service .version )
5860 == expected_service
5961 )
60- # TODO: error handling!
6162
6263
6364async def test_director_client_low_level_api (
@@ -84,3 +85,78 @@ async def test_director_client_low_level_api(
8485 f"/services/{ urllib .parse .quote_plus (key )} /{ version } "
8586 )
8687 assert service
88+
89+
90+ async def test_director_client_get_service_extras_with_org_labels (
91+ repository_lifespan_disabled : None ,
92+ background_task_lifespan_disabled : None ,
93+ rabbitmq_and_rpc_setup_disabled : None ,
94+ mocked_director_rest_api : MockRouter ,
95+ expected_director_rest_api_list_services : list [dict [str , Any ]],
96+ app : FastAPI ,
97+ ):
98+ director_api = get_director_client (app )
99+
100+ expected_service = expected_director_rest_api_list_services [0 ]
101+ key = expected_service ["key" ]
102+ version = expected_service ["version" ]
103+
104+ service_extras = await director_api .get_service_extras (key , version )
105+
106+ # Check node requirements are present
107+ assert service_extras .node_requirements is not None
108+ assert service_extras .node_requirements .cpu > 0
109+ assert service_extras .node_requirements .ram > 0
110+
111+ # Check service build details are present (since we have org.label-schema labels)
112+ assert service_extras .service_build_details is not None
113+ assert service_extras .service_build_details .build_date == "2023-04-17T08:04:15Z"
114+ assert (
115+ service_extras .service_build_details .vcs_ref
116+ == "4d79449a2e79f8a3b3b2e1dd0290af9f3d1a8792"
117+ )
118+ assert (
119+ service_extras .service_build_details .vcs_url
120+ == "https://github.com/ITISFoundation/jupyter-math.git"
121+ )
122+
123+
124+ async def test_director_client_get_service_extras_without_org_labels (
125+ repository_lifespan_disabled : None ,
126+ background_task_lifespan_disabled : None ,
127+ rabbitmq_and_rpc_setup_disabled : None ,
128+ mocked_director_rest_api_base : MockRouter ,
129+ expected_director_rest_api_list_services : list [dict [str , Any ]],
130+ get_mocked_service_labels : Callable [[str , str , bool ], dict ],
131+ app : FastAPI ,
132+ ):
133+ # Setup mock without org.label-schema labels
134+ expected_service = expected_director_rest_api_list_services [0 ]
135+ service_key = expected_service ["key" ]
136+ service_version = expected_service ["version" ]
137+
138+ # Mock the labels endpoint without org labels
139+ @mocked_director_rest_api_base .get (
140+ path__regex = r"^/services/(?P<service_key>[/\w-]+)/(?P<service_version>[0-9\.]+)/labels$" ,
141+ name = "get_service_labels_no_org" ,
142+ )
143+ def _get_service_labels_no_org (request , service_key , service_version ):
144+ return httpx .Response (
145+ status_code = 200 ,
146+ json = {
147+ "data" : get_mocked_service_labels (
148+ service_key , service_version , include_org_labels = False
149+ )
150+ },
151+ )
152+
153+ director_api = get_director_client (app )
154+ service_extras = await director_api .get_service_extras (service_key , service_version )
155+
156+ # Check node requirements are present
157+ assert service_extras .node_requirements is not None
158+ assert service_extras .node_requirements .cpu > 0
159+ assert service_extras .node_requirements .ram > 0
160+
161+ # Check service build details are NOT present (since we don't have org.label-schema labels)
162+ assert service_extras .service_build_details is None
0 commit comments