scripts/test-runtime-network.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)"
test_dir="$(mktemp -d "${TMPDIR:-/tmp}/vastora-runtime-network-test.XXXXXX")"
cleanup() { rm -rf "$test_dir"; }
trap cleanup EXIT HUP INT TERM
state_dir="$test_dir/state"
mkdir -p "$state_dir/networks" "$state_dir/aliases"
center_id="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
managed_id="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
unowned_id="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
install_dir="/opt/vastora/center"
network_file() { printf '%s/networks/%s.%s' "$state_dir" "$1" "$2"; }
create_test_network() {
name="$1"
identity="$2"
printf '%s\n' bridge >"$(network_file "$name" driver)"
{
printf '%s\n' 'io.vastora.managed=true' 'io.vastora.component=runtime-network'
if [ -n "$identity" ]; then printf '%s\n' "io.vastora.network=$identity"; fi
} >"$(network_file "$name" labels)"
: >"$(network_file "$name" members)"
}
add_member() {
name="$1"
container_id="$2"
shift 2
printf '%s\n' "$container_id" >>"$(network_file "$name" members)"
: >"$state_dir/aliases/$name.$container_id"
for alias in "$@"; do printf '%s\n' "$alias" >>"$state_dir/aliases/$name.$container_id"; done
}
remove_member() {
name="$1"
container_id="$2"
members="$(network_file "$name" members)"
temporary="$members.next"
awk -v id="$container_id" '$0 != id' "$members" >"$temporary"
mv "$temporary" "$members"
rm -f "$state_dir/aliases/$name.$container_id"
}
label_value() {
name="$1"
key="$2"
awk -F= -v key="$key" '$1 == key {sub(/^[^=]*=/, ""); print; exit}' "$(network_file "$name" labels)"
}
docker() {
object="${1:-}"
action="${2:-}"
shift 2 || true
case "$object:$action" in
network:inspect)
[ "${1:-}" = "--format" ] || return 2
format="$2"
name="$3"
[ -f "$(network_file "$name" driver)" ] || return 1
case "$format" in
'{{.Driver}}') cat "$(network_file "$name" driver)" ;;
*io.vastora.managed*) label_value "$name" io.vastora.managed ;;
*io.vastora.component*) label_value "$name" io.vastora.component ;;
*io.vastora.network*) label_value "$name" io.vastora.network ;;
*'.Containers'*) cat "$(network_file "$name" members)" ;;
*) return 2 ;;
esac
;;
network:create)
labels_file="$test_dir/create-labels"
: >"$labels_file"
name=""
while [ "$#" -gt 0 ]; do
case "$1" in
--driver) driver="$2"; shift 2 ;;
--label) printf '%s\n' "$2" >>"$labels_file"; shift 2 ;;
*) name="$1"; shift ;;
esac
done
[ -n "$name" ] || return 2
[ ! -f "$(network_file "$name" driver)" ] || return 1
printf '%s\n' "${driver:-bridge}" >"$(network_file "$name" driver)"
cp "$labels_file" "$(network_file "$name" labels)"
: >"$(network_file "$name" members)"
;;
network:connect)
aliases_file="$test_dir/connect-aliases"
: >"$aliases_file"
while [ "$#" -gt 2 ]; do
[ "$1" = "--alias" ] || return 2
printf '%s\n' "$2" >>"$aliases_file"
shift 2
done
name="$1"
container_id="$2"
if [ -f "$state_dir/fail-next-current-connect" ] &&
[ "$name" = "vastora-runtime" ] &&
[ "$(label_value "$name" io.vastora.network)" = "vastora-runtime" ]; then
rm -f "$state_dir/fail-next-current-connect"
return 1
fi
grep -Fqx "$container_id" "$(network_file "$name" members)" 2>/dev/null && return 1
printf '%s\n' "$container_id" >>"$(network_file "$name" members)"
cp "$aliases_file" "$state_dir/aliases/$name.$container_id"
;;
network:disconnect)
if [ "${1:-}" = "-f" ]; then shift; fi
name="$1"
container_id="$2"
grep -Fqx "$container_id" "$(network_file "$name" members)" || return 1
remove_member "$name" "$container_id"
;;
network:rm)
name="$1"
[ ! -s "$(network_file "$name" members)" ] || return 1
rm -f "$(network_file "$name" driver)" "$(network_file "$name" labels)" "$(network_file "$name" members)"
;;
container:inspect)
[ "${1:-}" = "--format" ] || return 2
format="$2"
container_id="$3"
case "$format" in
*io.vastora.managed*)
if [ "$container_id" = "$managed_id" ] || { [ -f "$state_dir/center-current" ] && [ "$container_id" = "$center_id" ]; }; then printf '%s\n' true; fi
;;
*io.vastora.component*)
if [ "$container_id" = "$managed_id" ]; then printf '%s\n' center-headscale
elif [ -f "$state_dir/center-current" ] && [ "$container_id" = "$center_id" ]; then printf '%s\n' center; fi
;;
*com.docker.compose.project.working_dir*) [ "$container_id" = "$center_id" ] && printf '%s\n' "$install_dir" ;;
*com.docker.compose.project.config_files*) [ "$container_id" = "$center_id" ] && printf '%s\n' "$install_dir/compose.yaml" ;;
*com.docker.compose.project*) [ "$container_id" = "$center_id" ] && printf '%s\n' vastora ;;
*com.docker.compose.service*) [ "$container_id" = "$center_id" ] && printf '%s\n' center ;;
*'.IPAMConfig'*) printf '%s\n' null ;;
*'.Links'*) printf '%s\n' null ;;
*'.DriverOpts'*) printf '%s\n' null ;;
*'.Aliases'*) cat "$state_dir/aliases/vastora-runtime.$container_id" ;;
*) return 2 ;;
esac
;;
*) return 2 ;;
esac
}
# shellcheck source=../deploy/center/runtime-network.sh
. "$project_dir/deploy/center/runtime-network.sh"
create_test_network vastora-runtime ""
add_member vastora-runtime "$center_id" vastora-center-1 center vastora-center
add_member vastora-runtime "$managed_id" vastora-center-headscale
migrate_legacy_vastora_runtime_network "$install_dir" >/dev/null
[ "$(label_value vastora-runtime io.vastora.network)" = vastora-runtime ]
grep -Fqx "$center_id" "$(network_file vastora-runtime members)"
grep -Fqx "$managed_id" "$(network_file vastora-runtime members)"
grep -Fqx vastora-center "$state_dir/aliases/vastora-runtime.$center_id"
test -z "$(find "$state_dir/networks" -name 'vastora-runtime-migration-*' -print -quit)"
ensure_vastora_runtime_network_for_upgrade "$install_dir"
if validate_vastora_runtime_network >/dev/null 2>&1; then
echo "Strict network validation accepted a legacy unlabeled Center container." >&2
exit 1
fi
touch "$state_dir/center-current"
validate_vastora_runtime_network
rm -f "$state_dir/center-current"
rm -rf "$state_dir/networks" "$state_dir/aliases"
mkdir -p "$state_dir/networks" "$state_dir/aliases"
create_test_network vastora-runtime ""
add_member vastora-runtime "$unowned_id" unrelated
if migrate_legacy_vastora_runtime_network "$install_dir" >/dev/null 2>&1; then
echo "Legacy migration accepted an unowned attached container." >&2
exit 1
fi
[ -z "$(label_value vastora-runtime io.vastora.network)" ]
grep -Fqx "$unowned_id" "$(network_file vastora-runtime members)"
rm -rf "$state_dir/networks" "$state_dir/aliases"
mkdir -p "$state_dir/networks" "$state_dir/aliases"
create_test_network vastora-runtime ""
add_member vastora-runtime "$center_id" vastora-center-1 center vastora-center
add_member vastora-runtime "$managed_id" vastora-center-headscale
touch "$state_dir/fail-next-current-connect"
if migrate_legacy_vastora_runtime_network "$install_dir" >/dev/null 2>&1; then
echo "Legacy migration did not report a failed final reconnect." >&2
exit 1
fi
[ -z "$(label_value vastora-runtime io.vastora.network)" ]
grep -Fqx "$center_id" "$(network_file vastora-runtime members)"
grep -Fqx "$managed_id" "$(network_file vastora-runtime members)"
test -z "$(find "$state_dir/networks" -name 'vastora-runtime-migration-*' -print -quit)"
echo "Runtime network migration test passed"