github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server_error_pages.py (about) 1 import pytest 2 import json 3 import requests 4 from kubernetes.client.rest import ApiException 5 6 from suite.custom_assertions import wait_and_assert_status_code, assert_vs_conf_not_exists, \ 7 assert_event_starts_with_text_and_contains_errors 8 from settings import TEST_DATA 9 from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf 10 from suite.resources_utils import wait_before_test, get_first_pod_name, get_events 11 12 13 @pytest.mark.vs 14 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 15 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 16 {"example": "virtual-server-error-pages", "app_type": None})], 17 indirect=True) 18 class TestVSErrorPages: 19 def test_redirect_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup): 20 wait_and_assert_status_code(307, virtual_server_setup.backend_1_url, 21 virtual_server_setup.vs_host, allow_redirects=False) 22 resp = requests.get(virtual_server_setup.backend_1_url, 23 headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 24 assert f'http://{virtual_server_setup.vs_host}/error.html' in resp.next.url 25 26 def test_return_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup): 27 wait_and_assert_status_code(207, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 28 resp = requests.get(virtual_server_setup.backend_2_url, 29 headers={"host": virtual_server_setup.vs_host}) 30 resp_content = json.loads(resp.content) 31 assert resp_content['status'] == '502' \ 32 and resp_content['message'] == 'Forbidden' \ 33 and resp.headers.get('x-debug-original-status') == '502' 34 35 def test_virtual_server_after_update(self, kube_apis, crd_ingress_controller, virtual_server_setup): 36 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, 37 f"{TEST_DATA}/virtual-server-error-pages/virtual-server-updated.yaml", 38 virtual_server_setup.namespace) 39 wait_and_assert_status_code(301, virtual_server_setup.backend_1_url, 40 virtual_server_setup.vs_host, allow_redirects=False) 41 resp = requests.get(virtual_server_setup.backend_1_url, 42 headers={"host": virtual_server_setup.vs_host, "x-forwarded-proto": "http"}, 43 allow_redirects=False) 44 assert f'http://{virtual_server_setup.vs_host}/error_http.html' in resp.next.url 45 46 wait_and_assert_status_code(502, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 47 resp = requests.get(virtual_server_setup.backend_2_url, 48 headers={"host": virtual_server_setup.vs_host}) 49 resp_content = resp.content.decode('utf-8') 50 assert resp_content == 'Hello World!\n' 51 52 def test_validation_event_flow(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, 53 virtual_server_setup): 54 invalid_fields = [ 55 "spec.routes[0].errorPages[0].redirect.url: Invalid value", 56 "spec.routes[0].errorPages[0].redirect.code: Invalid value: 101", 57 "spec.routes[1].errorPages[0].return.body: Invalid value: \"status\"", 58 "spec.routes[1].errorPages[0].return.code: Invalid value: 100", 59 "spec.routes[1].errorPages[0].return.headers[0].value: Invalid value: \"schema\"" 60 ] 61 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 62 vs_event_text = f"VirtualServer {text} was rejected with error:" 63 vs_file = f"{TEST_DATA}/virtual-server-error-pages/virtual-server-invalid.yaml" 64 patch_virtual_server_from_yaml(kube_apis.custom_objects, 65 virtual_server_setup.vs_name, 66 vs_file, 67 virtual_server_setup.namespace) 68 wait_before_test(2) 69 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 70 vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace) 71 72 assert_event_starts_with_text_and_contains_errors(vs_event_text, vs_events, invalid_fields) 73 assert_vs_conf_not_exists(kube_apis, ic_pod_name, ingress_controller_prerequisites.namespace, 74 virtual_server_setup) 75 76 def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites, 77 crd_ingress_controller, virtual_server_setup): 78 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 79 config_old = get_vs_nginx_template_conf(kube_apis.v1, 80 virtual_server_setup.namespace, 81 virtual_server_setup.vs_name, 82 ic_pod_name, 83 ingress_controller_prerequisites.namespace) 84 vs_file = f"{TEST_DATA}/virtual-server-error-pages/virtual-server-invalid-openapi.yaml" 85 try: 86 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_file, 87 virtual_server_setup.namespace) 88 except ApiException as ex: 89 assert ex.status == 422 \ 90 and "spec.routes.errorPages.codes" in ex.body \ 91 and "spec.routes.errorPages.redirect.code" in ex.body \ 92 and "spec.routes.errorPages.redirect.url" in ex.body \ 93 and "spec.routes.errorPages.return.code" in ex.body \ 94 and "spec.routes.errorPages.return.type" in ex.body \ 95 and "spec.routes.errorPages.return.body" in ex.body \ 96 and "spec.routes.errorPages.return.headers.name" in ex.body \ 97 and "spec.routes.errorPages.return.headers.value" in ex.body 98 except Exception as ex: 99 pytest.fail(f"An unexpected exception is raised: {ex}") 100 else: 101 pytest.fail("Expected an exception but there was none") 102 103 wait_before_test(1) 104 config_new = get_vs_nginx_template_conf(kube_apis.v1, 105 virtual_server_setup.namespace, 106 virtual_server_setup.vs_name, 107 ic_pod_name, 108 ingress_controller_prerequisites.namespace) 109 assert config_old == config_new, "Expected: config doesn't change" 110 111 @pytest.mark.parametrize('v_s_data', [ 112 {"src": "virtual-server-splits.yaml", "expected_code": 308}, 113 {"src": "virtual-server-matches.yaml", "expected_code": 307} 114 ]) 115 def test_splits_and_matches(self, kube_apis, crd_ingress_controller, virtual_server_setup, v_s_data): 116 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, 117 f"{TEST_DATA}/virtual-server-error-pages/{v_s_data['src']}", 118 virtual_server_setup.namespace) 119 wait_and_assert_status_code(v_s_data['expected_code'], virtual_server_setup.backend_1_url, 120 virtual_server_setup.vs_host, allow_redirects=False) 121 resp = requests.get(virtual_server_setup.backend_1_url, 122 headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 123 assert f'http://{virtual_server_setup.vs_host}/error.html' in resp.next.url