7
7
import random
8
8
from datetime import timezone
9
9
from 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
21
11
22
12
import aiodocker
23
13
import httpx
@@ -186,7 +176,6 @@ def service_monitored_labels(
186
176
187
177
@pytest .fixture
188
178
async def async_client (initialized_app : FastAPI ) -> AsyncIterator [httpx .AsyncClient ]:
189
-
190
179
async with httpx .AsyncClient (
191
180
app = initialized_app ,
192
181
base_url = f"http://{ initialized_app .title } .testserver.io" ,
@@ -218,25 +207,35 @@ async def host_node(
218
207
219
208
220
209
@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
+ ),
231
222
),
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 ()
240
239
241
240
242
241
@pytest .fixture
@@ -254,7 +253,7 @@ def task_template() -> dict[str, Any]:
254
253
255
254
@pytest .fixture
256
255
def 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 ]:
258
257
return {
259
258
"Resources" : {
260
259
"Reservations" : {
@@ -269,7 +268,7 @@ def _creator(num_cpus: NUM_CPUS, memory: Union[ByteSize, int]) -> dict[str, Any]
269
268
270
269
@pytest .fixture
271
270
def 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 ]:
273
272
return {
274
273
"Resources" : {
275
274
"Limits" : {
@@ -288,13 +287,13 @@ async def create_service(
288
287
docker_swarm : None ,
289
288
faker : Faker ,
290
289
) -> AsyncIterator [
291
- Callable [[dict [str , Any ], Optional [ dict [str , str ]] ], Awaitable [Service ]]
290
+ Callable [[dict [str , Any ], dict [str , str ] | None ], Awaitable [Service ]]
292
291
]:
293
292
created_services = []
294
293
295
294
async def _creator (
296
295
task_template : dict [str , Any ],
297
- labels : Optional [ dict [str , str ]] = None ,
296
+ labels : dict [str , str ] | None = None ,
298
297
wait_for_service_state = "running" ,
299
298
) -> Service :
300
299
service_name = f"pytest_{ faker .pystr ()} "
@@ -353,6 +352,7 @@ async def _creator(
353
352
await asyncio .gather (
354
353
* (async_docker_client .services .delete (s .ID ) for s in created_services )
355
354
)
355
+
356
356
# wait until all tasks are gone
357
357
@retry (
358
358
retry = retry_if_exception_type (AssertionError ),
0 commit comments