homelab: v0.5.0 — net/dns/metrics/logs probes (endpoint resolution)
The remaining verbs that pass the "saves reasoning, not just typing" test the user posed mid-session: each encodes the non-obvious which-endpoint-reached-how resolution otherwise re-derived every time. (Same test deprioritized node-ssh and secret-get aliasing — thin wrappers over commands already known.) - net check <host> [path]: two-legged reachability — external (public DNS→CF) vs internal (Traefik LB) — so you see WHERE a break is, not just that one path works. (live: surfaced the LB at 6ms vs CF 77ms.) - dns lookup <name> [type]: Technitium (10.0.20.201) vs public (1.1.1.1) diff. - metrics query "<promql>" / metrics alerts: Prometheus via the LB (prometheus-query.viktorbarzin.lan); alerts uses the synthetic ALERTS series since the query frontend has no /api/v1/alerts and Alertmanager has no ingress. - logs query "<logql>" [--since 1h] [--limit N]: Loki range query via the LB. All reach auth-free internal ingresses through the LB (Go form of curl --resolve host:443:10.0.20.203) — no port-forward, no kubectl. In-cluster- only endpoints (Alertmanager v2) deliberately out of scope. Verified live before building; all five smoke-tested green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
9189560ac3
commit
e91e1612dd
9 changed files with 466 additions and 3 deletions
49
cli/probe_test.go
Normal file
49
cli/probe_test.go
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestQueryArg(t *testing.T) {
|
||||
if got := queryArg([]string{"up"}, nil); got != "up" {
|
||||
t.Errorf(`queryArg(["up"]) = %q, want "up"`, got)
|
||||
}
|
||||
if got := queryArg([]string{"up", "--json"}, nil); got != "up" {
|
||||
t.Errorf(`--json should be dropped, got %q`, got)
|
||||
}
|
||||
// single quoted PromQL arrives as one token
|
||||
if got := queryArg([]string{"count by (node) (up)", "--json"}, nil); got != "count by (node) (up)" {
|
||||
t.Errorf(`quoted query mangled: %q`, got)
|
||||
}
|
||||
// value-flags and their values are skipped, query survives
|
||||
vf := map[string]bool{"--since": true, "--limit": true}
|
||||
if got := queryArg([]string{`{app="x"}`, "--since", "1h", "--limit", "50"}, vf); got != `{app="x"}` {
|
||||
t.Errorf(`value-flag skipping failed: %q`, got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLabelStr(t *testing.T) {
|
||||
got := labelStr(map[string]string{"__name__": "up", "job": "x", "instance": "y"})
|
||||
if got != "up{instance=y,job=x}" { // __name__ extracted, rest sorted
|
||||
t.Errorf("labelStr = %q", got)
|
||||
}
|
||||
if got := labelStr(map[string]string{"alertname": "Foo"}); got != "{alertname=Foo}" {
|
||||
t.Errorf("labelStr (no __name__) = %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestOneLineList(t *testing.T) {
|
||||
if got := oneLineList(" "); got != "(none)" {
|
||||
t.Errorf("empty = %q, want (none)", got)
|
||||
}
|
||||
if got := oneLineList("a\nb"); got != "a, b" {
|
||||
t.Errorf("multi = %q, want 'a, b'", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHostOnly(t *testing.T) {
|
||||
if got := hostOnly("foo.me/path"); got != "foo.me" {
|
||||
t.Errorf("hostOnly = %q", got)
|
||||
}
|
||||
if got := hostOnly("foo.me"); got != "foo.me" {
|
||||
t.Errorf("hostOnly = %q", got)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue