Refactor code for improved readability and performance
This commit is contained in:
374
scripts/validation/check-prerequisites.sh
Executable file
374
scripts/validation/check-prerequisites.sh
Executable file
@@ -0,0 +1,374 @@
|
||||
#!/usr/bin/env bash
|
||||
# Prerequisites Check Script
|
||||
# Validates that all required files and directories exist in the source project
|
||||
|
||||
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_warn() { echo "[WARNING] $1"; }
|
||||
log_error() { echo "[ERROR] $1"; }
|
||||
}
|
||||
|
||||
# Source project path
|
||||
SOURCE_PROJECT="${1:-}"
|
||||
if [[ -z "$SOURCE_PROJECT" ]]; then
|
||||
SOURCE_PROJECT="${SOURCE_PROJECT:-/home/intlc/projects/smom-dbis-138}"
|
||||
log_info "Using default source project: $SOURCE_PROJECT"
|
||||
fi
|
||||
|
||||
# Convert to absolute path
|
||||
if [[ "$SOURCE_PROJECT" != /* ]]; then
|
||||
SOURCE_PROJECT="$(cd "$PROJECT_ROOT" && cd "$SOURCE_PROJECT" && pwd 2>/dev/null || echo "$PROJECT_ROOT/$SOURCE_PROJECT")"
|
||||
fi
|
||||
|
||||
log_info "========================================="
|
||||
log_info "Prerequisites Check"
|
||||
log_info "========================================="
|
||||
log_info ""
|
||||
log_info "Source project: $SOURCE_PROJECT"
|
||||
log_info ""
|
||||
|
||||
ERRORS=0
|
||||
WARNINGS=0
|
||||
|
||||
# Check source project exists
|
||||
if [[ ! -d "$SOURCE_PROJECT" ]]; then
|
||||
log_error "Source project directory not found: $SOURCE_PROJECT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Source project directory exists"
|
||||
|
||||
# Check for required top-level directories
|
||||
log_info ""
|
||||
log_info "=== Checking Required Directories ==="
|
||||
|
||||
REQUIRED_DIRS=(
|
||||
"config"
|
||||
"keys/validators"
|
||||
)
|
||||
|
||||
for dir in "${REQUIRED_DIRS[@]}"; do
|
||||
if [[ -d "$SOURCE_PROJECT/$dir" ]]; then
|
||||
log_success "✓ $dir/ exists"
|
||||
else
|
||||
log_error "✗ $dir/ missing"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Check for config/nodes/ structure (node-specific directories)
|
||||
HAS_NODE_DIRS=false
|
||||
if [[ -d "$SOURCE_PROJECT/config/nodes" ]]; then
|
||||
log_success "✓ config/nodes/ directory exists"
|
||||
HAS_NODE_DIRS=true
|
||||
|
||||
# Check for node subdirectories
|
||||
log_info ""
|
||||
log_info "Checking node-specific directories in config/nodes/:"
|
||||
NODE_DIRS=$(find "$SOURCE_PROJECT/config/nodes" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
||||
if [[ $NODE_DIRS -gt 0 ]]; then
|
||||
log_success "✓ Found $NODE_DIRS node directory(ies)"
|
||||
log_info " Sample node directories:"
|
||||
find "$SOURCE_PROJECT/config/nodes" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | head -5 | while read dir; do
|
||||
log_info " - $(basename "$dir")"
|
||||
done
|
||||
else
|
||||
log_warn "⚠ config/nodes/ exists but is empty"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
else
|
||||
log_info "config/nodes/ not found (using flat config structure)"
|
||||
fi
|
||||
|
||||
# Check for required files (flat structure)
|
||||
log_info ""
|
||||
log_info "=== Checking Required Files ==="
|
||||
|
||||
REQUIRED_FILES=(
|
||||
"config/genesis.json"
|
||||
"config/permissions-nodes.toml"
|
||||
"config/permissions-accounts.toml"
|
||||
)
|
||||
|
||||
OPTIONAL_FILES=(
|
||||
"config/static-nodes.json"
|
||||
"config/config-validator.toml"
|
||||
"config/config-sentry.toml"
|
||||
"config/config-rpc-public.toml"
|
||||
"config/config-rpc-core.toml"
|
||||
)
|
||||
|
||||
for file in "${REQUIRED_FILES[@]}"; do
|
||||
if [[ -f "$SOURCE_PROJECT/$file" ]]; then
|
||||
log_success "✓ $file exists"
|
||||
else
|
||||
log_error "✗ $file missing (REQUIRED)"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
for file in "${OPTIONAL_FILES[@]}"; do
|
||||
if [[ -f "$SOURCE_PROJECT/$file" ]]; then
|
||||
log_success "✓ $file exists"
|
||||
else
|
||||
log_warn "⚠ $file not found (optional, may be in config/nodes/)"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Check node-specific files if config/nodes/ exists
|
||||
if [[ "$HAS_NODE_DIRS" == "true" ]]; then
|
||||
log_info ""
|
||||
log_info "=== Checking Node-Specific Files ==="
|
||||
|
||||
# Check first node directory for expected files
|
||||
FIRST_NODE_DIR=$(find "$SOURCE_PROJECT/config/nodes" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | head -1)
|
||||
if [[ -n "$FIRST_NODE_DIR" ]] && [[ -d "$FIRST_NODE_DIR" ]]; then
|
||||
NODE_NAME=$(basename "$FIRST_NODE_DIR")
|
||||
log_info "Checking structure in: config/nodes/$NODE_NAME/"
|
||||
|
||||
NODE_FILES=(
|
||||
"config.toml"
|
||||
"nodekey"
|
||||
"nodekey.pub"
|
||||
)
|
||||
|
||||
for file in "${NODE_FILES[@]}"; do
|
||||
if [[ -f "$FIRST_NODE_DIR/$file" ]]; then
|
||||
log_success "✓ config/nodes/$NODE_NAME/$file exists"
|
||||
else
|
||||
log_warn "⚠ config/nodes/$NODE_NAME/$file not found"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# List all files in the node directory
|
||||
log_info ""
|
||||
log_info "Files in config/nodes/$NODE_NAME/:"
|
||||
find "$FIRST_NODE_DIR" -type f -maxdepth 1 2>/dev/null | while read file; do
|
||||
log_info " - $(basename "$file")"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check validator keys
|
||||
log_info ""
|
||||
log_info "=== Checking Validator Keys ==="
|
||||
|
||||
KEYS_DIR="$SOURCE_PROJECT/keys/validators"
|
||||
if [[ -d "$KEYS_DIR" ]]; then
|
||||
KEY_COUNT=$(find "$KEYS_DIR" -mindepth 1 -maxdepth 1 -type d -name "validator-*" 2>/dev/null | wc -l)
|
||||
if [[ $KEY_COUNT -gt 0 ]]; then
|
||||
log_success "✓ Found $KEY_COUNT validator key directory(ies)"
|
||||
log_info " Validator directories:"
|
||||
find "$KEYS_DIR" -mindepth 1 -maxdepth 1 -type d -name "validator-*" 2>/dev/null | while read dir; do
|
||||
log_info " - $(basename "$dir")"
|
||||
done
|
||||
|
||||
# Try to get expected count from config files, or use default
|
||||
EXPECTED_VALIDATORS=5
|
||||
# Try multiple possible config file locations
|
||||
CONFIG_PATHS=(
|
||||
"$SCRIPT_DIR/../../smom-dbis-138-proxmox/config/proxmox.conf" # scripts/validation -> smom-dbis-138-proxmox/config
|
||||
"$SCRIPT_DIR/../../config/proxmox.conf" # smom-dbis-138-proxmox/scripts/validation -> smom-dbis-138-proxmox/config
|
||||
"$SCRIPT_DIR/../../../smom-dbis-138-proxmox/config/proxmox.conf" # scripts/validation -> smom-dbis-138-proxmox/config
|
||||
"$PROJECT_ROOT/smom-dbis-138-proxmox/config/proxmox.conf"
|
||||
"$PROJECT_ROOT/config/proxmox.conf"
|
||||
"$(dirname "$SOURCE_PROJECT")/../proxmox/smom-dbis-138-proxmox/config/proxmox.conf"
|
||||
"/home/intlc/projects/proxmox/smom-dbis-138-proxmox/config/proxmox.conf"
|
||||
)
|
||||
|
||||
for CONFIG_FILE in "${CONFIG_PATHS[@]}"; do
|
||||
# Resolve relative paths
|
||||
if [[ "$CONFIG_FILE" != /* ]]; then
|
||||
CONFIG_FILE="$(cd "$SCRIPT_DIR" && cd "$(dirname "$CONFIG_FILE")" 2>/dev/null && pwd)/$(basename "$CONFIG_FILE")" 2>/dev/null || echo "$CONFIG_FILE"
|
||||
fi
|
||||
if [[ -f "$CONFIG_FILE" ]]; then
|
||||
# Extract VALIDATOR_COUNT value, handling comments on same line
|
||||
CONFIG_VALIDATOR_COUNT=$(grep "^VALIDATOR_COUNT=" "$CONFIG_FILE" 2>/dev/null | head -1 | sed 's/^VALIDATOR_COUNT=//' | sed 's/[[:space:]]*#.*$//' | tr -d ' "' || echo "")
|
||||
if [[ -n "$CONFIG_VALIDATOR_COUNT" ]] && [[ "$CONFIG_VALIDATOR_COUNT" =~ ^[0-9]+$ ]]; then
|
||||
EXPECTED_VALIDATORS="$CONFIG_VALIDATOR_COUNT"
|
||||
log_info " Using VALIDATOR_COUNT=$EXPECTED_VALIDATORS from $(basename "$(dirname "$CONFIG_FILE")")/$(basename "$CONFIG_FILE")"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $KEY_COUNT -eq $EXPECTED_VALIDATORS ]]; then
|
||||
log_success "✓ Validator key count matches expected: $EXPECTED_VALIDATORS"
|
||||
else
|
||||
log_warn "⚠ Validator key count mismatch: expected $EXPECTED_VALIDATORS, found $KEY_COUNT"
|
||||
log_info " Note: This may be acceptable if you're deploying fewer validators than configured"
|
||||
log_info " Update VALIDATOR_COUNT=$KEY_COUNT in config/proxmox.conf if this is intentional"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
else
|
||||
log_warn "⚠ keys/validators/ exists but no validator-* directories found"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
else
|
||||
log_error "✗ keys/validators/ directory missing"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Validate genesis.json structure
|
||||
log_info ""
|
||||
log_info "=== Validating Genesis.json ==="
|
||||
GENESIS_FILE="$SOURCE_PROJECT/config/genesis.json"
|
||||
if [[ -f "$GENESIS_FILE" ]]; then
|
||||
# Check JSON syntax
|
||||
if python3 -m json.tool "$GENESIS_FILE" >/dev/null 2>&1; then
|
||||
log_success "✓ genesis.json syntax valid"
|
||||
|
||||
# Check for QBFT configuration
|
||||
if python3 -c "import sys, json; data=json.load(open('$GENESIS_FILE')); exit(0 if 'config' in data and 'qbft' in data.get('config', {}) else 1)" 2>/dev/null; then
|
||||
log_success "✓ QBFT configuration present in genesis.json"
|
||||
else
|
||||
log_error "✗ QBFT configuration missing in genesis.json"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Check for extraData field
|
||||
if python3 -c "import sys, json; data=json.load(open('$GENESIS_FILE')); exit(0 if 'extraData' in data else 1)" 2>/dev/null; then
|
||||
log_success "✓ extraData field present in genesis.json"
|
||||
|
||||
# Validate extraData format
|
||||
EXTRA_DATA=$(python3 -c "import sys, json; print(json.load(open('$GENESIS_FILE')).get('extraData', ''))" 2>/dev/null)
|
||||
if [[ "$EXTRA_DATA" =~ ^0x[0-9a-fA-F]*$ ]] || [[ -z "$EXTRA_DATA" ]]; then
|
||||
log_success "✓ extraData format valid"
|
||||
else
|
||||
log_error "✗ extraData format invalid: $EXTRA_DATA"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
log_error "✗ extraData field missing in genesis.json"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# For dynamic validators, verify no validators array in QBFT
|
||||
if python3 -c "import sys, json; data=json.load(open('$GENESIS_FILE')); qbft=data.get('config', {}).get('qbft', {}); exit(0 if 'validators' not in qbft else 1)" 2>/dev/null; then
|
||||
log_success "✓ Dynamic validator setup confirmed (no validators array in QBFT)"
|
||||
else
|
||||
log_warn "⚠ Validators array found in QBFT config (expected for dynamic validators)"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
else
|
||||
log_error "✗ genesis.json syntax invalid"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
log_error "✗ genesis.json not found"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Summary
|
||||
log_info ""
|
||||
log_info "========================================="
|
||||
log_info "Prerequisites Check Summary"
|
||||
log_info "========================================="
|
||||
log_info "Errors: $ERRORS"
|
||||
log_info "Warnings: $WARNINGS"
|
||||
log_info ""
|
||||
|
||||
if [[ $ERRORS -eq 0 ]]; then
|
||||
if [[ $WARNINGS -eq 0 ]]; then
|
||||
log_success "✓ All prerequisites met!"
|
||||
log_info ""
|
||||
log_info "Recommended next steps:"
|
||||
log_info " 1. Verify storage configuration: sudo ./scripts/validation/verify-storage-config.sh"
|
||||
log_info " 2. Verify network configuration: ./scripts/validation/verify-network-config.sh"
|
||||
log_info " 3. Pre-cache OS template: sudo ./scripts/deployment/pre-cache-os-template.sh"
|
||||
log_info ""
|
||||
log_info "Or run all verifications: ./scripts/validation/verify-all.sh $SOURCE_PROJECT"
|
||||
exit 0
|
||||
else
|
||||
log_warn "⚠ Prerequisites met with $WARNINGS warning(s)"
|
||||
log_info "Review warnings above, but deployment may proceed"
|
||||
log_info ""
|
||||
log_info "Recommended next steps:"
|
||||
log_info " 1. Review warnings above"
|
||||
log_info " 2. Verify storage configuration: sudo ./scripts/validation/verify-storage-config.sh"
|
||||
log_info " 3. Verify network configuration: ./scripts/validation/verify-network-config.sh"
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
log_error "✗ Prerequisites check failed with $ERRORS error(s)"
|
||||
log_info "Please fix the errors before proceeding with deployment"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Check for CCIP configuration files (if CCIP deployment planned)
|
||||
log_info ""
|
||||
log_info "=== Checking CCIP Configuration Files ==="
|
||||
|
||||
CCIP_REQUIRED_FILES=(
|
||||
"config/ccip/ops-config.yaml"
|
||||
"config/ccip/commit-config.yaml"
|
||||
"config/ccip/exec-config.yaml"
|
||||
"config/ccip/rmn-config.yaml"
|
||||
)
|
||||
|
||||
CCIP_OPTIONAL_FILES=(
|
||||
"config/ccip/monitor-config.yaml"
|
||||
"config/ccip/secrets.yaml"
|
||||
)
|
||||
|
||||
CCIP_FILES_EXIST=false
|
||||
if [[ -d "$SOURCE_PROJECT/config/ccip" ]] || [[ -d "$SOURCE_PROJECT/ccip" ]]; then
|
||||
CCIP_FILES_EXIST=true
|
||||
log_info "CCIP configuration directory found"
|
||||
|
||||
for file in "${CCIP_REQUIRED_FILES[@]}"; do
|
||||
if [[ -f "$SOURCE_PROJECT/$file" ]]; then
|
||||
log_success "✓ $file exists"
|
||||
else
|
||||
# Try alternative location
|
||||
alt_file="${file/config\/ccip/ccip}"
|
||||
if [[ -f "$SOURCE_PROJECT/$alt_file" ]]; then
|
||||
log_success "✓ $alt_file exists (alternative location)"
|
||||
else
|
||||
log_warn "⚠ $file not found (may be optional or in different location)"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
for file in "${CCIP_OPTIONAL_FILES[@]}"; do
|
||||
if [[ -f "$SOURCE_PROJECT/$file" ]]; then
|
||||
log_success "✓ $file exists"
|
||||
else
|
||||
log_info " (optional) $file not found"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log_info "CCIP configuration directory not found (CCIP deployment may not be planned)"
|
||||
fi
|
||||
|
||||
# Check for other service configurations
|
||||
log_info ""
|
||||
log_info "=== Checking Other Service Configuration Files ==="
|
||||
|
||||
SERVICE_CONFIGS=(
|
||||
"config/blockscout.env"
|
||||
"config/firefly/config.yaml"
|
||||
"config/fabric/network-config.yaml"
|
||||
"config/indy/pool-config.yaml"
|
||||
"config/cacti/config.yaml"
|
||||
)
|
||||
|
||||
for config in "${SERVICE_CONFIGS[@]}"; do
|
||||
service_name=$(basename "$(dirname "$config")")
|
||||
if [[ -f "$SOURCE_PROJECT/$config" ]]; then
|
||||
log_success "✓ $config exists"
|
||||
else
|
||||
log_info " (optional) $config not found - $service_name may use different config location"
|
||||
fi
|
||||
done
|
||||
|
||||
89
scripts/validation/verify-all.sh
Executable file
89
scripts/validation/verify-all.sh
Executable file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env bash
|
||||
# Quick Verification - Run All Checks
|
||||
# Convenience script to run all verification checks before deployment
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
# Try to find project root - could be at same level or in smom-dbis-138-proxmox subdirectory
|
||||
if [[ -d "$SCRIPT_DIR/../../smom-dbis-138-proxmox" ]]; then
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../smom-dbis-138-proxmox" && pwd)"
|
||||
elif [[ -d "$SCRIPT_DIR/../.." ]]; then
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
else
|
||||
PROJECT_ROOT="$SCRIPT_DIR/../.."
|
||||
fi
|
||||
|
||||
SOURCE_PROJECT="${1:-/home/intlc/projects/smom-dbis-138}"
|
||||
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo " Complete Verification - All Checks"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "Source Project: $SOURCE_PROJECT"
|
||||
echo ""
|
||||
|
||||
# 1. Prerequisites Check
|
||||
echo "=== 1. Prerequisites Check ==="
|
||||
if [[ -f "$SCRIPT_DIR/check-prerequisites.sh" ]]; then
|
||||
"$SCRIPT_DIR/check-prerequisites.sh" "$SOURCE_PROJECT" || {
|
||||
echo ""
|
||||
echo "❌ Prerequisites check failed. Fix issues before continuing."
|
||||
exit 1
|
||||
}
|
||||
elif [[ -f "$PROJECT_ROOT/scripts/validation/check-prerequisites.sh" ]]; then
|
||||
"$PROJECT_ROOT/scripts/validation/check-prerequisites.sh" "$SOURCE_PROJECT" || {
|
||||
echo ""
|
||||
echo "❌ Prerequisites check failed. Fix issues before continuing."
|
||||
exit 1
|
||||
}
|
||||
else
|
||||
echo "⚠ check-prerequisites.sh not found, skipping..."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== 2. Storage Configuration (requires root on Proxmox host) ==="
|
||||
if [[ $EUID -eq 0 ]] && command -v pvesm &>/dev/null; then
|
||||
if [[ -f "$SCRIPT_DIR/verify-storage-config.sh" ]]; then
|
||||
"$SCRIPT_DIR/verify-storage-config.sh" || {
|
||||
echo ""
|
||||
echo "⚠ Storage verification had issues. Review output above."
|
||||
}
|
||||
elif [[ -f "$PROJECT_ROOT/scripts/validation/verify-storage-config.sh" ]]; then
|
||||
"$PROJECT_ROOT/scripts/validation/verify-storage-config.sh" || {
|
||||
echo ""
|
||||
echo "⚠ Storage verification had issues. Review output above."
|
||||
}
|
||||
else
|
||||
echo "⚠ verify-storage-config.sh not found, skipping..."
|
||||
fi
|
||||
else
|
||||
echo " Skipping (not running as root on Proxmox host)"
|
||||
echo " To verify storage, run: sudo ./scripts/validation/verify-storage-config.sh"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== 3. Network Configuration ==="
|
||||
if [[ -f "$SCRIPT_DIR/verify-network-config.sh" ]]; then
|
||||
"$SCRIPT_DIR/verify-network-config.sh" || {
|
||||
echo ""
|
||||
echo "⚠ Network verification had issues. Review output above."
|
||||
}
|
||||
elif [[ -f "$PROJECT_ROOT/scripts/validation/verify-network-config.sh" ]]; then
|
||||
"$PROJECT_ROOT/scripts/validation/verify-network-config.sh" || {
|
||||
echo ""
|
||||
echo "⚠ Network verification had issues. Review output above."
|
||||
}
|
||||
else
|
||||
echo "⚠ verify-network-config.sh not found, skipping..."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo " Verification Complete"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "If all checks passed, you're ready to deploy:"
|
||||
echo " sudo ./scripts/deployment/deploy-phased.sh --source-project $SOURCE_PROJECT"
|
||||
echo ""
|
||||
|
||||
181
scripts/validation/verify-network-config.sh
Executable file
181
scripts/validation/verify-network-config.sh
Executable file
@@ -0,0 +1,181 @@
|
||||
#!/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"
|
||||
|
||||
119
scripts/validation/verify-storage-config.sh
Executable file
119
scripts/validation/verify-storage-config.sh
Executable file
@@ -0,0 +1,119 @@
|
||||
#!/usr/bin/env bash
|
||||
# Verify Storage Configuration
|
||||
# Checks if storage is configured for optimal deployment performance
|
||||
|
||||
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 "Storage Configuration Verification"
|
||||
log_info "========================================="
|
||||
log_info ""
|
||||
|
||||
# Check if running on Proxmox host
|
||||
if ! command_exists pvesm; then
|
||||
log_error "pvesm command not found. This script must be run on Proxmox host."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get configured storage
|
||||
CONFIGURED_STORAGE="${PROXMOX_STORAGE:-local-lvm}"
|
||||
log_info "Configured storage: $CONFIGURED_STORAGE"
|
||||
|
||||
# List available storage
|
||||
log_info ""
|
||||
log_info "=== Available Storage ==="
|
||||
pvesm status 2>/dev/null || {
|
||||
log_error "Failed to list storage. Are you running as root?"
|
||||
exit 1
|
||||
}
|
||||
|
||||
log_info ""
|
||||
log_info "=== Storage Details ==="
|
||||
|
||||
# Check if configured storage exists
|
||||
if pvesm status 2>/dev/null | grep -q "^$CONFIGURED_STORAGE"; then
|
||||
log_success "Configured storage '$CONFIGURED_STORAGE' exists"
|
||||
|
||||
# Get storage details
|
||||
STORAGE_TYPE=$(pvesm status 2>/dev/null | grep "^$CONFIGURED_STORAGE" | awk '{print $2}')
|
||||
STORAGE_STATUS=$(pvesm status 2>/dev/null | grep "^$CONFIGURED_STORAGE" | awk '{print $3}')
|
||||
STORAGE_TOTAL=$(pvesm status 2>/dev/null | grep "^$CONFIGURED_STORAGE" | awk '{print $4}')
|
||||
STORAGE_USED=$(pvesm status 2>/dev/null | grep "^$CONFIGURED_STORAGE" | awk '{print $5}')
|
||||
STORAGE_AVAIL=$(pvesm status 2>/dev/null | grep "^$CONFIGURED_STORAGE" | awk '{print $6}')
|
||||
|
||||
log_info " Type: $STORAGE_TYPE"
|
||||
log_info " Status: $STORAGE_STATUS"
|
||||
log_info " Total: $STORAGE_TOTAL"
|
||||
log_info " Used: $STORAGE_USED"
|
||||
log_info " Available: $STORAGE_AVAIL"
|
||||
|
||||
# Check storage type
|
||||
log_info ""
|
||||
log_info "=== Storage Type Analysis ==="
|
||||
|
||||
if [[ "$STORAGE_TYPE" == "lvm" ]] || [[ "$STORAGE_TYPE" == "lvmthin" ]] || [[ "$STORAGE_TYPE" == "zfspool" ]] || [[ "$STORAGE_TYPE" == "dir" ]]; then
|
||||
if echo "$CONFIGURED_STORAGE" | grep -q "local"; then
|
||||
log_success "Storage is local (recommended for deployment performance)"
|
||||
log_info " Local storage provides:"
|
||||
log_info " • Faster container creation (15-30 min saved)"
|
||||
log_info " • Faster OS template installation"
|
||||
log_info " • Lower latency for I/O operations"
|
||||
else
|
||||
log_warn "Storage appears to be network-based"
|
||||
log_info " Network storage considerations:"
|
||||
log_info " • Slower container creation"
|
||||
log_info " • Higher latency"
|
||||
log_info " • May benefit from caching"
|
||||
log_info ""
|
||||
log_info " Recommendation: Use local storage if possible for deployment"
|
||||
fi
|
||||
else
|
||||
log_warn "Storage type '$STORAGE_TYPE' detected"
|
||||
log_info " Verify this is optimal for your deployment needs"
|
||||
fi
|
||||
|
||||
# Check available space (estimate requirement: ~100GB per container, 67 containers = ~6.7TB)
|
||||
log_info ""
|
||||
log_info "=== Storage Capacity Check ==="
|
||||
ESTIMATED_NEED="6.7T" # Rough estimate for 67 containers
|
||||
log_info "Estimated storage needed: ~$ESTIMATED_NEED (for 67 containers)"
|
||||
log_info "Available storage: $STORAGE_AVAIL"
|
||||
|
||||
# Note: Actual space check would require parsing storage sizes
|
||||
log_info " Verify sufficient space is available for deployment"
|
||||
|
||||
else
|
||||
log_error "Configured storage '$CONFIGURED_STORAGE' not found"
|
||||
log_info ""
|
||||
log_info "Available storage options:"
|
||||
pvesm status 2>/dev/null | awk '{print " - " $1 " (" $2 ")"}'
|
||||
log_info ""
|
||||
log_info "To fix: Update PROXMOX_STORAGE in config/proxmox.conf"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info ""
|
||||
log_info "=== Storage Performance Recommendations ==="
|
||||
log_info ""
|
||||
log_info "For optimal deployment performance:"
|
||||
log_info " ✓ Use local storage (local-lvm, local, local-zfs)"
|
||||
log_info " ✓ Ensure sufficient available space"
|
||||
log_info " ✓ Monitor storage I/O during deployment"
|
||||
log_info " ✓ Consider SSD-based storage for faster operations"
|
||||
log_info ""
|
||||
|
||||
log_success "Storage configuration verification complete"
|
||||
|
||||
Reference in New Issue
Block a user