github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server_external_name.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, assert_event_with_full_equality_and_count 6 from suite.custom_resources_utils import get_vs_nginx_template_conf 7 from suite.resources_utils import replace_configmap_from_yaml, \ 8 ensure_connection_to_public_endpoint, replace_configmap, create_service_from_yaml, get_first_pod_name, get_events, \ 9 read_service, replace_service, wait_before_test, delete_namespace, create_service_with_name, \ 10 create_deployment_with_name, create_namespace_with_name_from_yaml, ensure_response_from_backend 11 12 13 class ExternalNameSetup: 14 """Encapsulate ExternalName example details. 15 16 Attributes: 17 ic_pod_name: 18 external_host: external service host 19 """ 20 def __init__(self, ic_pod_name, external_svc, external_host): 21 self.ic_pod_name = ic_pod_name 22 self.external_svc = external_svc 23 self.external_host = external_host 24 25 26 @pytest.fixture(scope="class") 27 def vs_externalname_setup(request, 28 kube_apis, 29 ingress_controller_prerequisites, 30 virtual_server_setup) -> ExternalNameSetup: 31 print("------------------------- Deploy External-Backend -----------------------------------") 32 external_ns = create_namespace_with_name_from_yaml(kube_apis.v1, "external-ns", f"{TEST_DATA}/common/ns.yaml") 33 external_svc_name = create_service_with_name(kube_apis.v1, external_ns, "external-backend-svc") 34 create_deployment_with_name(kube_apis.apps_v1_api, external_ns, "external-backend") 35 print("------------------------- Prepare ExternalName Setup -----------------------------------") 36 external_svc_src = f"{TEST_DATA}/virtual-server-externalname/externalname-svc.yaml" 37 external_svc_host = f"{external_svc_name}.{external_ns}.svc.cluster.local" 38 config_map_name = ingress_controller_prerequisites.config_map["metadata"]["name"] 39 replace_configmap_from_yaml(kube_apis.v1, config_map_name, 40 ingress_controller_prerequisites.namespace, 41 f"{TEST_DATA}/virtual-server-externalname/nginx-config.yaml") 42 external_svc = create_service_from_yaml(kube_apis.v1, virtual_server_setup.namespace, external_svc_src) 43 wait_before_test(2) 44 ensure_connection_to_public_endpoint(virtual_server_setup.public_endpoint.public_ip, 45 virtual_server_setup.public_endpoint.port, 46 virtual_server_setup.public_endpoint.port_ssl) 47 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 48 ensure_response_from_backend(virtual_server_setup.backend_1_url, virtual_server_setup.vs_host) 49 50 def fin(): 51 print("Clean up ExternalName Setup:") 52 delete_namespace(kube_apis.v1, external_ns) 53 replace_configmap(kube_apis.v1, config_map_name, 54 ingress_controller_prerequisites.namespace, 55 ingress_controller_prerequisites.config_map) 56 57 request.addfinalizer(fin) 58 59 return ExternalNameSetup(ic_pod_name, external_svc, external_svc_host) 60 61 62 @pytest.mark.vs 63 @pytest.mark.skip_for_nginx_oss 64 @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup', 65 [({"type": "complete", "extra_args": [f"-enable-custom-resources", "-v=3"]}, 66 {"example": "virtual-server-externalname", "app_type": "simple"})], 67 indirect=True) 68 class TestVSWithExternalNameService: 69 def test_response(self, kube_apis, crd_ingress_controller, virtual_server_setup, vs_externalname_setup): 70 wait_and_assert_status_code(200, virtual_server_setup.backend_1_url, 71 virtual_server_setup.vs_host) 72 73 def test_template_config(self, kube_apis, ingress_controller_prerequisites, 74 crd_ingress_controller, 75 virtual_server_setup, vs_externalname_setup): 76 result_conf = get_vs_nginx_template_conf(kube_apis.v1, 77 virtual_server_setup.namespace, 78 virtual_server_setup.vs_name, 79 vs_externalname_setup.ic_pod_name, 80 ingress_controller_prerequisites.namespace) 81 line = f"zone vs_{virtual_server_setup.namespace}_{virtual_server_setup.vs_name}_backend1 256k;" 82 assert line in result_conf 83 assert "random two least_conn;" in result_conf 84 assert f"server {vs_externalname_setup.external_host}:80 max_fails=1 fail_timeout=10s max_conns=0 resolve;"\ 85 in result_conf 86 87 def test_events_flows(self, kube_apis, ingress_controller_prerequisites, 88 crd_ingress_controller, virtual_server_setup, vs_externalname_setup): 89 text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}" 90 vs_event_text = f"Configuration for {text} was added or updated" 91 wait_before_test(10) 92 events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace) 93 initial_count = assert_event_and_get_count(vs_event_text, events_vs) 94 95 print("Step 1: Update external host in externalName service") 96 external_svc = read_service(kube_apis.v1, vs_externalname_setup.external_svc, virtual_server_setup.namespace) 97 external_svc.spec.external_name = "demo.nginx.com" 98 replace_service(kube_apis.v1, vs_externalname_setup.external_svc, virtual_server_setup.namespace, external_svc) 99 wait_before_test(10) 100 101 wait_for_event_count_increases(kube_apis, vs_event_text, initial_count, virtual_server_setup.namespace) 102 events_step_1 = get_events(kube_apis.v1, virtual_server_setup.namespace) 103 assert_event_and_count(vs_event_text, initial_count + 1, events_step_1) 104 105 print("Step 2: Remove resolver from ConfigMap to trigger an error") 106 config_map_name = ingress_controller_prerequisites.config_map["metadata"]["name"] 107 vs_event_warning_text = f"Configuration for {text} was added or updated ; with warning(s):" 108 replace_configmap(kube_apis.v1, config_map_name, 109 ingress_controller_prerequisites.namespace, 110 ingress_controller_prerequisites.config_map) 111 wait_before_test(10) 112 113 events_step_2 = get_events(kube_apis.v1, virtual_server_setup.namespace) 114 assert_event_and_count(vs_event_warning_text, 1, events_step_2) 115 assert_event_with_full_equality_and_count(vs_event_text, initial_count + 1, events_step_2)