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

     1  import requests
     2  import pytest
     3  
     4  from settings import TEST_DATA, DEPLOYMENTS
     5  from suite.custom_assertions import wait_and_assert_status_code
     6  from suite.custom_resources_utils import delete_crd, create_crd_from_yaml, \
     7      create_virtual_server_from_yaml, delete_virtual_server, patch_virtual_server_from_yaml
     8  from suite.resources_utils import patch_rbac, replace_service, read_service, \
     9      wait_before_test, delete_service, create_service_from_yaml
    10  from suite.yaml_utils import get_paths_from_vs_yaml, get_first_host_from_yaml, get_name_from_yaml
    11  
    12  
    13  @pytest.mark.vs
    14  @pytest.mark.smoke
    15  @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup',
    16                           [({"type": "complete", "extra_args": [f"-enable-custom-resources"]},
    17                             {"example": "virtual-server", "app_type": "simple"})],
    18                           indirect=True)
    19  class TestVirtualServer:
    20      def test_responses_after_setup(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    21          print("\nStep 1: initial check")
    22          resp = requests.get(virtual_server_setup.backend_1_url,
    23                              headers={"host": virtual_server_setup.vs_host})
    24          assert resp.status_code == 200
    25          resp = requests.get(virtual_server_setup.backend_2_url,
    26                              headers={"host": virtual_server_setup.vs_host})
    27          assert resp.status_code == 200
    28  
    29      def test_responses_after_virtual_server_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    30          print("Step 2: update host and paths in the VS and check")
    31          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name,
    32                                         f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml",
    33                                         virtual_server_setup.namespace)
    34          new_paths = get_paths_from_vs_yaml(f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml")
    35          new_backend_1_url = f"http://{virtual_server_setup.public_endpoint.public_ip}" \
    36              f":{virtual_server_setup.public_endpoint.port}/{new_paths[0]}"
    37          new_backend_2_url = f"http://{virtual_server_setup.public_endpoint.public_ip}" \
    38              f":{virtual_server_setup.public_endpoint.port}/{new_paths[1]}"
    39          new_host = get_first_host_from_yaml(f"{TEST_DATA}/virtual-server/standard/virtual-server-updated.yaml")
    40          wait_before_test(1)
    41          resp = requests.get(virtual_server_setup.backend_1_url,
    42                              headers={"host": virtual_server_setup.vs_host})
    43          assert resp.status_code == 404
    44          resp = requests.get(virtual_server_setup.backend_2_url,
    45                              headers={"host": virtual_server_setup.vs_host})
    46          assert resp.status_code == 404
    47          resp = requests.get(new_backend_1_url, headers={"host": new_host})
    48          assert resp.status_code == 200
    49          resp = requests.get(new_backend_2_url, headers={"host": new_host})
    50          assert resp.status_code == 200
    51  
    52          print("Step 3: restore VS and check")
    53          patch_virtual_server_from_yaml(kube_apis.custom_objects, virtual_server_setup.vs_name,
    54                                         f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml",
    55                                         virtual_server_setup.namespace)
    56          wait_before_test(1)
    57          resp = requests.get(new_backend_1_url, headers={"host": new_host})
    58          assert resp.status_code == 404
    59          resp = requests.get(new_backend_2_url, headers={"host": new_host})
    60          assert resp.status_code == 404
    61          resp = requests.get(virtual_server_setup.backend_1_url,
    62                              headers={"host": virtual_server_setup.vs_host})
    63          assert resp.status_code == 200
    64          resp = requests.get(virtual_server_setup.backend_2_url,
    65                              headers={"host": virtual_server_setup.vs_host})
    66          assert resp.status_code == 200
    67  
    68      def test_responses_after_backend_update(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    69          print("Step 4: update one backend service port and check")
    70          the_service = read_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace)
    71          the_service.spec.ports[0].port = 8080
    72          replace_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace, the_service)
    73          wait_before_test(1)
    74          resp = requests.get(virtual_server_setup.backend_1_url,
    75                              headers={"host": virtual_server_setup.vs_host})
    76          assert resp.status_code == 502
    77          resp = requests.get(virtual_server_setup.backend_2_url,
    78                              headers={"host": virtual_server_setup.vs_host})
    79          assert resp.status_code == 200
    80  
    81          print("Step 5: restore BE and check")
    82          the_service = read_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace)
    83          the_service.spec.ports[0].port = 80
    84          replace_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace, the_service)
    85          wait_before_test(1)
    86          resp = requests.get(virtual_server_setup.backend_1_url,
    87                              headers={"host": virtual_server_setup.vs_host})
    88          assert resp.status_code == 200
    89          resp = requests.get(virtual_server_setup.backend_2_url,
    90                              headers={"host": virtual_server_setup.vs_host})
    91          assert resp.status_code == 200
    92  
    93      def test_responses_after_virtual_server_removal(self, kube_apis, crd_ingress_controller, virtual_server_setup):
    94          print("\nStep 6: delete VS and check")
    95          delete_virtual_server(kube_apis.custom_objects, virtual_server_setup.vs_name, virtual_server_setup.namespace)
    96          wait_before_test(1)
    97          resp = requests.get(virtual_server_setup.backend_1_url,
    98                              headers={"host": virtual_server_setup.vs_host})
    99          assert resp.status_code == 404
   100          resp = requests.get(virtual_server_setup.backend_2_url,
   101                              headers={"host": virtual_server_setup.vs_host})
   102          assert resp.status_code == 404
   103  
   104          print("Step 7: restore VS and check")
   105          create_virtual_server_from_yaml(kube_apis.custom_objects,
   106                                          f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml",
   107                                          virtual_server_setup.namespace)
   108          wait_before_test(1)
   109          resp = requests.get(virtual_server_setup.backend_1_url,
   110                              headers={"host": virtual_server_setup.vs_host})
   111          assert resp.status_code == 200
   112          resp = requests.get(virtual_server_setup.backend_2_url,
   113                              headers={"host": virtual_server_setup.vs_host})
   114          assert resp.status_code == 200
   115  
   116      def test_responses_after_backend_service_removal(self, kube_apis, crd_ingress_controller, virtual_server_setup):
   117          print("\nStep 8: remove one backend service and check")
   118          delete_service(kube_apis.v1, "backend1-svc", virtual_server_setup.namespace)
   119          wait_before_test(1)
   120          resp = requests.get(virtual_server_setup.backend_1_url,
   121                              headers={"host": virtual_server_setup.vs_host})
   122          assert resp.status_code == 502
   123          resp = requests.get(virtual_server_setup.backend_2_url,
   124                              headers={"host": virtual_server_setup.vs_host})
   125          assert resp.status_code == 200
   126  
   127          print("\nStep 9: restore backend service and check")
   128          create_service_from_yaml(kube_apis.v1, virtual_server_setup.namespace, f"{TEST_DATA}/common/backend1-svc.yaml")
   129          wait_before_test(3)
   130          resp = requests.get(virtual_server_setup.backend_1_url,
   131                              headers={"host": virtual_server_setup.vs_host})
   132          assert resp.status_code == 200
   133          resp = requests.get(virtual_server_setup.backend_2_url,
   134                              headers={"host": virtual_server_setup.vs_host})
   135          assert resp.status_code == 200
   136  
   137      def test_responses_after_rbac_misconfiguration_on_the_fly(self, kube_apis, crd_ingress_controller,
   138                                                                virtual_server_setup):
   139          print("Step 10: remove virtualservers from the ClusterRole and check")
   140          patch_rbac(kube_apis.rbac_v1, f"{TEST_DATA}/virtual-server/rbac-without-vs.yaml")
   141          wait_before_test(1)
   142          resp = requests.get(virtual_server_setup.backend_1_url,
   143                              headers={"host": virtual_server_setup.vs_host})
   144          assert resp.status_code == 200
   145          resp = requests.get(virtual_server_setup.backend_2_url,
   146                              headers={"host": virtual_server_setup.vs_host})
   147          assert resp.status_code == 200
   148  
   149          print("Step 11: restore ClusterRole and check")
   150          patch_rbac(kube_apis.rbac_v1, f"{DEPLOYMENTS}/rbac/rbac.yaml")
   151          wait_before_test(1)
   152          resp = requests.get(virtual_server_setup.backend_1_url,
   153                              headers={"host": virtual_server_setup.vs_host})
   154          assert resp.status_code == 200
   155          resp = requests.get(virtual_server_setup.backend_2_url,
   156                              headers={"host": virtual_server_setup.vs_host})
   157          assert resp.status_code == 200
   158  
   159      def test_responses_after_crd_removal_on_the_fly(self, kube_apis, crd_ingress_controller, virtual_server_setup):
   160          print("\nStep 12: remove CRD and check")
   161          crd_name = get_name_from_yaml(f"{DEPLOYMENTS}/common/crds/k8s.nginx.org_virtualservers.yaml")
   162          delete_crd(kube_apis.api_extensions_v1, crd_name)
   163          wait_and_assert_status_code(404, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host)
   164          wait_and_assert_status_code(404, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
   165  
   166          print("Step 13: restore CRD and VS and check")
   167          create_crd_from_yaml(kube_apis.api_extensions_v1, crd_name,
   168                               f"{DEPLOYMENTS}/common/crds/k8s.nginx.org_virtualservers.yaml")
   169          wait_before_test(1)
   170          create_virtual_server_from_yaml(kube_apis.custom_objects,
   171                                          f"{TEST_DATA}/virtual-server/standard/virtual-server.yaml",
   172                                          virtual_server_setup.namespace)
   173          wait_and_assert_status_code(200, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host)
   174          wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)
   175  
   176  
   177  @pytest.mark.vs
   178  @pytest.mark.parametrize('crd_ingress_controller, virtual_server_setup',
   179                           [({"type": "rbac-without-vs", "extra_args": [f"-enable-custom-resources"]},
   180                             {"example": "virtual-server", "app_type": "simple"})],
   181                           indirect=True)
   182  class TestVirtualServerInitialRBACMisconfiguration:
   183      @pytest.mark.skip(reason="issues with ingressClass")
   184      def test_responses_after_rbac_misconfiguration(self, kube_apis, crd_ingress_controller, virtual_server_setup):
   185          print("\nStep 1: rbac misconfiguration from the very start")
   186          resp = requests.get(virtual_server_setup.backend_1_url,
   187                              headers={"host": virtual_server_setup.vs_host})
   188          assert resp.status_code == 404
   189          resp = requests.get(virtual_server_setup.backend_2_url,
   190                              headers={"host": virtual_server_setup.vs_host})
   191          assert resp.status_code == 404
   192  
   193          print("Step 2: configure RBAC and check")
   194          patch_rbac(kube_apis.rbac_v1, f"{DEPLOYMENTS}/rbac/rbac.yaml")
   195          wait_and_assert_status_code(200, virtual_server_setup.backend_1_url, virtual_server_setup.vs_host)
   196          wait_and_assert_status_code(200, virtual_server_setup.backend_2_url, virtual_server_setup.vs_host)