Files
sultan/pkg/server/payee_routes_test.go

80 lines
3.4 KiB
Go

package server
import (
"reflect"
"testing"
"time"
"sultan/pkg/accountant"
"sultan/pkg/registry"
)
// Aus dem gemeldeten Zustand eines Knotens entstehen die Berichtszeilen:
// Hosts, Ziel (IP und FQDN), Compose-Angaben, Produkt, down/aktiv.
func TestReportRoutes(t *testing.T) {
started := time.Date(2026, 10, 17, 8, 0, 0, 0, time.UTC)
st := registry.NodeState{
Host: &registry.HostInfo{FQDN: "webdocker11.lan.r25dc.de"},
Workloads: []registry.Workload{
{
Name: "kunde-a-wordpress-1", Host: "10.0.0.11",
Labels: map[string]string{
"traefik.enable": "true",
"traefik.http.routers.wp.rule": "Host(`www.kunde.de`) || Host(`kunde.de`)",
"traefik.http.services.wp.loadbalancer.server.port": "8081",
"sultan.accountant.billing": "web-hosting",
},
Meta: &registry.WorkloadMeta{ComposeProject: "kunde-a", ComposeService: "wordpress",
ComposeDir: "/srv/kunde-a", State: "running", StartedAt: started, Health: "healthy"},
},
{
Name: "olat", Host: "10.0.0.11",
Labels: map[string]string{
"traefik.enable": "true",
"traefik.http.routers.olat.rule": "Host(`olat.kunde.de`)",
"traefik.http.services.olat.loadbalancer.server.port": "8090",
},
Meta: &registry.WorkloadMeta{State: "exited"},
},
{
Name: "ca", Host: "10.0.0.11",
Labels: map[string]string{
"traefik.enable": "true",
"traefik.tcp.routers.ca.rule": "HostSNI(`ca.kunde.de`)",
"traefik.tcp.routers.ca.entrypoints": "websecure",
"traefik.tcp.routers.ca.tls.passthrough": "true",
"traefik.tcp.services.ca.loadbalancer.server.port": "9000",
},
},
{Name: "kaputt", Host: "10.0.0.11", Labels: map[string]string{"traefik.enable": "vielleicht"}},
},
DownServices: []string{"olat"},
}
active := map[string]bool{"http:kunde__webdocker11__wp": true, "tcp:kunde__webdocker11__ca": true}
got := reportRoutes("kunde", "webdocker11", st, func(proto, name string) bool { return active[proto+":"+name] })
want := []accountant.ReportRoute{
{Tenant: "kunde", Node: "webdocker11", Workload: "ca", Router: "ca", Protocol: "tcp",
Hosts: []string{"ca.kunde.de"}, Backend: "10.0.0.11:9000", BackendFQDN: "webdocker11.lan.r25dc.de:9000", Active: true},
{Tenant: "kunde", Node: "webdocker11", Workload: "kunde-a-wordpress-1", Router: "wp", Protocol: "http",
Hosts: []string{"kunde.de", "www.kunde.de"}, Backend: "http://10.0.0.11:8081",
BackendFQDN: "webdocker11.lan.r25dc.de:8081", Active: true, Product: "web-hosting",
ComposeProject: "kunde-a", ComposeService: "wordpress", ComposeDir: "/srv/kunde-a",
State: "running", StartedAt: started, Health: "healthy"},
{Tenant: "kunde", Node: "webdocker11", Workload: "olat", Router: "olat", Protocol: "http",
Hosts: []string{"olat.kunde.de"}, Backend: "http://10.0.0.11:8090",
BackendFQDN: "webdocker11.lan.r25dc.de:8090", Active: false, Down: true, State: "exited"},
}
if !reflect.DeepEqual(got, want) {
t.Errorf("reportRoutes =\n%+v\nerwartet\n%+v", got, want)
}
// Ohne Host-Infos (älterer Agent): kein FQDN-Ziel, Rest bleibt.
st.Host = nil
for _, r := range reportRoutes("kunde", "webdocker11", st, func(string, string) bool { return true }) {
if r.BackendFQDN != "" || r.Backend == "" {
t.Errorf("ohne Host-Infos: %+v", r)
}
}
}