diff --git a/daemon/core/configservice/dependencies.py b/daemon/core/configservice/dependencies.py index 7f62a563..49c8041c 100644 --- a/daemon/core/configservice/dependencies.py +++ b/daemon/core/configservice/dependencies.py @@ -7,11 +7,15 @@ if TYPE_CHECKING: class ConfigServiceDependencies: """ - Can generate boot paths for services, based on their dependencies. Will validate - that all services will be booted and that all dependencies exist within the services provided. + Generates sets of services to start in order of their dependencies. """ def __init__(self, services: Dict[str, "ConfigService"]) -> None: + """ + Create a ConfigServiceDependencies instance. + + :param services: services for determining dependency sets + """ # helpers to check validity self.dependents = {} self.booted = set() @@ -28,6 +32,11 @@ class ConfigServiceDependencies: self.visiting = set() def boot_paths(self) -> List[List["ConfigService"]]: + """ + Find services sets based on dependencies. + + :return: lists of lists of services that can be started in parallel + """ paths = [] for name in self.node_services: service = self.node_services[name] @@ -50,16 +59,33 @@ class ConfigServiceDependencies: return paths def _reset(self) -> None: + """ + Clear out metadata used for finding service dependency sets. + + :return: nothing + """ self.path = [] self.visited.clear() self.visiting.clear() def _start(self, service: "ConfigService") -> List["ConfigService"]: + """ + Starts a oath for checking dependencies for a given service. + + :param service: service to check dependencies for + :return: list of config services to start in order + """ logging.debug("starting service dependency check: %s", service.name) self._reset() return self._visit(service) def _visit(self, current_service: "ConfigService") -> List["ConfigService"]: + """ + Visits a service when discovering dependency chains for service. + + :param current_service: service being visited + :return: list of dependent services for a visited service + """ logging.debug("visiting service(%s): %s", current_service.name, self.path) self.visited.add(current_service.name) self.visiting.add(current_service.name) diff --git a/daemon/core/configservice/manager.py b/daemon/core/configservice/manager.py index af98e685..1f806f7b 100644 --- a/daemon/core/configservice/manager.py +++ b/daemon/core/configservice/manager.py @@ -8,16 +8,37 @@ from core.errors import CoreError class ConfigServiceManager: + """ + Manager for configurable services. + """ + def __init__(self): + """ + Create a ConfigServiceManager instance. + """ self.services = {} def get_service(self, name: str) -> Type[ConfigService]: + """ + Retrieve a service by name. + + :param name: name of service + :return: service class + :raises CoreError: when service is not found + """ service_class = self.services.get(name) if service_class is None: raise CoreError(f"service does not exit {name}") return service_class def add(self, service: ConfigService) -> None: + """ + Add service to manager, checking service requirements have been met. + + :param service: service to add to manager + :return: nothing + :raises CoreError: when service is a duplicate or has unmet executables + """ name = service.name logging.debug("loading service: class(%s) name(%s)", service.__class__, name) @@ -38,6 +59,12 @@ class ConfigServiceManager: self.services[name] = service def load(self, path: str) -> List[str]: + """ + Search path provided for configurable services and add them for being managed. + + :param path: path to search configurable services + :return: list errors when loading and adding services + """ path = pathlib.Path(path) subdirs = [x for x in path.iterdir() if x.is_dir()] subdirs.append(path)