github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_externalname_service.py (about) 1 import requests 2 import pytest 3 4 from settings import TEST_DATA 5 from suite.fixtures import PublicEndpoint 6 from suite.resources_utils import create_ingress_from_yaml, create_service_with_name, \ 7 create_namespace_with_name_from_yaml, create_deployment_with_name, delete_namespace, ensure_response_from_backend 8 from suite.resources_utils import replace_configmap_from_yaml, create_service_from_yaml 9 from suite.resources_utils import replace_configmap, delete_ingress, delete_service, get_ingress_nginx_template_conf 10 from suite.resources_utils import get_first_pod_name, ensure_connection_to_public_endpoint, wait_before_test 11 from suite.yaml_utils import get_first_ingress_host_from_yaml 12 13 14 class ExternalNameSetup: 15 """Encapsulate ExternalName example details. 16 17 Attributes: 18 public_endpoint: PublicEndpoint 19 ingress_name: 20 ingress_pod_name: 21 ingress_host: 22 service: external-name example service name 23 external_host: external-name example external host 24 namespace: external-name example namespace 25 """ 26 def __init__(self, public_endpoint: PublicEndpoint, 27 ingress_name, ingress_host, ingress_pod_name, service, external_host, namespace): 28 self.public_endpoint = public_endpoint 29 self.ingress_name = ingress_name 30 self.ingress_pod_name = ingress_pod_name 31 self.namespace = namespace 32 self.ingress_host = ingress_host 33 self.service = service 34 self.external_host = external_host 35 36 37 @pytest.fixture(scope="class") 38 def external_name_setup(request, 39 kube_apis, 40 ingress_controller_prerequisites, 41 ingress_controller_endpoint, ingress_controller, test_namespace) -> ExternalNameSetup: 42 print("------------------------- Deploy External-Backend -----------------------------------") 43 external_ns = create_namespace_with_name_from_yaml(kube_apis.v1, "external-ns", f"{TEST_DATA}/common/ns.yaml") 44 external_svc_name = create_service_with_name(kube_apis.v1, external_ns, "external-backend-svc") 45 create_deployment_with_name(kube_apis.apps_v1_api, external_ns, "external-backend") 46 print("------------------------- Deploy External-Name-Example -----------------------------------") 47 ingress_name = create_ingress_from_yaml(kube_apis.extensions_v1_beta1, test_namespace, 48 f"{TEST_DATA}/externalname-services/externalname-ingress.yaml") 49 ingress_host = get_first_ingress_host_from_yaml(f"{TEST_DATA}/externalname-services/externalname-ingress.yaml") 50 external_host = f"{external_svc_name}.{external_ns}.svc.cluster.local" 51 config_map_name = ingress_controller_prerequisites.config_map["metadata"]["name"] 52 replace_configmap_from_yaml(kube_apis.v1, config_map_name, 53 ingress_controller_prerequisites.namespace, 54 f"{TEST_DATA}/externalname-services/nginx-config.yaml") 55 svc_name = create_service_from_yaml(kube_apis.v1, 56 test_namespace, f"{TEST_DATA}/externalname-services/externalname-svc.yaml") 57 ensure_connection_to_public_endpoint(ingress_controller_endpoint.public_ip, 58 ingress_controller_endpoint.port, 59 ingress_controller_endpoint.port_ssl) 60 ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace) 61 62 def fin(): 63 print("Clean up External-Name-Example:") 64 delete_namespace(kube_apis.v1, external_ns) 65 replace_configmap(kube_apis.v1, config_map_name, 66 ingress_controller_prerequisites.namespace, 67 ingress_controller_prerequisites.config_map) 68 delete_ingress(kube_apis.extensions_v1_beta1, ingress_name, test_namespace) 69 delete_service(kube_apis.v1, svc_name, test_namespace) 70 71 request.addfinalizer(fin) 72 73 return ExternalNameSetup(ingress_controller_endpoint, 74 ingress_name, ingress_host, ic_pod_name, svc_name, external_host, test_namespace) 75 76 77 @pytest.mark.ingresses 78 @pytest.mark.skip_for_nginx_oss 79 class TestExternalNameService: 80 def test_resolver(self, external_name_setup): 81 wait_before_test() 82 req_url = f"http://{external_name_setup.public_endpoint.public_ip}:{external_name_setup.public_endpoint.port}/" 83 ensure_response_from_backend(req_url, external_name_setup.ingress_host) 84 resp = requests.get(req_url, headers={"host": external_name_setup.ingress_host}, verify=False) 85 assert resp.status_code == 200 86 87 def test_ic_template_config_upstream_zone(self, kube_apis, ingress_controller_prerequisites, 88 ingress_controller, external_name_setup): 89 result_conf = get_ingress_nginx_template_conf(kube_apis.v1, 90 external_name_setup.namespace, 91 external_name_setup.ingress_name, 92 external_name_setup.ingress_pod_name, 93 ingress_controller_prerequisites.namespace) 94 line = f"zone {external_name_setup.namespace}-" \ 95 f"{external_name_setup.ingress_name}-" \ 96 f"{external_name_setup.ingress_host}-{external_name_setup.service}-80 256k;" 97 assert line in result_conf 98 99 def test_ic_template_config_upstream_rule(self, kube_apis, ingress_controller_prerequisites, 100 ingress_controller, external_name_setup): 101 result_conf = get_ingress_nginx_template_conf(kube_apis.v1, 102 external_name_setup.namespace, 103 external_name_setup.ingress_name, 104 external_name_setup.ingress_pod_name, 105 ingress_controller_prerequisites.namespace) 106 assert "random two least_conn;" in result_conf 107 108 def test_ic_template_config_upstream_server(self, kube_apis, ingress_controller_prerequisites, 109 ingress_controller, ingress_controller_endpoint, external_name_setup): 110 result_conf = get_ingress_nginx_template_conf(kube_apis.v1, 111 external_name_setup.namespace, 112 external_name_setup.ingress_name, 113 external_name_setup.ingress_pod_name, 114 ingress_controller_prerequisites.namespace) 115 assert f"server {external_name_setup.external_host}:80 max_fails=1 fail_timeout=10s max_conns=0 resolve;"\ 116 in result_conf