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

     1  import pytest
     2  import json
     3  import requests
     4  from kubernetes.client.rest import ApiException
     5  
     6  from suite.custom_assertions import wait_and_assert_status_code, assert_vs_conf_not_exists, \
     7      assert_event_starts_with_text_and_contains_errors
     8  from settings import TEST_DATA
     9  from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf
    10  from suite.resources_utils import wait_before_test, get_first_pod_name, get_events
    11  
    12  
    13  @pytest.mark.vs
    14  @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup',
    15                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    16                             {"example": "virtual-server-error-pages", "app_type": None})],
    17                           indirect=True)
    18  class TestVSErrorPages:
    19      def test_redirect_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    20          wait_and_assert_status_code(307, virtual_server_setup.backend_1_url,
    21                                      virtual_server_setup.vs_host, allow_redirects=False)
    22          resp = requests.get(virtual_server_setup.backend_1_url,
    23                              headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
    24          assert f'http://{virtual_server_setup.vs_host}/error.html' in resp.next.url
    25  
    26      def test_return_strategy(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    27          wait_and_assert_status_code(207, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
    28          resp = requests.get(virtual_server_setup.backend_2_url,
    29                              headers={"host": virtual_server_setup.vs_host})
    30          resp_content = json.loads(resp.content)
    31          assert resp_content['status'] == '502' \
    32              and resp_content['message'] == 'Forbidden' \
    33              and resp.headers.get('x-debug-original-status') == '502'
    34  
    35      def test_virtual_server_after_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    36          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name,
    37                                         f"{TEST_DATA}/virtual-server-error-pages/virtual-server-updated.yaml",
    38                                         virtual_server_setup.namespace)
    39          wait_and_assert_status_code(301, virtual_server_setup.backend_1_url,
    40                                      virtual_server_setup.vs_host, allow_redirects=False)
    41          resp = requests.get(virtual_server_setup.backend_1_url,
    42                              headers={"host": virtual_server_setup.vs_host, "x-forwarded-proto": "http"},
    43                              allow_redirects=False)
    44          assert f'http://{virtual_server_setup.vs_host}/error_http.html' in resp.next.url
    45  
    46          wait_and_assert_status_code(502, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
    47          resp = requests.get(virtual_server_setup.backend_2_url,
    48                              headers={"host": virtual_server_setup.vs_host})
    49          resp_content = resp.content.decode('utf-8')
    50          assert resp_content == 'Hello World!\n'
    51  
    52      def test_validation_event_flow(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller,
    53                                     virtual_server_setup):
    54          invalid_fields = [
    55              "spec.routes[0].errorPages[0].redirect.url: Invalid value",
    56              "spec.routes[0].errorPages[0].redirect.code: Invalid value: 101",
    57              "spec.routes[1].errorPages[0].return.body: Invalid value: \"status\"",
    58              "spec.routes[1].errorPages[0].return.code: Invalid value: 100",
    59              "spec.routes[1].errorPages[0].return.headers[0].value: Invalid value: \"schema\""
    60          ]
    61          text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
    62          vs_event_text = f"VirtualServer {text} was rejected with error:"
    63          vs_file = f"{TEST_DATA}/virtual-server-error-pages/virtual-server-invalid.yaml"
    64          patch_virtual_server_from_yaml(kube_apis.custom_objects,
    65                                         virtual_server_setup.vs_name,
    66                                         vs_file,
    67                                         virtual_server_setup.namespace)
    68          wait_before_test(2)
    69          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    70          vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
    71  
    72          assert_event_starts_with_text_and_contains_errors(vs_event_text, vs_events, invalid_fields)
    73          assert_vs_conf_not_exists(kube_apis, ic_pod_name, ingress_controller_prerequisites.namespace,
    74                                    virtual_server_setup)
    75  
    76      def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites,
    77                                       crd_ingress_controller, virtual_server_setup):
    78          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    79          config_old = get_vs_nginx_template_conf(kube_apis.v1,
    80                                                  virtual_server_setup.namespace,
    81                                                  virtual_server_setup.vs_name,
    82                                                  ic_pod_name,
    83                                                  ingress_controller_prerequisites.namespace)
    84          vs_file = f"{TEST_DATA}/virtual-server-error-pages/virtual-server-invalid-openapi.yaml"
    85          try:
    86              patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_file,
    87                                             virtual_server_setup.namespace)
    88          except ApiException as ex:
    89              assert ex.status == 422 \
    90                     and "spec.routes.errorPages.codes" in ex.body \
    91                     and "spec.routes.errorPages.redirect.code" in ex.body \
    92                     and "spec.routes.errorPages.redirect.url" in ex.body \
    93                     and "spec.routes.errorPages.return.code" in ex.body \
    94                     and "spec.routes.errorPages.return.type" in ex.body \
    95                     and "spec.routes.errorPages.return.body" in ex.body \
    96                     and "spec.routes.errorPages.return.headers.name" in ex.body \
    97                     and "spec.routes.errorPages.return.headers.value" in ex.body
    98          except Exception as ex:
    99              pytest.fail(f"An unexpected exception is raised: {ex}")
   100          else:
   101              pytest.fail("Expected an exception but there was none")
   102  
   103          wait_before_test(1)
   104          config_new = get_vs_nginx_template_conf(kube_apis.v1,
   105                                                  virtual_server_setup.namespace,
   106                                                  virtual_server_setup.vs_name,
   107                                                  ic_pod_name,
   108                                                  ingress_controller_prerequisites.namespace)
   109          assert config_old == config_new, "Expected: config doesn't change"
   110  
   111      @pytest.mark.parametrize('v_s_data', [
   112          {"src": "virtual-server-splits.yaml", "expected_code": 308},
   113          {"src": "virtual-server-matches.yaml", "expected_code": 307}
   114      ])
   115      def test_splits_and_matches(self, kube_apis, crd_ingress_controller, virtual_server_setup, v_s_data):
   116          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name,
   117                                         f"{TEST_DATA}/virtual-server-error-pages/{v_s_data['src']}",
   118                                         virtual_server_setup.namespace)
   119          wait_and_assert_status_code(v_s_data['expected_code'], virtual_server_setup.backend_1_url,
   120                                      virtual_server_setup.vs_host, allow_redirects=False)
   121          resp = requests.get(virtual_server_setup.backend_1_url,
   122                              headers={"host": virtual_server_setup.vs_host}, allow_redirects=False)
   123          assert f'http://{virtual_server_setup.vs_host}/error.html' in resp.next.url