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

     1  import pytest
     2  import requests
     3  
     4  from settings import TEST_DATA
     5  from suite.custom_resources_utils import create_virtual_server_from_yaml, create_v_s_route_from_yaml, \
     6      patch_v_s_route_from_yaml
     7  from suite.fixtures import VirtualServerRoute
     8  from suite.resources_utils import wait_before_test, ensure_response_from_backend, create_example_app, \
     9      wait_until_all_pods_are_ready, create_namespace_with_name_from_yaml, delete_namespace
    10  from suite.yaml_utils import get_paths_from_vsr_yaml, get_first_host_from_yaml, get_route_namespace_from_vs_yaml
    11  
    12  
    13  def execute_assertions(resp_1, resp_2, resp_3):
    14      assert resp_1.status_code == 200
    15      assert "Server name: backend1-" in resp_1.text, "Expected response from backend1"
    16      assert resp_2.status_code == 200
    17      assert "Server name: backend3-" in resp_2.text, "Expected response from backend3"
    18      assert resp_3.status_code == 200
    19      assert "Server name: backend4-" in resp_3.text, "Expected response from backend4"
    20  
    21  
    22  def ensure_responses_from_backends(req_url, host) -> None:
    23      ensure_response_from_backend(req_url, host, {"x-version": "future"})
    24      ensure_response_from_backend(req_url, host, {"x-version": "deprecated"})
    25      ensure_response_from_backend(req_url, host, {"x-version-invalid": "deprecated"})
    26  
    27  
    28  class VSRAdvancedRoutingSetup:
    29      """
    30      Encapsulate advanced routing VSR example details.
    31  
    32      Attributes:
    33          namespace (str):
    34          vs_host (str):
    35          vs_name (str):
    36          route (VirtualServerRoute):
    37          backends_url (str): backend url
    38      """
    39  
    40      def __init__(self, namespace, vs_host, vs_name, route: VirtualServerRoute, backends_url):
    41          self.namespace = namespace
    42          self.vs_host = vs_host
    43          self.vs_name = vs_name
    44          self.route = route
    45          self.backends_url = backends_url
    46  
    47  
    48  @pytest.fixture(scope="class")
    49  def vsr_adv_routing_setup(request, kube_apis,
    50                            ingress_controller_prerequisites, ingress_controller_endpoint) -> VSRAdvancedRoutingSetup:
    51      """
    52      Prepare an example app for advanced routing VSR.
    53  
    54      Single namespace with VS+VSR and advanced-routing app.
    55  
    56      :param request: internal pytest fixture
    57      :param kube_apis: client apis
    58      :param ingress_controller_endpoint:
    59      :param ingress_controller_prerequisites:
    60      :return:
    61      """
    62      vs_routes_ns = get_route_namespace_from_vs_yaml(
    63          f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml")
    64      ns_1 = create_namespace_with_name_from_yaml(kube_apis.v1,
    65                                                  vs_routes_ns[0],
    66                                                  f"{TEST_DATA}/common/ns.yaml")
    67      print("------------------------- Deploy Virtual Server -----------------------------------")
    68      vs_name = create_virtual_server_from_yaml(kube_apis.custom_objects,
    69                                                f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml",
    70                                                ns_1)
    71      vs_host = get_first_host_from_yaml(f"{TEST_DATA}/{request.param['example']}/standard/virtual-server.yaml")
    72  
    73      print("------------------------- Deploy Virtual Server Route -----------------------------------")
    74      vsr_name = create_v_s_route_from_yaml(kube_apis.custom_objects,
    75                                            f"{TEST_DATA}/{request.param['example']}/virtual-server-route-header.yaml",
    76                                            ns_1)
    77      vsr_paths = get_paths_from_vsr_yaml(f"{TEST_DATA}/{request.param['example']}/virtual-server-route-header.yaml")
    78      route = VirtualServerRoute(ns_1, vsr_name, vsr_paths)
    79      backends_url = f"http://{ingress_controller_endpoint.public_ip}:{ingress_controller_endpoint.port}{vsr_paths[0]}"
    80  
    81      print("---------------------- Deploy advanced-routing app ----------------------------")
    82      create_example_app(kube_apis, "advanced-routing", ns_1)
    83      wait_until_all_pods_are_ready(kube_apis.v1, ns_1)
    84  
    85      def fin():
    86          print("Delete test namespace")
    87          delete_namespace(kube_apis.v1, ns_1)
    88  
    89      request.addfinalizer(fin)
    90  
    91      return VSRAdvancedRoutingSetup(ns_1, vs_host, vs_name, route, backends_url)
    92  
    93  
    94  @pytest.mark.vsr
    95  @pytest.mark.parametrize('crd_ingress_controller, vsr_adv_routing_setup',
    96                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    97                             {"example": "virtual-server-route-advanced-routing"})],
    98                           indirect=True)
    99  class TestVSRAdvancedRouting:
   100      def test_flow_with_header(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup):
   101          ensure_responses_from_backends(vsr_adv_routing_setup.backends_url, vsr_adv_routing_setup.vs_host)
   102  
   103          resp_1 = requests.get(vsr_adv_routing_setup.backends_url,
   104                                headers={"host": vsr_adv_routing_setup.vs_host, "x-version": "future"})
   105          resp_2 = requests.get(vsr_adv_routing_setup.backends_url,
   106                                headers={"host": vsr_adv_routing_setup.vs_host, "x-version": "deprecated"})
   107          resp_3 = requests.get(vsr_adv_routing_setup.backends_url,
   108                                headers={"host": vsr_adv_routing_setup.vs_host, "x-version-invalid": "deprecated"})
   109          execute_assertions(resp_1, resp_2, resp_3)
   110  
   111      def test_flow_with_argument(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup):
   112          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   113                                    vsr_adv_routing_setup.route.name,
   114                                    f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-argument.yaml",
   115                                    vsr_adv_routing_setup.namespace)
   116          wait_before_test(1)
   117  
   118          resp_1 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v1",
   119                                headers={"host": vsr_adv_routing_setup.vs_host})
   120          resp_2 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v2",
   121                                headers={"host": vsr_adv_routing_setup.vs_host})
   122          resp_3 = requests.get(vsr_adv_routing_setup.backends_url + "?argument1=v1",
   123                                headers={"host": vsr_adv_routing_setup.vs_host})
   124          execute_assertions(resp_1, resp_2, resp_3)
   125  
   126      def test_flow_with_cookie(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup):
   127          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   128                                    vsr_adv_routing_setup.route.name,
   129                                    f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-cookie.yaml",
   130                                    vsr_adv_routing_setup.namespace)
   131          wait_before_test(1)
   132  
   133          resp_1 = requests.get(vsr_adv_routing_setup.backends_url,
   134                                headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "some"})
   135          resp_2 = requests.get(vsr_adv_routing_setup.backends_url,
   136                                headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "bad"})
   137          resp_3 = requests.get(vsr_adv_routing_setup.backends_url,
   138                                headers={"host": vsr_adv_routing_setup.vs_host}, cookies={"user": "anonymous"})
   139          execute_assertions(resp_1, resp_2, resp_3)
   140  
   141      def test_flow_with_variable(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup):
   142          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   143                                    vsr_adv_routing_setup.route.name,
   144                                    f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-variable.yaml",
   145                                    vsr_adv_routing_setup.namespace)
   146          wait_before_test(1)
   147  
   148          resp_1 = requests.get(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host})
   149          resp_2 = requests.post(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host})
   150          resp_3 = requests.put(vsr_adv_routing_setup.backends_url, headers={"host": vsr_adv_routing_setup.vs_host})
   151          execute_assertions(resp_1, resp_2, resp_3)
   152  
   153      def test_flow_with_complex_conditions(self, kube_apis, crd_ingress_controller, vsr_adv_routing_setup):
   154          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   155                                    vsr_adv_routing_setup.route.name,
   156                                    f"{TEST_DATA}/virtual-server-route-advanced-routing/virtual-server-route-complex.yaml",
   157                                    vsr_adv_routing_setup.namespace)
   158          wait_before_test(1)
   159  
   160          resp_1 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v1",
   161                                headers={"host": vsr_adv_routing_setup.vs_host,
   162                                         "x-version": "future"}, cookies={"user": "some"})
   163          resp_2 = requests.post(vsr_adv_routing_setup.backends_url + "?arg1=v2",
   164                                 headers={"host": vsr_adv_routing_setup.vs_host,
   165                                          "x-version": "deprecated"}, cookies={"user": "bad"})
   166          resp_3 = requests.get(vsr_adv_routing_setup.backends_url + "?arg1=v2",
   167                                headers={"host": vsr_adv_routing_setup.vs_host,
   168                                         "x-version": "deprecated"}, cookies={"user": "bad"})
   169          execute_assertions(resp_1, resp_2, resp_3)