Skip to content

Commit 2ee3f20

Browse files
authored
add retries on backend responses and tests to address flakiness in CI(#3266)
1 parent b7eafa3 commit 2ee3f20

15 files changed

+70
-13
lines changed

tests/suite/test_ac_policies.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from suite.utils.custom_resources_utils import read_custom_resource
55
from suite.utils.policy_resources_utils import create_policy_from_yaml, delete_policy
66
from suite.utils.resources_utils import (
7+
ensure_response_from_backend,
78
get_last_reload_time,
89
get_test_file_name,
910
replace_configmap_from_yaml,
@@ -108,6 +109,9 @@ def test_deny_policy(
108109
"""
109110
Test if ip (10.0.0.1) block-listing is working: default(no policy) -> deny
110111
"""
112+
ensure_response_from_backend(
113+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
114+
)
111115
resp = requests.get(
112116
virtual_server_setup.backend_1_url,
113117
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
@@ -174,6 +178,9 @@ def test_allow_policy(
174178
"""
175179
Test if ip (10.0.0.1) allow-listing is working: default(no policy) -> allow
176180
"""
181+
ensure_response_from_backend(
182+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
183+
)
177184
resp = requests.get(
178185
virtual_server_setup.backend_1_url,
179186
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
@@ -234,6 +241,9 @@ def test_override_policy(
234241
"""
235242
Test if ip allow-listing overrides block-listing: default(no policy) -> deny and allow
236243
"""
244+
ensure_response_from_backend(
245+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
246+
)
237247
resp = requests.get(
238248
virtual_server_setup.backend_1_url,
239249
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
@@ -279,6 +289,9 @@ def test_invalid_policy(
279289
"""
280290
Test if invalid policy is applied then response is 500
281291
"""
292+
ensure_response_from_backend(
293+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
294+
)
282295
resp = requests.get(
283296
virtual_server_setup.backend_1_url,
284297
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
@@ -333,6 +346,9 @@ def test_deleted_policy(
333346
"""
334347
Test if valid policy is deleted then response is 500
335348
"""
349+
ensure_response_from_backend(
350+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
351+
)
336352
resp = requests.get(
337353
virtual_server_setup.backend_1_url,
338354
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
@@ -388,6 +404,9 @@ def test_route_override_spec(
388404
"""
389405
Test allow policy specified under routes overrides block in spec
390406
"""
407+
ensure_response_from_backend(
408+
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
409+
)
391410
resp = requests.get(
392411
virtual_server_setup.backend_1_url,
393412
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},

tests/suite/test_transport_server_external_name.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ def test_template_config(
9999
ts_externalname_setup,
100100
):
101101
wait_before_test()
102-
103102
nginx_file_path = f"/etc/nginx/nginx.conf"
103+
nginx_conf = ""
104104
nginx_conf = get_file_contents(
105105
kube_apis.v1, nginx_file_path, ts_externalname_setup.ic_pod_name, ingress_controller_prerequisites.namespace
106106
)
@@ -109,16 +109,25 @@ def test_template_config(
109109
ts_file_path = (
110110
f"/etc/nginx/stream-conf.d/ts_{transport_server_setup.namespace}_{transport_server_setup.name}.conf"
111111
)
112-
ts_conf = get_file_contents(
113-
kube_apis.v1, ts_file_path, ts_externalname_setup.ic_pod_name, ingress_controller_prerequisites.namespace
114-
)
112+
ts_conf = ""
113+
retry = 0
114+
while f"{ts_externalname_setup.external_host}:5353" not in ts_conf and retry < 5:
115+
wait_before_test()
116+
ts_conf = get_file_contents(
117+
kube_apis.v1,
118+
ts_file_path,
119+
ts_externalname_setup.ic_pod_name,
120+
ingress_controller_prerequisites.namespace,
121+
)
122+
retry = +1
115123

116124
assert resolver_count == 2 # one for http and other for stream context
117125
assert (
118126
f"server {ts_externalname_setup.external_host}:5353 max_fails=1 fail_timeout=10s max_conns=0 resolve;"
119127
in ts_conf
120128
)
121129

130+
@pytest.mark.flaky(max_runs=3)
122131
def test_event_warning(
123132
self,
124133
kube_apis,

tests/suite/test_v_s_route.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ def test_make_existing_vsr_invalid(
311311
patch_v_s_route_from_yaml(
312312
kube_apis.custom_objects, v_s_route_setup.route_s.name, route_yaml, v_s_route_setup.route_s.namespace
313313
)
314-
wait_before_test(1)
314+
wait_before_test()
315315
new_config = get_vs_nginx_template_conf(
316316
kube_apis.v1,
317317
v_s_route_setup.namespace,

tests/suite/test_v_s_route_canned_responses.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def test_update(self, kube_apis, crd_ingress_controller, v_s_route_setup):
109109
assert_event_count_increased(vs_event_text, initial_count_vs, new_events_ns)
110110
assert_event_count_increased(vsr_event_text, initial_count_vsr, new_events_ns)
111111

112+
@pytest.mark.flaky(max_runs=3)
112113
def test_validation_flow(self, kube_apis, crd_ingress_controller, v_s_route_setup):
113114
invalid_fields = ["spec.subroutes[0].action.return.code", "spec.subroutes[0].action.return.body"]
114115
req_host = f"{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"

tests/suite/test_v_s_route_grpc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ def test_config_after_enable_tls(
134134
)
135135
assert "grpc_pass grpcs://" in config
136136

137+
@pytest.mark.flaky(max_runs=3)
137138
@pytest.mark.parametrize("backend_setup", [{"app_type": "grpc-vs"}], indirect=True)
138139
def test_validation_flow(
139140
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, backend_setup, v_s_route_setup

tests/suite/test_v_s_route_redirects.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def test_update(self, kube_apis, crd_ingress_controller, v_s_route_setup):
7878
assert_event_count_increased(vs_event_text, initial_count_vs, new_events_ns)
7979
assert_event_count_increased(vsr_event_text, initial_count_vsr, new_events_ns)
8080

81+
@pytest.mark.flaky(max_runs=3)
8182
def test_validation_flow(self, kube_apis, crd_ingress_controller, v_s_route_setup):
8283
req_host = f"{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"
8384
req_url = f"http://{req_host}{v_s_route_setup.route_s.paths[0]}"

tests/suite/test_v_s_route_upstream_tls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ def test_events_after_setup(
123123
assert_event(vsr_m_event_text, events_ns_m)
124124
assert_event(vs_event_text, events_ns_m)
125125

126+
@pytest.mark.flaky(max_runs=3)
126127
def test_validation_flow(
127128
self,
128129
kube_apis,

tests/suite/test_virtual_server_canned_responses.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
9898
vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
9999
assert_event_count_increased(vs_event_text, initial_count, vs_events)
100100

101+
@pytest.mark.flaky(max_runs=3)
101102
def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup):
102103
invalid_fields = ["spec.routes[0].action.return.code", "spec.routes[0].action.return.body"]
103104
text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"

tests/suite/test_virtual_server_error_pages.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import json
2+
from unittest import mock
3+
from unittest.mock import Mock
24

35
import pytest
46
import requests
@@ -29,9 +31,21 @@ def test_redirect_strategy(self, kube_apis, crd_ingress_controller, virtual_serv
2931
wait_and_assert_status_code(
3032
307, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, allow_redirects=False
3133
)
32-
resp = requests.get(
33-
virtual_server_setup.backend_1_url, headers={"host": virtual_server_setup.vs_host}, allow_redirects=False
34-
)
34+
retry = 0
35+
while retry < 5:
36+
wait_before_test()
37+
try:
38+
resp = requests.get(
39+
virtual_server_setup.backend_1_url,
40+
headers={"host": virtual_server_setup.vs_host},
41+
allow_redirects=False,
42+
)
43+
print(f"redirect to uri: {resp.next.url}")
44+
except AttributeError as e:
45+
print(f"Exception occured: {e}")
46+
retry = +1
47+
continue
48+
break
3549
assert f"http://{virtual_server_setup.vs_host}/error.html" in resp.next.url
3650

3751
def test_return_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup):

tests/suite/test_virtual_server_grpc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def test_config_after_setup(
115115
assert_grpc_entries_exist(config)
116116
assert_proxy_entries_do_not_exist(config)
117117

118+
@pytest.mark.flaky(max_runs=3)
118119
@pytest.mark.parametrize("backend_setup", [{"app_type": "grpc-vs"}], indirect=True)
119120
def test_validation_flow(
120121
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, backend_setup, virtual_server_setup

0 commit comments

Comments
 (0)