Skip to content

Commit 338e8c6

Browse files
committed
add vsr test to rate limit by JWT claim
1 parent 5a6ee7c commit 338e8c6

File tree

4 files changed

+133
-6
lines changed

4 files changed

+133
-6
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
apiVersion: k8s.nginx.org/v1
2+
kind: VirtualServerRoute
3+
metadata:
4+
name: backends
5+
spec:
6+
host: virtual-server-route.example.com
7+
upstreams:
8+
- name: backend1
9+
service: backend1-svc
10+
port: 80
11+
- name: backend3
12+
service: backend3-svc
13+
port: 80
14+
subroutes:
15+
- path: "/backends/backend1"
16+
policies:
17+
- name: rate-limit-jwt-claim-sub
18+
action:
19+
pass: backend1
20+
- path: "/backends/backend3"
21+
action:
22+
pass: backend3

tests/requirements.txt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@ greenlet==3.1.1 \
332332
--hash=sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803 \
333333
--hash=sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79 \
334334
--hash=sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f
335-
# via playwright
335+
# via
336+
# -r requirements.in
337+
# playwright
336338
grpcio==1.68.1 \
337339
--hash=sha256:025f790c056815b3bf53da850dd70ebb849fd755a4b1ac822cb65cd631e37d43 \
338340
--hash=sha256:04cfd68bf4f38f5bb959ee2361a7546916bd9a50f78617a346b3aeb2b42e2161 \
@@ -614,7 +616,13 @@ pycparser==2.22 \
614616
pyee==12.0.0 \
615617
--hash=sha256:7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990 \
616618
--hash=sha256:c480603f4aa2927d4766eb41fa82793fe60a82cbfdb8d688e0d08c55a534e145
617-
# via playwright
619+
# via
620+
# -r requirements.in
621+
# playwright
622+
pyjwt==2.10.1 \
623+
--hash=sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953 \
624+
--hash=sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb
625+
# via -r requirements.in
618626
pyopenssl==24.3.0 \
619627
--hash=sha256:49f7a019577d834746bc55c5fce6ecbcec0f2b4ec5ce1cf43a9a173b8138bb36 \
620628
--hash=sha256:e474f5a473cd7f92221cc04976e48f4d11502804657a08a989fb3be5514c904a
@@ -733,7 +741,9 @@ six==1.17.0 \
733741
typing-extensions==4.12.2 \
734742
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \
735743
--hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8
736-
# via pyee
744+
# via
745+
# -r requirements.in
746+
# pyee
737747
urllib3==2.2.3 \
738748
--hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
739749
--hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9

tests/suite/test_rl_policies.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22

3+
import jwt
34
import pytest
45
import requests
56
from settings import TEST_DATA
@@ -26,7 +27,6 @@
2627
rl_vs_override_spec_route = f"{TEST_DATA}/rate-limit/route-subroute/virtual-server-override-spec-route.yaml"
2728
rl_vs_jwt_claim_sub = f"{TEST_DATA}/rate-limit/spec/virtual-server-jwt-claim-sub.yaml"
2829
rl_pol_jwt_claim_sub = f"{TEST_DATA}/rate-limit/policies/rate-limit-jwt-claim-sub.yaml"
29-
token = f"{TEST_DATA}/jwt-policy/token.jwt"
3030

3131

