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