github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server_redirects.py (about) 1 import pytest 2 import requests 3 from kubernetes.client.rest import ApiException 4 5 from settings import TEST_DATA 6 from suite.custom_assertions import wait_and_assert_status_code, assert_event_and_get_count, \ 7 assert_event_count_increased, assert_event_starts_with_text_and_contains_errors 8 from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf 9 from suite.resources_utils import get_first_pod_name, get_events, wait_before_test 10 11 12 @pytest.mark.vs 13 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 14 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 15 {"example": "virtual-server-redirects", "app_type": None})], 16 indirect=True) 17 class TestVSRedirects: 18 def test_config(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup): 19 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 20 config = get_vs_nginx_template_conf(kube_apis.v1, 21 virtual_server_setup.namespace, 22 virtual_server_setup.vs_name, 23 ic_pod_name, 24 ingress_controller_prerequisites.namespace) 25 assert 'error_page 418 =307' in config and 'error_page 418 =301' in config 26 27 def test_custom_redirect(self, kube_apis, crd_ingress_controller, virtual_server_setup): 28 req_url = f"{virtual_server_setup.backend_1_url}" 29 wait_and_assert_status_code(307, req_url, virtual_server_setup.vs_host, allow_redirects=False) 30 resp = requests.get(req_url, headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 31 assert resp.headers['location'] == "http://example.com" 32 33 def test_default_redirect(self, kube_apis, crd_ingress_controller, virtual_server_setup): 34 wait_and_assert_status_code(301, virtual_server_setup.backend_2_url, 35 virtual_server_setup.vs_host, allow_redirects=False) 36 resp = requests.get(virtual_server_setup.backend_2_url, 37 headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 38 assert resp.headers['location'] == f"http://{virtual_server_setup.vs_host}/default-redirect?arg=" 39 40 def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup): 41 wait_before_test(1) 42 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 43 vs_event_text = f"Configuration for {text} was added or updated" 44 events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace) 45 initial_count = assert_event_and_get_count(vs_event_text, events_vs) 46 vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-updated.yaml" 47 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 48 virtual_server_setup.namespace) 49 wait_and_assert_status_code(301, virtual_server_setup.backend_1_url, 50 virtual_server_setup.vs_host, allow_redirects=False) 51 resp = requests.get(virtual_server_setup.backend_1_url, 52 headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 53 assert resp.headers['location'] == "http://demo.nginx.com" 54 wait_and_assert_status_code(302, virtual_server_setup.backend_2_url, 55 virtual_server_setup.vs_host, allow_redirects=False) 56 resp = requests.get(virtual_server_setup.backend_2_url, 57 headers={"host": virtual_server_setup.vs_host}, allow_redirects=False) 58 assert resp.headers['location'] == "http://demo.nginx.com" 59 60 vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace) 61 assert_event_count_increased(vs_event_text, initial_count, vs_events) 62 63 def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup): 64 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 65 event_text = f"VirtualServer {text} was rejected with error:" 66 invalid_fields = ["spec.routes[0].action.redirect.code", "spec.routes[1].action.redirect.url"] 67 vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-invalid.yaml" 68 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 69 virtual_server_setup.namespace) 70 wait_before_test(2) 71 72 wait_and_assert_status_code(404, virtual_server_setup.backend_1_url, 73 virtual_server_setup.vs_host, allow_redirects=False) 74 vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace) 75 assert_event_starts_with_text_and_contains_errors(event_text, vs_events, invalid_fields) 76 77 def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites, 78 crd_ingress_controller, virtual_server_setup): 79 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 80 config_old = get_vs_nginx_template_conf(kube_apis.v1, 81 virtual_server_setup.namespace, 82 virtual_server_setup.vs_name, 83 ic_pod_name, 84 ingress_controller_prerequisites.namespace) 85 vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-invalid-openapi.yaml" 86 try: 87 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 88 virtual_server_setup.namespace) 89 except ApiException as ex: 90 assert ex.status == 422 \ 91 and "spec.routes.action.redirect.url" in ex.body \ 92 and "spec.routes.action.redirect.code" in ex.body 93 except Exception as ex: 94 pytest.fail(f"An unexpected exception is raised: {ex}") 95 else: 96 pytest.fail("Expected an exception but there was none") 97 98 wait_before_test(1) 99 config_new = get_vs_nginx_template_conf(kube_apis.v1, 100 virtual_server_setup.namespace, 101 virtual_server_setup.vs_name, 102 ic_pod_name, 103 ingress_controller_prerequisites.namespace) 104 assert config_old == config_new, "Expected: config doesn't change"