E580 Add startup test for 1 VS multiple VSRs · nginx/kubernetes-ingress@3a41c8a · GitHub
[go: up one dir, main page]

Skip to content

Commit 3a41c8a

Browse files
committed
Add startup test for 1 VS multiple VSRs
1 parent fa87fa7 commit 3a41c8a

File tree

5 files changed

+156
-8
lines changed

5 files changed

+156
-8
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: k8s.nginx.org/v1
2+
kind: VirtualServerRoute
3+
metadata:
4+
name: route
5+
spec:
6+
host: example.com
7+
subroutes:
8+
- path: "/route"
9+
action:
10+
return:
11+
body: "Hello World\n"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
apiVersion: k8s.nginx.org/v1
2+
kind: VirtualServer
3+
metadata:
4+< FBC8 /span>
name: virtual-server
5+
spec:
6+
host: example.com
7+
routes:

tests/suite/custom_resources_utils.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -260,15 +260,31 @@ def create_virtual_server_from_yaml(
260260
print("Create a VirtualServer:")
261261
with open(yaml_manifest) as f:
262262
dep = yaml.safe_load(f)
263+
264+
return create_virtual_server(custom_objects, dep, namespace)
265+
266+
267+
def create_virtual_server(
268+
custom_objects: CustomObjectsApi, vs, namespace
269+
) -> str:
270+
"""
271+
Create a VirtualServer.
272+
273+
:param custom_objects: CustomObjectsApi
274+
:param vs: a VirtualServer
275+
:param namespace:
276+
:return: str
277+
"""
278+
print("Create a VirtualServer:")
263279
try:
264280
custom_objects.create_namespaced_custom_object(
265-
"k8s.nginx.org", "v1", namespace, "virtualservers", dep
281+
"k8s.nginx.org", "v1", namespace, "virtualservers", vs
266282
)
267-
print(f"VirtualServer created with name '{dep['metadata']['name']}'")
268-
return dep["metadata"]["name"]
283+
print(f"VirtualServer created with name '{vs['metadata']['name']}'")
284+
return vs["metadata"]["name"]
269285
except ApiException as ex:
270286
logging.exception(
271-
f"Exception: {ex} occurred while creating VirtualServer: {dep['metadata']['name']}"
287+
f"Exception: {ex} occurred while creating VirtualServer: {vs['metadata']['name']}"
272288
)
273289
raise
274290

@@ -697,11 +713,23 @@ def create_v_s_route_from_yaml(custom_objects: CustomObjectsApi, yaml_manifest,
697713
with open(yaml_manifest) as f:
698714
dep = yaml.safe_load(f)
699715

716+
return create_v_s_route(custom_objects, dep, namespace)
717+
718+
def create_v_s_route(custom_objects: CustomObjectsApi, vsr, namespace) -> str:
719+
"""
720+
Create a VirtualServerRoute.
721+
722+
:param custom_objects: CustomObjectsApi
723+
:param vsr: a VirtualServerRoute
724+
:param namespace:
725+
:return: str
726+
"""
727+
print("Create a VirtualServerRoute:")
700728
custom_objects.create_namespaced_custom_object(
701-
"k8s.nginx.org", "v1", namespace, "virtualserverroutes", dep
729+
"k8s.nginx.org", "v1", namespace, "virtualserverroutes", vsr
702730
)
703-
print(f"VirtualServerRoute created with a name '{dep['metadata']['name']}'")
704-
return dep["metadata"]["name"]
731+
print(f"VirtualServerRoute created with a name '{vsr['metadata']['name']}'")
732+
return vsr["metadata"]["name"]
705733

706734

707735
def patch_v_s_route(custom_objects: CustomObjectsApi, name, namespace, body) -> str:

tests/suite/resources_utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,15 @@ def get_total_vs(req_url, ingress_class) -> str:
13371337
return parse_metric_data(resp_content, metric_string)
13381338

13391339

1340+
def get_total_vsr(req_url, ingress_class) -> str:
1341+
# return total number of virtualserverroutes in specified ingress class
1342+
ensure_connection(req_url, 200)
1343+
resp = requests.get(req_url)
1344+
resp_content = resp.content.decode("utf-8")
1345+
metric_string = 'virtualserverroute_resources_total{class="%s"}' % ingress_class
1346+
return parse_metric_data(resp_content, metric_string)
1347+
1348+
13401349
def get_last_reload_status(req_url, ingress_class) -> str:
13411350
# returnb last reload status 0/1
13421351
ensure_connection(req_url, 200)

tests/suite/test_batch_startup_times.py

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import time
2+
13
import requests
24
import pytest
35
import yaml
@@ -26,7 +28,7 @@
2628
get_total_ingresses,
2729
get_total_vs,
2830
get_last_reload_status,
29-
get_pods_amount,
31+
get_pods_amount, get_total_vsr,
3032
)
3133
from suite.custom_resources_utils import (
3234
create_virtual_server_from_yaml,
@@ -37,6 +39,8 @@
3739
create_policy_from_yaml,
3840
create_ap_waf_policy_from_yaml,
3941
delete_policy,
42+
create_virtual_server,
43+
create_v_s_route,
4044
)
4145
from suite.yaml_utils import get_first_ingress_host_from_yaml
4246
from settings import TEST_DATA
@@ -503,3 +507,92 @@ def test_ap_waf_policy_vs_batch_start(
503507
delete_policy(kube_apis.custom_objects, "waf-policy", test_namespace)
504508

505509
assert num is None
510+
511+
512+
##############################################################################################################
513+
514+
@pytest.fixture(scope="class")
515+
def vs_vsr_setup(
516+
request,
517+
kube_apis,
518+
test_namespace,
519+
ingress_controller_endpoint,
520+
):
521+
"""
522+
Deploy one VS with multiple VSRs.
523+
524+
:param kube_apis: client apis
525+
:param test_namespace:
526+
:param ingress_controller_endpoint: public endpoint
527+
:return:
528+
"""
529+
total_vsr = int(request.config.getoption("--batch-resources"))
530+
531+
vsr_source = f"{TEST_DATA}/startup/virtual-server-routes/route.yaml"
532+
533+
with open(vsr_source) as f:
534+
vsr = yaml.safe_load(f)
535+
536+
for i in range(1, total_vsr + 1):
537+
vsr["metadata"]["name"] = f"route-{i}"
538+
vsr["spec"]["subroutes"][0]["path"] = f"/route-{i}"
539+
540+
create_v_s_route(kube_apis.custom_objects, vsr, test_namespace)
541+
542+
vs_source = f"{TEST_DATA}/startup/virtual-server-routes/virtual-server.yaml"
543+
544+
with open(vs_source) as f:
545+
vs = yaml.safe_load(f)
546+
547+
routes = []
548+
for i in range(1, total_vsr + 1):
549+
route = {"path": f"/route-{i}", "route": f"route-{i}"}
550+
routes.append(route)
551+
552+
vs["spec"]["routes"] = routes
553+
create_virtual_server(kube_apis.custom_objects, vs, test_namespace)
554+
555+
556+
@pytest.mark.batch_start
557+
@pytest.mark.parametrize(
558+
"crd_ingress_controller",
559+
[
560+
pytest.param(
561+
{
562+
"type": "complete",
563+
"extra_args": ["-enable-custom-resources","-enable-prometheus-metrics", "-enable-leader-election=false"]
564+
},
565+
)
566+
],
567+
indirect=True,
568+
)
569+
class TestSingleVSMultipleVSRs:
570+
def test_startup_time(
571+
self,
572+
request,
573+
kube_apis,
574+
ingress_controller_prerequisites,
575+
crd_ingress_controller,
576+
ingress_controller_endpoint,
577+
vs_vsr_setup):
578+
"""
579+
Pod startup time with 1 VS and multiple VSRs.
580+
"""
581+
total_vsr = int(request.config.getoption("--batch-resources"))
582+
583+
ic_ns = ingress_controller_prerequisites.namespace
584+
scale_deployment(kube_apis.v1, kube_apis.apps_v1_api, "nginx-ingress", ic_ns, 0)
585+
while get_pods_amount(kube_apis.v1, ic_ns) is not 0:
586+
print(f"Number of replicas not 0, retrying...")
587+
wait_before_test()
588+
num = scale_deployment(kube_apis.v1, kube_apis.apps_v1_api, "nginx-ingress", ic_ns, 1)
589+
590+
metrics_url = f"http://{ingress_controller_endpoint.public_ip}:{ingress_controller_endpoint.metrics_port}/metrics"
591+
592+
assert (
593+
get_total_vs(metrics_url, "nginx") == "1"
594+
and get_total_vsr(metrics_url, "nginx") == str(total_vsr)
595+
and get_last_reload_status(metrics_url, "nginx") == "1"
596+
)
597+
598+
assert num is None

0 commit comments

Comments
 (0)
0