provisioning/scripts/migrate-to-target-configs.nu
2025-10-07 11:12:02 +01:00

227 lines
6.6 KiB
Plaintext
Executable File

#!/usr/bin/env nu
# Migrate from old config system to new workspace-based configs
# This script:
# 1. Detects old config.defaults.toml usage
# 2. Creates workspace structure
# 3. Generates config/provisioning.yaml from old config
# 4. Migrates provider settings
# 5. Creates user context
use ../core/nulib/lib_provisioning *
def main [
--workspace-name: string = "default" # Name for new workspace
--workspace-path: string # Path for workspace (defaults to ~/workspaces/{name})
--dry-run # Show what would be done
--backup # Backup old configs
] {
print "🔄 Migration to Target-Based Configuration System"
print "=================================================="
print ""
if $dry_run {
print "⚠️ DRY RUN MODE - No changes will be made"
print ""
}
# 1. Detect old system
print "Step 1: Detecting old configuration..."
let old_config_path = "/Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml"
if not ($old_config_path | path exists) {
print "✅ No old config found. System may already be migrated."
return
}
print $" Found: ($old_config_path)"
# Load old config
let old_config = (open $old_config_path | from toml)
print " ✅ Old config loaded"
print ""
# 2. Backup if requested
if $backup and not $dry_run {
print "Step 2: Creating backup..."
let backup_file = $"($old_config_path).backup.(date now | format date '%Y%m%d-%H%M%S')"
cp $old_config_path $backup_file
print $" ✅ Backup created: ($backup_file)"
print ""
}
# 3. Determine workspace path
let ws_path = if ($workspace_path | is-empty) {
([$env.HOME "workspaces" $workspace_name] | path join)
} else {
$workspace_path
}
print $"Step 3: Target workspace"
print $" Name: ($workspace_name)"
print $" Path: ($ws_path)"
print ""
if $dry_run {
print " Would create workspace structure..."
} else {
# 4. Create workspace structure
print "Step 4: Creating workspace..."
if ($ws_path | path exists) {
print " ⚠️ Workspace path already exists"
let confirm = (input "Continue and merge? [y/N]: ")
if not (($confirm | str downcase) in ["y" "yes"]) {
print " ❌ Migration cancelled"
return
}
}
# Create directories
let dirs = [
$ws_path
$"($ws_path)/config"
$"($ws_path)/config/providers"
$"($ws_path)/config/platform"
$"($ws_path)/infra"
$"($ws_path)/.cache"
$"($ws_path)/.runtime"
]
for dir in $dirs {
if not ($dir | path exists) {
mkdir $dir
print $" ✅ Created: ($dir)"
}
}
print ""
}
# 5. Generate provisioning.yaml
print "Step 5: Generating provisioning.yaml..."
let new_config = {
workspace: {
name: $workspace_name
version: "1.0.0"
created: (date now | format date "%Y-%m-%dT%H:%M:%SZ")
}
paths: {
base: $ws_path
infra: $"($ws_path)/infra"
cache: $"($ws_path)/.cache"
runtime: $"($ws_path)/.runtime"
}
core: ($old_config | get -i core | default {version: "1.0.0", name: "provisioning"})
debug: ($old_config | get -i debug | default {enabled: false, log_level: "info"})
output: ($old_config | get -i output | default {format: "yaml", file_viewer: "bat"})
http: ($old_config | get -i http | default {use_curl: false})
providers: ($old_config | get -i providers | default {active: [], default: "local"})
secrets: {provider: "sops", sops_enabled: true, kms_enabled: false}
sops: ($old_config | get -i sops | default {use_sops: true})
cache: ($old_config | get -i cache | default {enabled: true})
}
let config_file = $"($ws_path)/config/provisioning.yaml"
if $dry_run {
print " Would write to: ($config_file)"
print " Config preview:"
print ($new_config | to yaml)
} else {
$new_config | to yaml | save --force $config_file
print $" ✅ Created: ($config_file)"
}
print ""
# 6. Migrate provider configs
print "Step 6: Migrating provider configs..."
let providers = ($old_config | get -i providers | default {} | columns | where $it != "default")
for provider in $providers {
print $" • Migrating ($provider)..."
let template_file = $"/Users/Akasha/project-provisioning/provisioning/extensions/providers/($provider)/config.defaults.toml"
if not ($template_file | path exists) {
print $" ⚠️ Template not found, skipping"
continue
}
let provider_config_file = $"($ws_path)/config/providers/($provider).toml"
if $dry_run {
print $" Would create: ($provider_config_file)"
} else {
let template = (open $template_file)
let content = (
$template
| str replace --all "{{workspace.path}}" $ws_path
| str replace --all "{{workspace.name}}" $workspace_name
)
$content | save $provider_config_file
print $" ✅ Created: ($provider_config_file)"
}
}
print ""
# 7. Create user context
print "Step 7: Creating user context..."
let user_config_dir = ([$env.HOME "Library" "Application Support" "provisioning"] | path join)
let context_file = ($user_config_dir | path join $"ws_($workspace_name).yaml")
let context = {
workspace: {
name: $workspace_name
path: $ws_path
active: true
}
provisioning: {
path: "/usr/local/provisioning"
}
overrides: {
debug_enabled: false
log_level: "info"
}
metadata: {
created: (date now | format date "%Y-%m-%dT%H:%M:%SZ")
last_used: (date now | format date "%Y-%m-%dT%H:%M:%SZ")
version: "1.0.0"
}
}
if $dry_run {
print $" Would create: ($context_file)"
} else {
if not ($user_config_dir | path exists) {
mkdir $user_config_dir
}
$context | to yaml | save --force $context_file
print $" ✅ Created: ($context_file)"
}
print ""
# 8. Summary
print "✅ Migration Complete!"
print ""
print "📋 Summary:"
print $" Workspace: ($workspace_name)"
print $" Path: ($ws_path)"
print $" Config: ($config_file)"
print $" Context: ($context_file)"
print ""
print "🎯 Next Steps:"
print " 1. Review and customize: ($config_file)"
print " 2. Configure providers in: ($ws_path)/config/providers/"
print " 3. Test: provisioning workspace config validate"
print " 4. If all good, remove old config: ($old_config_path)"
print ""
if not $dry_run {
print $"⚠️ IMPORTANT: Old config is still at ($old_config_path)"
if $backup {
print $" Backup saved at: ($old_config_path).backup.*"
}
print " Remove it manually after verifying migration"
}
}