github.com/nginxinc/kubernetes-ingress@v1.12.5/tests/suite/test_virtual_server_redirects.py (about)

     1  import pytest
     2  import requests
     3  from kubernetes.client.rest import ApiException
     4  
     5  from settings import TEST_DATA
     6  from suite.custom_assertions import wait_and_assert_status_code, assert_event_and_get_count, \
     7      assert_event_count_increased, assert_event_starts_with_text_and_contains_errors
     8  from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf
     9  from suite.resources_utils import get_first_pod_name, get_events, wait_before_test
    10  
    11  
    12  @pytest.mark.vs
    13  @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup',
    14                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    15                             {"example": "virtual-server-redirects", "app_type": None})],
    16                           indirect=True)
    17  class TestVSRedirects:
    18      def test_config(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup):
    19          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    20          config = get_vs_nginx_template_conf(kube_apis.v1,
    21                                              virtual_server_setup.namespace,
    22                                              virtual_server_setup.vs_name,
    23                                              ic_pod_name,
    24                                              ingress_controller_prerequisites.namespace)
    25          assert 'error_page 418 =307' in config and 'error_page 418 =301' in config
    26  
    27      def test_custom_redirect(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    28          req_url = f"{virtual_server_setup.backend_1_url}"
    29          wait_and_assert_status_code(307, req_url, virtual_server_setup.vs_host, allow_redirects=False)
    30          resp = requests.get(req_url, headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
    31          assert resp.headers['location'] == "http://example.com"
    32  
    33      def test_default_redirect(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    34          wait_and_assert_status_code(301, virtual_server_setup.backend_2_url,
    35                                      virtual_server_setup.vs_host, allow_redirects=False)
    36          resp = requests.get(virtual_server_setup.backend_2_url,
    37                              headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
    38          assert resp.headers['location'] == f"http://{virtual_server_setup.vs_host}/default-redirect?arg="
    39  
    40      def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    41          wait_before_test(1)
    42          text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
    43          vs_event_text = f"Configuration for {text} was added or updated"
    44          events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace)
    45          initial_count = assert_event_and_get_count(vs_event_text, events_vs)
    46          vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-updated.yaml"
    47          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
    48                                         virtual_server_setup.namespace)
    49          wait_and_assert_status_code(301, virtual_server_setup.backend_1_url,
    50                                      virtual_server_setup.vs_host, allow_redirects=False)
    51          resp = requests.get(virtual_server_setup.backend_1_url,
    52                              headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
    53          assert resp.headers['location'] == "http://demo.nginx.com"
    54          wait_and_assert_status_code(302, virtual_server_setup.backend_2_url,
    55                                      virtual_server_setup.vs_host, allow_redirects=False)
    56          resp = requests.get(virtual_server_setup.backend_2_url,
    57                              headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
    58          assert resp.headers['location'] == "http://demo.nginx.com"
    59  
    60          vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
    61          assert_event_count_increased(vs_event_text, initial_count, vs_events)
    62  
    63      def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    64          text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
    65          event_text = f"VirtualServer {text} was rejected with error:"
    66          invalid_fields = ["spec.routes[0].action.redirect.code", "spec.routes[1].action.redirect.url"]
    67          vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-invalid.yaml"
    68          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
    69                                         virtual_server_setup.namespace)
    70          wait_before_test(2)
    71  
    72          wait_and_assert_status_code(404, virtual_server_setup.backend_1_url,
    73                                      virtual_server_setup.vs_host, allow_redirects=False)
    74          vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
    75          assert_event_starts_with_text_and_contains_errors(event_text, vs_events, invalid_fields)
    76  
    77      def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites,
    78                                       crd_ingress_controller, virtual_server_setup):
    79          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    80          config_old = get_vs_nginx_template_conf(kube_apis.v1,
    81                                                  virtual_server_setup.namespace,
    82                                                  virtual_server_setup.vs_name,
    83                                                  ic_pod_name,
    84                                                  ingress_controller_prerequisites.namespace)
    85          vs_src = f"{TEST_DATA}/virtual-server-redirects/virtual-server-invalid-openapi.yaml"
    86          try:
    87              patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
    88                                             virtual_server_setup.namespace)
    89          except ApiException as ex:
    90              assert ex.status == 422 \
    91                     and "spec.routes.action.redirect.url" in ex.body \
    92                     and "spec.routes.action.redirect.code" in ex.body
    93          except Exception as ex:
    94              pytest.fail(f"An unexpected exception is raised: {ex}")
    95          else:
    96              pytest.fail("Expected an exception but there was none")
    97  
    98          wait_before_test(1)
    99          config_new = get_vs_nginx_template_conf(kube_apis.v1,
   100                                                  virtual_server_setup.namespace,
   101                                                  virtual_server_setup.vs_name,
   102                                                  ic_pod_name,
   103                                                  ingress_controller_prerequisites.namespace)
   104          assert config_old == config_new, "Expected: config doesn't change"