2d24931597
gates / gates (push) Successful in 24s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
54 lines
2.2 KiB
Go
54 lines
2.2 KiB
Go
package notify
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// R-672 (hub v0.124.0): storage-fill alarms are "one operator event per POOL per 6 hours". The
|
|
// consequence asserted is the mail count.
|
|
//
|
|
// COMPANION RED-PROOF (REPORT): drop cooldownStorageSuffix from the key and the 6-hour window (hub
|
|
// v0.123.0: `customer:type`, 1 hour) → "a second pool filling in the same hour was silenced".
|
|
func TestR672_StorageFillIsPerPoolPerSixHours(t *testing.T) {
|
|
st := newDispStore(t)
|
|
d := NewDispatcher(st, "test-key", "from@felhom.eu", "op@felhom.eu", true, log.New(io.Discard, "", 0))
|
|
var mu sync.Mutex
|
|
sent := 0
|
|
d.sendEmailFn = func(string, string, string, map[string]string) error { mu.Lock(); sent++; mu.Unlock(); return nil }
|
|
count := func() int { mu.Lock(); defer mu.Unlock(); return sent }
|
|
pool := func(host, s string) string { return `{"host_id":"` + host + `","storage":"` + s + `","percent":91}` }
|
|
|
|
d.processOperator("c1", "storage_fill_critical", "critical", "pool A full", pool("h1", "local-lvm"), "hub")
|
|
d.processOperator("c1", "storage_fill_critical", "critical", "pool B full", pool("h1", "fast-lvm"), "hub")
|
|
if count() != 2 {
|
|
t.Fatalf("a second pool filling in the same hour was silenced (sent=%d)", count())
|
|
}
|
|
d.processOperator("c1", "storage_fill_critical", "critical", "pool A again", pool("h1", "local-lvm"), "hub")
|
|
if count() != 2 {
|
|
t.Fatalf("the same pool mailed twice at once (sent=%d)", count())
|
|
}
|
|
// Two hours later the SAME pool is still inside its 6-hour window (the old 1-hour window re-mailed it).
|
|
d.mu.Lock()
|
|
for k := range d.opCooldowns {
|
|
d.opCooldowns[k] = time.Now().Add(-2 * time.Hour)
|
|
}
|
|
d.mu.Unlock()
|
|
d.processOperator("c1", "storage_fill_critical", "critical", "pool A 2h later", pool("h1", "local-lvm"), "hub")
|
|
if count() != 2 {
|
|
t.Fatalf("the same pool was mailed again after 2 hours — want one per 6 hours (sent=%d)", count())
|
|
}
|
|
d.mu.Lock()
|
|
for k := range d.opCooldowns {
|
|
d.opCooldowns[k] = time.Now().Add(-7 * time.Hour)
|
|
}
|
|
d.mu.Unlock()
|
|
d.processOperator("c1", "storage_fill_critical", "critical", "pool A 7h later", pool("h1", "local-lvm"), "hub")
|
|
if count() != 3 {
|
|
t.Fatalf("after 6 hours the pool must alarm again (sent=%d)", count())
|
|
}
|
|
}
|