Initial monorepo structure
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
"""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,
|
||||
}
|
||||
Reference in New Issue
Block a user