From: Aleš Date: Thu, 6 Jan 2022 01:51:45 +0000 (+0100) Subject: datamodel: server: several management options moved to ServerSchema X-Git-Tag: v6.0.0a1~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=358f2b29e66c17672ebdafeae479d3604a0efb48;p=thirdparty%2Fknot-resolver.git datamodel: server: several management options moved to ServerSchema --- diff --git a/manager/etc/knot-resolver/config.dev.yml b/manager/etc/knot-resolver/config.dev.yml index 074097e82..2deeec790 100644 --- a/manager/etc/knot-resolver/config.dev.yml +++ b/manager/etc/knot-resolver/config.dev.yml @@ -11,8 +11,8 @@ network: port: 5353 server: workers: 1 + rundir: etc/knot-resolver/runtime management: listen: ip: 127.0.0.1 port: 5000 - rundir: etc/knot-resolver/runtime diff --git a/manager/knot_resolver_manager/datamodel/server_schema.py b/manager/knot_resolver_manager/datamodel/server_schema.py index 18c567b3e..8b0916f51 100644 --- a/manager/knot_resolver_manager/datamodel/server_schema.py +++ b/manager/knot_resolver_manager/datamodel/server_schema.py @@ -41,25 +41,13 @@ class WatchDogSchema(SchemaNode): class ManagementSchema(SchemaNode): """ - Configuration of the Manager itself. + Management API configuration. --- listen: Specifies where does the manager listen with its API. Can't be changed in runtime! - backend: Forces manager to use a specific service manager. Defaults to autodetection. - rundir: Directory where the manager can create files and which will be manager's cwd - watchdog: Systemd watchdog configuration. Can only be used with systemd backend. """ - # the default listen path here MUST use the default rundir listen: Listen = Listen({"unix-socket": "./manager.sock"}) - backend: BackendEnum = "auto" - rundir: UncheckedPath = UncheckedPath(".") - backend: BackendEnum = "auto" - watchdog: Union[Literal[False], WatchDogSchema] = False - - def _validate(self) -> None: - if self.watchdog and self.backend not in ["auto", "systemd"]: - raise ValueError("'watchdog' can only be configured for 'systemd' backend") class WebmgmtSchema(SchemaNode): @@ -70,12 +58,31 @@ class WebmgmtSchema(SchemaNode): class ServerSchema(SchemaNode): + """ + DNS resolver server control and management configuration. + + --- + hostname: Internal Knot Resolver hostname. Default is hostname of machine. + groupid: Additional identifier in case more managers are running on single machine. + nsid: Name Server Identifier (RFC 5001) which allows DNS clients to request resolver to send back its NSID along with the reply to a DNS request. + workers: The number of running 'Knot Resolver daemon' (kresd) workers. Based on number of CPUs if set to 'auto'. + use-cache-gc: Use cache garbage collector (kres-cache-gc) automatically. + backend: Forces manager to use a specific service manager. Defaults to autodetection. + watchdog: Systemd watchdog configuration. Can only be used with 'systemd' backend. + rundir: Directory where the manager can create files and which will be manager's cwd + management: Management API configuration. + webmgmt: Legacy built-in web management API configuration. + """ + class Raw(SchemaNode): hostname: Optional[str] = None groupid: Optional[str] = None nsid: Optional[str] = None workers: Union[Literal["auto"], int] = 1 use_cache_gc: bool = True + backend: BackendEnum = "auto" + watchdog: Union[Literal[False], WatchDogSchema] = False + rundir: UncheckedPath = UncheckedPath(".") management: ManagementSchema = ManagementSchema() webmgmt: Optional[WebmgmtSchema] = None @@ -86,6 +93,9 @@ class ServerSchema(SchemaNode): nsid: Optional[str] workers: int use_cache_gc: bool + backend: BackendEnum = "auto" + watchdog: Union[Literal[False], WatchDogSchema] + rundir: UncheckedPath = UncheckedPath(".") management: ManagementSchema webmgmt: Optional[WebmgmtSchema] @@ -102,3 +112,5 @@ class ServerSchema(SchemaNode): 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/datamodel/templates/server.lua.j2 b/manager/knot_resolver_manager/datamodel/templates/server.lua.j2 index ee3f51aff..308442f9f 100644 --- a/manager/knot_resolver_manager/datamodel/templates/server.lua.j2 +++ b/manager/knot_resolver_manager/datamodel/templates/server.lua.j2 @@ -7,9 +7,9 @@ modules.load('nsid') nsid.name('{{ cfg.server.nsid }}_' .. worker.id) {% endif %} -{% if cfg.server.management.watchdog -%} +{% if cfg.server.watchdog -%} modules.load('watchdog') -watchdog.config({ qname = '{{ cfg.server.management.watchdog.qname }}', qtype = kres.type.{{ cfg.server.management.watchdog.qtype }} }) +watchdog.config({ qname = '{{ cfg.server.watchdog.qname }}', qtype = kres.type.{{ cfg.server.watchdog.qtype }} }) {% else %} modules.unload('watchdog') {%- endif %} diff --git a/manager/knot_resolver_manager/server.py b/manager/knot_resolver_manager/server.py index 2b86719b0..0d2fc5788 100644 --- a/manager/knot_resolver_manager/server.py +++ b/manager/knot_resolver_manager/server.py @@ -259,8 +259,8 @@ async def _init_manager(config_store: ConfigStore) -> KresManager: """ # if configured, create a subprocess controller manually controller: Optional[SubprocessController] = None - if config_store.get().server.management.backend != "auto": - controller = await get_controller_by_name(config_store.get(), config_store.get().server.management.backend) + if config_store.get().server.backend != "auto": + controller = await get_controller_by_name(config_store.get(), config_store.get().server.backend) # Create KresManager. This will perform autodetection of available service managers and # select the most appropriate to use (or use the one configured directly) @@ -271,7 +271,7 @@ async def _init_manager(config_store: ConfigStore) -> KresManager: async def _deny_working_directory_changes(config_old: KresConfig, config_new: KresConfig) -> Result[None, str]: - if config_old.server.management.rundir != config_new.server.management.rundir: + if config_old.server.rundir != config_new.server.rundir: return Result.err("Changing manager's `rundir` during runtime is not allowed.") return Result.ok(None) @@ -280,10 +280,10 @@ async def _deny_working_directory_changes(config_old: KresConfig, config_new: Kr def _set_working_directory(config_raw: ParsedTree): config = KresConfig(config_raw) - if not config.server.management.rundir.to_path().exists(): - raise KresdManagerException(f"`rundir` directory ({config.server.management.rundir}) does not exist!") + if not config.server.rundir.to_path().exists(): + raise KresdManagerException(f"`rundir` directory ({config.server.rundir}) does not exist!") - os.chdir(config.server.management.rundir.to_path()) + os.chdir(config.server.rundir.to_path()) async def start_server(config: Union[Path, ParsedTree, _DefaultSentinel] = _DEFAULT_SENTINEL): diff --git a/manager/tests/integration/config.yml b/manager/tests/integration/config.yml index 5fe8f8a24..f2cf2feff 100644 --- a/manager/tests/integration/config.yml +++ b/manager/tests/integration/config.yml @@ -5,11 +5,11 @@ network: port: 5353 server: workers: 1 + rundir: tests/integration/run management: listen: ip: 127.0.0.1 port: 5001 - rundir: tests/integration/run cache: storage: cache logging: diff --git a/manager/tests/unit/datamodel/test_server_schema.py b/manager/tests/unit/datamodel/test_server_schema.py index c40699f45..636ebba1c 100644 --- a/manager/tests/unit/datamodel/test_server_schema.py +++ b/manager/tests/unit/datamodel/test_server_schema.py @@ -1,11 +1,11 @@ from pytest import raises -from knot_resolver_manager.datamodel.server_schema import ManagementSchema +from knot_resolver_manager.datamodel.server_schema import ServerSchema from knot_resolver_manager.exceptions import KresdManagerException -def test_management_watchdog(): - assert ManagementSchema({"watchdog": {"qname": "nic.cz.", "qtype": "A"}}) +def test_watchdog(): + assert ServerSchema({"watchdog": {"qname": "nic.cz.", "qtype": "A"}}) with raises(KresdManagerException): - ManagementSchema({"backend": "supervisord", "watchdog": {"qname": "nic.cz.", "qtype": "A"}}) + ServerSchema({"backend": "supervisord", "watchdog": {"qname": "nic.cz.", "qtype": "A"}})