A taken tunnel's found configuration is retired once the take is proven (hq ADR 0119)
Kept on disk it was the take's fallback; once the mesh's interface is up in its place and a peer has handshaken with it, it is an unmaintained way back onto the network, held for ever. It is now removed from where its unit reads it, its kept original verified first and left as it is, and the hold ends. Until proven — no handshake, or wg not answering — it is kept and the report says why. The retirement is recorded apart from holds, so later applies, an undeclare, and a reassignment find it retired rather than missing, and nothing writes it back.
This commit is contained in:
@@ -194,3 +194,49 @@ func TestAFoundTunnelReadsItsMTU(t *testing.T) {
|
||||
t.Fatalf("a config with no MTU must leave it zero; got %d", f2.MTU)
|
||||
}
|
||||
}
|
||||
|
||||
// novox/hq ADR 0119: a take is proven by a handshake on the mesh's interface, read from `wg show
|
||||
// <interface> latest-handshakes` — as wg prints it, a key and a Unix time per peer, zero for never.
|
||||
func TestAHandshakeIsAPeerWithATime(t *testing.T) {
|
||||
cases := map[string]struct {
|
||||
out string
|
||||
want int
|
||||
}{
|
||||
"two peers, one handshaken": {"PEER-A=\t1790000000\nPEER-B=\t0\n", 1},
|
||||
"every peer handshaken": {"PEER-A=\t1790000000\nPEER-B=\t1790000042\n", 2},
|
||||
"no peer ever": {"PEER-A=\t0\nPEER-B=\t0\n", 0},
|
||||
"an interface with no peer": {"", 0},
|
||||
"spaces, a trailing line": {"PEER-A= 1790000000\n\n", 1},
|
||||
}
|
||||
for name, c := range cases {
|
||||
got, err := ParseHandshakes(c.out)
|
||||
if err != nil || got != c.want {
|
||||
t.Errorf("%s: %d peer(s) handshaken (%v), want %d", name, got, err, c.want)
|
||||
}
|
||||
}
|
||||
// Output that is not a key and a time is not evidence of anything, and not a zero either.
|
||||
for _, nonsense := range []string{"PEER-A=\n", "PEER-A=\tyesterday\n", "PEER-A=\t-1\n", "a b c\n"} {
|
||||
if _, err := ParseHandshakes(nonsense); err == nil {
|
||||
t.Errorf("%q was read as handshakes", nonsense)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandshakesThatCannotBeAskedAreAnErrorNotAZero(t *testing.T) {
|
||||
var asked string
|
||||
ok := func(_ context.Context, name string, args ...string) (string, error) {
|
||||
asked = name + " " + strings.Join(args, " ")
|
||||
return "PEER-A=\t1790000000\n", nil
|
||||
}
|
||||
if n, err := Handshaken(context.Background(), ok, "mesh0"); err != nil || n != 1 ||
|
||||
asked != "wg show mesh0 latest-handshakes" {
|
||||
t.Fatalf("asked %q and read %d (%v)", asked, n, err)
|
||||
}
|
||||
missing := func(context.Context, string, ...string) (string, error) {
|
||||
return "", errors.New(`exec: "wg": executable file not found in $PATH`)
|
||||
}
|
||||
if _, err := Handshaken(context.Background(), missing, "mesh0"); err == nil ||
|
||||
!strings.Contains(err.Error(), "mesh0") {
|
||||
t.Fatalf("a machine with no wg was read as one with no handshake: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user