From: Aleš Date: Mon, 14 Feb 2022 15:06:37 +0000 (+0100) Subject: datamodel: integer type annotations replaced with custom types X-Git-Tag: v6.0.0a1~42^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=661307518e2c86021e8ce0cd4c6cb1f30680cbbf;p=thirdparty%2Fknot-resolver.git datamodel: integer type annotations replaced with custom types --- diff --git a/manager/knot_resolver_manager/datamodel/dnssec_schema.py b/manager/knot_resolver_manager/datamodel/dnssec_schema.py index ba1e6d517..add4eeebe 100644 --- a/manager/knot_resolver_manager/datamodel/dnssec_schema.py +++ b/manager/knot_resolver_manager/datamodel/dnssec_schema.py @@ -1,6 +1,6 @@ from typing import List, Optional -from knot_resolver_manager.datamodel.types import TimeUnit +from knot_resolver_manager.datamodel.types import IntNonNegative, TimeUnit from knot_resolver_manager.utils import SchemaNode @@ -37,7 +37,7 @@ class DnssecSchema(SchemaNode): trust_anchor_sentinel: bool = True trust_anchor_signal_query: bool = True time_skew_detection: bool = True - keep_removed: int = 0 + keep_removed: IntNonNegative = IntNonNegative(0) refresh_time: Optional[TimeUnit] = None hold_down_time: TimeUnit = TimeUnit("30d") trust_anchors: Optional[List[str]] = None diff --git a/manager/knot_resolver_manager/datamodel/network_schema.py b/manager/knot_resolver_manager/datamodel/network_schema.py index 6292cd1c7..91475dfc2 100644 --- a/manager/knot_resolver_manager/datamodel/network_schema.py +++ b/manager/knot_resolver_manager/datamodel/network_schema.py @@ -4,6 +4,8 @@ from typing_extensions import Literal from knot_resolver_manager.datamodel.types import ( CheckedPath, + Int0_512, + Int0_65535, InterfaceOptionalPort, IPAddress, IPNetwork, @@ -61,13 +63,11 @@ class TLSSchema(SchemaNode): sticket_secret: Optional[str] = None sticket_secret_file: Optional[CheckedPath] = None auto_discovery: bool = False - padding: int = 1 + padding: Union[bool, Int0_512] = True def _validate(self): if self.sticket_secret and self.sticket_secret_file: raise ValueError("'sticket_secret' and 'sticket_secret_file' are both defined, only one can be used") - if not 0 <= self.padding <= 512: - raise ValueError("'padding' must be number in range<0-512>") class ListenSchema(SchemaNode): @@ -155,7 +155,7 @@ class NetworkSchema(SchemaNode): do_ipv6: bool = True out_interface_v4: Optional[IPv4Address] = None out_interface_v6: Optional[IPv6Address] = None - tcp_pipeline: int = 100 + tcp_pipeline: Int0_65535 = Int0_65535(100) edns_tcp_keepalive: bool = True edns_buffer_size: EdnsBufferSizeSchema = EdnsBufferSizeSchema() address_renumbering: Optional[List[AddressRenumberingSchema]] = None @@ -164,7 +164,3 @@ class NetworkSchema(SchemaNode): ListenSchema({"interface": "127.0.0.1"}), ListenSchema({"interface": "::1", "freebind": True}), ] - - def _validate(self): - if self.tcp_pipeline < 0: - raise ValueError("'tcp-pipeline' must be nonnegative number") diff --git a/manager/knot_resolver_manager/datamodel/options_schema.py b/manager/knot_resolver_manager/datamodel/options_schema.py index 832d3511b..12b99ef28 100644 --- a/manager/knot_resolver_manager/datamodel/options_schema.py +++ b/manager/knot_resolver_manager/datamodel/options_schema.py @@ -2,10 +2,9 @@ from typing import Any, Union from typing_extensions import Literal +from knot_resolver_manager.datamodel.types import IntNonNegative, TimeUnit from knot_resolver_manager.utils import SchemaNode -from .types import TimeUnit - GlueCheckingEnum = Literal["normal", "strict", "permissive"] @@ -19,7 +18,7 @@ class PredictionSchema(SchemaNode): """ window: TimeUnit = TimeUnit("15m") - period: int = 24 + period: IntNonNegative = IntNonNegative(24) class OptionsSchema(SchemaNode): diff --git a/manager/knot_resolver_manager/datamodel/server_schema.py b/manager/knot_resolver_manager/datamodel/server_schema.py index ea6a550fb..9ce17ec40 100644 --- a/manager/knot_resolver_manager/datamodel/server_schema.py +++ b/manager/knot_resolver_manager/datamodel/server_schema.py @@ -10,6 +10,7 @@ from knot_resolver_manager.datamodel.types import ( DNSRecordTypeEnum, DomainName, InterfacePort, + IntPositive, IPAddressPort, UncheckedPath, ) @@ -114,7 +115,7 @@ class ServerSchema(SchemaNode): hostname: Optional[str] = None groupid: Optional[str] = None nsid: Optional[str] = None - workers: Union[Literal["auto"], int] = 1 + workers: Union[Literal["auto"], IntPositive] = IntPositive(1) use_cache_gc: bool = True backend: BackendEnum = "auto" watchdog: Union[bool, WatchDogSchema] = True @@ -127,7 +128,7 @@ class ServerSchema(SchemaNode): hostname: str groupid: Optional[str] nsid: Optional[str] - workers: int + workers: IntPositive use_cache_gc: bool backend: BackendEnum = "auto" watchdog: Union[bool, WatchDogSchema] @@ -142,11 +143,9 @@ class ServerSchema(SchemaNode): def _workers(self, obj: Raw) -> Any: if obj.workers == "auto": - return _cpu_count() + return IntPositive(_cpu_count()) return obj.workers def _validate(self) -> None: - if self.workers < 0: - raise ValueError("Number of workers must be non-negative") if self.watchdog and self.backend not in ["auto", "systemd"]: raise ValueError("'watchdog' can only be configured for 'systemd' backend") diff --git a/manager/knot_resolver_manager/kres_manager.py b/manager/knot_resolver_manager/kres_manager.py index 7353c87cb..41042bba7 100644 --- a/manager/knot_resolver_manager/kres_manager.py +++ b/manager/knot_resolver_manager/kres_manager.py @@ -146,7 +146,7 @@ class KresManager: async def apply_config(self, config: KresConfig) -> None: async with self._manager_lock: logger.debug("Applying new config to all workers") - await self._ensure_number_of_children(config, config.server.workers) + await self._ensure_number_of_children(config, int(config.server.workers)) await self._rolling_restart(config) if self._is_gc_running() != config.server.use_cache_gc: diff --git a/manager/tests/unit/datamodel/test_config_schema.py b/manager/tests/unit/datamodel/test_config_schema.py index d7786cb0f..e55777cf5 100644 --- a/manager/tests/unit/datamodel/test_config_schema.py +++ b/manager/tests/unit/datamodel/test_config_schema.py @@ -2,7 +2,6 @@ import json from typing import Any, Dict, cast from pytest import raises -from yaml.nodes import Node from knot_resolver_manager.datamodel import KresConfig from knot_resolver_manager.datamodel.types import IPv6Network96, TimeUnit @@ -35,7 +34,7 @@ def test_dnssec_default_true(): assert config.dnssec.trust_anchor_sentinel == True assert config.dnssec.trust_anchor_signal_query == True assert config.dnssec.time_skew_detection == True - assert config.dnssec.keep_removed == 0 + assert int(config.dnssec.keep_removed) == 0 assert config.dnssec.refresh_time == None assert config.dnssec.hold_down_time == TimeUnit("30d") diff --git a/manager/tests/unit/datamodel/test_options_schema.py b/manager/tests/unit/datamodel/test_options_schema.py index eeb193454..b775dc873 100644 --- a/manager/tests/unit/datamodel/test_options_schema.py +++ b/manager/tests/unit/datamodel/test_options_schema.py @@ -1,9 +1,9 @@ from knot_resolver_manager.datamodel.options_schema import OptionsSchema -from knot_resolver_manager.datamodel.types import TimeUnit +from knot_resolver_manager.datamodel.types import IntNonNegative, TimeUnit def test_prediction_true(): y = OptionsSchema({"prediction": True}) assert y.prediction.window == TimeUnit("15m") - assert y.prediction.period == 24 + assert int(y.prediction.period) == 24