summaryrefslogtreecommitdiffstats
path: root/python/knot_resolver
diff options
context:
space:
mode:
authorVladimír Čunát <vladimir.cunat@nic.cz>2024-11-06 11:16:11 +0100
committerVladimír Čunát <vladimir.cunat@nic.cz>2024-11-06 20:56:23 +0100
commit90a6865069ebbac0f13b8b41a0961a7244858172 (patch)
treecac644cdb6a477fb2d72119f0608d39a1eeecfb2 /python/knot_resolver
parentlib/mmapped: fix typo (diff)
downloadknot-resolver-90a6865069ebbac0f13b8b41a0961a7244858172.tar.xz
knot-resolver-90a6865069ebbac0f13b8b41a0961a7244858172.zip
rate-limiting config: use more precise types
This gives us a bit more consistency. I suppose that IntRangeBase isn't worth doing for the other cases. Aleš helped with this.
Diffstat (limited to 'python/knot_resolver')
-rw-r--r--python/knot_resolver/datamodel/rate_limiting_schema.py29
-rw-r--r--python/knot_resolver/datamodel/templates/rate_limiting.lua.j22
-rw-r--r--python/knot_resolver/datamodel/types/__init__.py2
-rw-r--r--python/knot_resolver/datamodel/types/types.py5
4 files changed, 22 insertions, 16 deletions
diff --git a/python/knot_resolver/datamodel/rate_limiting_schema.py b/python/knot_resolver/datamodel/rate_limiting_schema.py
index d93272da..60994c20 100644
--- a/python/knot_resolver/datamodel/rate_limiting_schema.py
+++ b/python/knot_resolver/datamodel/rate_limiting_schema.py
@@ -1,3 +1,8 @@
+from knot_resolver.datamodel.types import (
+ Int0_32,
+ IntPositive,
+ TimeUnit,
+)
from knot_resolver.utils.modeling import ConfigSchema
@@ -10,26 +15,20 @@ class RateLimitingSchema(ConfigSchema):
rate_limit: Maximal number of allowed queries per second from a single host.
instant_limit: Maximal number of allowed queries at a single point in time from a single host.
slip: Number of restricted responses out of which one is sent as truncated, the others are dropped.
- log_period: Minimal time in msec between two log messages, or zero to disable.
+ log_period: Minimal time between two log messages, or '0s' to disable.
dry_run: Perform only classification and logging but no restrictions.
"""
- capacity: int = 524288
- rate_limit: int
- instant_limit: int = 50
- slip: int = 2
- log_period: int = 0
+ capacity: IntPositive = IntPositive(524288)
+ rate_limit: IntPositive
+ instant_limit: IntPositive = IntPositive(50)
+ slip: Int0_32 = Int0_32(2)
+ log_period: TimeUnit = TimeUnit("0s")
dry_run: bool = False
def _validate(self) -> None:
- max_instant_limit = int(2**32 / 768 - 1)
- if not 1 <= self.instant_limit <= max_instant_limit:
+ max_instant_limit = int(2 ** 32 // 768 - 1)
+ if not int(self.instant_limit) <= max_instant_limit:
raise ValueError(f"'instant-limit' has to be in range 1..{max_instant_limit}")
- if not 1 <= self.rate_limit <= 1000 * self.instant_limit:
+ if not int(self.rate_limit) <= 1000 * int(self.instant_limit):
raise ValueError("'rate-limit' has to be in range 1..(1000 * instant-limit)")
- if not 0 < self.capacity:
- raise ValueError("'capacity' has to be positive")
- if not 0 <= self.slip <= 100:
- raise ValueError("'slip' has to be in range 0..100")
- if not 0 <= self.log_period:
- raise ValueError("'log-period' has to be non-negative")
diff --git a/python/knot_resolver/datamodel/templates/rate_limiting.lua.j2 b/python/knot_resolver/datamodel/templates/rate_limiting.lua.j2
index 4f9547f5..63f92125 100644
--- a/python/knot_resolver/datamodel/templates/rate_limiting.lua.j2
+++ b/python/knot_resolver/datamodel/templates/rate_limiting.lua.j2
@@ -7,6 +7,6 @@ assert(C.ratelimiting_init(
{{ cfg.rate_limiting.instant_limit }},
{{ cfg.rate_limiting.rate_limit }},
{{ cfg.rate_limiting.slip }},
- {{ cfg.rate_limiting.log_period }},
+ {{ cfg.rate_limiting.log_period.millis() }},
{{ boolean(cfg.rate_limiting.dry_run) }}) == 0)
{%- endif %}
diff --git a/python/knot_resolver/datamodel/types/__init__.py b/python/knot_resolver/datamodel/types/__init__.py
index a3d7db3e..d1334b5a 100644
--- a/python/knot_resolver/datamodel/types/__init__.py
+++ b/python/knot_resolver/datamodel/types/__init__.py
@@ -6,6 +6,7 @@ from .types import (
EscapedStr,
EscapedStr32B,
IDPattern,
+ Int0_32,
Int0_512,
Int0_65535,
InterfaceName,
@@ -37,6 +38,7 @@ __all__ = [
"EscapedStr",
"EscapedStr32B",
"IDPattern",
+ "Int0_32",
"Int0_512",
"Int0_65535",
"InterfaceName",
diff --git a/python/knot_resolver/datamodel/types/types.py b/python/knot_resolver/datamodel/types/types.py
index 6cd1e4cb..3c9b9fe1 100644
--- a/python/knot_resolver/datamodel/types/types.py
+++ b/python/knot_resolver/datamodel/types/types.py
@@ -14,6 +14,11 @@ class IntPositive(IntRangeBase):
_min: int = 1
+class Int0_32(IntRangeBase): # noqa: N801
+ _min: int = 0
+ _max: int = 32
+
+
class Int0_512(IntRangeBase): # noqa: N801
_min: int = 0
_max: int = 512