github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server.py (about) 1 import requests 2 import pytest 3 4 from settings import TEST_DATA, DEPLOYMENTS 5 from suite.custom_assertions import wait_and_assert_status_code 6 from suite.custom_resources_utils import delete_crd, create_crd_from_yaml, \ 7 create_virtual_server_from_yaml, delete_virtual_server, patch_virtual_server_from_yaml 8 from suite.resources_utils import patch_rbac, replace_service, read_service, \ 9 wait_before_test, delete_service, create_service_from_yaml 10 from suite.yaml_utils import get_paths_from_vs_yaml, get_first_host_from_yaml, get_name_from_yaml 11 12 13 @pytest.mark.vs 14 @pytest.mark.smoke 15 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 16 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 17 {"example": "virtual-server", "app_type": "simple"})], 18 indirect=True) 19 class TestVirtualServer: 20 def test_responses_after_setup(self, kube_apis, crd_ingress_controller, virtual_server_setup): 21 print("\nStep 1: initial check") 22 resp = requests.get(virtual_server_setup.backend_1_url, 23 headers={"host": virtual_server_setup.vs_host}) 24 assert resp.status_code == 200 25 resp = requests.get(virtual_server_setup.backend_2_url, 26 headers={"host": virtual_server_setup.vs_host}) 27 assert resp.status_code == 200 28 29 def test_responses_after_virtual_server_update(self, kube_apis, crd_ingress_controller, virtual_server_setup): 30 print("Step 2: update host and paths in the VS and check") 31 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, 32 f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml", 33 virtual_server_setup.namespace) 34 new_paths = get_paths_from_vs_yaml(f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml") 35 new_backend_1_url = f"http://{virtual_server_setup.public_endpoint.public_ip}" \ 36 f":{virtual_server_setup.public_endpoint.port}/{new_paths[0]}" 37 new_backend_2_url = f"http://{virtual_server_setup.public_endpoint.public_ip}" \ 38 f":{virtual_server_setup.public_endpoint.port}/{new_paths[1]}" 39 new_host = get_first_host_from_yaml(f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml") 40 wait_before_test(1) 41 resp = requests.get(virtual_server_setup.backend_1_url, 42 headers={"host": virtual_server_setup.vs_host}) 43 assert resp.status_code == 404 44 resp = requests.get(virtual_server_setup.backend_2_url, 45 headers={"host": virtual_server_setup.vs_host}) 46 assert resp.status_code == 404 47 resp = requests.get(new_backend_1_url, headers={"host": new_host}) 48 assert resp.status_code == 200 49 resp = requests.get(new_backend_2_url, headers={"host": new_host}) 50 assert resp.status_code == 200 51 52 print("Step 3: restore VS and check") 53 patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, 54 f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml", 55 virtual_server_setup.namespace) 56 wait_before_test(1) 57 resp = requests.get(new_backend_1_url, headers={"host": new_host}) 58 assert resp.status_code == 404 59 resp = requests.get(new_backend_2_url, headers={"host": new_host}) 60 assert resp.status_code == 404 61 resp = requests.get(virtual_server_setup.backend_1_url, 62 headers={"host": virtual_server_setup.vs_host}) 63 assert resp.status_code == 200 64 resp = requests.get(virtual_server_setup.backend_2_url, 65 headers={"host": virtual_server_setup.vs_host}) 66 assert resp.status_code == 200 67 68 def test_responses_after_backend_update(self, kube_apis, crd_ingress_controller, virtual_server_setup): 69 print("Step 4: update one backend service port and check") 70 the_service = read_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace) 71 the_service.spec.ports[0].port = 8080 72 replace_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace, the_service) 73 wait_before_test(1) 74 resp = requests.get(virtual_server_setup.backend_1_url, 75 headers={"host": virtual_server_setup.vs_host}) 76 assert resp.status_code == 502 77 resp = requests.get(virtual_server_setup.backend_2_url, 78 headers={"host": virtual_server_setup.vs_host}) 79 assert resp.status_code == 200 80 81 print("Step 5: restore BE and check") 82 the_service = read_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace) 83 the_service.spec.ports[0].port = 80 84 replace_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace, the_service) 85 wait_before_test(1) 86 resp = requests.get(virtual_server_setup.backend_1_url, 87 headers={"host": virtual_server_setup.vs_host}) 88 assert resp.status_code == 200 89 resp = requests.get(virtual_server_setup.backend_2_url, 90 headers={"host": virtual_server_setup.vs_host}) 91 assert resp.status_code == 200 92 93 def test_responses_after_virtual_server_removal(self, kube_apis, crd_ingress_controller, virtual_server_setup): 94 print("\nStep 6: delete VS and check") 95 delete_virtual_server(kube_apis.custom_objects, virtual_server_setup.vs_name, virtual_server_setup.namespace) 96 wait_before_test(1) 97 resp = requests.get(virtual_server_setup.backend_1_url, 98 headers={"host": virtual_server_setup.vs_host}) 99 assert resp.status_code == 404 100 resp = requests.get(virtual_server_setup.backend_2_url, 101 headers={"host": virtual_server_setup.vs_host}) 102 assert resp.status_code == 404 103 104 print("Step 7: restore VS and check") 105 create_virtual_server_from_yaml(kube_apis.custom_objects, 106 f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml", 107 virtual_server_setup.namespace) 108 wait_before_test(1) 109 resp = requests.get(virtual_server_setup.backend_1_url, 110 headers={"host": virtual_server_setup.vs_host}) 111 assert resp.status_code == 200 112 resp = requests.get(virtual_server_setup.backend_2_url, 113 headers={"host": virtual_server_setup.vs_host}) 114 assert resp.status_code == 200 115 116 def test_responses_after_backend_service_removal(self, kube_apis, crd_ingress_controller, virtual_server_setup): 117 print("\nStep 8: remove one backend service and check") 118 delete_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace) 119 wait_before_test(1) 120 resp = requests.get(virtual_server_setup.backend_1_url, 121 headers={"host": virtual_server_setup.vs_host}) 122 assert resp.status_code == 502 123 resp = requests.get(virtual_server_setup.backend_2_url, 124 headers={"host": virtual_server_setup.vs_host}) 125 assert resp.status_code == 200 126 127 print("\nStep 9: restore backend service and check") 128 create_service_from_yaml(kube_apis.v1, virtual_server_setup.namespace, f"{TEST_DATA}/common/backend1-svc.yaml") 129 wait_before_test(3) 130 resp = requests.get(virtual_server_setup.backend_1_url, 131 headers={"host": virtual_server_setup.vs_host}) 132 assert resp.status_code == 200 133 resp = requests.get(virtual_server_setup.backend_2_url, 134 headers={"host": virtual_server_setup.vs_host}) 135 assert resp.status_code == 200 136 137 def test_responses_after_rbac_misconfiguration_on_the_fly(self, kube_apis, crd_ingress_controller, 138 virtual_server_setup): 139 print("Step 10: remove virtualservers from the ClusterRole and check") 140 patch_rbac(kube_apis.rbac_v1, f"{TEST_DATA}/virtual-server/rbac-without-vs.yaml") 141 wait_before_test(1) 142 resp = requests.get(virtual_server_setup.backend_1_url, 143 headers={"host": virtual_server_setup.vs_host}) 144 assert resp.status_code == 200 145 resp = requests.get(virtual_server_setup.backend_2_url, 146 headers={"host": virtual_server_setup.vs_host}) 147 assert resp.status_code == 200 148 149 print("Step 11: restore ClusterRole and check") 150 patch_rbac(kube_apis.rbac_v1, f"{DEPLOYMENTS}/rbac/rbac.yaml") 151 wait_before_test(1) 152 resp = requests.get(virtual_server_setup.backend_1_url, 153 headers={"host": virtual_server_setup.vs_host}) 154 assert resp.status_code == 200 155 resp = requests.get(virtual_server_setup.backend_2_url, 156 headers={"host": virtual_server_setup.vs_host}) 157 assert resp.status_code == 200 158 159 def test_responses_after_crd_removal_on_the_fly(self, kube_apis, crd_ingress_controller, virtual_server_setup): 160 print("\nStep 12: remove CRD and check") 161 crd_name = get_name_from_yaml(f"{DEPLOYMENTS}/common/crds/k8s.nginx.org_virtualservers.yaml") 162 delete_crd(kube_apis.api_extensions_v1, crd_name) 163 wait_and_assert_status_code(404, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 164 wait_and_assert_status_code(404, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 165 166 print("Step 13: restore CRD and VS and check") 167 create_crd_from_yaml(kube_apis.api_extensions_v1, crd_name, 168 f"{DEPLOYMENTS}/common/crds/k8s.nginx.org_virtualservers.yaml") 169 wait_before_test(1) 170 create_virtual_server_from_yaml(kube_apis.custom_objects, 171 f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml", 172 virtual_server_setup.namespace) 173 wait_and_assert_status_code(200, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 174 wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host) 175 176 177 @pytest.mark.vs 178 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 179 [({"type": "rbac-without-vs", "extra_args": [f"-enable-custom-resources"]}, 180 {"example": "virtual-server", "app_type": "simple"})], 181 indirect=True) 182 class TestVirtualServerInitialRBACMisconfiguration: 183 @pytest.mark.skip(reason="issues with ingressClass") 184 def test_responses_after_rbac_misconfiguration(self, kube_apis, crd_ingress_controller, virtual_server_setup): 185 print("\nStep 1: rbac misconfiguration from the very start") 186 resp = requests.get(virtual_server_setup.backend_1_url, 187 headers={"host": virtual_server_setup.vs_host}) 188 assert resp.status_code == 404 189 resp = requests.get(virtual_server_setup.backend_2_url, 190 headers={"host": virtual_server_setup.vs_host}) 191 assert resp.status_code == 404 192 193 print("Step 2: configure RBAC and check") 194 patch_rbac(kube_apis.rbac_v1, f"{DEPLOYMENTS}/rbac/rbac.yaml") 195 wait_and_assert_status_code(200, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 196 wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)