3232
@pytest.mark.policies
@@ -387,19 +387,25 @@ def test_rl_policy_jwt_claim_sub(
387387
wait_before_test()
388388

389389
policy_info = read_custom_resource(kube_apis.custom_objects, test_namespace, "policies", pol_name)
390+
jwt_token = jwt.encode(
391+
{"sub": "client1"},
392+
"nginx",
393+
algorithm="HS256",
394+
)
390395
occur = []
391396
t_end = time.perf_counter() + 1
397+
392398
resp = requests.get(
393399
virtual_server_setup.backend_1_url,
394-
headers={"host": virtual_server_setup.vs_host, "Authorization": f"Bearer {token}"},
400+
headers={"host": virtual_server_setup.vs_host, "Authorization": f"Bearer {jwt_token}"},
395401
)
396402
print(resp.status_code)
397403
wait_before_test()
398404
assert resp.status_code == 200
399405
while time.perf_counter() < t_end:
400406
resp = requests.get(
401407
virtual_server_setup.backend_1_url,
402-
headers={"host": virtual_server_setup.vs_host, "Authorization": f"Bearer {token}"},
408+
headers={"host": virtual_server_setup.vs_host, "Authorization": f"Bearer {jwt_token}"},
403409
)
404410
occur.append(resp.status_code)
405411
delete_policy(kube_apis.custom_objects, pol_name, test_namespace)

tests/suite/test_rl_policies_vsr.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import time
22

3+
import jwt
34
import pytest
45
import requests
56
from settings import TEST_DATA
@@ -24,6 +25,8 @@
2425
rl_vsr_override_src = f"{TEST_DATA}/rate-limit/route-subroute/virtual-server-route-override-subroute.yaml"
2526
rl_vsr_override_vs_spec_src = f"{TEST_DATA}/rate-limit/route-subroute/virtual-server-vsr-spec-override.yaml"
2627
rl_vsr_override_vs_route_src = f"{TEST_DATA}/rate-limit/route-subroute/virtual-server-vsr-route-override.yaml"
28+
rl_vsr_jwt_claim_sub_src = f"{TEST_DATA}/rate-limit/route-subroute/virtual-server-route-jwt-claim-sub.yaml"
29+
rl_pol_jwt_claim_sub_src = f"{TEST_DATA}/rate-limit/policies/rate-limit-jwt-claim-sub.yaml"
2730

2831

2932
@pytest.mark.policies
@@ -416,3 +419,89 @@ def test_rl_policy_scaled_vsr(
416419
and policy_info["status"]["reason"] == "AddedOrUpdated"
417420
and policy_info["status"]["state"] == "Valid"
418421
)
422+
423+
@pytest.mark.smoke
424+
@pytest.mark.parametrize("src", [rl_vsr_jwt_claim_sub_src])
425+
def test_rl_policy_jwt_claim_sub_vsr(
426+
self,
427+
kube_apis,
428+
ingress_controller_prerequisites,
429+
crd_ingress_controller,
430+
v_s_route_app_setup,
431+
v_s_route_setup,
432+
test_namespace,
433+
src,
434+
):
435+
"""
436+
Test if rate-limiting policy is working with 1 rps using $jwt_claim_sub as the rate limit key in vsr:subroute
437+
"""
438+
439+
req_url = f"http://{v_s_route_setup.public_endpoint.public_ip}:{v_s_route_setup.public_endpoint.port}"
440+
print(f"Create rl policy")
441+
pol_name = create_policy_from_yaml(
442+
kube_apis.custom_objects, rl_pol_jwt_claim_sub_src, v_s_route_setup.route_m.namespace
443+
)
444+
wait_before_test(1)
445+
policy_info = read_custom_resource(
446+
kube_apis.custom_objects, v_s_route_setup.route_m.namespace, "policies", pol_name
447+
)
448+
assert (
449+
policy_info["status"]
450+
and policy_info["status"]["reason"] == "AddedOrUpdated"
451+
and policy_info["status"]["state"] == "Valid"
452+
)
453+
454+
print(f"Patch vsr with policy: {src}")
455+
patch_v_s_route_from_yaml(
456+
kube_apis.custom_objects,
457+
v_s_route_setup.route_m.name,
458+
src,
459+
v_s_route_setup.route_m.namespace,
460+
)
461+
wait_before_test(1)
462+
vsr_info = read_custom_resource(
463+
kube_apis.custom_objects,
464+
v_s_route_setup.route_m.namespace,
465+
"virtualserverroutes",
466+
v_s_route_setup.route_m.name,
467+
)
468+
assert (
469+
vsr_info["status"]
470+
and vsr_info["status"]["reason"] == "AddedOrUpdated"
471+
and vsr_info["status"]["state"] == "Valid"
472+
)
473+
474+
vs_info = read_custom_resource(
475+
kube_apis.custom_objects, v_s_route_setup.namespace, "virtualservers", v_s_route_setup.vs_name
476+
)
477+
assert (
478+
vs_info["status"]
479+
and vs_info["status"]["reason"] == "AddedOrUpdated"
480+
and vs_info["status"]["state"] == "Valid"
481+
)
482+
483+
wait_before_test()
484+
jwt_token = jwt.encode(
485+
{"sub": "client1"},
486+
"nginx",
487+
algorithm="HS256",
488+
)
489+
occur = []
490+
t_end = time.perf_counter() + 1
491+
resp = requests.get(
492+
f"{req_url}{v_s_route_setup.route_m.paths[0]}",
493+
headers={"host": v_s_route_setup.vs_host, "Authorization": f"Bearer {jwt_token}"},
494+
)
495+
496+
print(resp.status_code)
497+
assert resp.status_code == 200
498+
while time.perf_counter() < t_end:
499+
resp = requests.get(
500+
f"{req_url}{v_s_route_setup.route_m.paths[0]}",
501+
headers={"host": v_s_route_setup.vs_host, "Authorization": f"Bearer {jwt_token}"},
502+
)
503+
occur.append(resp.status_code)
504+
delete_policy(kube_apis.custom_objects, pol_name, v_s_route_setup.route_m.namespace)
505+
self.restore_default_vsr(kube_apis, v_s_route_setup)
506+
507+
assert occur.count(200) <= 1

0 commit comments

Comments
 (0)