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)