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)