138 lines
5.0 KiB
Python
138 lines
5.0 KiB
Python
"""Integrationsmodul – Verdrahtung aller Komponenten.
|
||
|
||
Stellt eine Factory-Funktion bereit, die alle Monorepo-Komponenten mit
|
||
korrekten Querverweisen erstellt und verdrahtet:
|
||
|
||
- SecretEncryptionManager ↔ ContextGuard (load_env nutzt Entschlüsselung)
|
||
- SecretEncryptionManager ↔ FederationManager (Team-Repos erhalten nur eigene Secrets)
|
||
- SecretEncryptionManager ↔ OrchestratorAdapter (Env-Loading via Encryption)
|
||
|
||
Requirements: 2.2, 9.3, 9.4, 10.10
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
from pathlib import Path
|
||
from typing import Any
|
||
|
||
from monorepo.audit import AuditLogger
|
||
from monorepo.encryption import MachineContextManager, SecretEncryptionManager
|
||
from monorepo.federation import FederationManager
|
||
from monorepo.orchestrator import OrchestratorAdapter
|
||
from monorepo.security import ContextGuard
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
def create_integrated_stack(root_path: Path) -> dict[str, Any]:
|
||
"""Erstellt alle Monorepo-Komponenten mit vollständiger Verdrahtung.
|
||
|
||
Factory-Funktion die den gesamten Komponentenstack aufbaut, wobei
|
||
der SecretEncryptionManager als zentrales Bindeglied zwischen
|
||
ContextGuard, OrchestratorAdapter und FederationManager dient.
|
||
|
||
Ablauf:
|
||
1. MachineContext laden (aus shared/config/machine-context.yaml)
|
||
2. SecretEncryptionManager erstellen
|
||
3. ContextGuard mit encryption_manager erstellen
|
||
4. AuditLogger erstellen
|
||
5. OrchestratorAdapter mit encryption_manager und context_guard erstellen
|
||
6. FederationManager mit encryption_manager erstellen
|
||
|
||
Args:
|
||
root_path: Wurzelverzeichnis des Monorepos (absoluter Pfad).
|
||
|
||
Returns:
|
||
Dict mit allen erstellten Komponenten:
|
||
- "encryption_manager": SecretEncryptionManager
|
||
- "context_guard": ContextGuard
|
||
- "audit_logger": AuditLogger
|
||
- "orchestrator_adapter": OrchestratorAdapter
|
||
- "federation_manager": FederationManager (oder None wenn team-repos.yaml fehlt)
|
||
- "machine_context_manager": MachineContextManager
|
||
|
||
Raises:
|
||
FileNotFoundError: Wenn essentielle Konfigurationsdateien fehlen
|
||
(access-config.yaml muss existieren; machine-context.yaml ist
|
||
optional, führt aber zu einem eingeschränkten Stack).
|
||
"""
|
||
root_path = root_path.resolve()
|
||
|
||
# 1. MachineContext laden
|
||
machine_ctx_manager = MachineContextManager(root_path)
|
||
encryption_manager: SecretEncryptionManager | None = None
|
||
|
||
try:
|
||
machine_ctx_manager.load()
|
||
encryption_manager = machine_ctx_manager.create_encryption_manager()
|
||
logger.info(
|
||
"SecretEncryptionManager erstellt für Maschine '%s' "
|
||
"(autorisierte Kontexte: %s).",
|
||
machine_ctx_manager.machine_context.name,
|
||
machine_ctx_manager.machine_context.authorized_contexts,
|
||
)
|
||
except FileNotFoundError:
|
||
logger.warning(
|
||
"machine-context.yaml nicht gefunden. "
|
||
"Stack wird ohne Verschlüsselung erstellt."
|
||
)
|
||
except ValueError as e:
|
||
logger.warning(
|
||
"machine-context.yaml ungültig: %s. "
|
||
"Stack wird ohne Verschlüsselung erstellt.",
|
||
e,
|
||
)
|
||
|
||
# 2. ContextGuard mit optionalem encryption_manager erstellen
|
||
context_guard = ContextGuard(
|
||
root_path=root_path,
|
||
encryption_manager=encryption_manager,
|
||
)
|
||
logger.info("ContextGuard erstellt (encryption: %s).", encryption_manager is not None)
|
||
|
||
# 3. AuditLogger erstellen
|
||
audit_logger = AuditLogger(root_path / ".audit" / "access.log")
|
||
|
||
# 4. OrchestratorAdapter mit encryption_manager verdrahten
|
||
orchestrator_adapter = OrchestratorAdapter(
|
||
root_path=root_path,
|
||
context_guard=context_guard,
|
||
audit_logger=audit_logger,
|
||
encryption_manager=encryption_manager,
|
||
)
|
||
logger.info("OrchestratorAdapter erstellt (encryption: %s).", encryption_manager is not None)
|
||
|
||
# 5. FederationManager mit encryption_manager erstellen
|
||
federation_manager: FederationManager | None = None
|
||
team_repos_config_path = root_path / "shared" / "config" / "team-repos.yaml"
|
||
|
||
if team_repos_config_path.exists():
|
||
try:
|
||
federation_manager = FederationManager(
|
||
config_path=team_repos_config_path,
|
||
monorepo_root=root_path,
|
||
encryption_manager=encryption_manager,
|
||
)
|
||
logger.info(
|
||
"FederationManager erstellt (encryption: %s).",
|
||
encryption_manager is not None,
|
||
)
|
||
except (FileNotFoundError, ValueError) as e:
|
||
logger.warning(
|
||
"FederationManager konnte nicht erstellt werden: %s", e
|
||
)
|
||
else:
|
||
logger.info(
|
||
"team-repos.yaml nicht gefunden. FederationManager wird nicht erstellt."
|
||
)
|
||
|
||
return {
|
||
"encryption_manager": encryption_manager,
|
||
"context_guard": context_guard,
|
||
"audit_logger": audit_logger,
|
||
"orchestrator_adapter": orchestrator_adapter,
|
||
"federation_manager": federation_manager,
|
||
"machine_context_manager": machine_ctx_manager,
|
||
}
|