provisioning/taskservs/polkadot/zombienet/default/install-polkadot-zombienet.sh
2025-09-22 23:11:41 +01:00

321 lines
10 KiB
Bash
Executable File

#!/bin/bash
# Info: Script to install Polkadot Zombienet
# Author: Provisioning System
# Release: 1.0
# Date: 2025-07-24
USAGE="install-polkadot-zombienet.sh"
[ "$1" == "-h" ] && echo "$USAGE" && exit 1
[ -r "env-polkadot-zombienet" ] && . ./env-polkadot-zombienet
ZOMBIENET_VERSION=${ZOMBIENET_VERSION:-1.3.133}
ZOMBIENET_PROVIDER=${ZOMBIENET_PROVIDER:-native}
# Determine architecture and OS
ARCH="$(uname -m)"
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "$ARCH" in
x86_64) ZOMBIE_ARCH="x64" ;;
aarch64|arm64) ZOMBIE_ARCH="arm64" ;;
*) echo "Unsupported architecture: $ARCH" && exit 1 ;;
esac
case "$OS" in
linux) ZOMBIE_OS="linux" ;;
darwin) ZOMBIE_OS="macos" ;;
*) echo "Unsupported OS: $OS" && exit 1 ;;
esac
ZOMBIENET_URL="https://github.com/paritytech/zombienet/releases/download"
ZOMBIENET_BINARY="zombienet-${ZOMBIE_OS}-${ZOMBIE_ARCH}"
ZOMBIENET_BIN_PATH=${ZOMBIENET_BIN_PATH:-/usr/local/bin}
ZOMBIENET_BINARY_NAME=${ZOMBIENET_BINARY:-zombienet}
ZOMBIENET_SYSTEMCTL_MODE=${ZOMBIENET_SYSTEMCTL_MODE:-enabled}
ZOMBIENET_CONFIG_PATH=${ZOMBIENET_CONFIG_PATH:-/etc/zombienet}
ZOMBIENET_WORK_PATH=${ZOMBIENET_WORK_PATH:-/var/lib/zombienet}
ZOMBIENET_NETWORKS_PATH=${ZOMBIENET_NETWORKS_PATH:-/var/lib/zombienet/networks}
ZOMBIENET_BINARIES_PATH=${ZOMBIENET_BINARIES_PATH:-/var/lib/zombienet/binaries}
ZOMBIENET_LOGS_PATH=${ZOMBIENET_LOGS_PATH:-/var/lib/zombienet/logs}
ZOMBIENET_RUN_USER=${ZOMBIENET_RUN_USER:-zombienet}
ZOMBIENET_RUN_GROUP=${ZOMBIENET_RUN_GROUP:-zombienet}
ZOMBIENET_RUN_USER_HOME=${ZOMBIENET_RUN_USER_HOME:-/home/zombienet}
echo "Installing Polkadot Zombienet ${ZOMBIENET_VERSION}..."
# Install dependencies based on provider
echo "Installing dependencies for provider: $ZOMBIENET_PROVIDER..."
if command -v apt-get >/dev/null 2>&1; then
apt-get update
DEPS="curl ca-certificates jq"
case "$ZOMBIENET_PROVIDER" in
"kubernetes")
DEPS="$DEPS kubectl"
;;
"podman")
DEPS="$DEPS podman"
;;
"native")
# Native provider needs no additional system packages
;;
esac
apt-get install -y $DEPS
elif command -v yum >/dev/null 2>&1; then
yum update -y
DEPS="curl ca-certificates jq"
case "$ZOMBIENET_PROVIDER" in
"kubernetes")
DEPS="$DEPS kubectl"
;;
"podman")
DEPS="$DEPS podman"
;;
esac
yum install -y $DEPS
elif command -v dnf >/dev/null 2>&1; then
dnf update -y
DEPS="curl ca-certificates jq"
case "$ZOMBIENET_PROVIDER" in
"kubernetes")
DEPS="$DEPS kubectl"
;;
"podman")
DEPS="$DEPS podman"
;;
esac
dnf install -y $DEPS
else
echo "Package manager not found. Please install dependencies manually."
exit 1
fi
# Create user and group
if ! id "$ZOMBIENET_RUN_USER" &>/dev/null; then
groupadd -r "$ZOMBIENET_RUN_GROUP"
useradd -r -g "$ZOMBIENET_RUN_GROUP" -d "$ZOMBIENET_RUN_USER_HOME" -s /bin/bash -c "Zombienet service user" "$ZOMBIENET_RUN_USER"
fi
# Create directories
mkdir -p "$ZOMBIENET_CONFIG_PATH"
mkdir -p "$ZOMBIENET_WORK_PATH"
mkdir -p "$ZOMBIENET_NETWORKS_PATH"
mkdir -p "$ZOMBIENET_BINARIES_PATH"
mkdir -p "$ZOMBIENET_LOGS_PATH"
mkdir -p "$ZOMBIENET_RUN_USER_HOME"
# Download and install Zombienet binary
cd /tmp
echo "Downloading Zombienet from ${ZOMBIENET_URL}/v${ZOMBIENET_VERSION}/${ZOMBIENET_BINARY}..."
curl -L -o zombienet "${ZOMBIENET_URL}/v${ZOMBIENET_VERSION}/${ZOMBIENET_BINARY}"
if [ ! -f "zombienet" ]; then
echo "Failed to download Zombienet binary"
exit 1
fi
# Install binary
chmod +x zombienet
mv zombienet "$ZOMBIENET_BIN_PATH/$ZOMBIENET_BINARY_NAME"
# Download required binaries for native provider
if [ "$ZOMBIENET_PROVIDER" = "native" ]; then
echo "Setting up binaries for native provider..."
# Download Polkadot binary
POLKADOT_VERSION="latest"
POLKADOT_URL="https://github.com/paritytech/polkadot/releases/latest/download/polkadot"
echo "Downloading Polkadot binary..."
curl -L -o "$ZOMBIENET_BINARIES_PATH/polkadot" "$POLKADOT_URL"
chmod +x "$ZOMBIENET_BINARIES_PATH/polkadot"
# Download Polkadot-Parachain binary
PARACHAIN_URL="https://github.com/paritytech/polkadot-sdk/releases/latest/download/polkadot-parachain"
echo "Downloading Polkadot-Parachain binary..."
curl -L -o "$ZOMBIENET_BINARIES_PATH/polkadot-parachain" "$PARACHAIN_URL" || {
echo "Warning: Could not download polkadot-parachain binary"
echo "You may need to build it manually or provide your own parachain binary"
}
if [ -f "$ZOMBIENET_BINARIES_PATH/polkadot-parachain" ]; then
chmod +x "$ZOMBIENET_BINARIES_PATH/polkadot-parachain"
fi
# Create symbolic links in PATH
ln -sf "$ZOMBIENET_BINARIES_PATH/polkadot" "$ZOMBIENET_BIN_PATH/polkadot"
if [ -f "$ZOMBIENET_BINARIES_PATH/polkadot-parachain" ]; then
ln -sf "$ZOMBIENET_BINARIES_PATH/polkadot-parachain" "$ZOMBIENET_BIN_PATH/polkadot-parachain"
fi
fi
# Copy network templates
if [ -f "simple-network.toml" ]; then
cp simple-network.toml "$ZOMBIENET_NETWORKS_PATH/"
fi
if [ -f "parachain-network.toml" ]; then
cp parachain-network.toml "$ZOMBIENET_NETWORKS_PATH/"
fi
# Create default network configuration from template if available
if [ -f "network-config.toml.j2" ]; then
cp network-config.toml.j2 "$ZOMBIENET_CONFIG_PATH/"
fi
# Set ownership
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_WORK_PATH"
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_NETWORKS_PATH"
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_BINARIES_PATH"
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_LOGS_PATH"
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_RUN_USER_HOME"
chown -R "$ZOMBIENET_RUN_USER:$ZOMBIENET_RUN_GROUP" "$ZOMBIENET_CONFIG_PATH"
# Create zombienet management script
cat > "$ZOMBIENET_BIN_PATH/zombienet-manager" << EOF
#!/bin/bash
# Zombienet Network Manager
ZOMBIENET_BIN="$ZOMBIENET_BIN_PATH/$ZOMBIENET_BINARY_NAME"
NETWORKS_PATH="$ZOMBIENET_NETWORKS_PATH"
LOGS_PATH="$ZOMBIENET_LOGS_PATH"
PROVIDER="$ZOMBIENET_PROVIDER"
case "\$1" in
"spawn")
NETWORK_FILE="\${2:-\$NETWORKS_PATH/simple-network.toml}"
if [ ! -f "\$NETWORK_FILE" ]; then
echo "Network file not found: \$NETWORK_FILE"
exit 1
fi
echo "Spawning network with \$NETWORK_FILE using \$PROVIDER provider..."
sudo -u $ZOMBIENET_RUN_USER "\$ZOMBIENET_BIN" spawn --provider "\$PROVIDER" "\$NETWORK_FILE"
;;
"test")
TEST_FILE="\${2}"
if [ ! -f "\$TEST_FILE" ]; then
echo "Test file not found: \$TEST_FILE"
exit 1
fi
echo "Running test: \$TEST_FILE"
sudo -u $ZOMBIENET_RUN_USER "\$ZOMBIENET_BIN" test --provider "\$PROVIDER" "\$TEST_FILE"
;;
"setup")
echo "Setting up Zombienet binaries..."
sudo -u $ZOMBIENET_RUN_USER "\$ZOMBIENET_BIN" setup
;;
"list")
echo "Available network configurations:"
ls -la "\$NETWORKS_PATH"/*.toml 2>/dev/null || echo "No network configurations found"
;;
"logs")
echo "Recent Zombienet logs:"
find "\$LOGS_PATH" -name "*.log" -type f -exec tail -n 20 {} + 2>/dev/null || echo "No logs found"
;;
"clean")
echo "Cleaning up Zombienet processes and logs..."
pkill -f zombienet || echo "No zombienet processes found"
rm -rf "\$LOGS_PATH"/*
echo "Cleanup completed"
;;
"help"|*)
echo "Zombienet Network Manager"
echo "Usage: \$0 [command] [options]"
echo ""
echo "Commands:"
echo " spawn [network.toml] Spawn a network (default: simple-network.toml)"
echo " test [test.zndsl] Run a test file"
echo " setup Setup required binaries"
echo " list List available network configurations"
echo " logs Show recent logs"
echo " clean Clean up processes and logs"
echo " help Show this help message"
echo ""
echo "Provider: \$PROVIDER"
echo "Networks path: \$NETWORKS_PATH"
echo "Logs path: \$LOGS_PATH"
;;
esac
EOF
chmod +x "$ZOMBIENET_BIN_PATH/zombienet-manager"
# Create zombienet info file
cat > "$ZOMBIENET_CONFIG_PATH/zombienet-info.json" << EOF
{
"version": "$ZOMBIENET_VERSION",
"provider": "$ZOMBIENET_PROVIDER",
"binary_path": "$ZOMBIENET_BIN_PATH/$ZOMBIENET_BINARY_NAME",
"networks_path": "$ZOMBIENET_NETWORKS_PATH",
"binaries_path": "$ZOMBIENET_BINARIES_PATH",
"logs_path": "$ZOMBIENET_LOGS_PATH",
"user": "$ZOMBIENET_RUN_USER",
"manager_script": "$ZOMBIENET_BIN_PATH/zombienet-manager",
"templates": [
"simple-network.toml",
"parachain-network.toml"
]
}
EOF
echo "=========================================="
echo "Polkadot Zombienet installation completed!"
echo "=========================================="
echo "Version: $ZOMBIENET_VERSION"
echo "Provider: $ZOMBIENET_PROVIDER"
echo "Binary: $ZOMBIENET_BIN_PATH/$ZOMBIENET_BINARY_NAME"
echo "Manager: $ZOMBIENET_BIN_PATH/zombienet-manager"
echo ""
echo "Paths:"
echo "Networks: $ZOMBIENET_NETWORKS_PATH"
echo "Binaries: $ZOMBIENET_BINARIES_PATH"
echo "Logs: $ZOMBIENET_LOGS_PATH"
echo "Config: $ZOMBIENET_CONFIG_PATH"
echo ""
echo "Quick start:"
echo "# List available networks"
echo "$ZOMBIENET_BIN_PATH/zombienet-manager list"
echo ""
echo "# Spawn simple network"
echo "$ZOMBIENET_BIN_PATH/zombienet-manager spawn"
echo ""
echo "# Spawn network with parachains"
echo "$ZOMBIENET_BIN_PATH/zombienet-manager spawn $ZOMBIENET_NETWORKS_PATH/parachain-network.toml"
echo ""
echo "# View logs"
echo "$ZOMBIENET_BIN_PATH/zombienet-manager logs"
echo ""
echo "# Clean up"
echo "$ZOMBIENET_BIN_PATH/zombienet-manager clean"
if [ "$ZOMBIENET_PROVIDER" = "native" ]; then
echo ""
echo "Native provider binaries installed:"
ls -la "$ZOMBIENET_BINARIES_PATH"
fi
# Test Zombienet installation
echo ""
echo "Testing Zombienet installation..."
if "$ZOMBIENET_BIN_PATH/$ZOMBIENET_BINARY_NAME" --version >/dev/null 2>&1; then
echo "✅ Zombienet binary is working"
else
echo "⚠️ Zombienet binary test failed"
fi
# Cleanup
cd /
rm -rf /tmp/zombienet
echo ""
echo "Installation completed! Use 'zombienet-manager help' for usage instructions."