- fix(scheduler): backend.down-Check läuft nur noch wenn dieser Node den VIP hält (nodeHoldsVIP). Ein keepalived-BACKUP-Node hat KEINE VLAN-IP → erreicht die Backend-Subnetze nicht → sah bisher ALLE Backends L4-down und feuerte Dauer-Fehlalarme (Hauptquelle des alert_events-Spams). Master sieht die echten States. - feat(ctl): `cluster-reconcile-replication` — bringt Publication/Grants/ Subscription idempotent in den Soll-Zustand (Publisher: fehlende Shared- Tables ADD, node-lokale DROP, GRANT SELECT für Replikator; Subscriber: neue Tabellen leeren + REFRESH). Läuft im postinst nach migrate. - fix(packaging): postinst re-added network_interfaces/ip_addresses bei JEDEM Upgrade in die Publication (alter fester Block) → ersetzt durch den Reconcile. DAS war die Wiederkehr-Ursache. - fix(replication): waf_alerts → localOnlyTables (Event-Daten, node-lokal wie alert_events). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
28 lines
862 B
Go
28 lines
862 B
Go
package main
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestFilterSharedTables(t *testing.T) {
|
|
all := []string{
|
|
"backends", "domains", "waf_configs", "oidc_settings",
|
|
"ip_addresses", "network_interfaces", "alert_events", "waf_alerts",
|
|
"ha_nodes", "goose_db_version", "radius_users", "",
|
|
}
|
|
got := filterSharedTables(all)
|
|
want := []string{"backends", "domains", "oidc_settings", "radius_users", "waf_configs"}
|
|
if !reflect.DeepEqual(got, want) {
|
|
t.Errorf("filterSharedTables()\n got=%v\nwant=%v", got, want)
|
|
}
|
|
// node-lokale müssen raus sein (inkl. der frisch node-lokal gemachten).
|
|
for _, local := range []string{"ip_addresses", "network_interfaces", "alert_events", "waf_alerts", "ha_nodes", "goose_db_version"} {
|
|
for _, g := range got {
|
|
if g == local {
|
|
t.Errorf("localOnly-Tabelle %q darf NICHT in shared-Liste sein", local)
|
|
}
|
|
}
|
|
}
|
|
}
|