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

     1  import pytest
     2  import requests
     3  import json
     4  
     5  from kubernetes.client.rest import ApiException
     6  
     7  from settings import TEST_DATA
     8  from suite.custom_assertions import wait_and_assert_status_code, assert_event_and_get_count, \
     9      assert_event_count_increased, assert_event_starts_with_text_and_contains_errors
    10  from suite.custom_resources_utils import patch_virtual_server_from_yaml, get_vs_nginx_template_conf
    11  from suite.resources_utils import get_first_pod_name, get_events, wait_before_test
    12  
    13  
    14  @pytest.mark.vs
    15  @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup',
    16                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    17                             {"example": "virtual-server-canned-responses", "app_type": None})],
    18                           indirect=True)
    19  class TestVSCannedResponse:
    20      def test_config(self, kube_apis, ingress_controller_prerequisites, crd_ingress_controller, virtual_server_setup):
    21          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    22          config = get_vs_nginx_template_conf(kube_apis.v1,
    23                                              virtual_server_setup.namespace,
    24                                              virtual_server_setup.vs_name,
    25                                              ic_pod_name,
    26                                              ingress_controller_prerequisites.namespace)
    27          assert "error_page 418 =407" in config and "error_page 418 =200" in config
    28  
    29      def test_custom_canned_response(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    30          req_url = f"{virtual_server_setup.backend_1_url}?arg1=arg"
    31          wait_and_assert_status_code(407, req_url, virtual_server_setup.vs_host)
    32          resp = requests.get(req_url, headers={"host": virtual_server_setup.vs_host})
    33          resp_content = json.loads(resp.content)
    34          assert resp.headers['content-type'] == 'application/json' \
    35              and resp_content['host'] == virtual_server_setup.vs_host \
    36              and resp_content['request_time'] != "" \
    37              and resp_content['pid'] != "" \
    38              and resp_content['server_protocol'] == "HTTP/1.1" \
    39              and resp_content['connections_active'] != "" \
    40              and resp_content['connections_writing'] != "" \
    41              and resp_content['request_uri'] == "/canned-response?arg1=arg" \
    42              and resp_content['remote_addr'] != "" \
    43              and resp_content['remote_port'] != "" \
    44              and resp_content['server_addr'] != "" \
    45              and resp_content['request_method'] == "GET" \
    46              and resp_content['scheme'] == "http" \
    47              and resp_content['request_length'] != "" \
    48              and resp_content['nginx_version'] != "" \
    49              and resp_content['connection'] != "" \
    50              and resp_content['time_local'] != "" \
    51              and resp_content['server_port'] != "" \
    52              and resp_content['server_name'] == virtual_server_setup.vs_host \
    53              and resp_content['connections_waiting'] != "" \
    54              and resp_content['request_body'] == "" \
    55              and resp_content['args'] == "arg1=arg" \
    56              and resp_content['time_iso8601'] != "" \
    57              and resp_content['connections_reading'] != ""
    58  
    59      def test_default_canned_response(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    60          wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
    61          resp = requests.get(virtual_server_setup.backend_2_url, headers={"host": virtual_server_setup.vs_host})
    62          resp_content = resp.content.decode('utf-8')
    63          assert resp.headers['content-type'] == 'text/plain' and resp_content == "line1\nline2\nline3"
    64  
    65      def test_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    66          wait_before_test(1)
    67          text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
    68          vs_event_text = f"Configuration for {text} was added or updated"
    69          events_vs = get_events(kube_apis.v1, virtual_server_setup.namespace)
    70          initial_count = assert_event_and_get_count(vs_event_text, events_vs)
    71          vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-updated.yaml"
    72          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
    73                                         virtual_server_setup.namespace)
    74          wait_and_assert_status_code(501, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host)
    75          resp = requests.get(virtual_server_setup.backend_1_url, headers={"host": virtual_server_setup.vs_host})
    76          resp_content = resp.content.decode('utf-8')
    77          assert resp.headers['content-type'] == 'some/type' and resp_content == "{}"
    78  
    79          wait_and_assert_status_code(201, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
    80          resp = requests.get(virtual_server_setup.backend_2_url, headers={"host": virtual_server_setup.vs_host})
    81          resp_content = resp.content.decode('utf-8')
    82          assert resp.headers['content-type'] == 'user-type' and resp_content == "line1\nline2"
    83  
    84          vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
    85          assert_event_count_increased(vs_event_text, initial_count, vs_events)
    86  
    87      def test_validation_flow(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    88          invalid_fields = [
    89              "spec.routes[0].action.return.code", "spec.routes[0].action.return.body"
    90          ]
    91          text = f"{virtual_server_setup.namespace}/{virtual_server_setup.vs_name}"
    92          vs_event_text = f"VirtualServer {text} was rejected with error:"
    93          vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-invalid.yaml"
    94          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
    95                                         virtual_server_setup.namespace)
    96          wait_before_test(1)
    97  
    98          wait_and_assert_status_code(404, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host)
    99          vs_events = get_events(kube_apis.v1, virtual_server_setup.namespace)
   100          assert_event_starts_with_text_and_contains_errors(vs_event_text, vs_events, invalid_fields)
   101  
   102      def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites,
   103                                       crd_ingress_controller, virtual_server_setup):
   104          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
   105          config_old = get_vs_nginx_template_conf(kube_apis.v1,
   106                                                  virtual_server_setup.namespace,
   107                                                  virtual_server_setup.vs_name,
   108                                                  ic_pod_name,
   109                                                  ingress_controller_prerequisites.namespace)
   110          vs_src = f"{TEST_DATA}/virtual-server-canned-responses/virtual-server-invalid-openapi.yaml"
   111          try:
   112              patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name, vs_src,
   113                                             virtual_server_setup.namespace)
   114          except ApiException as ex:
   115              assert ex.status == 422 \
   116                     and "spec.routes.action.return.type" in ex.body \
   117                     and "spec.routes.action.return.body" in ex.body \
   118                     and "spec.routes.action.return.code" in ex.body
   119          except Exception as ex:
   120              pytest.fail(f"An unexpected exception is raised: {ex}")
   121          else:
   122              pytest.fail("Expected an exception but there was none")
   123  
   124          wait_before_test(1)
   125          config_new = get_vs_nginx_template_conf(kube_apis.v1,
   126                                                  virtual_server_setup.namespace,
   127                                                  virtual_server_setup.vs_name,
   128                                                  ic_pod_name,
   129                                                  ingress_controller_prerequisites.namespace)
   130          assert config_old == config_new, "Expected: config doesn't change"