provisioning/tools/migrate-to-provider-agnostic.nu
2025-10-07 11:12:02 +01:00

198 lines
6.9 KiB
Plaintext
Executable File

# Migration Script: Switch to Provider-Agnostic Middleware
# This script safely migrates from hardcoded middleware to provider-agnostic architecture
use ../core/nulib/lib_provisioning/utils/logging.nu *
# Migration script
export def main [
--dry-run # Show what would be done without executing
--force # Skip confirmation prompts
]: nothing -> nothing {
log-section "Provider-Agnostic Middleware Migration" "migration"
if $dry_run {
log-warning "DRY RUN MODE - No actual changes will be made" "migration"
}
# Step 1: Backup current middleware
let middleware_path = "provisioning/extensions/providers/prov_lib/middleware.nu"
let backup_path = "provisioning/extensions/providers/prov_lib/middleware_hardcoded.backup"
if ($middleware_path | path exists) {
if not $dry_run {
cp $middleware_path $backup_path
}
log-info $"Backup created: ($backup_path)" "migration"
} else {
log-error $"Middleware file not found: ($middleware_path)" "migration"
return
}
# Step 2: Check provider adapters exist
let required_adapters = [
"provisioning/extensions/providers/aws/provider.nu"
"provisioning/extensions/providers/upcloud/provider.nu"
"provisioning/extensions/providers/local/provider.nu"
]
mut missing_adapters = []
for adapter in $required_adapters {
if not ($adapter | path exists) {
$missing_adapters = ($missing_adapters | append $adapter)
}
}
if ($missing_adapters | length) > 0 {
log-error "Missing required provider adapters:" "migration"
for adapter in $missing_adapters {
log-error $" - ($adapter)" "migration"
}
return
} else {
log-success "All required provider adapters found" "migration"
}
# Step 3: Replace middleware with provider-agnostic version
let agnostic_middleware = "provisioning/extensions/providers/prov_lib/middleware_provider_agnostic.nu"
if not ($agnostic_middleware | path exists) {
log-error $"Provider-agnostic middleware not found: ($agnostic_middleware)" "migration"
return
}
if not $dry_run and ($force or (confirm "Replace middleware with provider-agnostic version?")) {
cp $agnostic_middleware $middleware_path
log-success "Middleware replaced with provider-agnostic version" "migration"
} else if $dry_run {
log-info $"Would replace ($middleware_path) with ($agnostic_middleware)" "migration"
} else {
log-warning "Migration cancelled by user" "migration"
return
}
# Step 4: Test the new middleware
log-info "Testing new provider-agnostic middleware..." "migration"
if not $dry_run {
try {
# Test import
nu -c "use provisioning/extensions/providers/prov_lib/middleware.nu *; mw_provider_status | length"
log-success "Middleware import test passed" "migration"
# Test provider registry initialization
nu -c "use provisioning/core/nulib/lib_provisioning/providers/registry.nu *; init-provider-registry"
log-success "Provider registry initialization test passed" "migration"
} catch {|err|
log-error $"Middleware test failed: ($err.msg)" "migration"
log-warning "Restoring backup..." "migration"
cp $backup_path $middleware_path
return
}
} else {
log-info "Would run middleware import and registry tests" "migration"
}
# Step 5: Show migration summary
log-section "Migration Summary" "migration"
let summary = [
"✅ Backup created: middleware_hardcoded.backup"
"✅ Provider adapters validated"
"✅ Provider-agnostic middleware installed"
"✅ Middleware tests passed"
""
"🚀 Benefits enabled:"
" • No hardcoded provider imports"
" • Multi-provider infrastructure support"
" • Dynamic provider loading"
" • Extensible provider system"
""
"📋 Next steps:"
" • Test with existing infrastructure"
" • Run: ./provisioning/tools/test-provider-agnostic.nu"
" • Update any custom code using old middleware"
]
for line in $summary {
print $line
}
if not $dry_run {
log-success "Migration completed successfully!" "migration"
} else {
log-info "Dry run completed - use --force to execute" "migration"
}
}
# Confirmation helper
def confirm [message: string]: nothing -> bool {
print $"($message) (y/N): "
let response = (input)
$response == "y" or $response == "Y" or $response == "yes"
}
# Rollback migration
export def rollback []: nothing -> nothing {
log-section "Rolling back provider-agnostic migration" "migration"
let middleware_path = "provisioning/extensions/providers/prov_lib/middleware.nu"
let backup_path = "provisioning/extensions/providers/prov_lib/middleware_hardcoded.backup"
if ($backup_path | path exists) {
cp $backup_path $middleware_path
log-success "Rollback completed - hardcoded middleware restored" "migration"
} else {
log-error $"Backup not found: ($backup_path)" "migration"
}
}
# Show migration status
export def status []: nothing -> nothing {
log-section "Migration Status Check" "migration"
let middleware_path = "provisioning/extensions/providers/prov_lib/middleware.nu"
let backup_path = "provisioning/extensions/providers/prov_lib/middleware_hardcoded.backup"
# Check if middleware exists
if ($middleware_path | path exists) {
# Check if it's the new version by looking for provider-agnostic patterns
let content = (open $middleware_path)
if ($content | str contains "dispatch_provider_function") {
log-success "Provider-agnostic middleware is active" "migration"
} else {
log-info "Hardcoded middleware is active" "migration"
}
} else {
log-error "Middleware file not found" "migration"
}
# Check backup status
if ($backup_path | path exists) {
log-info "Backup available for rollback" "migration"
} else {
log-warning "No backup found" "migration"
}
# Check provider adapters
let adapters = [
"provisioning/extensions/providers/aws/provider.nu"
"provisioning/extensions/providers/upcloud/provider.nu"
"provisioning/extensions/providers/local/provider.nu"
]
mut adapter_status = []
for adapter in $adapters {
let exists = ($adapter | path exists)
let provider_name = ($adapter | path dirname | path basename)
$adapter_status = ($adapter_status | append {
provider: $provider_name
adapter_exists: $exists
status: (if $exists { "✅" } else { "❌" })
})
}
print "Provider Adapter Status:"
print ($adapter_status | table)
}