File: registered_workers.py

package info (click to toggle)
knot-resolver 6.0.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,376 kB
  • sloc: javascript: 42,732; ansic: 40,311; python: 12,580; cpp: 2,121; sh: 1,988; xml: 193; makefile: 181
file content (49 lines) | stat: -rw-r--r-- 1,442 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import asyncio
import logging
from typing import TYPE_CHECKING, Dict, List, Tuple

from .exceptions import SubprocessControllerError

if TYPE_CHECKING:
    from knot_resolver.controller.interface import KresID, Subprocess


logger = logging.getLogger(__name__)


_REGISTERED_WORKERS: "Dict[KresID, Subprocess]" = {}


def get_registered_workers_kresids() -> "List[KresID]":
    return list(_REGISTERED_WORKERS.keys())


async def command_single_registered_worker(cmd: str) -> "Tuple[KresID, object]":
    for sub in _REGISTERED_WORKERS.values():
        return sub.id, await sub.command(cmd)
    raise SubprocessControllerError(
        "Unable to execute the command. There is no kresd worker running to execute the command."
        "Try start/restart the resolver.",
    )


async def command_registered_workers(cmd: str) -> "Dict[KresID, object]":
    async def single_pair(sub: "Subprocess") -> "Tuple[KresID, object]":
        return sub.id, await sub.command(cmd)

    pairs = await asyncio.gather(*(single_pair(inst) for inst in _REGISTERED_WORKERS.values()))
    return dict(pairs)


def unregister_worker(subprocess: "Subprocess") -> None:
    """
    Unregister kresd worker "Subprocess" from the list.
    """
    del _REGISTERED_WORKERS[subprocess.id]


def register_worker(subprocess: "Subprocess") -> None:
    """
    Register kresd worker "Subprocess" on the list.
    """
    _REGISTERED_WORKERS[subprocess.id] = subprocess