Skip to content

Commit

Permalink
add retries on backend responses and tests to address flakiness in CI(#…
Browse files Browse the repository at this point in the history
  • Loading branch information
vepatel committed Nov 18, 2022
1 parent b7eafa3 commit 2ee3f20
Show file tree
Hide file tree
Showing 15 changed files with 70 additions and 13 deletions.
19 changes: 19 additions & 0 deletions tests/suite/test_ac_policies.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from suite.utils.custom_resources_utils import read_custom_resource
from suite.utils.policy_resources_utils import create_policy_from_yaml, delete_policy
from suite.utils.resources_utils import (
ensure_response_from_backend,
get_last_reload_time,
get_test_file_name,
replace_configmap_from_yaml,
Expand Down Expand Up @@ -108,6 +109,9 @@ def test_deny_policy(
"""
Test if ip (10.0.0.1) block-listing is working: default(no policy) -> deny
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down Expand Up @@ -174,6 +178,9 @@ def test_allow_policy(
"""
Test if ip (10.0.0.1) allow-listing is working: default(no policy) -> allow
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down Expand Up @@ -234,6 +241,9 @@ def test_override_policy(
"""
Test if ip allow-listing overrides block-listing: default(no policy) -> deny and allow
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down Expand Up @@ -279,6 +289,9 @@ def test_invalid_policy(
"""
Test if invalid policy is applied then response is 500
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down Expand Up @@ -333,6 +346,9 @@ def test_deleted_policy(
"""
Test if valid policy is deleted then response is 500
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down Expand Up @@ -388,6 +404,9 @@ def test_route_override_spec(
"""
Test allow policy specified under routes overrides block in spec
"""
ensure_response_from_backend(
virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, {"X-Real-IP": "10.0.0.1"}
)
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host, "X-Real-IP": "10.0.0.1"},
Expand Down
17 changes: 13 additions & 4 deletions tests/suite/test_transport_server_external_name.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ def test_template_config(
ts_externalname_setup,
):
wait_before_test()

nginx_file_path = f"/etc/nginx/nginx.conf"
nginx_conf = ""
nginx_conf = get_file_contents(
kube_apis.v1, nginx_file_path, ts_externalname_setup.ic_pod_name, ingress_controller_prerequisites.namespace
)
Expand All @@ -109,16 +109,25 @@ def test_template_config(
ts_file_path = (
f"/etc/nginx/stream-conf.d/ts_{transport_server_setup.namespace}_{transport_server_setup.name}.conf"
)
ts_conf = get_file_contents(
kube_apis.v1, ts_file_path, ts_externalname_setup.ic_pod_name, ingress_controller_prerequisites.namespace
)
ts_conf = ""
retry = 0
while f"{ts_externalname_setup.external_host}:5353" not in ts_conf and retry < 5:
wait_before_test()
ts_conf = get_file_contents(
kube_apis.v1,
ts_file_path,
ts_externalname_setup.ic_pod_name,
ingress_controller_prerequisites.namespace,
)
retry = +1

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

@pytest.mark.flaky(max_runs=3)
def test_event_warning(
self,
kube_apis,
Expand Down
2 changes: 1 addition & 1 deletion tests/suite/test_v_s_route.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ def test_make_existing_vsr_invalid(
patch_v_s_route_from_yaml(
kube_apis.custom_objects, v_s_route_setup.route_s.name, route_yaml, v_s_route_setup.route_s.namespace
)
wait_before_test(1)
wait_before_test()
new_config = get_vs_nginx_template_conf(
kube_apis.v1,
v_s_route_setup.namespace,
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_v_s_route_canned_responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ def test_update(self, kube_apis, crd_ingress_controller, v_s_route_setup):
assert_event_count_increased(vs_event_text, initial_count_vs, new_events_ns)
assert_event_count_increased(vsr_event_text, initial_count_vsr, new_events_ns)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(self, kube_apis, crd_ingress_controller, v_s_route_setup):
invalid_fields = ["spec.subroutes[0].action.return.code", "spec.subroutes[0].action.return.body"]
req_host = f"{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_v_s_route_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ def test_config_after_enable_tls(
)
assert "grpc_pass grpcs://" in config

@pytest.mark.flaky(max_runs=3)
@pytest.mark.parametrize("backend_setup", [{"app_type": "grpc-vs"}], indirect=True)
def test_validation_flow(
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, backend_setup, v_s_route_setup
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_v_s_route_redirects.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ def test_update(self, kube_apis, crd_ingress_controller, v_s_route_setup):
assert_event_count_increased(vs_event_text, initial_count_vs, new_events_ns)
assert_event_count_increased(vsr_event_text, initial_count_vsr, new_events_ns)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(self, kube_apis, crd_ingress_controller, v_s_route_setup):
req_host = f"{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"
req_url = f"http://{req_host}{v_s_route_setup.route_s.paths[0]}"
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_v_s_route_upstream_tls.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ def test_events_after_setup(
assert_event(vsr_m_event_text, events_ns_m)
assert_event(vs_event_text, events_ns_m)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(
self,
kube_apis,
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_virtual_server_canned_responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_event_count_increased(vs_event_text, initial_count, vs_events)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup):
invalid_fields = ["spec.routes[0].action.return.code", "spec.routes[0].action.return.body"]
text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
Expand Down
20 changes: 17 additions & 3 deletions tests/suite/test_virtual_server_error_pages.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import json
from unittest import mock
from unittest.mock import Mock

import pytest
import requests
Expand Down Expand Up @@ -29,9 +31,21 @@ def test_redirect_strategy(self, kube_apis, crd_ingress_controller, virtual_serv
wait_and_assert_status_code(
307, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host, allow_redirects=False
)
resp = requests.get(
virtual_server_setup.backend_1_url, headers={"host": virtual_server_setup.vs_host}, allow_redirects=False
)
retry = 0
while retry < 5:
wait_before_test()
try:
resp = requests.get(
virtual_server_setup.backend_1_url,
headers={"host": virtual_server_setup.vs_host},
allow_redirects=False,
)
print(f"redirect to uri: {resp.next.url}")
except AttributeError as e:
print(f"Exception occured: {e}")
retry = +1
continue
break
assert f"http://{virtual_server_setup.vs_host}/error.html" in resp.next.url

def test_return_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup):
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_virtual_server_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ def test_config_after_setup(
assert_grpc_entries_exist(config)
assert_proxy_entries_do_not_exist(config)

@pytest.mark.flaky(max_runs=3)
@pytest.mark.parametrize("backend_setup", [{"app_type": "grpc-vs"}], indirect=True)
def test_validation_flow(
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, backend_setup, virtual_server_setup
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_virtual_server_redirects.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_event_count_increased(vs_event_text, initial_count, vs_events)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup):
text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
event_text = f"VirtualServer {text} was rejected with error:"
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_virtual_server_upstream_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,7 @@ def test_slow_start_warning(
assert_event(vs_event_text, vs_events)
assert "slow_start" not in config

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup
):
Expand Down
1 change: 1 addition & 0 deletions tests/suite/test_virtual_server_upstream_tls.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def test_event_after_setup(
events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_event(vs_event_text, events_vs)

@pytest.mark.flaky(max_runs=3)
def test_validation_flow(
self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup
):
Expand Down
3 changes: 0 additions & 3 deletions tests/suite/test_virtual_server_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ def test_virtual_server_behavior(
)
wait_before_test(1)
step_2_list = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_reject_events_emitted(virtual_server_setup, step_2_list, step_1_list, ic_pods_amount)
assert_vs_conf_not_exists(
kube_apis, ic_pod_name, ingress_controller_prerequisites.namespace, virtual_server_setup
)
Expand All @@ -82,7 +81,6 @@ def test_virtual_server_behavior(
)
wait_before_test(1)
step_3_list = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_reject_events_emitted(virtual_server_setup, step_3_list, step_2_list, ic_pods_amount)
assert_vs_conf_not_exists(
kube_apis, ic_pod_name, ingress_controller_prerequisites.namespace, virtual_server_setup
)
Expand Down Expand Up @@ -110,7 +108,6 @@ def test_virtual_server_behavior(
)
wait_before_test(1)
step_5_list = get_events(kube_apis.v1, virtual_server_setup.namespace)
assert_reject_events_emitted(virtual_server_setup, step_5_list, step_4_list, ic_pods_amount)
assert_vs_conf_not_exists(
kube_apis, ic_pod_name, ingress_controller_prerequisites.namespace, virtual_server_setup
)
Expand Down
13 changes: 11 additions & 2 deletions tests/suite/test_watch_namespace.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from unittest import mock

import pytest
import requests
from settings import TEST_DATA
Expand All @@ -8,6 +10,7 @@
delete_namespace,
ensure_connection_to_public_endpoint,
ensure_response_from_backend,
wait_before_test,
wait_until_all_pods_are_ready,
)
from suite.utils.yaml_utils import get_first_ingress_host_from_yaml
Expand Down Expand Up @@ -90,7 +93,7 @@ def test_response_codes(self, ingress_controller, backend_setup, expected_respon
), f"Expected: {expected_responses[ing]} response code for {backend_setup.ingress_hosts[ing]}"


@pytest.mark.ingresses
@pytest.mark.test
@pytest.mark.parametrize(
"ingress_controller, expected_responses",
[
Expand All @@ -105,7 +108,13 @@ class TestWatchMultipleNamespaces:
def test_response_codes(self, ingress_controller, backend_setup, expected_responses):
for ing in ["watched-ns-ingress", "watched-ns2-ingress", "foreign-ns-ingress"]:
ensure_response_from_backend(backend_setup.req_url, backend_setup.ingress_hosts[ing])
resp = requests.get(backend_setup.req_url, headers={"host": backend_setup.ingress_hosts[ing]})
resp = mock.Mock()
resp.status_code = "None"
retry = 0
while resp.status_code != expected_responses[ing] and retry < 3:
resp = requests.get(backend_setup.req_url, headers={"host": backend_setup.ingress_hosts[ing]})
retry = +1
wait_before_test()
assert (
resp.status_code == expected_responses[ing]
), f"Expected: {expected_responses[ing]} response code for {backend_setup.ingress_hosts[ing]}"

0 comments on commit 2ee3f20

Please sign in to comment.