Accountant: Inventar, where, Checkmk, Abrechnung

This commit is contained in:
br committed 2026-10-18 17:08:58 +02:00
1 parent 9f16148cde
commit dd93277750
59 files changed
+7522 -113

No files matched your search

+62
View File
@@ -441,3 +441,65 @@ func TestRegistry_NodeMaintenanceFromDirectory(t *testing.T) {
t.Error("Knotenwartung aus dem Directory nicht angewendet")
}
}
// Zusatzdaten (Compose, Startzeit, Health, Host-Infos) werden mit dem
// Zustand gespeichert, ändern das Routing aber nicht.
func TestRegistry_StateKeepsMetadata(t *testing.T) {
r, _, _ := newRegistry()
plain := wp("wordpress", "100.64.0.1", "kunde.de")
if err := r.Update(ctx, "n1", NodeState{Workloads: []Workload{plain}}); err != nil {
t.Fatal(err)
}
before, _ := json.Marshal(r.Config())
started := time.Date(2026, 10, 16, 8, 15, 30, 0, time.UTC)
withMeta := plain
withMeta.Meta = &WorkloadMeta{
ComposeProject: "kunde-a", ComposeService: "wordpress", ComposeDir: "/srv/kunde-a",
State: "running", StartedAt: started, Health: "healthy",
}
state := NodeState{
Workloads: []Workload{withMeta},
Host: &HostInfo{
FQDN: "webdocker11.lan.r25dc.de", OS: "Debian GNU/Linux 13 (trixie)",
DockerVersion: "29.8.2", NetBirdIP: "100.64.0.42",
},
}
if err := r.Update(ctx, "n1", state); err != nil {
t.Fatal(err)
}
if after, _ := json.Marshal(r.Config()); string(after) != string(before) {
t.Errorf("Zusatzdaten ändern das Routing:\nvorher %s\nnachher %s", before, after)
}
got, ok := r.State("n1")
if !ok || !reflect.DeepEqual(got, state) {
t.Errorf("State(n1) = %+v, %v; erwartet %+v", got, ok, state)
}
if _, ok := r.State("gibts-nicht"); ok {
t.Error("State für unbekannten Knoten")
}
// Kopie: Änderungen am Ergebnis wirken nicht auf die Registry zurück.
got.Workloads[0].Meta.ComposeDir = "/manipuliert"
got.Host.FQDN = "manipuliert"
again, _ := r.State("n1")
if again.Workloads[0].Meta.ComposeDir != "/srv/kunde-a" || again.Host.FQDN != "webdocker11.lan.r25dc.de" {
t.Errorf("State liefert keine Kopie: %+v", again)
}
}
// Ältere Agents schicken keine Zusatzdaten; JSON ohne die Felder bleibt gültig
// und erzeugt keine leeren Objekte.
func TestNodeState_JSONWithoutMetadata(t *testing.T) {
var st NodeState
if err := json.Unmarshal([]byte(`{"workloads":[{"name":"wp","host":"10.0.0.1","labels":{}}]}`), &st); err != nil {
t.Fatal(err)
}
if st.Host != nil || st.Workloads[0].Meta != nil {
t.Errorf("Zusatzdaten erfunden: %+v", st)
}
out, _ := json.Marshal(st)
if want := `{"workloads":[{"name":"wp","host":"10.0.0.1","labels":{}}]}`; string(out) != want {
t.Errorf("JSON = %s, erwartet %s", out, want)
}
}