github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_v_s_route_advanced_routing.py (about) 1 import pytest 2 import requests 3 4 from settings import TEST_DATA 5 from suite.custom_resources_utils import create_virtual_server_from_yaml, create_v_s_route_from_yaml, \ 6 patch_v_s_route_from_yaml 7 from suite.fixtures import VirtualServerRoute 8 from suite.resources_utils import wait_before_test, ensure_response_from_backend, create_example_app, \ 9 wait_until_all_pods_are_ready, create_namespace_with_name_from_yaml, delete_namespace 10 from suite.yaml_utils import get_paths_from_vsr_yaml, get_first_host_from_yaml, get_route_namespace_from_vs_yaml 11 12 13 def execute_assertions(resp_1, resp_2, resp_3): 14 assert resp_1.status_code == 200 15 assert "Server name: backend1-" in resp_1.text, "Expected response from backend1" 16 assert resp_2.status_code == 200 17 assert "Server name: backend3-" in resp_2.text, "Expected response from backend3" 18 assert resp_3.status_code == 200 19 assert "Server name: backend4-" in resp_3.text, "Expected response from backend4" 20 21 22 def ensure_responses_from_backends(req_url, host) -> None: 23 ensure_response_from_backend(req_url, host, {"x-version": "future"}) 24 ensure_response_from_backend(req_url, host, {"x-version": "deprecated"}) 25 ensure_response_from_backend(req_url, host, {"x-version-invalid": "deprecated"}) 26 27 28 class VSRAdvancedRoutingSetup: 29 """ 30 Encapsulate advanced routing VSR example details. 31 32 Attributes: 33 namespace (str): 34 vs_host (str): 35 vs_name (str): 36 route (VirtualServerRoute): 37 backends_url (str): backend url 38 """ 39 40 def __init__(self, namespace, vs_host, vs_name, route: VirtualServerRoute, backends_url): 41 self.namespace = namespace 42 self.vs_host = vs_host 43 self.vs_name = vs_name 44 self.route = route 45 self.backends_url = backends_url 46 47 48 @pytest.fixture(scope="class") 49 def vsr_adv_routing_setup(request, kube_apis, 50 ingress_controller_prerequisites, ingress_controller_endpoint) -> VSRAdvancedRoutingSetup: 51 """ 52 Prepare an example app for advanced routing VSR. 53 54 Single namespace with VS+VSR and advanced-routing app. 55 56 :param request: internal pytest fixture 57 :param kube_apis: client apis 58 :param ingress_controller_endpoint: 59 :param ingress_controller_prerequisites: 60 :return: 61 """ 62 vs_routes_ns = get_route_namespace_from_vs_yaml( 63 f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml") 64 ns_1 = create_namespace_with_name_from_yaml(kube_apis.v1, 65 vs_routes_ns[0], 66 f"{TEST_DATA}/common/ns.yaml") 67 print("------------------------- Deploy Virtual Server -----------------------------------") 68 vs_name = create_virtual_server_from_yaml(kube_apis.custom_objects, 69 f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml", 70 ns_1) 71 vs_host = get_first_host_from_yaml(f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml") 72 73 print("------------------------- Deploy Virtual Server Route -----------------------------------") 74 vsr_name = create_v_s_route_from_yaml(kube_apis.custom_objects, 75 f"{TEST_DATA}/{request.param['example']}/virtual-server-route-header.yaml", 76 ns_1) 77 vsr_paths = get_paths_from_vsr_yaml(f"{TEST_DATA}/{request.param['example']}/virtual-server-route-header.yaml") 78 route = VirtualServerRoute(ns_1, vsr_name, vsr_paths) 79 backends_url = f"http://{ingress_controller_endpoint.public_ip}:{ingress_controller_endpoint.port}{vsr_paths[0]}" 80 81 print("---------------------- Deploy advanced-routing app ----------------------------") 82 create_example_app(kube_apis, "advanced-routing", ns_1) 83 wait_until_all_pods_are_ready(kube_apis.v1, ns_1) 84 85 def fin(): 86 print("Delete test namespace") 87 delete_namespace(kube_apis.v1, ns_1) 88 89 request.addfinalizer(fin) 90 91 return VSRAdvancedRoutingSetup(ns_1, vs_host, vs_name, route, backends_url) 92 93 94 @pytest.mark.vsr 95 @pytest.mark.parametrize('crd_ingress_controller, vsr_adv_routing_setup', 96 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 97 {"example": "virtual-server-route-advanced-routing"})], 98 indirect=True) 99 class TestVSRAdvancedRouting: 100 def test_flow_with_header(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup): 101 ensure_responses_from_backends(vsr_adv_routing_setup.backends_url, vsr_adv_routing_setup.vs_host) 102 103 resp_1 = requests.get(vsr_adv_routing_setup.backends_url, 104 headers={"host": vsr_adv_routing_setup.vs_host, "x-version": "future"}) 105 resp_2 = requests.get(vsr_adv_routing_setup.backends_url, 106 headers={"host": vsr_adv_routing_setup.vs_host, "x-version": "deprecated"}) 107 resp_3 = requests.get(vsr_adv_routing_setup.backends_url, 108 headers={"host": vsr_adv_routing_setup.vs_host, "x-version-invalid": "deprecated"}) 109 execute_assertions(resp_1, resp_2, resp_3) 110 111 def test_flow_with_argument(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup): 112 patch_v_s_route_from_yaml(kube_apis.custom_objects, 113 vsr_adv_routing_setup.route.name, 114 f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-argument.yaml", 115 vsr_adv_routing_setup.namespace) 116 wait_before_test(1) 117 118 resp_1 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v1", 119 headers={"host": vsr_adv_routing_setup.vs_host}) 120 resp_2 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v2", 121 headers={"host": vsr_adv_routing_setup.vs_host}) 122 resp_3 = requests.get(vsr_adv_routing_setup.backends_url + "?argument1=v1", 123 headers={"host": vsr_adv_routing_setup.vs_host}) 124 execute_assertions(resp_1, resp_2, resp_3) 125 126 def test_flow_with_cookie(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup): 127 patch_v_s_route_from_yaml(kube_apis.custom_objects, 128 vsr_adv_routing_setup.route.name, 129 f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-cookie.yaml", 130 vsr_adv_routing_setup.namespace) 131 wait_before_test(1) 132 133 resp_1 = requests.get(vsr_adv_routing_setup.backends_url, 134 headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "some"}) 135 resp_2 = requests.get(vsr_adv_routing_setup.backends_url, 136 headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "bad"}) 137 resp_3 = requests.get(vsr_adv_routing_setup.backends_url, 138 headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "anonymous"}) 139 execute_assertions(resp_1, resp_2, resp_3) 140 141 def test_flow_with_variable(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup): 142 patch_v_s_route_from_yaml(kube_apis.custom_objects, 143 vsr_adv_routing_setup.route.name, 144 f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-variable.yaml", 145 vsr_adv_routing_setup.namespace) 146 wait_before_test(1) 147 148 resp_1 = requests.get(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host}) 149 resp_2 = requests.post(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host}) 150 resp_3 = requests.put(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host}) 151 execute_assertions(resp_1, resp_2, resp_3) 152 153 def test_flow_with_complex_conditions(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup): 154 patch_v_s_route_from_yaml(kube_apis.custom_objects, 155 vsr_adv_routing_setup.route.name, 156 f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-complex.yaml", 157 vsr_adv_routing_setup.namespace) 158 wait_before_test(1) 159 160 resp_1 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v1", 161 headers={"host": vsr_adv_routing_setup.vs_host, 162 "x-version": "future"}, cookies={"user": "some"}) 163 resp_2 = requests.post(vsr_adv_routing_setup.backends_url + "?arg1=v2", 164 headers={"host": vsr_adv_routing_setup.vs_host, 165 "x-version": "deprecated"}, cookies={"user": "bad"}) 166 resp_3 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v2", 167 headers={"host": vsr_adv_routing_setup.vs_host, 168 "x-version": "deprecated"}, cookies={"user": "bad"}) 169 execute_assertions(resp_1, resp_2, resp_3)