Skip to content

Commit 2854f98

Browse files
Merge pull request #226 from element-hq/gaelg/ingresses-endpoints
tests: improve endpoints status verification
2 parents 408e8ce + bf27e86 commit 2854f98

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

newsfragments/226.internal.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Tests: Improve endpoints status verifications.

tests/integration/fixtures/helm.py

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import yaml
1212
from lightkube import AsyncClient
1313
from lightkube.models.meta_v1 import ObjectMeta
14-
from lightkube.resources.core_v1 import Endpoints, Namespace, Secret, Service
14+
from lightkube.resources.core_v1 import Namespace, Secret, Service
1515
from lightkube.resources.networking_v1 import Ingress
1616

1717
from ..lib.helpers import kubernetes_docker_secret, kubernetes_tls_secret
@@ -201,19 +201,6 @@ async def _ingress_ready(ingress_suffix):
201201
waitfor="jsonpath='{.subsets[].addresses}'",
202202
)
203203

204-
endpoints_ready = False
205-
while not endpoints_ready:
206-
endpoint = await kube_client.get(
207-
Endpoints, name=service.metadata.name, namespace=generated_data.ess_namespace
208-
)
209-
210-
for subset in endpoint.subsets:
211-
if not subset or subset.notReadyAddresses or not subset.addresses or not subset.ports:
212-
await asyncio.sleep(0.1)
213-
break
214-
else:
215-
endpoints_ready = True
216-
217204
return _ingress_ready
218205

219206

tests/integration/test_networking.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import asyncio
66
import os
7+
import time
78

89
import pytest
910
from lightkube import AsyncClient
@@ -58,17 +59,36 @@ async def test_services_have_endpoints(
5859
kube_client: AsyncClient,
5960
generated_data: ESSData,
6061
):
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):
6563
await asyncio.to_thread(
6664
cluster.wait,
67-
name=f"endpoints/{service.metadata.name}",
65+
name=f"endpoints/{name}",
6866
namespace=generated_data.ess_namespace,
6967
waitfor="jsonpath='{.subsets[].addresses}'",
7068
)
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):
7292
assert endpoint.metadata is not None, f"Encountered an endpoint without metadata : {endpoint}"
7393
assert endpoint.subsets, f"Endpoint {endpoint.metadata.name} has no subsets"
7494

@@ -81,8 +101,8 @@ async def test_services_have_endpoints(
81101

82102
port_names = [port.name for port in ports if port.name]
83103
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:
86106
if port.name:
87107
assert port.name in port_names
88108
else:

0 commit comments

Comments
 (0)