"""Configuration loader. Reads from the path in FESTER_CONFIG env var if set, otherwise from config.yaml in the project root. Provides CONFIG as a module-level dict. """ import os from pathlib import Path import yaml BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # Allow override via env var (for tests / dev / multi-cluster setups) _env_config = os.environ.get("FESTER_CONFIG") if _env_config: CONFIG_PATH = _env_config else: CONFIG_PATH = os.path.join(BASE_DIR, "config.yaml") # Graceful fallback: if the requested config doesn't exist, use a sensible # default so the backend can still boot (e.g. in a fresh clone or container). if not Path(CONFIG_PATH).exists(): CONFIG = { "master": {"name": "fester-master", "role": "control"}, "nodes": [ {"name": "localhost", "host": "127.0.0.1", "max_jobs": 4}, ], "projects": [], "btc": { "enabled": True, "root": "/opt/BTC", "primary": False, }, } else: with open(CONFIG_PATH, "r") as f: CONFIG = yaml.safe_load(f) or {} # Ensure required keys exist CONFIG.setdefault("master", {"name": "fester-master", "role": "control"}) CONFIG.setdefault("nodes", []) CONFIG.setdefault("projects", []) # BTC (Build Tool Chain) configuration CONFIG.setdefault("btc", {}) CONFIG["btc"].setdefault("enabled", True) CONFIG["btc"].setdefault("root", "/opt/BTC") CONFIG["btc"].setdefault("primary", False)