Files
proxmox/scripts/validation/verify-network-config.sh

182 lines
7.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Verify Network Configuration
# Checks network connectivity and bandwidth to Proxmox host
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
source "$PROJECT_ROOT/lib/common.sh" 2>/dev/null || {
log_info() { echo "[INFO] $1"; }
log_success() { echo "[✓] $1"; }
log_error() { echo "[ERROR] $1"; }
log_warn() { echo "[WARN] $1"; }
}
# Load configuration
load_config "$PROJECT_ROOT/config/proxmox.conf" 2>/dev/null || true
log_info "========================================="
log_info "Network Configuration Verification"
log_info "========================================="
log_info ""
# Check network connectivity
log_info "=== Network Connectivity ==="
# Get Proxmox host IP/name (if configured)
PROXMOX_HOST="${PROXMOX_HOST:-localhost}"
log_info "Proxmox host: $PROXMOX_HOST"
# Check if we can resolve the host
if command_exists ping; then
if ping -c 1 -W 2 "$PROXMOX_HOST" &>/dev/null; then
log_success "Proxmox host is reachable"
# Get average latency
LATENCY=$(ping -c 3 -W 2 "$PROXMOX_HOST" 2>/dev/null | grep "avg" | awk -F'/' '{print $5}' || echo "N/A")
if [[ "$LATENCY" != "N/A" ]]; then
log_info " Average latency: ${LATENCY}ms"
if (( $(echo "$LATENCY > 100" | bc -l 2>/dev/null || echo 0) )); then
log_warn " High latency detected (>100ms). May impact deployment performance."
fi
fi
else
log_warn "Cannot ping Proxmox host (may be normal if running locally)"
fi
fi
# Check network interfaces
log_info ""
log_info "=== Network Interfaces ==="
if [[ -f /proc/net/dev ]]; then
# List active network interfaces
INTERFACES=$(ip -o link show 2>/dev/null | awk -F': ' '{print $2}' | grep -v "lo" || true)
if [[ -n "$INTERFACES" ]]; then
for iface in $INTERFACES; do
if ip link show "$iface" 2>/dev/null | grep -q "state UP"; then
log_info " $iface: UP"
# Get link speed if available
if [[ -f "/sys/class/net/$iface/speed" ]]; then
SPEED=$(cat "/sys/class/net/$iface/speed" 2>/dev/null || echo "unknown")
if [[ "$SPEED" != "-1" ]] && [[ "$SPEED" != "unknown" ]]; then
if [[ $SPEED -ge 1000 ]]; then
log_success " Speed: ${SPEED}Mbps (Gigabit or better - recommended)"
elif [[ $SPEED -ge 100 ]]; then
log_warn " Speed: ${SPEED}Mbps (Fast Ethernet - may limit performance)"
else
log_warn " Speed: ${SPEED}Mbps (Slow - may significantly impact deployment)"
fi
fi
fi
else
log_info " $iface: DOWN"
fi
done
fi
else
log_warn "Cannot check network interfaces (/proc/net/dev not available)"
fi
# Check Proxmox bridge configuration (if on Proxmox host)
log_info ""
log_info "=== Proxmox Bridge Configuration ==="
CONFIGURED_BRIDGE="${PROXMOX_BRIDGE:-vmbr0}"
log_info "Configured bridge: $CONFIGURED_BRIDGE"
if command_exists ip; then
if ip link show "$CONFIGURED_BRIDGE" &>/dev/null; then
log_success "Bridge '$CONFIGURED_BRIDGE' exists"
BRIDGE_STATUS=$(ip link show "$CONFIGURED_BRIDGE" 2>/dev/null | grep -o "state [A-Z]*" | awk '{print $2}')
log_info " Status: $BRIDGE_STATUS"
if [[ "$BRIDGE_STATUS" == "UP" ]]; then
log_success " Bridge is UP"
else
log_warn " Bridge is DOWN - containers may not have network access"
fi
else
log_error "Bridge '$CONFIGURED_BRIDGE' not found"
log_info " Available bridges:"
ip link show type bridge 2>/dev/null | grep "^[0-9]" | awk -F': ' '{print " - " $2}' || log_info " (none found)"
fi
fi
# Check DNS resolution (important for package downloads)
log_info ""
log_info "=== DNS Configuration ==="
if command_exists nslookup || command_exists host; then
TEST_DOMAIN="github.com"
if nslookup "$TEST_DOMAIN" &>/dev/null || host "$TEST_DOMAIN" &>/dev/null; then
log_success "DNS resolution working ($TEST_DOMAIN)"
else
log_error "DNS resolution failed - package downloads may fail"
fi
else
log_warn "Cannot test DNS (nslookup/host not available)"
fi
# Check internet connectivity (for package downloads)
log_info ""
log_info "=== Internet Connectivity ==="
if command_exists curl; then
if curl -s --max-time 5 https://github.com &>/dev/null; then
log_success "Internet connectivity working (GitHub reachable)"
# Test download speed (rough estimate)
log_info " Testing download speed..."
SPEED_TEST=$(curl -s -o /dev/null -w "%{speed_download}" --max-time 10 https://github.com 2>/dev/null || echo "0")
if [[ -n "$SPEED_TEST" ]] && [[ "$SPEED_TEST" != "0" ]]; then
# Convert bytes/s to Mbps
SPEED_MBPS=$(echo "scale=2; $SPEED_TEST * 8 / 1024 / 1024" | bc 2>/dev/null || echo "N/A")
if [[ "$SPEED_MBPS" != "N/A" ]]; then
log_info " Approximate download speed: ${SPEED_MBPS} Mbps"
if (( $(echo "$SPEED_MBPS > 100" | bc -l 2>/dev/null || echo 0) )); then
log_success " Speed is good for deployment (recommended: >100 Mbps)"
elif (( $(echo "$SPEED_MBPS > 10" | bc -l 2>/dev/null || echo 0) )); then
log_warn " Speed is acceptable but may slow deployment (recommended: >100 Mbps)"
else
log_warn " Speed is slow - deployment may be significantly slower"
log_info " Consider:"
log_info " • Using local package mirrors"
log_info " • Pre-caching packages"
log_info " • Upgrading network connection"
fi
fi
fi
else
log_warn "Internet connectivity test failed (may be normal in isolated networks)"
fi
else
log_warn "Cannot test internet connectivity (curl not available)"
fi
# Network optimization recommendations
log_info ""
log_info "=== Network Optimization Recommendations ==="
log_info ""
log_info "For optimal deployment performance:"
log_info " ✓ Use Gigabit Ethernet (1 Gbps) or faster"
log_info " ✓ Ensure low latency (<50ms) to Proxmox host"
log_info " ✓ Use wired connection instead of wireless"
log_info " ✓ Consider local package mirrors for apt"
log_info " ✓ Pre-cache OS templates (saves 5-10 minutes)"
log_info " ✓ Monitor network usage during deployment"
log_info ""
log_info "Expected network usage:"
log_info " • OS template download: ~200-500 MB (one-time)"
log_info " • Package downloads: ~500 MB - 2 GB per container"
log_info " • Configuration file transfers: Minimal"
log_info " • Total for 67 containers: ~35-135 GB"
log_info ""
log_success "Network configuration verification complete"