github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_v_s_route_externalname.py (about) 1 import pytest 2 3 from settings import TEST_DATA 4 from suite.custom_assertions import assert_event_and_count, assert_event_and_get_count, wait_and_assert_status_code, \ 5 wait_for_event_count_increases 6 from suite.custom_resources_utils import create_virtual_server_from_yaml, \ 7 create_v_s_route_from_yaml, get_vs_nginx_template_conf 8 from suite.fixtures import VirtualServerRoute, PublicEndpoint 9 from suite.resources_utils import get_first_pod_name, get_events, \ 10 wait_before_test, replace_configmap_from_yaml, create_service_from_yaml, \ 11 delete_namespace, create_namespace_with_name_from_yaml, read_service, replace_service, replace_configmap, \ 12 create_service_with_name, create_deployment_with_name, ensure_response_from_backend 13 from suite.yaml_utils import get_paths_from_vsr_yaml, get_route_namespace_from_vs_yaml, get_first_host_from_yaml 14 15 16 class ReducedVirtualServerRouteSetup: 17 """ 18 Encapsulate Virtual Server Example details. 19 20 Attributes: 21 public_endpoint (PublicEndpoint): 22 namespace (str): 23 vs_host (str): 24 vs_name (str): 25 route (VirtualServerRoute): route with single subroute 26 """ 27 28 def __init__(self, public_endpoint: PublicEndpoint, 29 namespace, vs_host, vs_name, route: VirtualServerRoute, external_svc, external_host): 30 self.public_endpoint = public_endpoint 31 self.namespace = namespace 32 self.vs_host = vs_host 33 self.vs_name = vs_name 34 self.route = route 35 self.external_svc = external_svc 36 self.external_host = external_host 37 38 39 @pytest.fixture(scope="class") 40 def vsr_externalname_setup(request, kube_apis, 41 ingress_controller_prerequisites, 42 ingress_controller_endpoint) -> ReducedVirtualServerRouteSetup: 43 """ 44 Prepare an example app for Virtual Server Route. 45 46 1st namespace with externalName svc and VS+VSR. 47 48 :param request: internal pytest fixture 49 :param kube_apis: client apis 50 :param ingress_controller_endpoint: 51 :param ingress_controller_prerequisites: 52 :return: 53 """ 54 vs_routes_ns = get_route_namespace_from_vs_yaml( 55 f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml") 56 ns_1 = create_namespace_with_name_from_yaml(kube_apis.v1, 57 vs_routes_ns[0], 58 f"{TEST_DATA}/common/ns.yaml") 59 print("------------------------- Deploy External-Backend -----------------------------------") 60 external_ns = create_namespace_with_name_from_yaml(kube_apis.v1, "external-ns", f"{TEST_DATA}/common/ns.yaml") 61 external_svc_name = create_service_with_name(kube_apis.v1, external_ns, "external-backend-svc") 62 create_deployment_with_name(kube_apis.apps_v1_api, external_ns, "external-backend") 63 64 print("------------------------- Deploy Virtual Server -----------------------------------") 65 vs_name = create_virtual_server_from_yaml(kube_apis.custom_objects, 66 f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml", 67 ns_1) 68 vs_host = get_first_host_from_yaml(f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml") 69 70 print("------------------------- Deploy Virtual Server Route -----------------------------------") 71 vsr_name = create_v_s_route_from_yaml(kube_apis.custom_objects, 72 f"{TEST_DATA}/{request.param['example']}/route-single.yaml", 73 ns_1) 74 vsr_paths = get_paths_from_vsr_yaml(f"{TEST_DATA}/{request.param['example']}/route-single.yaml") 75 route = VirtualServerRoute(ns_1, vsr_name, vsr_paths) 76 77 print("---------------------- Deploy ExternalName service and update ConfigMap ----------------------------") 78 config_map_name = ingress_controller_prerequisites.config_map["metadata"]["name"] 79 replace_configmap_from_yaml(kube_apis.v1, config_map_name, 80 ingress_controller_prerequisites.namespace, 81 f"{TEST_DATA}/{request.param['example']}/nginx-config.yaml") 82 external_svc_host = f"{external_svc_name}.{external_ns}.svc.cluster.local" 83 svc_name = create_service_from_yaml(kube_apis.v1, 84 ns_1, f"{TEST_DATA}/{request.param['example']}/externalname-svc.yaml") 85 wait_before_test(2) 86 req_url = f"http://{ingress_controller_endpoint.public_ip}:{ingress_controller_endpoint.port}" 87 ensure_response_from_backend(f"{req_url}{route.paths[0]}", vs_host) 88 89 def fin(): 90 print("Delete test namespaces") 91 delete_namespace(kube_apis.v1, external_ns) 92 delete_namespace(kube_apis.v1, ns_1) 93 94 request.addfinalizer(fin) 95 96 return ReducedVirtualServerRouteSetup(ingress_controller_endpoint, 97 ns_1, vs_host, vs_name, route, svc_name, external_svc_host) 98 99 @pytest.mark.vsr 100 @pytest.mark.skip_for_nginx_oss 101 @pytest.mark.parametrize('crd_ingress_controller, vsr_externalname_setup', 102 [({"type": "complete", "extra_args": [f"-enable-custom-resources"]}, 103 {"example": "virtual-server-route-externalname"})], 104 indirect=True) 105 class TestVSRWithExternalNameService: 106 def test_responses(self, kube_apis, 107 crd_ingress_controller, 108 vsr_externalname_setup): 109 req_url = f"http://{vsr_externalname_setup.public_endpoint.public_ip}:" \ 110 f"{vsr_externalname_setup.public_endpoint.port}" 111 wait_and_assert_status_code(200, f"{req_url}{vsr_externalname_setup.route.paths[0]}", 112 vsr_externalname_setup.vs_host) 113 114 def test_template_config(self, kube_apis, 115 ingress_controller_prerequisites, 116 crd_ingress_controller, 117 vsr_externalname_setup): 118 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 119 initial_config = get_vs_nginx_template_conf(kube_apis.v1, 120 vsr_externalname_setup.namespace, 121 vsr_externalname_setup.vs_name, 122 ic_pod_name, 123 ingress_controller_prerequisites.namespace) 124 125 line = f"zone vs_{vsr_externalname_setup.namespace}_{vsr_externalname_setup.vs_name}" \ 126 f"_vsr_{vsr_externalname_setup.route.namespace}_{vsr_externalname_setup.route.name}_ext-backend 256k;" 127 assert line in initial_config 128 assert "random two least_conn;" in initial_config 129 assert f"server {vsr_externalname_setup.external_host}:80 max_fails=1 fail_timeout=10s max_conns=0 resolve;"\ 130 in initial_config 131 132 def test_events_flows(self, kube_apis, 133 ingress_controller_prerequisites, 134 crd_ingress_controller, 135 vsr_externalname_setup): 136 text_vsr = f"{vsr_externalname_setup.route.namespace}/{vsr_externalname_setup.route.name}" 137 text_vs = f"{vsr_externalname_setup.namespace}/{vsr_externalname_setup.vs_name}" 138 vsr_event_text = f"Configuration for {text_vsr} was added or updated" 139 vsr_event_warning_text = f"Configuration for {text_vsr} was added or updated with warning(s):" 140 vs_event_text = f"Configuration for {text_vs} was added or updated" 141 wait_before_test(10) 142 initial_events = get_events(kube_apis.v1, vsr_externalname_setup.route.namespace) 143 initial_count_vsr = assert_event_and_get_count(vsr_event_text, initial_events) 144 initial_warning_count_vsr = assert_event_and_get_count(vsr_event_warning_text, initial_events) 145 initial_count_vs = assert_event_and_get_count(vs_event_text, initial_events) 146 147 print("Step 1: Update external host in externalName service") 148 external_svc = read_service(kube_apis.v1, vsr_externalname_setup.external_svc, vsr_externalname_setup.namespace) 149 external_svc.spec.external_name = "demo.nginx.com" 150 replace_service(kube_apis.v1, 151 vsr_externalname_setup.external_svc, vsr_externalname_setup.namespace, external_svc) 152 wait_before_test(10) 153 154 wait_for_event_count_increases(kube_apis, vsr_event_text, 155 initial_count_vsr, vsr_externalname_setup.route.namespace) 156 events_step_1 = get_events(kube_apis.v1, vsr_externalname_setup.route.namespace) 157 assert_event_and_count(vsr_event_text, initial_count_vsr + 1, events_step_1) 158 assert_event_and_count(vs_event_text, initial_count_vs + 1, events_step_1) 159 160 print("Step 2: Remove resolver from ConfigMap to trigger an error") 161 config_map_name = ingress_controller_prerequisites.config_map["metadata"]["name"] 162 replace_configmap(kube_apis.v1, config_map_name, 163 ingress_controller_prerequisites.namespace, 164 ingress_controller_prerequisites.config_map) 165 wait_before_test(10) 166 167 events_step_2 = get_events(kube_apis.v1, vsr_externalname_setup.route.namespace) 168 assert_event_and_count(vsr_event_warning_text, initial_warning_count_vsr + 1, events_step_2) 169 assert_event_and_count(vs_event_text, initial_count_vs + 2, events_step_2)