282 lines
7.5 KiB
Bash
282 lines
7.5 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# validate-configs.sh
|
||
|
|
# Validates all configuration files without requiring external access
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
RED='\033[0;31m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
ERRORS=0
|
||
|
|
WARNINGS=0
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
error() {
|
||
|
|
echo -e "${RED}[ERROR]${NC} $1" >&2
|
||
|
|
((ERRORS++))
|
||
|
|
}
|
||
|
|
|
||
|
|
warn() {
|
||
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
|
|
((WARNINGS++))
|
||
|
|
}
|
||
|
|
|
||
|
|
success() {
|
||
|
|
echo -e "${GREEN}[✓]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
check_yaml_syntax() {
|
||
|
|
local file=$1
|
||
|
|
|
||
|
|
if [ ! -f "$file" ]; then
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
if command -v yamllint &> /dev/null; then
|
||
|
|
if yamllint -d relaxed "$file" &> /dev/null; then
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
elif command -v python3 &> /dev/null; then
|
||
|
|
if python3 -c "import yaml; list(yaml.safe_load_all(open('$file')))" &> /dev/null 2>&1; then
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
# Basic check - file exists and is readable, and has .yaml/.yml extension
|
||
|
|
if [[ "$file" =~ \.(yaml|yml)$ ]] && [ -r "$file" ]; then
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
check_placeholders() {
|
||
|
|
local file=$1
|
||
|
|
local placeholders=(
|
||
|
|
"CHANGE_ME"
|
||
|
|
"your-"
|
||
|
|
"TBD"
|
||
|
|
"TODO"
|
||
|
|
"FIXME"
|
||
|
|
"placeholder"
|
||
|
|
)
|
||
|
|
|
||
|
|
local found=false
|
||
|
|
for placeholder in "${placeholders[@]}"; do
|
||
|
|
if grep -qi "$placeholder" "$file" 2>/dev/null; then
|
||
|
|
if [ "$found" = false ]; then
|
||
|
|
warn "Found placeholders in: $file"
|
||
|
|
found=true
|
||
|
|
fi
|
||
|
|
grep -ni "$placeholder" "$file" 2>/dev/null | head -3 | sed 's/^/ /'
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ "$found" = false ]; then
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
validate_provider_config() {
|
||
|
|
log "Validating provider configuration..."
|
||
|
|
|
||
|
|
local config_file="crossplane-provider-proxmox/examples/provider-config.yaml"
|
||
|
|
|
||
|
|
if [ ! -f "$config_file" ]; then
|
||
|
|
error "Provider config not found: $config_file"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check YAML syntax
|
||
|
|
if check_yaml_syntax "$config_file"; then
|
||
|
|
success "Provider config YAML syntax valid"
|
||
|
|
else
|
||
|
|
error "Provider config YAML syntax invalid"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for placeholders
|
||
|
|
if check_placeholders "$config_file"; then
|
||
|
|
success "Provider config has no placeholders"
|
||
|
|
else
|
||
|
|
warn "Provider config may contain placeholders"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check required fields
|
||
|
|
if grep -q "ml110-01.sankofa.nexus" "$config_file" && grep -q "r630-01.sankofa.nexus" "$config_file"; then
|
||
|
|
success "Provider config has correct FQDNs"
|
||
|
|
else
|
||
|
|
error "Provider config missing correct FQDNs"
|
||
|
|
fi
|
||
|
|
|
||
|
|
if grep -q "ML110-01" "$config_file" && grep -q "R630-01" "$config_file"; then
|
||
|
|
success "Provider config has correct node names"
|
||
|
|
else
|
||
|
|
error "Provider config missing correct node names"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
validate_tunnel_configs() {
|
||
|
|
log "Validating Cloudflare tunnel configurations..."
|
||
|
|
|
||
|
|
local tunnel_configs=(
|
||
|
|
"cloudflare/tunnel-configs/proxmox-site-1.yaml"
|
||
|
|
"cloudflare/tunnel-configs/proxmox-site-2.yaml"
|
||
|
|
"cloudflare/tunnel-configs/proxmox-site-3.yaml"
|
||
|
|
)
|
||
|
|
|
||
|
|
for config in "${tunnel_configs[@]}"; do
|
||
|
|
if [ ! -f "$config" ]; then
|
||
|
|
error "Tunnel config not found: $config"
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
if check_yaml_syntax "$config"; then
|
||
|
|
success "Tunnel config YAML valid: $(basename $config)"
|
||
|
|
else
|
||
|
|
error "Tunnel config YAML invalid: $(basename $config)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
if check_placeholders "$config"; then
|
||
|
|
success "Tunnel config has no placeholders: $(basename $config)"
|
||
|
|
else
|
||
|
|
warn "Tunnel config may contain placeholders: $(basename $config)"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
validate_vm_manifests() {
|
||
|
|
log "Validating VM manifests..."
|
||
|
|
|
||
|
|
local vm_manifests=(
|
||
|
|
"crossplane-provider-proxmox/examples/test-vm-instance-1.yaml"
|
||
|
|
"crossplane-provider-proxmox/examples/test-vm-instance-2.yaml"
|
||
|
|
"crossplane-provider-proxmox/examples/vm-example.yaml"
|
||
|
|
)
|
||
|
|
|
||
|
|
for manifest in "${vm_manifests[@]}"; do
|
||
|
|
if [ ! -f "$manifest" ]; then
|
||
|
|
warn "VM manifest not found: $manifest"
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
if check_yaml_syntax "$manifest"; then
|
||
|
|
success "VM manifest YAML valid: $(basename $manifest)"
|
||
|
|
else
|
||
|
|
error "VM manifest YAML invalid: $(basename $manifest)"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check for required fields
|
||
|
|
if grep -q "site:" "$manifest" && grep -q "node:" "$manifest"; then
|
||
|
|
success "VM manifest has required fields: $(basename $manifest)"
|
||
|
|
else
|
||
|
|
error "VM manifest missing required fields: $(basename $manifest)"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
validate_dns_configs() {
|
||
|
|
log "Validating DNS configurations..."
|
||
|
|
|
||
|
|
local dns_files=(
|
||
|
|
"cloudflare/dns/sankofa.nexus-records.yaml"
|
||
|
|
"cloudflare/terraform/dns.tf"
|
||
|
|
)
|
||
|
|
|
||
|
|
for dns_file in "${dns_files[@]}"; do
|
||
|
|
if [ ! -f "$dns_file" ]; then
|
||
|
|
warn "DNS config not found: $dns_file"
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
if check_yaml_syntax "$dns_file" 2>/dev/null || [ -f "$dns_file" ]; then
|
||
|
|
success "DNS config valid: $(basename $dns_file)"
|
||
|
|
else
|
||
|
|
error "DNS config invalid: $(basename $dns_file)"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
check_file_structure() {
|
||
|
|
log "Checking file structure..."
|
||
|
|
|
||
|
|
local required_dirs=(
|
||
|
|
"crossplane-provider-proxmox"
|
||
|
|
"cloudflare/tunnel-configs"
|
||
|
|
"cloudflare/dns"
|
||
|
|
"docs/proxmox"
|
||
|
|
"scripts"
|
||
|
|
"infrastructure/monitoring/dashboards"
|
||
|
|
)
|
||
|
|
|
||
|
|
for dir in "${required_dirs[@]}"; do
|
||
|
|
if [ -d "$dir" ]; then
|
||
|
|
success "Directory exists: $dir"
|
||
|
|
else
|
||
|
|
error "Directory missing: $dir"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
print_summary() {
|
||
|
|
echo ""
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo "Validation Summary"
|
||
|
|
echo "═══════════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
echo "Errors: ${ERRORS}"
|
||
|
|
echo "Warnings: ${WARNINGS}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ "${ERRORS}" -eq 0 ]; then
|
||
|
|
success "All configuration files are valid!"
|
||
|
|
if [ "${WARNINGS}" -gt 0 ]; then
|
||
|
|
warn "Some warnings found, but configurations appear valid"
|
||
|
|
fi
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
error "Some errors were found. Please review and fix them."
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
main() {
|
||
|
|
echo ""
|
||
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
||
|
|
echo "║ Configuration Validation ║"
|
||
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
check_file_structure
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
validate_provider_config
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
validate_tunnel_configs
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
validate_vm_manifests
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
validate_dns_configs
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
print_summary
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|
||
|
|
|