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

     1  import requests
     2  import pytest
     3  from kubernetes.client.rest import ApiException
     4  
     5  from settings import TEST_DATA
     6  from suite.custom_assertions import assert_event_and_count, assert_event_and_get_count, \
     7      assert_event_with_full_equality_and_count
     8  from suite.custom_resources_utils import create_virtual_server_from_yaml, \
     9      delete_virtual_server, create_v_s_route_from_yaml, delete_v_s_route, get_vs_nginx_template_conf, \
    10      patch_v_s_route_from_yaml
    11  from suite.resources_utils import delete_service, get_first_pod_name, get_events, \
    12      wait_before_test, read_service, replace_service, create_service_with_name
    13  from suite.yaml_utils import get_paths_from_vsr_yaml
    14  
    15  
    16  def assert_responses_and_server_name(resp_1, resp_2, resp_3):
    17      assert resp_1.status_code == 200
    18      assert "Server name: backend1-" in resp_1.text
    19      assert resp_2.status_code == 200
    20      assert "Server name: backend3-" in resp_2.text
    21      assert resp_3.status_code == 200
    22      assert "Server name: backend2-" in resp_3.text
    23  
    24  
    25  def assert_locations_in_config(config, paths):
    26      for path in paths:
    27          assert f"location {path}" in config
    28  
    29  
    30  def assert_locations_not_in_config(config, paths):
    31      assert "No such file or directory" not in config
    32      for path in paths:
    33          assert f"location {path}" not in config
    34  
    35  
    36  @pytest.mark.smoke
    37  @pytest.mark.vsr
    38  @pytest.mark.parametrize('crd_ingress_controller, v_s_route_setup',
    39                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    40                             {"example": "virtual-server-route"})],
    41                           indirect=True)
    42  class TestVirtualServerRoute:
    43      def test_responses_and_events_in_flow(self, kube_apis,
    44                                            ingress_controller_prerequisites,
    45                                            crd_ingress_controller,
    46                                            v_s_route_setup,
    47                                            v_s_route_app_setup):
    48          req_url = f"http://{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"
    49          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
    50          vs_name = f"{v_s_route_setup.namespace}/{v_s_route_setup.vs_name}"
    51          vsr_1_name = f"{v_s_route_setup.namespace}/{v_s_route_setup.route_m.name}"
    52          vsr_2_name = f"{v_s_route_setup.route_s.namespace}/{v_s_route_setup.route_s.name}"
    53          vsr_1_event_text = f"Configuration for {vsr_1_name} was added or updated"
    54          vs_event_text = f"Configuration for {vs_name} was added or updated"
    55          vs_warning_event_text = f"Configuration for {vs_name} was added or updated with warning(s): VirtualServerRoute {vsr_1_name} doesn't exist or invalid"
    56          vsr_2_event_text = f"Configuration for {vsr_2_name} was added or updated"
    57          initial_config = get_vs_nginx_template_conf(kube_apis.v1,
    58                                                      v_s_route_setup.namespace,
    59                                                      v_s_route_setup.vs_name,
    60                                                      ic_pod_name,
    61                                                      ingress_controller_prerequisites.namespace)
    62  
    63          print("\nStep 1: initial check")
    64          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
    65                                headers={"host": v_s_route_setup.vs_host})
    66          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
    67                                headers={"host": v_s_route_setup.vs_host})
    68          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
    69                                headers={"host": v_s_route_setup.vs_host})
    70          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
    71          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
    72          assert_responses_and_server_name(resp_1, resp_2, resp_3)
    73          assert_locations_in_config(initial_config, v_s_route_setup.route_m.paths)
    74          assert_locations_in_config(initial_config, v_s_route_setup.route_s.paths)
    75          initial_count_vsr_1 = assert_event_and_get_count(vsr_1_event_text, events_ns_1)
    76          initial_count_vs = assert_event_and_get_count(vs_event_text, events_ns_1)
    77          initial_count_vsr_2 = assert_event_and_get_count(vsr_2_event_text, events_ns_2)
    78  
    79          print("\nStep 2: update multiple VSRoute and check")
    80          patch_v_s_route_from_yaml(kube_apis.custom_objects,
    81                                    v_s_route_setup.route_m.name,
    82                                    f"{TEST_DATA}/virtual-server-route/route-multiple-updated.yaml",
    83                                    v_s_route_setup.route_m.namespace)
    84          new_vsr_paths = get_paths_from_vsr_yaml(f"{TEST_DATA}/virtual-server-route/route-multiple-updated.yaml")
    85          wait_before_test(1)
    86          resp_1 = requests.get(f"{req_url}{new_vsr_paths[0]}",
    87                                headers={"host": v_s_route_setup.vs_host})
    88          resp_2 = requests.get(f"{req_url}{new_vsr_paths[1]}",
    89                                headers={"host": v_s_route_setup.vs_host})
    90          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
    91                                headers={"host": v_s_route_setup.vs_host})
    92          assert_responses_and_server_name(resp_1, resp_2, resp_3)
    93          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
    94          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
    95          assert_event_and_count(vsr_1_event_text, initial_count_vsr_1 + 1, events_ns_1)
    96          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 1, events_ns_1)
    97          # 2nd VSRoute gets an event about update too
    98          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 1, events_ns_2)
    99  
   100          print("\nStep 3: restore VSRoute and check")
   101          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   102                                    v_s_route_setup.route_m.name,
   103                                    f"{TEST_DATA}/virtual-server-route/route-multiple.yaml",
   104                                    v_s_route_setup.route_m.namespace)
   105          wait_before_test(1)
   106          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   107                                headers={"host": v_s_route_setup.vs_host})
   108          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   109                                headers={"host": v_s_route_setup.vs_host})
   110          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   111                                headers={"host": v_s_route_setup.vs_host})
   112          assert_responses_and_server_name(resp_1, resp_2, resp_3)
   113          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   114          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   115          assert_event_and_count(vsr_1_event_text, initial_count_vsr_1 + 2, events_ns_1)
   116          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 2, events_ns_1)
   117          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 2, events_ns_2)
   118  
   119          print("\nStep 4: update one backend service port and check")
   120          svc_1 = read_service(kube_apis.v1, "backend1-svc", v_s_route_setup.route_m.namespace)
   121          svc_1.spec.ports[0].port = 8080
   122          replace_service(kube_apis.v1, "backend1-svc", v_s_route_setup.route_m.namespace, svc_1)
   123          wait_before_test(1)
   124          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   125                                headers={"host": v_s_route_setup.vs_host})
   126          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   127                                headers={"host": v_s_route_setup.vs_host})
   128          assert resp_1.status_code == 502
   129          assert resp_2.status_code == 200
   130          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   131          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   132          assert_event_and_count(vsr_1_event_text, initial_count_vsr_1 + 3, events_ns_1)
   133          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 3, events_ns_1)
   134          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 3, events_ns_2)
   135  
   136          print("\nStep 5: restore backend service and check")
   137          svc_1 = read_service(kube_apis.v1, "backend1-svc", v_s_route_setup.route_m.namespace)
   138          svc_1.spec.ports[0].port = 80
   139          replace_service(kube_apis.v1, "backend1-svc", v_s_route_setup.route_m.namespace, svc_1)
   140          wait_before_test(1)
   141          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   142                                headers={"host": v_s_route_setup.vs_host})
   143          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   144                                headers={"host": v_s_route_setup.vs_host})
   145          assert resp_1.status_code == 200
   146          assert resp_2.status_code == 200
   147          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   148          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   149          assert_event_and_count(vsr_1_event_text, initial_count_vsr_1 + 4, events_ns_1)
   150          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 4, events_ns_1)
   151          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 4, events_ns_2)
   152  
   153          print("\nStep 6: remove VSRoute and check")
   154          delete_v_s_route(kube_apis.custom_objects, v_s_route_setup.route_m.name, v_s_route_setup.namespace)
   155          wait_before_test(1)
   156          new_config = get_vs_nginx_template_conf(kube_apis.v1,
   157                                                  v_s_route_setup.namespace,
   158                                                  v_s_route_setup.vs_name,
   159                                                  ic_pod_name,
   160                                                  ingress_controller_prerequisites.namespace)
   161          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   162                                headers={"host": v_s_route_setup.vs_host})
   163          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   164                                headers={"host": v_s_route_setup.vs_host})
   165          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   166                                headers={"host": v_s_route_setup.vs_host})
   167          assert resp_1.status_code == 404
   168          assert resp_2.status_code == 404
   169          assert resp_3.status_code == 200
   170          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   171          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   172          assert_locations_not_in_config(new_config, v_s_route_setup.route_m.paths)
   173          assert_event_and_count(vsr_1_event_text, initial_count_vsr_1 + 4, events_ns_1)
   174          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 4, events_ns_1)
   175          # a warning event because the VS references a non-existing VSR
   176          assert_event_with_full_equality_and_count(vs_warning_event_text, 1, events_ns_1)
   177          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 5, events_ns_2)
   178  
   179          print("\nStep 7: restore VSRoute and check")
   180          create_v_s_route_from_yaml(kube_apis.custom_objects,
   181                                     f"{TEST_DATA}/virtual-server-route/route-multiple.yaml",
   182                                     v_s_route_setup.namespace)
   183          wait_before_test(1)
   184          new_config = get_vs_nginx_template_conf(kube_apis.v1,
   185                                                  v_s_route_setup.namespace,
   186                                                  v_s_route_setup.vs_name,
   187                                                  ic_pod_name,
   188                                                  ingress_controller_prerequisites.namespace)
   189          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   190                                headers={"host": v_s_route_setup.vs_host})
   191          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   192                                headers={"host": v_s_route_setup.vs_host})
   193          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   194                                headers={"host": v_s_route_setup.vs_host})
   195          assert_responses_and_server_name(resp_1, resp_2, resp_3)
   196          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   197          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   198          assert_locations_in_config(new_config, v_s_route_setup.route_m.paths)
   199          assert_event_and_count(vsr_1_event_text, 1, events_ns_1)
   200          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 5, events_ns_1)
   201          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 6, events_ns_2)
   202  
   203          print("\nStep 8: remove one backend service and check")
   204          delete_service(kube_apis.v1, "backend1-svc", v_s_route_setup.route_m.namespace)
   205          wait_before_test(1)
   206          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   207                                headers={"host": v_s_route_setup.vs_host})
   208          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   209                                headers={"host": v_s_route_setup.vs_host})
   210          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   211                                headers={"host": v_s_route_setup.vs_host})
   212          assert resp_1.status_code == 502
   213          assert resp_2.status_code == 200
   214          assert resp_3.status_code == 200
   215          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   216          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   217          assert_event_and_count(vsr_1_event_text, 2, events_ns_1)
   218          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 6, events_ns_1)
   219          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 7, events_ns_2)
   220  
   221          print("\nStep 9: restore backend service and check")
   222          create_service_with_name(kube_apis.v1, v_s_route_setup.route_m.namespace, "backend1-svc")
   223          wait_before_test(1)
   224          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   225                                headers={"host": v_s_route_setup.vs_host})
   226          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   227                                headers={"host": v_s_route_setup.vs_host})
   228          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   229                                headers={"host": v_s_route_setup.vs_host})
   230          assert_responses_and_server_name(resp_1, resp_2, resp_3)
   231          events_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   232          events_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   233          assert_event_and_count(vsr_1_event_text, 3, events_ns_1)
   234          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 7, events_ns_1)
   235          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 8, events_ns_2)
   236  
   237          print("\nStep 10: remove VS and check")
   238          delete_virtual_server(kube_apis.custom_objects, v_s_route_setup.vs_name, v_s_route_setup.namespace)
   239          wait_before_test(1)
   240          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   241                                headers={"host": v_s_route_setup.vs_host})
   242          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   243                                headers={"host": v_s_route_setup.vs_host})
   244          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   245                                headers={"host": v_s_route_setup.vs_host})
   246          assert resp_1.status_code == 404
   247          assert resp_2.status_code == 404
   248          assert resp_3.status_code == 404
   249          list0_list_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   250          list0_list_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   251          assert_event_and_count(vsr_1_event_text, 3, list0_list_ns_1)
   252          assert_event_with_full_equality_and_count(vs_event_text, initial_count_vs + 7, list0_list_ns_1)
   253          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 8, list0_list_ns_2)
   254  
   255          print("\nStep 11: restore VS and check")
   256          create_virtual_server_from_yaml(kube_apis.custom_objects,
   257                                          f"{TEST_DATA}/virtual-server-route/standard/virtual-server.yaml",
   258                                          v_s_route_setup.namespace)
   259          wait_before_test(1)
   260          resp_1 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[0]}",
   261                                headers={"host": v_s_route_setup.vs_host})
   262          resp_2 = requests.get(f"{req_url}{v_s_route_setup.route_m.paths[1]}",
   263                                headers={"host": v_s_route_setup.vs_host})
   264          resp_3 = requests.get(f"{req_url}{v_s_route_setup.route_s.paths[0]}",
   265                                headers={"host": v_s_route_setup.vs_host})
   266          assert_responses_and_server_name(resp_1, resp_2, resp_3)
   267          list1_list_ns_1 = get_events(kube_apis.v1, v_s_route_setup.route_m.namespace)
   268          list1_list_ns_2 = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   269          assert_event_and_count(vsr_1_event_text, 4, list1_list_ns_1)
   270          assert_event_with_full_equality_and_count(vs_event_text, 1, list1_list_ns_1)
   271          assert_event_and_count(vsr_2_event_text, initial_count_vsr_2 + 9, list1_list_ns_2)
   272  
   273  
   274  @pytest.mark.vsr
   275  @pytest.mark.parametrize('crd_ingress_controller, v_s_route_setup',
   276                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
   277                             {"example": "virtual-server-route"})],
   278                           indirect=True)
   279  class TestVirtualServerRouteValidation:
   280      def test_vsr_without_vs(self, kube_apis,
   281                              ingress_controller_prerequisites,
   282                              crd_ingress_controller,
   283                              v_s_route_setup,
   284                              test_namespace):
   285          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
   286          vsr_name = create_v_s_route_from_yaml(kube_apis.custom_objects,
   287                                                f"{TEST_DATA}/virtual-server-route/route-orphan.yaml",
   288                                                test_namespace)
   289          vsr_paths = get_paths_from_vsr_yaml(f"{TEST_DATA}/virtual-server-route/route-orphan.yaml")
   290          wait_before_test(1)
   291          new_config = get_vs_nginx_template_conf(kube_apis.v1,
   292                                                  v_s_route_setup.namespace,
   293                                                  v_s_route_setup.vs_name,
   294                                                  ic_pod_name,
   295                                                  ingress_controller_prerequisites.namespace)
   296          new_list_ns_3 = get_events(kube_apis.v1, test_namespace)
   297          assert_locations_not_in_config(new_config, vsr_paths)
   298          assert_event_and_count(f"VirtualServer {v_s_route_setup.namespace}/{v_s_route_setup.vs_name} ignores VirtualServerRoute", 1, new_list_ns_3)
   299  
   300      @pytest.mark.parametrize("route_yaml", [f"{TEST_DATA}/virtual-server-route/route-single-invalid-host.yaml",
   301                                              f"{TEST_DATA}/virtual-server-route/route-single-duplicate-path.yaml"])
   302      def test_make_existing_vsr_invalid(self, kube_apis,
   303                                         ingress_controller_prerequisites,
   304                                         crd_ingress_controller,
   305                                         v_s_route_setup,
   306                                         route_yaml):
   307          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
   308          patch_v_s_route_from_yaml(kube_apis.custom_objects,
   309                                    v_s_route_setup.route_s.name,
   310                                    route_yaml,
   311                                    v_s_route_setup.route_s.namespace)
   312          wait_before_test(1)
   313          new_config = get_vs_nginx_template_conf(kube_apis.v1,
   314                                                  v_s_route_setup.namespace,
   315                                                  v_s_route_setup.vs_name,
   316                                                  ic_pod_name,
   317                                                  ingress_controller_prerequisites.namespace)
   318          new_vs_events = get_events(kube_apis.v1, v_s_route_setup.namespace)
   319          new_vsr_events = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   320          assert_locations_not_in_config(new_config, v_s_route_setup.route_s.paths)
   321          text = f"{v_s_route_setup.route_s.namespace}/{v_s_route_setup.route_s.name}"
   322          assert_event_and_count(f"Configuration for {v_s_route_setup.namespace}/{v_s_route_setup.vs_name} was added or updated with warning(s)",
   323                                 1,
   324                                 new_vs_events)
   325  
   326          if route_yaml == f"{TEST_DATA}/virtual-server-route/route-single-invalid-host.yaml":
   327              assert_event_and_count(f"VirtualServer is invalid or doesn't exist",
   328                                     1,
   329                                     new_vsr_events)
   330          else:
   331              assert_event_and_count(f"VirtualServerRoute {text} was rejected with error",
   332                                     1,
   333                                     new_vsr_events)
   334  
   335  
   336      def test_openapi_validation_flow(self, kube_apis, ingress_controller_prerequisites,
   337                                       crd_ingress_controller, v_s_route_setup):
   338          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
   339          config_old = get_vs_nginx_template_conf(kube_apis.v1,
   340                                                  v_s_route_setup.namespace,
   341                                                  v_s_route_setup.vs_name,
   342                                                  ic_pod_name,
   343                                                  ingress_controller_prerequisites.namespace)
   344          route_yaml = f"{TEST_DATA}/virtual-server-route/route-single-invalid-openapi.yaml"
   345          try:
   346              patch_v_s_route_from_yaml(kube_apis.custom_objects,
   347                                        v_s_route_setup.route_s.name,
   348                                        route_yaml,
   349                                        v_s_route_setup.route_s.namespace)
   350          except ApiException as ex:
   351              assert ex.status == 422 and "spec.subroutes.action.pass" in ex.body
   352          except Exception as ex:
   353              pytest.fail(f"An unexpected exception is raised: {ex}")
   354          else:
   355              pytest.fail("Expected an exception but there was none")
   356  
   357          wait_before_test(1)
   358          config_new = get_vs_nginx_template_conf(kube_apis.v1,
   359                                                  v_s_route_setup.namespace,
   360                                                  v_s_route_setup.vs_name,
   361                                                  ic_pod_name,
   362                                                  ingress_controller_prerequisites.namespace)
   363          assert config_old == config_new, "Expected: config doesn't change"
   364  
   365  
   366  @pytest.mark.vsr
   367  @pytest.mark.parametrize('crd_ingress_controller, v_s_route_setup',
   368                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
   369                             {"example": "virtual-server-route"})],
   370                           indirect=True)
   371  class TestCreateInvalidVirtualServerRoute:
   372      def test_create_invalid_vsr(self, kube_apis,
   373                                  ingress_controller_prerequisites,
   374                                  crd_ingress_controller,
   375                                  v_s_route_setup):
   376          route_yaml = f"{TEST_DATA}/virtual-server-route/route-single-duplicate-path.yaml"
   377          ic_pod_name = get_first_pod_name(kube_apis.v1, ingress_controller_prerequisites.namespace)
   378          text = f"{v_s_route_setup.route_s.namespace}/{v_s_route_setup.route_s.name}"
   379          vs_event_text = f"Configuration for {v_s_route_setup.namespace}/{v_s_route_setup.vs_name} was added or updated with warning(s)"
   380          vsr_event_text = f"VirtualServerRoute {text} was rejected with error: spec.subroutes[1].path: Duplicate value: \"/backend2\""
   381          delete_v_s_route(kube_apis.custom_objects,
   382                           v_s_route_setup.route_s.name,
   383                           v_s_route_setup.route_s.namespace)
   384  
   385          create_v_s_route_from_yaml(kube_apis.custom_objects,
   386                                     route_yaml,
   387                                     v_s_route_setup.route_s.namespace)
   388          wait_before_test(1)
   389          new_config = get_vs_nginx_template_conf(kube_apis.v1,
   390                                                  v_s_route_setup.namespace,
   391                                                  v_s_route_setup.vs_name,
   392                                                  ic_pod_name,
   393                                                  ingress_controller_prerequisites.namespace)
   394          new_vs_events = get_events(kube_apis.v1, v_s_route_setup.namespace)
   395          new_vsr_events = get_events(kube_apis.v1, v_s_route_setup.route_s.namespace)
   396          assert_locations_not_in_config(new_config, v_s_route_setup.route_s.paths)
   397          assert_event_and_count(vs_event_text,
   398                                 1,
   399                                 new_vs_events)
   400          assert_event_and_count(vsr_event_text,
   401                                 1,
   402                                 new_vsr_events)