Add complete TUI application for monitoring Kubernetes clusters and host systems. Features include: Core features: - Collector framework with concurrent scheduling - Host collectors: disk, memory, load, network - Kubernetes collectors: pods, nodes, workloads, events with informers - Issue deduplication, state management, and resolve-after logic - Bubble Tea TUI with table view, details pane, and filtering - JSON export functionality UX improvements: - Help overlay with keybindings - Priority/category filters with visual indicators - Direct priority jump (0/1/2/3) - Bulk acknowledge (Shift+A) - Clipboard copy (y) - Theme toggle (T) - Age format toggle (d) - Wide title toggle (t) - Vi-style navigation (j/k) - Home/End jump (g/G) - Rollup drill-down in details Robustness: - Grace period for unreachable clusters - Rollups for high-volume issues - Flap suppression - RBAC error handling Files: All core application code with tests for host collectors, engine, store, model, and export packages.
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package host
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"tower/internal/model"
|
|
)
|
|
|
|
func TestParseProcLoadavgFirst(t *testing.T) {
|
|
v, err := parseProcLoadavgFirst("1.23 0.70 0.50 1/123 4567\n")
|
|
if err != nil {
|
|
t.Fatalf("unexpected err: %v", err)
|
|
}
|
|
if v < 1.229 || v > 1.231 {
|
|
t.Fatalf("expected 1.23, got %v", v)
|
|
}
|
|
if _, err := parseProcLoadavgFirst("\n"); err == nil {
|
|
t.Fatalf("expected error")
|
|
}
|
|
}
|
|
|
|
func TestDesiredLoadPriority(t *testing.T) {
|
|
p, w := desiredLoadPriority(3.99)
|
|
if p != "" || w != 0 {
|
|
t.Fatalf("expected none")
|
|
}
|
|
p, w = desiredLoadPriority(4.0)
|
|
if p != model.PriorityP2 || w != 120*time.Second {
|
|
t.Fatalf("expected P2/120s")
|
|
}
|
|
p, w = desiredLoadPriority(6.0)
|
|
if p != model.PriorityP1 || w != 120*time.Second {
|
|
t.Fatalf("expected P1/120s")
|
|
}
|
|
}
|
|
|
|
func TestUpdateSustainedWorksForLoadToo(t *testing.T) {
|
|
now := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)
|
|
p, since := updateSustained(now, "", time.Time{}, model.PriorityP2)
|
|
if p != model.PriorityP2 || !since.Equal(now) {
|
|
t.Fatalf("expected set")
|
|
}
|
|
p2, since2 := updateSustained(now.Add(10*time.Second), p, since, model.PriorityP2)
|
|
if p2 != model.PriorityP2 || !since2.Equal(since) {
|
|
t.Fatalf("expected unchanged")
|
|
}
|
|
}
|