+-- 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 }}, {
{% endfor %}
{% if cfg.lua %}
--- lua section
+-- LUA section
{% if cfg.lua.script_file %}
{% import cfg.lua.script_file as script_file %}
-- lua.script-file
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__)
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:
--- /dev/null
+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 == "."