post-check: failover check warns only on link without NM connection; retry, stub-nmcli tests

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KqhjP7nud5gdBg25zCiRk9
This commit is contained in:
2026-09-23 19:11:55 -04:00
co-authored by Claude Sonnet 5
parent 2601472576
commit 698f9ee446
3 changed files with 78 additions and 25 deletions
+46 -10
View File
@@ -451,20 +451,56 @@ for w in "running 2026-01-01T00:00:00+00:00 /bak" "rolled-back 2026-01-01T00:00:
pcs "$tc/st" | grep -qF -- "-> post-deploy: last --apply-network status: $w — see /var/log/vanlink-apply-network.log" && ok "19b: status ${w%% *} -> warn" || bad "19b: status ${w%% *} warn missing"
done
pcs "$tc/none" | grep -q 'last --apply-network' && bad "19b: absent status file must print nothing" || ok "19b: absent status file prints nothing"
# 19c. van-failover state.json (VANLINK_FAILOVER_STATE, VANLINK_SYSNET)
mkdir -p "$tc/sys/dev1" "$tc/sys/dev2"
fo() { POSTCHECK_WAIT=0 VANLINK_SYSNET="$tc/sys" VANLINK_FAILOVER_STATE="$1" VANLINK_APPLY_STATUS="$tc/none" ./deploy.sh --post-check hosts/van.conf 2>&1 || true; }
# 19c. van-failover state.json (VANLINK_FAILOVER_STATE, VANLINK_SYSNET); inline output only (before "== warnings ==")
mkdir -p "$tc/sys/up1" "$tc/sys/up2" "$tc/sys/down"
echo 1 > "$tc/sys/up1/carrier"; echo 1 > "$tc/sys/up2/carrier"; echo 0 > "$tc/sys/down/carrier"
fo() { POSTCHECK_WAIT=0 VANLINK_SYSNET="$tc/sys" VANLINK_FAILOVER_STATE="$1" VANLINK_APPLY_STATUS="$tc/none" ./deploy.sh --post-check hosts/van.conf 2>&1 | sed '/^== warnings ==$/,$d' || true; }
cat > "$tc/f.json" <<'J'
{"wans":[{"name":"starlink","device":"dev1","present":false},{"name":"cell","device":"dev2","present":true},
{"name":"wifi","device":"","present":false},{"name":"gone","device":"nodev","present":false}]}
{"updated":"2026-01-01T00:00:00+0000","wans":[{"name":"starlink","device":"up1","present":false},{"name":"cell","device":"up2","present":true},
{"name":"nolink","device":"down","present":false},{"name":"wifi","device":"","present":false},{"name":"gone","device":"nodev","present":false}]}
J
o=$(fo "$tc/f.json")
echo "$o" | grep -q -- '-> post-deploy: .*WAN starlink' && ok "19c: existing device present:false -> warn" || bad "19c: starlink warn missing"
echo "$o" | grep -q ' ok .*WAN cell' && ok "19c: present:true -> ok" || bad "19c: cell ok missing"
echo "$o" | grep -qE 'WAN (wifi|gone)' && bad "19c: empty/nonexistent device must be ignored" || ok "19c: empty/nonexistent device ignored"
echo "$o" | grep -q -- '-> post-deploy: starlink (up1) has link but no active NetworkManager connection' && ok "19c: link up + present:false -> warn" || bad "19c: starlink warn missing"
echo "$o" | grep -q ' ok .*WAN cell' && ok "19c: link up + present:true -> ok" || bad "19c: cell ok missing"
echo "$o" | grep -qE 'nolink|wifi|gone' && bad "19c: no carrier / empty / absent device must be ignored" || ok "19c: no carrier, empty and absent devices ignored"
echo '{ not json' > "$tc/bad.json"
o=$(fo "$tc/bad.json"); [ "$(echo "$o" | grep -- '-> post-deploy: .*failover state' | sort -u | wc -l)" = 1 ] && ok "19c: invalid JSON -> one warn" || bad "19c: invalid JSON warn count"
o=$(fo "$tc/nofile"); [ "$(echo "$o" | grep -- '-> post-deploy: .*failover state' | sort -u | wc -l)" = 1 ] && ok "19c: missing file -> one warn" || bad "19c: missing file warn count"
o=$(fo "$tc/bad.json"); [ "$(echo "$o" | grep -c -- 'failover state')" = 1 ] && ok "19c: invalid JSON -> one warn" || bad "19c: invalid JSON warn count"
o=$(fo "$tc/nofile"); [ "$(echo "$o" | grep -c -- 'failover state')" = 1 ] && ok "19c: missing file -> one warn" || bad "19c: missing file warn count"
echo '{"wans":[]}' > "$tc/noupd.json"
o=$(fo "$tc/noupd.json"); [ "$(echo "$o" | grep -c -- 'failover state')" = 1 ] && ok "19c: no updated stamp -> one warn" || bad "19c: no-updated warn count"
# 19d. status file: unrecognised / blank
echo "bogus 1 2" > "$tc/st"; pcs "$tc/st" | grep -qF -- '-> post-deploy: unrecognised apply-network status: bogus 1 2' && ok "19d: unrecognised status -> warn" || bad "19d: unrecognised status warn missing"
printf '\n \n' > "$tc/st"; pcs "$tc/st" | grep -qE 'last --apply-network|unrecognised' && bad "19d: blank status must be silent" || ok "19d: blank status silent"
# 19e. probes h (unmanaged), i (cellular profile), k (netplan) in both branches, with a stub nmcli first on PATH
mkdir -p "$tc/stub" "$tc/nm" "$tc/sys2/wlan1" "$tc/sys2/wlan2" "$tc/sys2/lan"
for i in $(sed -n 's/^WIFI_5G_IFACE=\([^ ]*\).*/\1/p;s/^WIFI_2G_IFACE=\([^ ]*\).*/\1/p;s/^LAN_IFACE=\([^ ]*\).*/\1/p' hosts/van.conf | tr -d '"'); do mkdir -p "$tc/sys2/$i"; done
cat > "$tc/stub/nmcli" <<'S'
#!/bin/sh
case "$*" in
*DEVICE,STATE*) cat "$STUB_DEV" ;;
*"NAME connection show"*) cat "$STUB_CONN" ;;
esac
S
chmod +x "$tc/stub/nmcli"
ifs=$(sed -n 's/^WIFI_5G_IFACE=\([^ ]*\).*/\1/p;s/^WIFI_2G_IFACE=\([^ ]*\).*/\1/p;s/^LAN_IFACE=\([^ ]*\).*/\1/p' hosts/van.conf | tr -d '"')
conn=$(sed -n 's/^CELLULAR_CONN_NAME=//p' hosts/van.conf | tr -d '"')
nm() { PATH="$tc/stub:/usr/bin:/bin" STUB_DEV="$tc/dev" STUB_CONN="$tc/conn" VANLINK_NM_DIR="$tc/nm" VANLINK_SYSNET="$tc/sys2" \
VANLINK_WAN_NETPLAN="$tc/np.yaml" VANLINK_APPLY_STATUS="$tc/none" POSTCHECK_WAIT=0 ./deploy.sh --post-check hosts/van.conf 2>&1 | sed '/^== warnings ==$/,$d' || true; }
: > "$tc/dev"; : > "$tc/conn"
for i in $ifs; do echo "$i:unmanaged" >> "$tc/dev"; done
echo "$conn" > "$tc/conn"; VANLINK_CONF=hosts/van.conf ./deploy.sh --render-wan-netplan > "$tc/np.yaml"
o=$(nm)
first=$(echo "$ifs" | head -1)
echo "$o" | grep -q " ok NetworkManager leaves $first unmanaged" && ok "19e: unmanaged -> ok" || bad "19e: unmanaged ok missing"
echo "$o" | grep -q " ok NetworkManager connection $conn exists" && ok "19e: cellular profile present -> ok" || bad "19e: cellular ok missing"
echo "$o" | grep -q ' ok WAN netplan matches' && ok "19e: netplan matches -> ok" || bad "19e: netplan ok missing"
echo "$first:connected" > "$tc/dev"; : > "$tc/conn"; echo '# differs' >> "$tc/np.yaml"
o=$(nm)
echo "$o" | grep -q -- "-> post-deploy: NetworkManager manages $first" && ok "19e: managed -> warn" || bad "19e: managed warn missing"
echo "$o" | grep -q -- "-> post-deploy: NetworkManager connection $conn not found" && ok "19e: cellular missing -> warn" || bad "19e: cellular warn missing"
echo "$o" | grep -q -- '-> post-deploy: WAN netplan differs' && ok "19e: netplan differs -> warn" || bad "19e: netplan warn missing"
printf 'id=%s\n' "$conn" > "$tc/nm/x.nmconnection"
nm | grep -q " ok NetworkManager connection $conn exists" && ok "19e: cellular keyfile scan -> ok" || bad "19e: keyfile scan ok missing"
rm -rf "$tc"
exit "$fail"