From: Aleš Date: Wed, 14 Apr 2021 14:17:08 +0000 (+0200) Subject: config: basic structure X-Git-Tag: v6.0.0a1~174 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f4f30a086c8a2153197bc0edf2bcffc4e8e472c;p=thirdparty%2Fknot-resolver.git config: basic structure - new sections added - number of kresd instances can be based on number of system's CPUs --- diff --git a/manager/integration/tests/worker_count/run_test.py b/manager/integration/tests/worker_count/run_test.py index 3c862819a..94e819a8e 100644 --- a/manager/integration/tests/worker_count/run_test.py +++ b/manager/integration/tests/worker_count/run_test.py @@ -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}" diff --git a/manager/knot_resolver_manager/datamodel/config.py b/manager/knot_resolver_manager/datamodel/config.py index a30e7d18d..3e0b51bbe 100644 --- a/manager/knot_resolver_manager/datamodel/config.py +++ b/manager/knot_resolver_manager/datamodel/config.py @@ -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 index 000000000..bcb24b737 --- /dev/null +++ b/manager/knot_resolver_manager/datamodel/dnssec_config.py @@ -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 index 000000000..cd020ae25 --- /dev/null +++ b/manager/knot_resolver_manager/datamodel/hints_config.py @@ -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 index 000000000..2a9ecfa2e --- /dev/null +++ b/manager/knot_resolver_manager/datamodel/options_config.py @@ -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 diff --git a/manager/knot_resolver_manager/datamodel/server_config.py b/manager/knot_resolver_manager/datamodel/server_config.py index 404909a3a..cde4f14a2 100644 --- a/manager/knot_resolver_manager/datamodel/server_config.py +++ b/manager/knot_resolver_manager/datamodel/server_config.py @@ -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") diff --git a/manager/knot_resolver_manager/kres_manager.py b/manager/knot_resolver_manager/kres_manager.py index f6d3f4f91..ee98648e4 100644 --- a/manager/knot_resolver_manager/kres_manager.py +++ b/manager/knot_resolver_manager/kres_manager.py @@ -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()