77import random
88from datetime import timezone
99from pathlib import Path
10- from typing import (
11- Any ,
12- AsyncIterator ,
13- Awaitable ,
14- Callable ,
15- Final ,
16- Iterator ,
17- Optional ,
18- Union ,
19- cast ,
20- )
10+ from typing import Any , AsyncIterator , Awaitable , Callable , Final , Iterator , cast
2111
2212import aiodocker
2313import httpx
@@ -186,7 +176,6 @@ def service_monitored_labels(
186176
187177@pytest .fixture
188178async def async_client (initialized_app : FastAPI ) -> AsyncIterator [httpx .AsyncClient ]:
189-
190179 async with httpx .AsyncClient (
191180 app = initialized_app ,
192181 base_url = f"http://{ initialized_app .title } .testserver.io" ,
@@ -218,25 +207,35 @@ async def host_node(
218207
219208
220209@pytest .fixture
221- def fake_node (faker : Faker ) -> Node :
222- return Node (
223- ID = faker .uuid4 (),
224- Version = ObjectVersion (Index = faker .pyint ()),
225- CreatedAt = faker .date_time (tzinfo = timezone .utc ).isoformat (),
226- UpdatedAt = faker .date_time (tzinfo = timezone .utc ).isoformat (),
227- Description = NodeDescription (
228- Hostname = faker .pystr (),
229- Resources = ResourceObject (
230- NanoCPUs = int (9 * 1e9 ), MemoryBytes = 256 * 1024 * 1024 * 1024
210+ def create_fake_node (faker : Faker ) -> Callable [..., Node ]:
211+ def _creator (** node_overrides ) -> Node :
212+ default_config = dict (
213+ ID = faker .uuid4 (),
214+ Version = ObjectVersion (Index = faker .pyint ()),
215+ CreatedAt = faker .date_time (tzinfo = timezone .utc ).isoformat (),
216+ UpdatedAt = faker .date_time (tzinfo = timezone .utc ).isoformat (),
217+ Description = NodeDescription (
218+ Hostname = faker .pystr (),
219+ Resources = ResourceObject (
220+ NanoCPUs = int (9 * 1e9 ), MemoryBytes = 256 * 1024 * 1024 * 1024
221+ ),
231222 ),
232- ),
233- Spec = NodeSpec (
234- Name = None ,
235- Labels = None ,
236- Role = None ,
237- Availability = Availability .drain ,
238- ),
239- )
223+ Spec = NodeSpec (
224+ Name = None ,
225+ Labels = None ,
226+ Role = None ,
227+ Availability = Availability .drain ,
228+ ),
229+ )
230+ default_config .update (** node_overrides )
231+ return Node (** default_config )
232+
233+ return _creator
234+
235+
236+ @pytest .fixture
237+ def fake_node (create_fake_node : Callable [..., Node ]) -> Node :
238+ return create_fake_node ()
240239
241240
242241@pytest .fixture
@@ -254,7 +253,7 @@ def task_template() -> dict[str, Any]:
254253
255254@pytest .fixture
256255def create_task_reservations () -> Callable [[NUM_CPUS , int ], dict [str , Any ]]:
257- def _creator (num_cpus : NUM_CPUS , memory : Union [ ByteSize , int ] ) -> dict [str , Any ]:
256+ def _creator (num_cpus : NUM_CPUS , memory : ByteSize | int ) -> dict [str , Any ]:
258257 return {
259258 "Resources" : {
260259 "Reservations" : {
@@ -269,7 +268,7 @@ def _creator(num_cpus: NUM_CPUS, memory: Union[ByteSize, int]) -> dict[str, Any]
269268
270269@pytest .fixture
271270def create_task_limits () -> Callable [[NUM_CPUS , int ], dict [str , Any ]]:
272- def _creator (num_cpus : NUM_CPUS , memory : Union [ ByteSize , int ] ) -> dict [str , Any ]:
271+ def _creator (num_cpus : NUM_CPUS , memory : ByteSize | int ) -> dict [str , Any ]:
273272 return {
274273 "Resources" : {
275274 "Limits" : {
@@ -288,13 +287,13 @@ async def create_service(
288287 docker_swarm : None ,
289288 faker : Faker ,
290289) -> AsyncIterator [
291- Callable [[dict [str , Any ], Optional [ dict [str , str ]] ], Awaitable [Service ]]
290+ Callable [[dict [str , Any ], dict [str , str ] | None ], Awaitable [Service ]]
292291]:
293292 created_services = []
294293
295294 async def _creator (
296295 task_template : dict [str , Any ],
297- labels : Optional [ dict [str , str ]] = None ,
296+ labels : dict [str , str ] | None = None ,
298297 wait_for_service_state = "running" ,
299298 ) -> Service :
300299 service_name = f"pytest_{ faker .pystr ()} "
@@ -353,6 +352,7 @@ async def _creator(
353352 await asyncio .gather (
354353 * (async_docker_client .services .delete (s .ID ) for s in created_services )
355354 )
355+
356356 # wait until all tasks are gone
357357 @retry (
358358 retry = retry_if_exception_type (AssertionError ),
0 commit comments