Files
Orchestrator/shared/tools/monorepo-cli/src/monorepo/integration.py
T
2026-06-30 20:37:40 +02:00

138 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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,
}