mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-24 16:40:38 +00:00
feat(pageserver): support force overriding feature flags (#12233)
## Problem Part of #11813 ## Summary of changes Add a test API to make it easier to manipulate the feature flags within tests. --------- Signed-off-by: Alex Chi Z <chi@neon.tech>
This commit is contained in:
@@ -1219,3 +1219,31 @@ class PageserverHttpClient(requests.Session, MetricsGetter):
|
||||
)
|
||||
self.verbose_error(res)
|
||||
return res.json()
|
||||
|
||||
def force_override_feature_flag(self, flag: str, value: str | None = None):
|
||||
if value is None:
|
||||
res = self.delete(
|
||||
f"http://localhost:{self.port}/v1/feature_flag/{flag}",
|
||||
)
|
||||
else:
|
||||
res = self.put(
|
||||
f"http://localhost:{self.port}/v1/feature_flag/{flag}",
|
||||
params={"value": value},
|
||||
)
|
||||
self.verbose_error(res)
|
||||
|
||||
def evaluate_feature_flag_boolean(self, tenant_id: TenantId, flag: str) -> Any:
|
||||
res = self.get(
|
||||
f"http://localhost:{self.port}/v1/tenant/{tenant_id}/feature_flag/{flag}",
|
||||
params={"as": "boolean"},
|
||||
)
|
||||
self.verbose_error(res)
|
||||
return res.json()
|
||||
|
||||
def evaluate_feature_flag_multivariate(self, tenant_id: TenantId, flag: str) -> Any:
|
||||
res = self.get(
|
||||
f"http://localhost:{self.port}/v1/tenant/{tenant_id}/feature_flag/{flag}",
|
||||
params={"as": "multivariate"},
|
||||
)
|
||||
self.verbose_error(res)
|
||||
return res.json()
|
||||
|
||||
51
test_runner/regress/test_feature_flag.py
Normal file
51
test_runner/regress/test_feature_flag.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from fixtures.utils import run_only_on_default_postgres
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from fixtures.neon_fixtures import NeonEnvBuilder
|
||||
|
||||
|
||||
@run_only_on_default_postgres("Pageserver-only test only needs to run on one version")
|
||||
def test_feature_flag(neon_env_builder: NeonEnvBuilder):
|
||||
env = neon_env_builder.init_start()
|
||||
env.pageserver.http_client().force_override_feature_flag("test-feature-flag", "true")
|
||||
assert env.pageserver.http_client().evaluate_feature_flag_boolean(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]["Ok"]
|
||||
assert (
|
||||
env.pageserver.http_client().evaluate_feature_flag_multivariate(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]["Ok"]
|
||||
== "true"
|
||||
)
|
||||
|
||||
env.pageserver.http_client().force_override_feature_flag("test-feature-flag", "false")
|
||||
assert (
|
||||
env.pageserver.http_client().evaluate_feature_flag_boolean(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]["Err"]
|
||||
== "No condition group is matched"
|
||||
)
|
||||
assert (
|
||||
env.pageserver.http_client().evaluate_feature_flag_multivariate(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]["Ok"]
|
||||
== "false"
|
||||
)
|
||||
|
||||
env.pageserver.http_client().force_override_feature_flag("test-feature-flag", None)
|
||||
assert (
|
||||
"Err"
|
||||
in env.pageserver.http_client().evaluate_feature_flag_boolean(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]
|
||||
)
|
||||
assert (
|
||||
"Err"
|
||||
in env.pageserver.http_client().evaluate_feature_flag_multivariate(
|
||||
env.initial_tenant, "test-feature-flag"
|
||||
)["result"]
|
||||
)
|
||||
Reference in New Issue
Block a user