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"))
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}"
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()
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()
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+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
@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")
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()