plba
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from app_runtime.config.providers import FileConfigProvider
|
||||
from app_runtime.contracts.application import ApplicationModule
|
||||
from app_runtime.control.service import ControlPlaneService
|
||||
from app_runtime.core.configuration import ConfigurationManager
|
||||
from app_runtime.core.registration import ModuleRegistry
|
||||
from app_runtime.core.service_container import ServiceContainer
|
||||
from app_runtime.core.types import HealthPayload, LifecycleState
|
||||
from app_runtime.health.registry import HealthRegistry
|
||||
from app_runtime.logging.manager import LogManager
|
||||
from app_runtime.tracing.service import TraceService
|
||||
from app_runtime.workers.supervisor import WorkerSupervisor
|
||||
|
||||
|
||||
class RuntimeManager:
|
||||
def __init__(
|
||||
self,
|
||||
configuration: ConfigurationManager | None = None,
|
||||
services: ServiceContainer | None = None,
|
||||
traces: TraceService | None = None,
|
||||
health: HealthRegistry | None = None,
|
||||
logs: LogManager | None = None,
|
||||
workers: WorkerSupervisor | None = None,
|
||||
control_plane: ControlPlaneService | None = None,
|
||||
) -> None:
|
||||
self.configuration = configuration or ConfigurationManager()
|
||||
self.services = services or ServiceContainer()
|
||||
self.traces = traces or TraceService()
|
||||
self.health = health or HealthRegistry()
|
||||
self.logs = logs or LogManager()
|
||||
self.workers = workers or WorkerSupervisor()
|
||||
self.control_plane = control_plane or ControlPlaneService()
|
||||
self.registry = ModuleRegistry(self.services)
|
||||
self._started = False
|
||||
self._state = LifecycleState.IDLE
|
||||
self._core_registered = False
|
||||
self._workers_registered = False
|
||||
self._register_core_services()
|
||||
|
||||
def register_module(self, module: ApplicationModule) -> None:
|
||||
self.registry.register_module(module.name)
|
||||
module.register(self.registry)
|
||||
|
||||
def add_config_file(self, path: str) -> FileConfigProvider:
|
||||
provider = FileConfigProvider(path)
|
||||
self.configuration.add_provider(provider)
|
||||
return provider
|
||||
|
||||
def start(self) -> None:
|
||||
if self._started:
|
||||
return
|
||||
self._state = LifecycleState.STARTING
|
||||
config = self.configuration.load()
|
||||
self.logs.apply_config(config)
|
||||
self._register_health_contributors()
|
||||
self._register_workers()
|
||||
self.workers.start()
|
||||
self.control_plane.start(self)
|
||||
self._started = True
|
||||
self._refresh_state()
|
||||
|
||||
def stop(self, timeout: float = 30.0, force: bool = False, stop_control_plane: bool = True) -> None:
|
||||
if not self._started:
|
||||
return
|
||||
self._state = LifecycleState.STOPPING
|
||||
self.workers.stop(timeout=timeout, force=force)
|
||||
if stop_control_plane:
|
||||
self.control_plane.stop()
|
||||
self._started = False
|
||||
self._state = LifecycleState.STOPPED
|
||||
|
||||
def status(self) -> dict[str, object]:
|
||||
self._refresh_state()
|
||||
return self.control_plane.snapshot(self)
|
||||
|
||||
def current_health(self) -> HealthPayload:
|
||||
self._refresh_state()
|
||||
return self.health.payload(self._state, self.workers.healths())
|
||||
|
||||
async def health_status(self) -> HealthPayload:
|
||||
return self.current_health()
|
||||
|
||||
async def start_runtime(self) -> str:
|
||||
if self._started:
|
||||
return "runtime already running"
|
||||
self.start()
|
||||
return "runtime started"
|
||||
|
||||
async def stop_runtime(self) -> str:
|
||||
if not self._started:
|
||||
return "runtime already stopped"
|
||||
self.stop(stop_control_plane=False)
|
||||
return "runtime stopped"
|
||||
|
||||
async def runtime_status(self) -> str:
|
||||
self._refresh_state()
|
||||
return self._state.value
|
||||
|
||||
def _register_core_services(self) -> None:
|
||||
if self._core_registered:
|
||||
return
|
||||
self.services.register("configuration", self.configuration)
|
||||
self.services.register("traces", self.traces)
|
||||
self.services.register("health", self.health)
|
||||
self.services.register("logs", self.logs)
|
||||
self.services.register("workers", self.workers)
|
||||
self.services.register("control_plane", self.control_plane)
|
||||
self._core_registered = True
|
||||
|
||||
def _register_health_contributors(self) -> None:
|
||||
for contributor in self.registry.health_contributors:
|
||||
self.health.register(contributor)
|
||||
|
||||
def _register_workers(self) -> None:
|
||||
if self._workers_registered:
|
||||
return
|
||||
for worker in self.registry.workers:
|
||||
self.workers.register(worker)
|
||||
self._workers_registered = True
|
||||
|
||||
def _refresh_state(self) -> None:
|
||||
if not self._started or self._state == LifecycleState.STOPPING:
|
||||
return
|
||||
self._state = self.workers.lifecycle_state()
|
||||
Reference in New Issue
Block a user