]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
datamodel: server: added several conf options
authorAleš <ales.mrazek@nic.cz>
Tue, 7 Sep 2021 14:07:07 +0000 (16:07 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:52 +0000 (16:17 +0200)
manager/knot_resolver_manager/datamodel/lua_template.j2
manager/knot_resolver_manager/datamodel/server_config.py
manager/tests/datamodel/test_server_config.py [new file with mode: 0644]

index 9e4c958136ccdf90340ab8782e622d6453d61dfa..889202e6c7917d8dcd12f0381e09740edc77c6c3 100644 (file)
@@ -1,3 +1,14 @@
+-- SERVER section
+-- server.hostname
+hostname('{{ cfg.server.hostname }}')
+
+{% if cfg.server.nsid %}
+-- server.nsid
+modules.load('nsid')
+nsid.name('{{ cfg.server.nsid }} ' .. worker.id)
+{% endif %}
+
+-- NETWORK section
 -- network.interfaces
 {% for item in cfg.network.interfaces %}
 net.listen('{{ item.address }}', {{ item.port }}, {
@@ -7,7 +18,7 @@ net.listen('{{ item.address }}', {{ item.port }}, {
 {% endfor %}
 
 {% if cfg.lua %}
--- lua section
+-- LUA section
 {% if cfg.lua.script_file %}
 {% import cfg.lua.script_file as script_file %}
 -- lua.script-file
index fd70f74e20a0530d02e9adf7f7e0b5def369cd87..98ba66d9f63ade062167aac408ef91bc9526060b 100644 (file)
@@ -1,10 +1,12 @@
 import logging
 import os
-from typing import Union
+import socket
+from typing import Optional, Union
 
 from typing_extensions import Literal
 
 from knot_resolver_manager.utils import DataParser, DataValidationException, DataValidator
+from knot_resolver_manager.utils.types import LiteralEnum
 
 logger = logging.getLogger(__name__)
 
@@ -27,21 +29,54 @@ def _cpu_count() -> int:
         return cpus
 
 
+BackendEnum = LiteralEnum["auto", "systemd", "supervisord"]
+
+
+class Management(DataParser):
+    listen: str = "/tmp/manager.sock"
+    backend: BackendEnum = "auto"
+    rundir: str = "."
+
+
+class ManagementStrict(DataValidator):
+    listen: str
+    backend: BackendEnum
+    rundir: str
+
+    def _validate(self) -> None:
+        pass
+
+
 class Server(DataParser):
+    hostname: Optional[str] = None
+    groupid: Optional[str] = None
+    nsid: Optional[str]
     workers: Union[Literal["auto"], int] = 1
     use_cache_gc: bool = True
+    management: Management = Management()
 
 
 class ServerStrict(DataValidator):
+    hostname: str
+    groupid: Optional[str]
+    nsid: Optional[str]
     workers: int
     use_cache_gc: bool
+    management: ManagementStrict
+
+    def _hostname(self, obj: Server) -> str:
+        if isinstance(obj.hostname, str):
+            return obj.hostname
+        elif obj.hostname is None:
+            return socket.gethostname()
+        raise DataValidationException(f"Unexpected value for 'server.hostname': {obj.workers}")
 
     def _workers(self, obj: Server) -> int:
         if isinstance(obj.workers, int):
             return obj.workers
         elif obj.workers == "auto":
             return _cpu_count()
-        raise DataValidationException(f"Unexpected value: {obj.workers}")
+        raise DataValidationException(f"Unexpected value for 'server.workers': {obj.workers}")
 
     def _validate(self) -> None:
         if self.workers < 0:
diff --git a/manager/tests/datamodel/test_server_config.py b/manager/tests/datamodel/test_server_config.py
new file mode 100644 (file)
index 0000000..94b36f6
--- /dev/null
@@ -0,0 +1,38 @@
+from knot_resolver_manager.datamodel.server_config import Server, ServerStrict
+
+yaml = """
+hostname: myhostname
+groupid: group1
+nsid: mynsid
+workers: 4
+use-cache-gc: false
+management:
+    listen: /tmp/manager.sock
+    backend: systemd
+    rundir: "."
+"""
+
+config = Server.from_yaml(yaml)
+strict = ServerStrict(config)
+
+
+def test_parsing():
+    assert config.hostname == "myhostname"
+    assert config.groupid == "group1"
+    assert config.nsid == "mynsid"
+    assert config.workers == 4
+    assert config.use_cache_gc == False
+    assert config.management.listen == "/tmp/manager.sock"
+    assert config.management.backend == "systemd"
+    assert config.management.rundir == "."
+
+
+def test_validating():
+    assert strict.hostname == "myhostname"
+    assert strict.groupid == "group1"
+    assert strict.nsid == "mynsid"
+    assert strict.workers == 4
+    assert strict.use_cache_gc == False
+    assert strict.management.listen == "/tmp/manager.sock"
+    assert strict.management.backend == "systemd"
+    assert strict.management.rundir == "."