argus/src/master/app/__init__.py

42 lines
1.2 KiB
Python

from __future__ import annotations
import atexit
import logging
from flask import Flask
from .config import AppConfig, load_config
from .routes import register_routes
from .scheduler import StatusScheduler
from .storage import Storage
def create_app(config: AppConfig | None = None) -> Flask:
app_config = config or load_config()
storage = Storage(app_config.db_path, app_config.node_id_prefix)
scheduler = StatusScheduler(storage, app_config)
app = Flask(__name__)
app.config["APP_CONFIG"] = app_config
app.config["STORAGE"] = storage
app.config["SCHEDULER"] = scheduler
register_routes(app, storage, scheduler, app_config)
scheduler.start()
def _cleanup() -> None:
logging.getLogger("argus.master").info("Shutting down master app")
try:
scheduler.stop()
except Exception: # pragma: no cover - defensive
logging.getLogger("argus.master").exception("Failed to stop scheduler")
try:
storage.close()
except Exception: # pragma: no cover - defensive
logging.getLogger("argus.master").exception("Failed to close storage")
atexit.register(_cleanup)
return app