github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server_canned_responses.py (about) 1 import pytest 2 import requests 3 import json 4 5 from kubernetes.client.rest import ApiException 6 7 from settings import TEST_DATA 8 from suite.custom_assertions import wait_and_assert_status_code, assert_event_and_get_count, \ 9 assert_event_count_increased, assert_event_starts_with_text_and_contains_errors 10 from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf 11 from suite.resources_utils import get_first_pod_name, get_events, wait_before_test 12 13 14 @pytest.mark.vs 15 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 16 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 17 {"example": "virtual-server-canned-responses", "app_type": None})], 18 indirect=True) 19 class TestVSCannedResponse: 20 def test_config(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup): 21 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 22 config = get_vs_nginx_template_conf(kube_apis.v1, 23 virtual_server_setup.namespace, 24 virtual_server_setup.vs_name, 25 ic_pod_name, 26 ingress_controller_prerequisites.namespace) 27 assert "error_page 418 =407" in config and "error_page 418 =200" in config 28 29 def test_custom_canned_response(self, kube_apis, crd_ingress_controller, virtual_server_setup): 30 req_url = f"{virtual_server_setup.backend_1_url}?arg1=arg" 31 wait_and_assert_status_code(407, req_url, virtual_server_setup.vs_host) 32 resp = requests.get(req_url, headers={"host": virtual_server_setup.vs_host}) 33 resp_content = json.loads(resp.content) 34 assert resp.headers['content-type'] == 'application/json' \ 35 and resp_content['host'] == virtual_server_setup.vs_host \ 36 and resp_content['request_time'] != "" \ 37 and resp_content['pid'] != "" \ 38 and resp_content['server_protocol'] == "HTTP/1.1" \ 39 and resp_content['connections_active'] != "" \ 40 and resp_content['connections_writing'] != "" \ 41 and resp_content['request_uri'] == "/canned-response?arg1=arg" \ 42 and resp_content['remote_addr'] != "" \ 43 and resp_content['remote_port'] != "" \ 44 and resp_content['server_addr'] != "" \ 45 and resp_content['request_method'] == "GET" \ 46 and resp_content['scheme'] == "http" \ 47 and resp_content['request_length'] != "" \ 48 and resp_content['nginx_version'] != "" \ 49 and resp_content['connection'] != "" \ 50 and resp_content['time_local'] != "" \ 51 and resp_content['server_port'] != "" \ 52 and resp_content['server_name'] == virtual_server_setup.vs_host \ 53 and resp_content['connections_waiting'] != "" \ 54 and resp_content['request_body'] == "" \ 55 and resp_content['args'] == "arg1=arg" \ 56 and resp_content['time_iso8601'] != "" \ 57 and resp_content['connections_reading'] != "" 58 59 def test_default_canned_response(self, kube_apis, crd_ingress_controller, virtual_server_setup): 60 wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 61 resp = requests.get(virtual_server_setup.backend_2_url, headers={"host": virtual_server_setup.vs_host}) 62 resp_content = resp.content.decode('utf-8') 63 assert resp.headers['content-type'] == 'text/plain' and resp_content == "line1\nline2\nline3" 64 65 def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup): 66 wait_before_test(1) 67 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 68 vs_event_text = f"Configuration for {text} was added or updated" 69 events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace) 70 initial_count = assert_event_and_get_count(vs_event_text, events_vs) 71 vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-updated.yaml" 72 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 73 virtual_server_setup.namespace) 74 wait_and_assert_status_code(501, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 75 resp = requests.get(virtual_server_setup.backend_1_url, headers={"host": virtual_server_setup.vs_host}) 76 resp_content = resp.content.decode('utf-8') 77 assert resp.headers['content-type'] == 'some/type' and resp_content == "{}" 78 79 wait_and_assert_status_code(201, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 80 resp = requests.get(virtual_server_setup.backend_2_url, headers={"host": virtual_server_setup.vs_host}) 81 resp_content = resp.content.decode('utf-8') 82 assert resp.headers['content-type'] == 'user-type' and resp_content == "line1\nline2" 83 84 vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace) 85 assert_event_count_increased(vs_event_text, initial_count, vs_events) 86 87 def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup): 88 invalid_fields = [ 89 "spec.routes[0].action.return.code", "spec.routes[0].action.return.body" 90 ] 91 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 92 vs_event_text = f"VirtualServer {text} was rejected with error:" 93 vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-invalid.yaml" 94 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 95 virtual_server_setup.namespace) 96 wait_before_test(1) 97 98 wait_and_assert_status_code(404, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 99 vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace) 100 assert_event_starts_with_text_and_contains_errors(vs_event_text, vs_events, invalid_fields) 101 102 def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites, 103 crd_ingress_controller, virtual_server_setup): 104 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 105 config_old = get_vs_nginx_template_conf(kube_apis.v1, 106 virtual_server_setup.namespace, 107 virtual_server_setup.vs_name, 108 ic_pod_name, 109 ingress_controller_prerequisites.namespace) 110 vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-invalid-openapi.yaml" 111 try: 112 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src, 113 virtual_server_setup.namespace) 114 except ApiException as ex: 115 assert ex.status == 422 \ 116 and "spec.routes.action.return.type" in ex.body \ 117 and "spec.routes.action.return.body" in ex.body \ 118 and "spec.routes.action.return.code" in ex.body 119 except Exception as ex: 120 pytest.fail(f"An unexpected exception is raised: {ex}") 121 else: 122 pytest.fail("Expected an exception but there was none") 123 124 wait_before_test(1) 125 config_new = get_vs_nginx_template_conf(kube_apis.v1, 126 virtual_server_setup.namespace, 127 virtual_server_setup.vs_name, 128 ic_pod_name, 129 ingress_controller_prerequisites.namespace) 130 assert config_old == config_new, "Expected: config doesn't change"