4
4
5
5
import asyncio
6
6
import os
7
+ import time
7
8
8
9
import pytest
9
10
from lightkube import AsyncClient
@@ -58,17 +59,36 @@ async def test_services_have_endpoints(
58
59
kube_client : AsyncClient ,
59
60
generated_data : ESSData ,
60
61
):
61
- async for service in kube_client .list (
62
- Service , namespace = generated_data .ess_namespace , labels = {"app.kubernetes.io/part-of" : op .in_ (["matrix-stack" ])}
63
- ):
64
- assert service .metadata is not None , f"Encountered a service without metadata : { service } "
62
+ async def _wait_for_endpoint_ready (name ):
65
63
await asyncio .to_thread (
66
64
cluster .wait ,
67
- name = f"endpoints/{ service . metadata . name } " ,
65
+ name = f"endpoints/{ name } " ,
68
66
namespace = generated_data .ess_namespace ,
69
67
waitfor = "jsonpath='{.subsets[].addresses}'" ,
70
68
)
71
- endpoint = await kube_client .get (Endpoints , name = service .metadata .name , namespace = generated_data .ess_namespace )
69
+ # We wait maximum 30 seconds for the endpoints to be ready
70
+ start_time = time .time ()
71
+ while time .time () - start_time < 30 :
72
+ endpoint = await kube_client .get (Endpoints , name = name , namespace = generated_data .ess_namespace )
73
+
74
+ for subset in endpoint .subsets :
75
+ if not subset or subset .notReadyAddresses or not subset .addresses or not subset .ports :
76
+ await asyncio .sleep (0.1 )
77
+ break
78
+ else :
79
+ break
80
+ return endpoint
81
+
82
+ endpoints_to_wait = []
83
+ services = {}
84
+ async for service in kube_client .list (
85
+ Service , namespace = generated_data .ess_namespace , labels = {"app.kubernetes.io/part-of" : op .in_ (["matrix-stack" ])}
86
+ ):
87
+ assert service .metadata is not None , f"Encountered a service without metadata : { service } "
88
+ endpoints_to_wait .append (_wait_for_endpoint_ready (service .metadata .name ))
89
+ services [service .metadata .name ] = service
90
+
91
+ for endpoint in await asyncio .gather (* endpoints_to_wait ):
72
92
assert endpoint .metadata is not None , f"Encountered an endpoint without metadata : { endpoint } "
73
93
assert endpoint .subsets , f"Endpoint { endpoint .metadata .name } has no subsets"
74
94
@@ -81,8 +101,8 @@ async def test_services_have_endpoints(
81
101
82
102
port_names = [port .name for port in ports if port .name ]
83
103
port_numbers = [port .port for port in ports ]
84
- assert service .spec is not None , f"Service { service .metadata .name } has no spec"
85
- for port in service .spec .ports :
104
+ assert services [ endpoint . metadata . name ] .spec is not None , f"Service { service .metadata .name } has no spec"
105
+ for port in services [ endpoint . metadata . name ] .spec .ports :
86
106
if port .name :
87
107
assert port .name in port_names
88
108
else :
0 commit comments