168 lines
5.1 KiB
Bash
168 lines
5.1 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# test-proxmox-interconnectivity.sh
|
||
|
|
# Tests connectivity between Proxmox instances
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
RED='\033[0;31m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
# Load environment variables
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
if [ -f "${SCRIPT_DIR}/../.env" ]; then
|
||
|
|
set -a
|
||
|
|
source <(grep -v '^#' "${SCRIPT_DIR}/../.env" | grep -v '^$' | sed 's/^/export /')
|
||
|
|
set +a
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Instance configurations
|
||
|
|
declare -A INSTANCES=(
|
||
|
|
["ml110-01"]="192.168.11.10:https://ml110-01.sankofa.nexus:8006:${PROXMOX_TOKEN_ML110_01:-}"
|
||
|
|
["r630-01"]="192.168.11.11:https://r630-01.sankofa.nexus:8006:${PROXMOX_TOKEN_R630_01:-}"
|
||
|
|
)
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
error() {
|
||
|
|
echo -e "${RED}[ERROR]${NC} $1" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
warn() {
|
||
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
info() {
|
||
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
test_connectivity() {
|
||
|
|
local from_name=$1
|
||
|
|
local from_ip=$2
|
||
|
|
local to_name=$3
|
||
|
|
local to_endpoint=$4
|
||
|
|
local to_token=$5
|
||
|
|
|
||
|
|
info "Testing: ${from_name} (${from_ip}) → ${to_name}"
|
||
|
|
|
||
|
|
# Test basic connectivity
|
||
|
|
local http_code=$(curl -k -s --connect-timeout 5 -o /dev/null -w "%{http_code}" "${to_endpoint}/api2/json/version" 2>/dev/null || echo "000")
|
||
|
|
|
||
|
|
case "$http_code" in
|
||
|
|
200)
|
||
|
|
log " ✓ Connected (HTTP 200)"
|
||
|
|
if [ -n "$to_token" ]; then
|
||
|
|
local version=$(curl -k -s -H "Authorization: PVEAPIToken ${to_token}" "${to_endpoint}/api2/json/version" 2>/dev/null | jq -r '.data.version // empty')
|
||
|
|
if [ -n "$version" ]; then
|
||
|
|
log " ✓ Authenticated - Proxmox version: ${version}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
return 0
|
||
|
|
;;
|
||
|
|
401)
|
||
|
|
warn " ⚠ Connected but authentication required (HTTP 401)"
|
||
|
|
return 0
|
||
|
|
;;
|
||
|
|
000)
|
||
|
|
error " ✗ Connection failed (timeout or unreachable)"
|
||
|
|
return 1
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
warn " ⚠ Unexpected response: HTTP ${http_code}"
|
||
|
|
return 1
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
}
|
||
|
|
|
||
|
|
test_ping() {
|
||
|
|
local from_name=$1
|
||
|
|
local from_ip=$2
|
||
|
|
local to_name=$3
|
||
|
|
local to_ip=$4
|
||
|
|
|
||
|
|
info "Testing ping: ${from_name} → ${to_name}"
|
||
|
|
|
||
|
|
if command -v ping &> /dev/null; then
|
||
|
|
if ping -c 2 -W 2 "${to_ip}" &> /dev/null; then
|
||
|
|
log " ✓ Ping successful"
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
error " ✗ Ping failed"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
warn " ⚠ ping command not available"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
main() {
|
||
|
|
echo ""
|
||
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
|
|
echo "║ Proxmox Inter-Instance Connectivity Test ║"
|
||
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
info "Network Configuration:"
|
||
|
|
echo " • Instance 1: ML110-01 at 192.168.11.10"
|
||
|
|
echo " • Instance 2: R630-01 at 192.168.11.11"
|
||
|
|
echo " • Subnet: 192.168.11.0/24"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
local total_errors=0
|
||
|
|
local total_tests=0
|
||
|
|
|
||
|
|
# Test all combinations
|
||
|
|
for from_name in "${!INSTANCES[@]}"; do
|
||
|
|
IFS=':' read -r from_ip from_endpoint from_token <<< "${INSTANCES[$from_name]}"
|
||
|
|
|
||
|
|
for to_name in "${!INSTANCES[@]}"; do
|
||
|
|
if [ "$from_name" != "$to_name" ]; then
|
||
|
|
IFS=':' read -r to_ip to_endpoint to_token <<< "${INSTANCES[$to_name]}"
|
||
|
|
|
||
|
|
info "=================================="
|
||
|
|
((total_tests++))
|
||
|
|
|
||
|
|
# Test ping
|
||
|
|
test_ping "$from_name" "$from_ip" "$to_name" "$to_ip" || ((total_errors++))
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Test HTTP connectivity
|
||
|
|
test_connectivity "$from_name" "$from_ip" "$to_name" "$to_endpoint" "$to_token" || ((total_errors++))
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
if [ $total_errors -eq 0 ]; then
|
||
|
|
log "✓ All connectivity tests passed! (${total_tests} tests)"
|
||
|
|
echo ""
|
||
|
|
info "Instances can see each other and are ready for clustering"
|
||
|
|
else
|
||
|
|
error "✗ Found ${total_errors} issue(s) in ${total_tests} tests"
|
||
|
|
echo ""
|
||
|
|
warn "Instances may not be able to see each other"
|
||
|
|
warn "Check:"
|
||
|
|
warn " • Network connectivity"
|
||
|
|
warn " • Firewall rules"
|
||
|
|
warn " • Routing configuration"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
info "Note: These tests are from THIS machine"
|
||
|
|
info "To test FROM the Proxmox instances themselves:"
|
||
|
|
info " 1. SSH into each instance"
|
||
|
|
info " 2. Run: curl -k https://<other-instance-ip>:8006/api2/json/version"
|
||
|
|
echo ""
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|
||
|
|
|