scripts/test-center-uninstall.sh
Rama main · réplica de lectura del repositorio original.
#!/bin/sh
set -eu
script_dir="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)"
project_dir="$(CDPATH='' cd -- "$script_dir/.." && pwd)"
temporary_dir="$(mktemp -d "${TMPDIR:-/tmp}/vastora-center-uninstall-test.XXXXXX")"
temporary_dir="$(CDPATH='' cd -- "$temporary_dir" && pwd -P)"
cleanup() { rm -rf "$temporary_dir"; }
trap cleanup EXIT HUP INT TERM
fake_bin="$temporary_dir/fake-bin"
systemd_dir="$temporary_dir/systemd"
docker_log="$temporary_dir/docker.log"
systemctl_log="$temporary_dir/systemctl.log"
install -d "$fake_bin" "$systemd_dir"
digest="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
"$project_dir/scripts/package-center-install.sh" \
--version 0.1.0-test \
--image "ghcr.io/petauron/vastora-center@sha256:$digest" \
--output-dir "$temporary_dir/release" >/dev/null
archive="$temporary_dir/release/vastora-center-install.tar.gz"
checksum="$archive.sha256"
if "$project_dir/install.sh" center uninstall --purge >"$temporary_dir/unsupported.out" 2>&1; then
echo "Legacy uninstall flags were accepted instead of using the TUI" >&2
exit 1
fi
grep -Fq 'the terminal menu provides every option' "$temporary_dir/unsupported.out"
cat > "$fake_bin/id" <<'EOF'
#!/bin/sh
if [ "${1:-}" = "-u" ]; then echo 0; else exec /usr/bin/id "$@"; fi
EOF
cat > "$fake_bin/systemctl" <<'EOF'
#!/bin/sh
printf '%s\n' "$*" >> "$FAKE_SYSTEMCTL_LOG"
exit 0
EOF
cat > "$fake_bin/uname" <<'EOF'
#!/bin/sh
case "${1:-}" in
-s) echo Linux ;;
-m) echo x86_64 ;;
*) echo Linux ;;
esac
EOF
cat > "$fake_bin/curl" <<'EOF'
#!/bin/sh
output=""
url=""
while [ "$#" -gt 0 ]; do
case "$1" in
-o) output="$2"; shift 2 ;;
https://*) url="$1"; shift ;;
*) shift ;;
esac
done
case "$url" in
*.sha256) cp "$FAKE_RELEASE_CHECKSUM" "$output" ;;
*) cp "$FAKE_RELEASE_ARCHIVE" "$output" ;;
esac
EOF
cat > "$fake_bin/docker" <<'EOF'
#!/bin/sh
printf '%s\n' "$*" >> "$FAKE_DOCKER_LOG"
case "${1:-}" in
info) exit 0 ;;
compose)
case "$*" in
*'center capabilities')
if [ "${FAKE_DOCKER_CAPABILITIES:-current}" = old ]; then exit 1; fi
printf '%s\n' 'decommission-applications' 'agent-host-decommission'
exit 0
;;
*'center offline-agent-cleanups'*)
if [ -n "${FAKE_OFFLINE_AGENT_REPORT:-}" ]; then
printf '%s\n' "$FAKE_OFFLINE_AGENT_REPORT"
fi
exit 0
;;
*'center decommission-applications'*)
if [ "${FAKE_DOCKER_MODE:-}" = cleanup-fail ]; then exit 1; fi
exit 0
;;
esac
exit 0
;;
volume)
case "${2:-}" in
inspect)
case "$*" in
*vastora_deployer-socket*) exit 1 ;;
esac
exit 1
;;
rm) exit 0 ;;
esac
;;
container) exit 1 ;;
ps|inspect) exit 0 ;;
rm) exit 0 ;;
esac
exit 0
EOF
chmod 0755 "$fake_bin/id" "$fake_bin/systemctl" "$fake_bin/uname" "$fake_bin/curl" "$fake_bin/docker"
create_install() {
target="$1"
install -d "$target"
printf '%s\n' 'VASTORA_CENTER_IMAGE=test' > "$target/.env"
install -m 0644 "$project_dir/deploy/center/compose.yaml" "$target/compose.yaml"
cat > "$systemd_dir/vastora-center-update.service" <<EOF
[Unit]
Description=Vastora Center verified update
[Service]
ExecStart=$target/update-center.sh --install-dir $target
EOF
cat > "$systemd_dir/vastora-center-update.path" <<EOF
[Unit]
Description=Watch for a Vastora Center update request
[Path]
PathExists=$target/.update-request
EOF
}
default_install="$temporary_dir/default-center"
create_install "$default_install"
: > "$temporary_dir/default.input"
printf '1\ny\n' > "$temporary_dir/default.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/default.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/default.output" \
FAKE_RELEASE_ARCHIVE="$archive" \
FAKE_RELEASE_CHECKSUM="$checksum" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/install.sh" center uninstall \
--release-url https://releases.example.test/vastora-center-install.tar.gz \
--install-dir "$default_install" >/dev/null
test ! -e "$default_install"
test ! -e "$systemd_dir/vastora-center-update.service"
test ! -e "$systemd_dir/vastora-center-update.path"
grep -Fqx 'compose down' "$docker_log"
if grep -Fq 'volume rm vastora_center-data' "$docker_log"; then
echo "Default uninstall deleted the Center database" >&2
exit 1
fi
grep -Fqx 'stop vastora-center-update.path' "$systemctl_log"
grep -Fqx 'disable vastora-center-update.path' "$systemctl_log"
cancelled_install="$temporary_dir/cancelled-center"
create_install "$cancelled_install"
printf '4\n' > "$temporary_dir/cancelled.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/cancelled.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/cancelled.output" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
LC_ALL=C \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$cancelled_install" >/dev/null
test -d "$cancelled_install"
test -e "$systemd_dir/vastora-center-update.service"
test ! -s "$systemctl_log"
grep -Fq 'Vastora Center Uninstall' "$temporary_dir/cancelled.output"
grep -Fq 'Cancelled; nothing was changed.' "$temporary_dir/cancelled.output"
if grep -Fq 'compose down' "$docker_log"; then
echo "Cancelled uninstall mutated the Center runtime" >&2
exit 1
fi
rm -rf "$cancelled_install"
rm -f "$systemd_dir/vastora-center-update.service" "$systemd_dir/vastora-center-update.path"
chinese_install="$temporary_dir/chinese-center"
create_install "$chinese_install"
printf '4\n' > "$temporary_dir/chinese.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/chinese.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/chinese.output" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
LC_ALL=zh_CN.UTF-8 \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$chinese_install" >/dev/null
test -d "$chinese_install"
test ! -s "$systemctl_log"
grep -Fq 'Vastora Center 卸载' "$temporary_dir/chinese.output"
grep -Fq '已取消,没有修改任何内容。' "$temporary_dir/chinese.output"
if grep -Fq 'compose down' "$docker_log"; then
echo "Chinese cancellation mutated the Center runtime" >&2
exit 1
fi
rm -rf "$chinese_install"
rm -f "$systemd_dir/vastora-center-update.service" "$systemd_dir/vastora-center-update.path"
failed_cleanup_install="$temporary_dir/failed-cleanup-center"
create_install "$failed_cleanup_install"
printf '2\ny\n' > "$temporary_dir/failed-cleanup.input"
: > "$docker_log"
: > "$systemctl_log"
if VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/failed-cleanup.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/failed-cleanup.output" \
FAKE_DOCKER_MODE=cleanup-fail \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$failed_cleanup_install" >/dev/null 2>&1; then
echo "Center uninstall continued after application cleanup failed" >&2
exit 1
fi
test -d "$failed_cleanup_install"
test -e "$systemd_dir/vastora-center-update.path"
grep -Fqx 'start vastora-center-update.path' "$systemctl_log"
if grep -Fq 'compose down' "$docker_log"; then
echo "Failed application cleanup stopped Center" >&2
exit 1
fi
rm -rf "$failed_cleanup_install"
rm -f "$systemd_dir/vastora-center-update.service" "$systemd_dir/vastora-center-update.path"
keep_data_install="$temporary_dir/keep-data-center"
create_install "$keep_data_install"
printf '2\ny\n' > "$temporary_dir/keep-data.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/keep-data.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/keep-data.output" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$keep_data_install" >/dev/null
test ! -e "$keep_data_install"
grep -Fqx 'compose exec -T center /usr/local/bin/vastora center decommission-applications --data-dir /var/lib/vastora' "$docker_log"
if grep -Fq -- '--delete-data' "$docker_log"; then
echo "Keep-data selection requested application data deletion" >&2
exit 1
fi
delete_data_install="$temporary_dir/delete-data-center"
create_install "$delete_data_install"
printf '3\nDELETE\n' > "$temporary_dir/delete-data.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/delete-data.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/delete-data.output" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$delete_data_install" >/dev/null
test ! -e "$delete_data_install"
grep -Fqx 'compose exec -T center /usr/local/bin/vastora center decommission-applications --data-dir /var/lib/vastora --delete-data' "$docker_log"
offline_install="$temporary_dir/offline-center"
create_install "$offline_install"
printf '2\ny\nFORCE\n' > "$temporary_dir/offline.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/offline.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/offline.output" \
FAKE_OFFLINE_AGENT_REPORT='Wuhan node (node-offline)\n sudo vastora agent uninstall --purge' \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$offline_install" >/dev/null
test ! -e "$offline_install"
grep -Fq 'sudo vastora agent uninstall --purge' "$temporary_dir/offline.output"
grep -Fqx 'compose exec -T center /usr/local/bin/vastora center decommission-applications --data-dir /var/lib/vastora --force-offline' "$docker_log"
legacy_bundle="$temporary_dir/legacy-bundle"
install -d "$legacy_bundle"
install -m 0755 "$project_dir/deploy/center/uninstall.sh" "$legacy_bundle/uninstall.sh"
cat > "$legacy_bundle/upgrade.sh" <<'EOF'
#!/bin/sh
printf '%s\n' "$*" >> "$FAKE_UPGRADE_LOG"
EOF
chmod 0755 "$legacy_bundle/upgrade.sh"
legacy_install="$temporary_dir/legacy-center"
create_install "$legacy_install"
printf '2\ny\n' > "$temporary_dir/legacy.input"
: > "$docker_log"
: > "$systemctl_log"
: > "$temporary_dir/upgrade.log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/legacy.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/legacy.output" \
FAKE_DOCKER_CAPABILITIES=old \
FAKE_UPGRADE_LOG="$temporary_dir/upgrade.log" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$legacy_bundle/uninstall.sh" --install-dir "$legacy_install" >/dev/null
test ! -e "$legacy_install"
grep -Fqx -- "--install-dir $legacy_install" "$temporary_dir/upgrade.log"
grep -Fqx 'compose exec -T center /usr/local/bin/vastora center decommission-applications --data-dir /var/lib/vastora' "$docker_log"
cli_install="$temporary_dir/cli-center"
create_install "$cli_install"
install -m 0644 /dev/null "$cli_install/.host-cli-installed"
install -d "$temporary_dir/host-bin"
cat > "$temporary_dir/host-bin/vastora" <<'EOF'
#!/bin/sh
if [ "${1:-}" = help ]; then printf '%s\n' 'Vastora control-plane tools'; fi
EOF
chmod 0755 "$temporary_dir/host-bin/vastora"
printf '1\ny\n' > "$temporary_dir/cli.input"
: > "$docker_log"
: > "$systemctl_log"
VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
VASTORA_HOST_CLI_PATH="$temporary_dir/host-bin/vastora" \
VASTORA_UNINSTALL_INPUT="$temporary_dir/cli.input" \
VASTORA_UNINSTALL_OUTPUT="$temporary_dir/cli.output" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$cli_install" >/dev/null
test ! -e "$temporary_dir/host-bin/vastora"
unsafe_install="$temporary_dir/unsafe-center"
install -d "$unsafe_install"
printf '%s\n' 'unrelated=true' > "$unsafe_install/.env"
printf '%s\n' 'name: unrelated' > "$unsafe_install/compose.yaml"
if VASTORA_SYSTEMD_UNIT_DIR="$systemd_dir" \
FAKE_DOCKER_LOG="$docker_log" \
FAKE_SYSTEMCTL_LOG="$systemctl_log" \
PATH="$fake_bin:$PATH" \
"$project_dir/deploy/center/uninstall.sh" --install-dir "$unsafe_install" >/dev/null 2>&1; then
echo "Uninstaller accepted an unrelated directory" >&2
exit 1
fi
test -d "$unsafe_install"
echo "Center uninstall test passed"