From 0852e073e8760af44b6fcb63ec02c5b09bc2d8d7 Mon Sep 17 00:00:00 2001 From: Jim Fitzpatrick Date: Tue, 3 Dec 2024 11:54:35 +0000 Subject: [PATCH] ADD: Defaults and overrides: override merge on same target This adds test that make use of the merge strategy on overrides that are targeting the same resource. Signed-off-by: Jim Fitzpatrick --- .../overrides/merge/same_target/__init__.py | 0 .../overrides/merge/same_target/conftest.py | 50 +++++++++++++++++++ .../merge/same_target/test_ab_strategy.py | 28 +++++++++++ .../merge/same_target/test_ba_startegy.py | 28 +++++++++++ 4 files changed, 106 insertions(+) create mode 100644 testsuite/tests/singlecluster/overrides/merge/same_target/__init__.py create mode 100644 testsuite/tests/singlecluster/overrides/merge/same_target/conftest.py create mode 100644 testsuite/tests/singlecluster/overrides/merge/same_target/test_ab_strategy.py create mode 100644 testsuite/tests/singlecluster/overrides/merge/same_target/test_ba_startegy.py diff --git a/testsuite/tests/singlecluster/overrides/merge/same_target/__init__.py b/testsuite/tests/singlecluster/overrides/merge/same_target/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/singlecluster/overrides/merge/same_target/conftest.py b/testsuite/tests/singlecluster/overrides/merge/same_target/conftest.py new file mode 100644 index 00000000..328c42a3 --- /dev/null +++ b/testsuite/tests/singlecluster/overrides/merge/same_target/conftest.py @@ -0,0 +1,50 @@ +import pytest + +from testsuite.gateway import MatchType, PathMatch, RouteMatch +from testsuite.kuadrant.policy import CelPredicate, Strategy +from testsuite.kuadrant.policy.rate_limit import Limit, RateLimitPolicy + +LIMIT = Limit(8, "5s") +OVERRIDE_LIMIT = Limit(6, "5s") + + +@pytest.fixture(scope="module") +def route(route, backend): + """Add two new rules to the route""" + route.remove_all_rules() + route.add_rule( + backend, + RouteMatch(path=PathMatch(value="/get", type=MatchType.PATH_PREFIX)), + ) + route.add_rule( + backend, + RouteMatch(path=PathMatch(value="/anything", type=MatchType.PATH_PREFIX)), + ) + return route + + +@pytest.fixture(scope="module") +def rate_limit(cluster, blame, module_label, route): + """Add a RateLimitPolicy targeting the first HTTPRouteRule.""" + rate_limit = RateLimitPolicy.create_instance(cluster, blame("sp"), route, labels={"testRun": module_label}) + basic_when = [ + CelPredicate("request.path == '/get'"), + ] + rate_limit.add_limit("basic", [LIMIT], when=basic_when) + return rate_limit + + +@pytest.fixture(scope="module") +def override_merge_rate_limit(cluster, blame, module_label, route): + """Add a RateLimitPolicy targeting the first HTTPRouteRule.""" + policy = RateLimitPolicy.create_instance(cluster, blame("omp"), route, labels={"testRun": module_label}) + basic_when = [ + CelPredicate("request.path == '/get'"), + ] + override_when = [ + CelPredicate("request.path == '/anything'"), + ] + policy.overrides.add_limit("basic", [OVERRIDE_LIMIT], when=basic_when) + policy.overrides.add_limit("override", [OVERRIDE_LIMIT], when=override_when) + policy.strategy(Strategy.MERGE) + return policy diff --git a/testsuite/tests/singlecluster/overrides/merge/same_target/test_ab_strategy.py b/testsuite/tests/singlecluster/overrides/merge/same_target/test_ab_strategy.py new file mode 100644 index 00000000..c158fed2 --- /dev/null +++ b/testsuite/tests/singlecluster/overrides/merge/same_target/test_ab_strategy.py @@ -0,0 +1,28 @@ +"""Test override policies aimed at the same resoure uses oldested policy.""" + +import pytest + +from .conftest import OVERRIDE_LIMIT + +pytestmark = [pytest.mark.kuadrant_only] + + +@pytest.fixture(scope="module", autouse=True) +def commit(request, route, rate_limit, override_merge_rate_limit): # pylint: disable=unused-argument + """Commits RateLimitPolicy after the HTTPRoute is created""" + for policy in [rate_limit, override_merge_rate_limit]: + request.addfinalizer(policy.delete) + policy.commit() + policy.wait_for_accepted() + + +@pytest.mark.parametrize("rate_limit", ["gateway", "route"], indirect=True) +def test_multiple_policies_merge_override_ab(client): + """Test RateLimitPolicy with merge overrides being ingored due to age""" + responses = client.get_many("/get", OVERRIDE_LIMIT.limit) + responses.assert_all(200) + assert client.get("/get").status_code == 429 + + responses = client.get_many("/anything", OVERRIDE_LIMIT.limit) + responses.assert_all(200) + assert client.get("/anything").status_code == 429 diff --git a/testsuite/tests/singlecluster/overrides/merge/same_target/test_ba_startegy.py b/testsuite/tests/singlecluster/overrides/merge/same_target/test_ba_startegy.py new file mode 100644 index 00000000..23234edb --- /dev/null +++ b/testsuite/tests/singlecluster/overrides/merge/same_target/test_ba_startegy.py @@ -0,0 +1,28 @@ +"""Test defaults policy aimed at the same resoure uses oldested policy.""" + +import pytest + +from .conftest import OVERRIDE_LIMIT + +pytestmark = [pytest.mark.kuadrant_only] + + +@pytest.fixture(scope="module", autouse=True) +def commit(request, route, rate_limit, override_merge_rate_limit): # pylint: disable=unused-argument + """Commits RateLimitPolicy after the HTTPRoute is created""" + for policy in [override_merge_rate_limit, rate_limit]: + request.addfinalizer(policy.delete) + policy.commit() + policy.wait_for_accepted() + + +@pytest.mark.parametrize("rate_limit", ["gateway", "route"], indirect=True) +def test_multiple_policies_merge_default_ba(client): + """Test RateLimitPolicy with merge overrides being enforced due to age""" + responses = client.get_many("/get", OVERRIDE_LIMIT.limit) + responses.assert_all(200) + assert client.get("/get").status_code == 429 + + responses = client.get_many("/anything", OVERRIDE_LIMIT.limit) + responses.assert_all(200) + assert client.get("/anything").status_code == 429