From: Aleš Date: Thu, 27 Jan 2022 14:47:10 +0000 (+0100) Subject: datamodel: validation function for listening configuration X-Git-Tag: v6.0.0a1~45^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d11c3e905593132767b79de24bb10b1408422256;p=thirdparty%2Fknot-resolver.git datamodel: validation function for listening configuration --- diff --git a/manager/knot_resolver_manager/datamodel/network_schema.py b/manager/knot_resolver_manager/datamodel/network_schema.py index f6af86c1d..09351ce93 100644 --- a/manager/knot_resolver_manager/datamodel/network_schema.py +++ b/manager/knot_resolver_manager/datamodel/network_schema.py @@ -43,6 +43,19 @@ class TLSSchema(SchemaNode): raise ValueError("'padding' must be number in range<0-512>") +def listen_config_validate(obj: object) -> None: + present = { + "ip-address" if hasattr(obj, "ip_address") and getattr(obj, "ip_address") is not None else ..., + "unix-socket" if hasattr(obj, "unix_socket") and getattr(obj, "unix_socket") is not None else ..., + "interface" if hasattr(obj, "interface") and getattr(obj, "interface") is not None else ..., + } + if not (present == {"ip-address", ...} or present == {"unix-socket", ...} or present == {"interface", ...}): + raise ValueError( + "Listen configuration contains incompatible configuration options." + f" Expected one of 'ip-address', 'interface' and 'unix-socket' options, got '{present}'." + ) + + class ListenSchema(SchemaNode): class Raw(SchemaNode): unix_socket: Union[None, CheckedPath, List[CheckedPath]] = None @@ -103,16 +116,7 @@ class ListenSchema(SchemaNode): return None def _validate(self) -> None: - present = { - "ip_address" if self.ip_address is not None else ..., - "unix_socket" if self.unix_socket is not None else ..., - "interface" if self.interface is not None else ..., - } - if not (present == {"ip_address", ...} or present == {"unix_socket", ...} or present == {"interface", ...}): - raise ValueError( - "Listen configuration contains multiple incompatible options at once. " - "Only one of 'ip-address', 'interface' and 'unix-socket' optionscan be configured at once." - ) + listen_config_validate(self) if self.port and self.unix_socket: raise ValueError( "'unix-socket' and 'port' are not compatible options. " diff --git a/manager/knot_resolver_manager/datamodel/server_schema.py b/manager/knot_resolver_manager/datamodel/server_schema.py index fe6b4f50d..002adf1e2 100644 --- a/manager/knot_resolver_manager/datamodel/server_schema.py +++ b/manager/knot_resolver_manager/datamodel/server_schema.py @@ -5,6 +5,7 @@ from typing import Any, Optional, Union from typing_extensions import Literal +from knot_resolver_manager.datamodel.network_schema import listen_config_validate from knot_resolver_manager.datamodel.types import ( CheckedPath, DomainName, @@ -63,16 +64,7 @@ class WebmgmtSchema(SchemaNode): key_file: Optional[CheckedPath] = None def _validate(self) -> None: - present = { - "ip_address" if self.ip_address is not None else ..., - "unix_socket" if self.unix_socket is not None else ..., - "interface" if self.interface is not None else ..., - } - if not (present == {"ip_address", ...} or present == {"unix_socket", ...} or present == {"interface", ...}): - raise ValueError( - "Listen configuration contains multiple incompatible options at once. " - "One of 'ip-address', 'interface' or 'unix-socket' must be configured." - ) + listen_config_validate(self) class ServerSchema(SchemaNode):