mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-15 17:11:30 +00:00
f14fb64562
* feat(eks): unify eks-server + eks-agent into one eks-node AMI Collapse the two K3s AMIs into a single spinifex-eks-node image whose role (server vs agent) is chosen per-instance at first boot, halving build time, storage, and CVE-rotation surface. - scripts/images/eks-node/: superset manifest + merged setup.sh; all role services baked but only crond + the new eks-node-role selector enabled. - eks-node-role first-boot selector reads SPINIFEX_K3S_ROLE, rc-update adds + starts the matching services (server: k3s + eks-token-webhook + k3s-first-boot publisher; agent: k3s-agent), records /etc/spinifex-eks/role, self-disables. Paths are env-overridable; eks-node-role_test.sh covers all five cases. - mulga-eks-etcd-snapshot.sh early-exits on agent nodes. - k3s_server_vm.go seeds SPINIFEX_K3S_ROLE=server into first-boot.env. - Makefile/dev-install: build-eks-node-image / import-eks-node-image replace the server+agent targets. - Delete scripts/images/eks-server + eks-agent. The launcher resolves the AMI by the spinifex:managed-by=eks tag, so running clusters (which hold the resolved AMI ID) are unaffected. AMI bake + cluster boot are operational integration steps, not yet run. * fix(eks): order eks-node-role after cloud-config/cloud-final The first-boot role selector reads /etc/spinifex-eks/first-boot.env, which cloud-init delivers via write_files in the cloud-config/cloud-final stages. The selector only depended on net+cgroups, so on a fast boot it could start before write_files landed and read a missing role env. Add an after-ordering on cloud-config + cloud-final so the env file is always present first.
104 lines
3.9 KiB
Bash
Executable File
104 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Self-contained POSIX test for eks-node-role.sh role selection. No bats/root
|
|
# needed: rc-update / rc-service are stubbed on PATH and record their calls; the
|
|
# script's file paths are redirected into a temp dir via its EKS_NODE_* env knobs.
|
|
#
|
|
# Run: sh scripts/images/eks-node/eks-node-role_test.sh
|
|
set -eu
|
|
|
|
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
|
SELECTOR="${SCRIPT_DIR}/eks-node-role.sh"
|
|
WORK=$(mktemp -d)
|
|
trap 'rm -rf "${WORK}"' EXIT
|
|
|
|
# Stub rc-update / rc-service: append "cmd args" to ${CALLS} when invoked.
|
|
STUBBIN="${WORK}/bin"
|
|
mkdir -p "${STUBBIN}"
|
|
for tool in rc-update rc-service; do
|
|
cat > "${STUBBIN}/${tool}" <<EOF
|
|
#!/bin/sh
|
|
echo "${tool} \$*" >> "\${CALLS}"
|
|
exit 0
|
|
EOF
|
|
chmod +x "${STUBBIN}/${tool}"
|
|
done
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
check() { # check <desc> <expected> <actual>
|
|
if [ "$2" = "$3" ]; then
|
|
PASS=$((PASS + 1))
|
|
else
|
|
FAIL=$((FAIL + 1))
|
|
echo "FAIL: $1"
|
|
echo " expected: [$2]"
|
|
echo " actual: [$3]"
|
|
fi
|
|
}
|
|
|
|
# run_case <name>: resets a per-case dir, exports the knobs; caller seeds env
|
|
# files then invokes the selector. Sets CASE (dir), CALLS (log), ROLE_FILE.
|
|
run_case() {
|
|
CASE="${WORK}/$1"
|
|
mkdir -p "${CASE}"
|
|
CALLS="${CASE}/calls"
|
|
: > "${CALLS}"
|
|
ROLE_FILE="${CASE}/role"
|
|
export CALLS
|
|
export EKS_NODE_ROLE_FILE="${ROLE_FILE}"
|
|
export EKS_NODE_ENVFILE="${CASE}/first-boot.env"
|
|
export EKS_NODE_AGENT_ENVFILE="${CASE}/agent.env"
|
|
}
|
|
|
|
# Run the selector, capturing its exit code in ${rc} without tripping set -e.
|
|
invoke() { rc=0; PATH="${STUBBIN}:${PATH}" sh "${SELECTOR}" >/dev/null 2>&1 || rc=$?; }
|
|
|
|
# --- Case 1: explicit server role ---
|
|
run_case server
|
|
printf 'SPINIFEX_K3S_ROLE=server\nEKS_CLUSTER_NAME=alpha\n' > "${EKS_NODE_ENVFILE}"
|
|
invoke
|
|
check "server: exit 0" 0 "${rc}"
|
|
check "server: role file" "server" "$(cat "${ROLE_FILE}")"
|
|
check "server: enables webhook" "yes" "$(grep -q 'rc-update add eks-token-webhook default' "${CALLS}" && echo yes || echo no)"
|
|
check "server: enables k3s" "yes" "$(grep -q 'rc-update add k3s default' "${CALLS}" && echo yes || echo no)"
|
|
check "server: enables k3s-first-boot" "yes" "$(grep -q 'rc-update add k3s-first-boot default' "${CALLS}" && echo yes || echo no)"
|
|
check "server: starts k3s" "yes" "$(grep -q 'rc-service k3s start' "${CALLS}" && echo yes || echo no)"
|
|
check "server: no k3s-agent" "no" "$(grep -q 'k3s-agent' "${CALLS}" && echo yes || echo no)"
|
|
check "server: self-disables" "yes" "$(grep -q 'rc-update del eks-node-role default' "${CALLS}" && echo yes || echo no)"
|
|
|
|
# --- Case 2: explicit agent role ---
|
|
run_case agent_explicit
|
|
printf 'SPINIFEX_K3S_ROLE=agent\n' > "${EKS_NODE_ENVFILE}"
|
|
invoke
|
|
check "agent: exit 0" 0 "${rc}"
|
|
check "agent: role file" "agent" "$(cat "${ROLE_FILE}")"
|
|
check "agent: enables k3s-agent" "yes" "$(grep -q 'rc-update add k3s-agent default' "${CALLS}" && echo yes || echo no)"
|
|
check "agent: no server services" "no" "$(grep -qE 'eks-token-webhook|k3s-first-boot|add k3s default' "${CALLS}" && echo yes || echo no)"
|
|
|
|
# --- Case 3: agent inferred from agent.env (no explicit role) ---
|
|
run_case agent_inferred
|
|
printf 'K3S_URL=https://nlb:443\nK3S_TOKEN=abc\n' > "${EKS_NODE_AGENT_ENVFILE}"
|
|
invoke
|
|
check "infer: exit 0" 0 "${rc}"
|
|
check "infer: role file" "agent" "$(cat "${ROLE_FILE}")"
|
|
check "infer: enables k3s-agent" "yes" "$(grep -q 'rc-update add k3s-agent default' "${CALLS}" && echo yes || echo no)"
|
|
|
|
# --- Case 4: missing role + no env files → fail, no role file, no services ---
|
|
run_case missing
|
|
invoke
|
|
check "missing: nonzero exit" "1" "${rc}"
|
|
check "missing: no role file" "absent" "$([ -f "${ROLE_FILE}" ] && echo present || echo absent)"
|
|
check "missing: no rc calls" "" "$(cat "${CALLS}")"
|
|
|
|
# --- Case 5: already resolved (role file present) → no-op, exit 0 ---
|
|
run_case resolved
|
|
printf 'SPINIFEX_K3S_ROLE=server\n' > "${EKS_NODE_ENVFILE}"
|
|
printf 'server\n' > "${ROLE_FILE}"
|
|
invoke
|
|
check "resolved: exit 0" 0 "${rc}"
|
|
check "resolved: no rc calls" "" "$(cat "${CALLS}")"
|
|
|
|
echo "---"
|
|
echo "PASS=${PASS} FAIL=${FAIL}"
|
|
[ "${FAIL}" -eq 0 ]
|