OPS-12: Merge-Folgefehler behoben (NewProvisioner-Signatur, Runtime-DSN)
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (push) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (push) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s

Der automatische Merge von PR #217 (OPS-12) gegen main liess
internal/tenant/provisioner.go::ProvisionWithID mit einem nicht mehr
existierenden Feld (p.dsnTemplate) zurueck und vergass dort den
grantRuntimeRole-Aufruf, den Provision() bereits hat -- echter
Build-Fehler, kein reiner Textkonflikt, git markierte ihn nicht als
Konflikt. Drei weitere Aufrufer von NewProvisioner (Migrationswerkzeug,
Cutover-Orchestrator, Test) riefen noch mit der alten Drei-Parameter-
Signatur auf. Alle auf die neue Vier-Parameter-Signatur (Admin-DSN +
Runtime-DSN) nachgezogen, wo keine eigene Runtime-DSN-Variable existiert
faellt auf dieselbe Vorlage zurueck (admin-only Werkzeuge).

Verifiziert auf Host 204: go build/vet sauber, betroffene Pakete
(tenant, migrationtenant, cutoverorchestrator, cor01-tenant-migrate)
gruen. Einziger verbleibender FAIL (TestAllHTTPServersUseHTTPHarden)
ist der bereits bekannte, unabhaengige Befund aus PR #345 (noch nicht
gemergt), keine neue Regression.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-10-17 16:24:14 +02:00
1 parent d5b526db0e
commit 7abc866356
4 files changed
+13 -4

No files matched your search

+5 -1
View File
@@ -42,7 +42,11 @@ func main() {
defer adminPool.Close()
registry := tenant.NewRegistry(registryPool)
provisioner := tenant.NewProvisioner(adminPool, registry, dsnTemplate)
runtimeDSNTemplate := os.Getenv("NEXARCH_TENANT_RUNTIME_DSN_TEMPLATE")
if runtimeDSNTemplate == "" {
runtimeDSNTemplate = dsnTemplate
}
provisioner := tenant.NewProvisioner(adminPool, registry, dsnTemplate, runtimeDSNTemplate)
mapStore := migrationtenant.NewMapStore(registryPool)
migrator := migrationtenant.NewMigrator(mapStore, provisioner)
+1 -1
View File
@@ -241,7 +241,7 @@ func (d *Dryrun) cor01(ctx context.Context) (Outcome, error) {
defer adminPool.Close()
registry := tenant.NewRegistry(d.registry)
provisioner := tenant.NewProvisioner(adminPool, registry, d.cluster.TenantDSNTemplate())
provisioner := tenant.NewProvisioner(adminPool, registry, d.cluster.TenantDSNTemplate(), d.cluster.TenantDSNTemplate())
res, err := migrationtenant.NewMigrator(migrationtenant.NewMapStore(d.registry), provisioner).MigrateApproved(ctx)
if err != nil {
return Outcome{}, err
+1 -1
View File
@@ -72,7 +72,7 @@ func TestMigrateApproved(t *testing.T) {
dsnTemplate := strings.Replace(adminDSN, "/postgres?", "/%s?", 1)
registry := tenant.NewRegistry(registryPool)
provisioner := tenant.NewProvisioner(adminPool, registry, dsnTemplate)
provisioner := tenant.NewProvisioner(adminPool, registry, dsnTemplate, dsnTemplate)
mapStore := NewMapStore(registryPool)
migrator := NewMigrator(mapStore, provisioner)
+6 -1
View File
@@ -225,12 +225,17 @@ func (p *Provisioner) ProvisionWithID(ctx context.Context, id, slug, name string
return Tenant{}, fmt.Errorf("tenant-datenbank isolieren (revoke connect from public): %w", err)
}
if err := p.grantRuntimeRole(ctx, dbName); err != nil {
p.rollbackDatabase(ctx, dbName)
return Tenant{}, fmt.Errorf("laufzeit-rolle berechtigen: %w", err)
}
t := Tenant{
ID: id,
Slug: slug,
Name: name,
DBName: dbName,
DBDSN: fmt.Sprintf(p.dsnTemplate, dbName),
DBDSN: fmt.Sprintf(p.runtimeDSNTemplate, dbName),
Status: StatusActive,
}