Newer
Older
openstack-caracal-ipv4 / tests / phase-00-maas-standup / run-tests.sh
#!/usr/bin/env bash
# Behavior regression for phase-00-maas-standup.sh (D-058). Fake `maas` + real jq.
# Drives DRY-RUN and asserts WOULD/SKIP/DRIFT/refuse behaviour across scenarios.
set -uo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT="$(cd "$HERE/../../scripts" && pwd)/phase-00-maas-standup.sh"
BIN="$HERE/fakebin"; FIX="$HERE/fix"
chmod +x "$BIN"/* 2>/dev/null || true   # GitHub Desktop lands files mode 100644
command -v jq >/dev/null || { echo "FAIL: jq required"; exit 1; }
python3 "$HERE/make_fixtures.py" >/dev/null
rc_all=0; OUT="$(mktemp)"

run() {  # <want_exit> <label> <scenario>
  local want="$1" label="$2" s="$3"
  PATH="$BIN:$PATH" \
    FIX_SUBNETS="$FIX/${s}_subnets.json" FIX_SPACES="$FIX/${s}_spaces.json" \
    FIX_VLANS="$FIX/${s}_vlans.json" FIX_IPRANGES="$FIX/${s}_ipranges.json" \
    FIX_FABRICS="$FIX/${s}_fabrics.json" \
    bash "$SCRIPT" >"$OUT" 2>&1
  local rc=$?
  if [ "$rc" -ne "$want" ]; then
    printf '  [XX] %-40s exit %s (want %s)\n' "$label" "$rc" "$want"; sed 's/^/        /' "$OUT"; rc_all=1; return 1
  fi
  printf '  [ok] %-40s exit %s\n' "$label" "$rc"; return 0
}
has()    { grep -qE "$1" "$OUT" || { printf '       MISS expected /%s/\n' "$1"; rc_all=1; }; }
absent() { grep -qE "$1" "$OUT" && { printf '       LEAK forbidden /%s/\n' "$1"; rc_all=1; } || true; }
count()  { local n; n=$(grep -cE "$1" "$OUT"); [ "$n" -eq "$2" ] || { printf '       COUNT /%s/ = %s (want %s)\n' "$1" "$n" "$2"; rc_all=1; }; }

echo "=== phase-00-maas-standup.sh -- D-058 MAAS topology stand-up (fake maas + real jq) ==="

run 0 "fresh MAAS: full create plan" fresh
has 'no drift'
has 'WOULD: create fabric provider-public'
has 'WOULD: create space provider-vip'
has 'WOULD: create VLAN vid=104 name=provider-vip mtu=1500'
has 'WOULD: create VLAN vid=103 name=metal-internal mtu=1500'   # fresh: parent mtu unknown -> 1500
has 'WOULD: create subnet 10\.12\.8\.0/22'
has 'WOULD: create subnet 10\.12\.12\.0/22'
has 'WOULD: create subnet 10\.12\.20\.0/22'
has 'WOULD: subnet 10\.12\.8\.0/22 -> gateway_ip=10\.12\.8\.1'
has 'WOULD: create reserved API-VIP band 10\.12\.16\.2-10\.12\.16\.100'
absent 'DRIFT'

run 0 "D-058 done: all SKIP, zero WOULD" done
count 'WOULD:' 0
has 'no drift'
has 'space provider-vip exists -- SKIP'
has 'VID 104 on fabric 1 exists -- SKIP'
has 'subnet 10\.12\.16\.0/22 exists -- SKIP'
has 'gateway_ip already 10\.12\.12\.1 -- SKIP'
has 'reserved range starting 10\.12\.8\.2 exists -- SKIP'
has 'OK \(dryrun\) -- topology consistent with D-058'

run 1 "D-052 current: 3 migrating planes drift + refuse" d052
count 'DRIFT:' 3
has "DRIFT: 10\.12\.8\.0/22 is space 'metal-admin' but D-058 assigns it to 'provider-vip'"
has "DRIFT: 10\.12\.12\.0/22 is space 'metal-internal' but D-058 assigns it to 'metal-admin'"
has "DRIFT: 10\.12\.16\.0/22 is space 'data-tenant' but D-058 assigns it to 'metal-internal'"
has '10\.12\.8\.0/22 occupied by the wrong plane'      # provider-vip refused
has 'subnet 10\.12\.4\.0/22 exists -- SKIP'            # provider-public unchanged
has 'subnet 10\.12\.32\.0/22 exists -- SKIP'           # storage unchanged
has 'need a gated re-CIDR/migration'
has 'plane storage \(10\.12\.32'        # reached PAST the absent untagged plane (the live-crash point)
has 'plane replication \(10\.12\.36'
absent 'parse error'                       # maas_json must swallow any stray MAAS error

run 1 "wrong VID on provider-vip subnet -> drift(vid)" wrongvid
has "DRIFT: 10\.12\.8\.0/22 space ok \('provider-vip'\) but VID '99' != target 104"

echo
[ "$rc_all" -eq 0 ] && echo "ALL PASS" || echo "SOME FAILED"
rm -f "$OUT"; exit "$rc_all"