sultan token tenant update: Mandanten nachträglich ändern

Weitere Compose-Stacks eines Kunden sind der Regelfall; bisher ließen sich
Domains und Routenlimit nur per delete + neu anlegen (und damit ohne Knoten)
ändern. Die Änderung liegt bewusst nur auf dem Server: Ein Agent darf sich
keine Domains selbst freigeben.

- Domains und Features werden hinzugefügt/entfernt statt ersetzt; unbekannter
  Eintrag beim Entfernen ist ein Fehler, die letzte Domain bleibt
- Verlängerung in die Zukunft setzt expired auf active (der Ablauf-Job setzt
  das nie zurück); Quarantäne und Zahlungsverzug bleiben
- Wechsel auf kommerziell mit vergangenem valid_until verlangt --valid-until

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
brandClaude Opus 5.5 committed 2026-11-02 18:32:28 +01:00
1 parent dd93277750
commit c2d6dd694f
7 files changed
+413 -25

No files matched your search

+30
View File
@@ -453,6 +453,36 @@ func TestRefreshLoopAppliesTenantChanges(t *testing.T) {
})
}
// Der Regelfall beim Kunden: Der Dienst meldet eine Domain, die erst danach
// beim Mandanten eingetragen wird. Die Route erscheint ohne neue Meldung des
// Agents; entzieht man die Domain wieder, verschwindet sie.
func TestRefreshLoopAppliesDomainChanges(t *testing.T) {
s, _ := startServer(t, func(c *Config) { c.RefreshInterval = 20 * time.Millisecond })
createTenant(t, s, "kunde", "kunde.de")
agent := newAgent(t, s, issueToken(t, s, "kunde"))
agent.enroll(t, "n1")
agent.connect(t)
eventually(t, "Stream", func() bool { return s.hub.Connected("n1") })
agent.do(t, http.MethodPost, "/api/v1/state", wpState("neu.de"))
eventually(t, "Verstoß: keine Route", func() bool { return providerConfig(t, s) == "{}" })
setDomains := func(domains ...string) {
t.Helper()
tn, err := s.store.GetTenant(ctx, "kunde")
if err != nil {
t.Fatal(err)
}
tn.AllowedDomains = domains
if _, err := s.store.UpdateTenant(ctx, tn); err != nil {
t.Fatal(err)
}
}
setDomains("kunde.de", "neu.de")
eventually(t, "Route nach Freigabe", func() bool { return strings.Contains(providerConfig(t, s), "neu.de") })
setDomains("kunde.de")
eventually(t, "Route nach Entzug weg", func() bool { return providerConfig(t, s) == "{}" })
}
func TestDirectory(t *testing.T) {
s, _ := startServer(t)
createTenant(t, s, "kunde", "kunde.de")