227 lines
6.6 KiB
Plaintext
227 lines
6.6 KiB
Plaintext
|
|
#!/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"
|
||
|
|
}
|
||
|
|
}
|