]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
config: basic structure
authorAleš <ales.mrazek@nic.cz>
Wed, 14 Apr 2021 14:17:08 +0000 (16:17 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:52 +0000 (16:17 +0200)
- new sections added
- number of kresd instances can be based on number of system's CPUs

manager/integration/tests/worker_count/run_test.py
manager/knot_resolver_manager/datamodel/config.py
manager/knot_resolver_manager/datamodel/dnssec_config.py [new file with mode: 0644]
manager/knot_resolver_manager/datamodel/hints_config.py [new file with mode: 0644]
manager/knot_resolver_manager/datamodel/options_config.py [new file with mode: 0644]
manager/knot_resolver_manager/datamodel/server_config.py
manager/knot_resolver_manager/kres_manager.py

index 3c862819a2f456d066335b15f8f8cf168d2ad204..94e819a8e32a20ec8f106618a763a6fdcf3579bc 100644 (file)
@@ -22,6 +22,11 @@ def set_workers(num: int):
        r = requests.post('http+unix://%2Ftmp%2Fmanager.sock/config', data=PAYLOAD_F(num))
        r.raise_for_status()
 
+def set_workers_auto():
+       # send the config
+       r = requests.post('http+unix://%2Ftmp%2Fmanager.sock/config', data=PAYLOAD_F("\"auto\""))
+       r.raise_for_status()
+
 def count_running() -> int:
        cmd = subprocess.run("ps aux | grep kresd | grep -v grep", shell=True, stdout=subprocess.PIPE)
        return len(str(cmd.stdout, 'utf8').strip().split("\n"))
@@ -44,3 +49,10 @@ set_workers(4)
 time.sleep(2)
 count = count_running()
 assert count == 4, f"Unexpected number of kresd instances is running - {count}"
+
+print("Setting instances configuration to 'auto'")
+set_workers_auto()
+time.sleep(2)
+count = count_running()
+print(f"  - number of instances running is {count}")
+assert count != 1, f"Unexpected number of kresd instances is running - {count}"
index a30e7d18d6eedf91f0b44a32644d7516e2fb7442..3e0b51bbee3de1efb74a26b32850a9b26ebcb7fe 100644 (file)
@@ -5,16 +5,23 @@ from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassPar
 
 from .cache_config import CacheConfig
 from .dns64_config import Dns64Config
+from .dnssec_config import DnssecConfig
+from .hints_config import StaticHintsConfig
 from .logging_config import LoggingConfig
 from .lua_config import LuaConfig
 from .network_config import NetworkConfig
+from .options_config import OptionsConfig
 from .server_config import ServerConfig
 
 
 @dataclass
 class KresConfig(DataclassParserValidatorMixin):
+    # pylint: disable=too-many-instance-attributes
     server: ServerConfig = ServerConfig()
+    options: OptionsConfig = OptionsConfig()
     network: Optional[NetworkConfig] = None
+    static_hints: StaticHintsConfig = StaticHintsConfig()
+    dnssec: Optional[DnssecConfig] = None
     cache: CacheConfig = CacheConfig()
     dns64: Optional[Dns64Config] = None
     logging: LoggingConfig = LoggingConfig()
@@ -22,8 +29,12 @@ class KresConfig(DataclassParserValidatorMixin):
 
     def validate(self):
         self.server.validate()
+        self.options.validate()
         if self.network is not None:
             self.network.validate()
+        self.static_hints.validate()
+        if self.dnssec is not None:
+            self.dnssec.validate()
         self.cache.validate()
         if self.dns64 is not None:
             self.dns64.validate()
diff --git a/manager/knot_resolver_manager/datamodel/dnssec_config.py b/manager/knot_resolver_manager/datamodel/dnssec_config.py
new file mode 100644 (file)
index 0000000..bcb24b7
--- /dev/null
@@ -0,0 +1,8 @@
+from knot_resolver_manager.compat.dataclasses import dataclass
+from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassParserValidatorMixin
+
+
+@dataclass
+class DnssecConfig(DataclassParserValidatorMixin):
+    def validate(self):
+        pass
diff --git a/manager/knot_resolver_manager/datamodel/hints_config.py b/manager/knot_resolver_manager/datamodel/hints_config.py
new file mode 100644 (file)
index 0000000..cd020ae
--- /dev/null
@@ -0,0 +1,8 @@
+from knot_resolver_manager.compat.dataclasses import dataclass
+from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassParserValidatorMixin
+
+
+@dataclass
+class StaticHintsConfig(DataclassParserValidatorMixin):
+    def validate(self):
+        pass
diff --git a/manager/knot_resolver_manager/datamodel/options_config.py b/manager/knot_resolver_manager/datamodel/options_config.py
new file mode 100644 (file)
index 0000000..2a9ecfa
--- /dev/null
@@ -0,0 +1,8 @@
+from knot_resolver_manager.compat.dataclasses import dataclass
+from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassParserValidatorMixin
+
+
+@dataclass
+class OptionsConfig(DataclassParserValidatorMixin):
+    def validate(self):
+        pass
index 404909a3a54a7948a3e7109e44d16bdd7077a515..cde4f14a28eddb628d8ff2427bf2688d5b6807bf 100644 (file)
@@ -1,3 +1,8 @@
+import os
+from typing import Optional, Union
+
+from typing_extensions import Literal
+
 from knot_resolver_manager.compat.dataclasses import dataclass
 from knot_resolver_manager.utils.dataclasses_parservalidator import DataclassParserValidatorMixin
 
@@ -6,8 +11,22 @@ from .errors import DataValidationError
 
 @dataclass
 class ServerConfig(DataclassParserValidatorMixin):
-    instances: int = 1
+    hostname: Optional[str] = None
+    instances: Union[Literal["auto"], int] = 1
+    instances_num: int = 1
+    use_cache_gc: bool = True
+
+    def __post_init__(self):
+        if isinstance(self.instances, int):
+            self.instances_num = self.instances
+        elif self.instances == "auto":
+            cpu_count = os.cpu_count()
+            if cpu_count is not None:
+                self.instances_num = cpu_count
+            else:
+                # TODO: do better logging
+                print("cannot get number of CPUs")
 
     def validate(self):
-        if not 0 < self.instances <= 256:
+        if not 0 < self.instances_num <= 256:
             raise DataValidationError("number of kresd instances must be in range 1..256")
index f6d3f4f91b1aad68c9609b2110d2f7d5d0f5aa61..ee98648e4ab333543bdb72c73cf62746778e69a1 100644 (file)
@@ -72,5 +72,5 @@ class KresManager:
     async def apply_config(self, config: KresConfig):
         async with self._children_lock:
             await self._write_config(config)
-            await self._ensure_number_of_children(config.server.instances)
+            await self._ensure_number_of_children(config.server.instances_num)
             await self._rolling_restart()