# Migration Example: Complete Walkthrough ## Scenario Migrating a production infrastructure project from the old `config.defaults.toml` system to the new workspace-based configuration. **Current Setup**: - Infrastructure name: `production-cluster` - Providers: AWS, UpCloud - Platform services: Orchestrator, Control Center, KMS - Old config location: `/Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml` **Target Setup**: - Workspace name: `production-cluster` - Workspace path: `~/workspaces/production-cluster` - All configurations validated and tested ## Step-by-Step Migration ### Step 1: Pre-Migration Assessment ```bash # Check current configuration $ provisioning env # Output: PROVISIONING_BASE: /Users/Akasha/project-provisioning PROVISIONING_CONFIG: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml PROVISIONING_PROVIDER: aws ... # Review current config file $ cat provisioning/config/config.defaults.toml | head -20 [core] name = "provisioning" version = "1.0.0" [debug] enabled = false log_level = "info" [providers] default = "aws" active = ["aws", "upcloud"] [providers.aws] region = "us-east-1" ... ``` ### Step 2: Backup Current Configuration ```bash # Create timestamped backup $ cp -r provisioning/config provisioning/config.backup.$(date +%Y%m%d-%H%M%S) # Verify backup $ ls -la provisioning/config.backup.* drwxr-xr-x 8 user staff 256 Oct 6 10:30 provisioning/config.backup.20251006-103000 ``` ### Step 3: Dry Run Migration ```bash # Preview migration without making changes $ ./provisioning/scripts/migrate-to-target-configs.nu \ --workspace-name "production-cluster" \ --dry-run ๐Ÿ”„ Migration to Target-Based Configuration System ================================================== โš ๏ธ DRY RUN MODE - No changes will be made Step 1: Detecting old configuration... Found: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml โœ… Old config loaded Step 3: Target workspace Name: production-cluster Path: /Users/Akasha/workspaces/production-cluster Would create workspace structure... Step 5: Generating provisioning.yaml... Would write to: /Users/Akasha/workspaces/production-cluster/config/provisioning.yaml Config preview: workspace: name: production-cluster version: 1.0.0 created: '2025-10-06T10:35:00Z' paths: base: /Users/Akasha/workspaces/production-cluster infra: /Users/Akasha/workspaces/production-cluster/infra cache: /Users/Akasha/workspaces/production-cluster/.cache runtime: /Users/Akasha/workspaces/production-cluster/.runtime core: name: provisioning version: 1.0.0 debug: enabled: false log_level: info providers: active: - aws - upcloud default: aws ... Step 6: Migrating provider configs... โ€ข Migrating aws... Would create: /Users/Akasha/workspaces/production-cluster/config/providers/aws.toml โ€ข Migrating upcloud... Would create: /Users/Akasha/workspaces/production-cluster/config/providers/upcloud.toml Step 7: Creating user context... Would create: /Users/Akasha/Library/Application Support/provisioning/ws_production-cluster.yaml ``` ### Step 4: Execute Migration with Backup ```bash # Run actual migration $ ./provisioning/scripts/migrate-to-target-configs.nu \ --workspace-name "production-cluster" \ --backup ๐Ÿ”„ Migration to Target-Based Configuration System ================================================== Step 1: Detecting old configuration... Found: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml โœ… Old config loaded Step 2: Creating backup... โœ… Backup created: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml.backup.20251006-103500 Step 3: Target workspace Name: production-cluster Path: /Users/Akasha/workspaces/production-cluster Step 4: Creating workspace... โœ… Created: /Users/Akasha/workspaces/production-cluster โœ… Created: /Users/Akasha/workspaces/production-cluster/config โœ… Created: /Users/Akasha/workspaces/production-cluster/config/providers โœ… Created: /Users/Akasha/workspaces/production-cluster/config/platform โœ… Created: /Users/Akasha/workspaces/production-cluster/infra โœ… Created: /Users/Akasha/workspaces/production-cluster/.cache โœ… Created: /Users/Akasha/workspaces/production-cluster/.runtime Step 5: Generating provisioning.yaml... โœ… Created: /Users/Akasha/workspaces/production-cluster/config/provisioning.yaml Step 6: Migrating provider configs... โ€ข Migrating aws... โœ… Created: /Users/Akasha/workspaces/production-cluster/config/providers/aws.toml โ€ข Migrating upcloud... โœ… Created: /Users/Akasha/workspaces/production-cluster/config/providers/upcloud.toml Step 7: Creating user context... โœ… Created: /Users/Akasha/Library/Application Support/provisioning/ws_production-cluster.yaml โœ… Migration Complete! ๐Ÿ“‹ Summary: Workspace: production-cluster Path: /Users/Akasha/workspaces/production-cluster Config: /Users/Akasha/workspaces/production-cluster/config/provisioning.yaml Context: /Users/Akasha/Library/Application Support/provisioning/ws_production-cluster.yaml ๐ŸŽฏ Next Steps: 1. Review and customize: /Users/Akasha/workspaces/production-cluster/config/provisioning.yaml 2. Configure providers in: /Users/Akasha/workspaces/production-cluster/config/providers/ 3. Test: provisioning workspace config validate 4. If all good, remove old config: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml โš ๏ธ IMPORTANT: Old config is still at /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml Backup saved at: /Users/Akasha/project-provisioning/provisioning/config/config.defaults.toml.backup.* Remove it manually after verifying migration ``` ### Step 5: Verify Workspace Structure ```bash # Check created workspace structure $ tree ~/workspaces/production-cluster -L 3 /Users/Akasha/workspaces/production-cluster โ”œโ”€โ”€ config โ”‚ โ”œโ”€โ”€ provisioning.yaml โ”‚ โ”œโ”€โ”€ providers โ”‚ โ”‚ โ”œโ”€โ”€ aws.toml โ”‚ โ”‚ โ””โ”€โ”€ upcloud.toml โ”‚ โ””โ”€โ”€ platform โ”œโ”€โ”€ infra โ”œโ”€โ”€ .cache โ””โ”€โ”€ .runtime # View main configuration $ cat ~/workspaces/production-cluster/config/provisioning.yaml workspace: name: production-cluster version: 1.0.0 created: '2025-10-06T10:35:00Z' paths: base: /Users/Akasha/workspaces/production-cluster infra: /Users/Akasha/workspaces/production-cluster/infra cache: /Users/Akasha/workspaces/production-cluster/.cache runtime: /Users/Akasha/workspaces/production-cluster/.runtime ... # View provider configuration $ cat ~/workspaces/production-cluster/config/providers/aws.toml [provider] name = "aws" region = "us-east-1" enabled = true [credentials] type = "environment" [compute] default_instance_type = "t3.medium" ... ``` ### Step 6: Validate Configuration ```bash # Validate workspace configuration $ provisioning workspace config validate โœ… Validation passed # Validate provider configurations $ provisioning provider validate aws โœ… Validation passed $ provisioning provider validate upcloud โœ… Validation passed ``` ### Step 7: Run Validation Test Suite ```bash # Run comprehensive validation tests $ nu provisioning/tests/config_validation_tests.nu ๐Ÿงช Configuration Validation Test Suite ====================================== Test 1: Required Fields Validation โœ… PASSED Test 2: Type Validation โœ… PASSED Test 3: Enum Validation โœ… PASSED Test 4: Range Validation โœ… PASSED Test 5: Pattern Validation โœ… PASSED Test 6: Deprecated Fields Warning โœ… PASSED ๐Ÿ“Š Results: 6 passed, 0 failed โœ… All tests passed! ``` ### Step 8: Test Operations ```bash # Test server operations in check mode $ provisioning --check server list Checking server configuration... โœ… Configuration valid โœ… AWS provider configured โœ… UpCloud provider configured # Test taskserv operations $ provisioning --check taskserv list Available taskservs: โ€ข kubernetes (v1.28.0) โ€ข containerd (v1.7.0) โ€ข etcd (v3.5.0) ... # Verify workspace info $ provisioning workspace info Workspace: production-cluster Path: /Users/Akasha/workspaces/production-cluster Active: Yes Version: 1.0.0 Created: 2025-10-06T10:35:00Z Configuration: Providers: aws, upcloud Platform services: orchestrator, control-center, kms Infrastructure: Count: 0 Path: /Users/Akasha/workspaces/production-cluster/infra ``` ### Step 9: Customize Configuration ```bash # Edit main workspace config $ vim ~/workspaces/production-cluster/config/provisioning.yaml # Update debug settings for production debug: enabled: false # โ† Ensure disabled in production log_level: "warn" # โ† Higher threshold # Update output settings output: format: "json" # โ† JSON for automation file_viewer: "jq" # โ† Better for JSON # Save and validate $ provisioning workspace config validate โœ… Validation passed # Edit AWS provider config $ vim ~/workspaces/production-cluster/config/providers/aws.toml # Update region and credentials [provider] region = "eu-west-1" # โ† European region [credentials] type = "iam_role" # โ† Use IAM role in production # Validate provider config $ provisioning provider validate aws โœ… Validation passed ``` ### Step 10: Create Platform Service Configs ```bash # Create orchestrator config $ cat > ~/workspaces/production-cluster/config/platform/orchestrator.toml << 'EOF' [service] name = "orchestrator" enabled = true [server] host = "0.0.0.0" port = 8080 [workers] count = 4 [queue] max_size = 1000 storage_path = "/Users/Akasha/workspaces/production-cluster/.runtime/queue" EOF # Validate orchestrator config $ provisioning platform validate orchestrator โœ… Validation passed # Create KMS config $ cat > ~/workspaces/production-cluster/config/platform/kms.toml << 'EOF' [kms] enabled = true provider = "aws_kms" [encryption] algorithm = "AES-256-GCM" key_rotation_days = 90 EOF # Validate KMS config $ provisioning platform validate kms โœ… Validation passed ``` ### Step 11: Update Infrastructure Definitions ```bash # Copy existing infrastructure to new workspace $ cp -r provisioning/infra/production-cluster \ ~/workspaces/production-cluster/infra/ # Verify infrastructure $ ls -la ~/workspaces/production-cluster/infra/production-cluster total 32 -rw-r--r-- 1 user staff 1024 Oct 6 10:45 servers.yaml -rw-r--r-- 1 user staff 2048 Oct 6 10:45 taskservs.yaml -rw-r--r-- 1 user staff 1536 Oct 6 10:45 cluster.yaml ``` ### Step 12: Final Validation ```bash # Comprehensive validation $ provisioning workspace config validate --verbose Validating workspace configuration... โœ… Workspace name: production-cluster (valid) โœ… Version: 1.0.0 (valid semver) โœ… Paths configuration: valid โœ… Debug configuration: valid โœ… Output configuration: valid โœ… Provider configuration: valid โœ… Secrets configuration: valid Validating providers... โœ… AWS provider: configured and valid โœ… UpCloud provider: configured and valid Validating platform services... โœ… Orchestrator: configured and valid โœ… KMS: configured and valid Overall: โœ… All validations passed ``` ### Step 13: Test Deployment (Check Mode) ```bash # Test server deployment in check mode $ provisioning --check server create --infra production-cluster Checking server deployment... โœ… Configuration loaded โœ… Provider validated (aws) โœ… Infrastructure definition found โœ… Resource limits checked โœ… Dependencies resolved Would create: โ€ข web-01 (t3.medium, eu-west-1a) โ€ข web-02 (t3.medium, eu-west-1b) โ€ข db-01 (r5.large, eu-west-1a) Dry run complete. Use without --check to deploy. ``` ### Step 14: Clean Up Old Configuration ```bash # Verify everything works with new configuration $ provisioning workspace info $ provisioning --check server list $ provisioning --check taskserv list # All good? Remove old config $ rm provisioning/config/config.defaults.toml $ rm provisioning/config/config.user.toml # Keep backup for reference $ ls -la provisioning/config.backup.* -rw-r--r-- 1 user staff 8192 Oct 6 10:30 config.defaults.toml.backup.20251006-103500 ``` ### Step 15: Update CI/CD Pipeline ```yaml # .gitlab-ci.yml variables: PROVISIONING_WORKSPACE: "production-cluster" stages: - validate - deploy validate: stage: validate script: # Validate all configurations - provisioning workspace config validate - provisioning provider validate --all - provisioning platform validate --all # Run validation tests - nu provisioning/tests/config_validation_tests.nu only: changes: - "workspaces/*/config/**/*" deploy: stage: deploy script: # Deploy with validated configuration - provisioning --check server create --infra production-cluster - provisioning server create --infra production-cluster only: - main when: manual ``` ## Result **Before Migration**: - โŒ Monolithic config file - โŒ No validation - โŒ Hard to manage multiple environments - โŒ Provider configs mixed with core settings **After Migration**: - โœ… Modular workspace structure - โœ… Schema-based validation - โœ… Clear separation of concerns - โœ… Provider configs isolated - โœ… Platform services configurable - โœ… Test suite for validation - โœ… CI/CD integration ready ## Workspace Final State ``` ~/workspaces/production-cluster/ โ”œโ”€โ”€ config/ โ”‚ โ”œโ”€โ”€ provisioning.yaml # โœ… Main config (validated) โ”‚ โ”œโ”€โ”€ providers/ โ”‚ โ”‚ โ”œโ”€โ”€ aws.toml # โœ… AWS config (validated) โ”‚ โ”‚ โ””โ”€โ”€ upcloud.toml # โœ… UpCloud config (validated) โ”‚ โ””โ”€โ”€ platform/ โ”‚ โ”œโ”€โ”€ orchestrator.toml # โœ… Orchestrator (validated) โ”‚ โ””โ”€โ”€ kms.toml # โœ… KMS (validated) โ”œโ”€โ”€ infra/ โ”‚ โ””โ”€โ”€ production-cluster/ # โœ… Infrastructure definitions โ”‚ โ”œโ”€โ”€ servers.yaml โ”‚ โ”œโ”€โ”€ taskservs.yaml โ”‚ โ””โ”€โ”€ cluster.yaml โ”œโ”€โ”€ .cache/ # โœ… Cache directory โ””โ”€โ”€ .runtime/ # โœ… Runtime data ~/Library/Application Support/provisioning/ โ””โ”€โ”€ ws_production-cluster.yaml # โœ… User context ``` ## Commands Reference ### Migration ```bash ./provisioning/scripts/migrate-to-target-configs.nu --workspace-name "production-cluster" --backup ``` ### Validation ```bash provisioning workspace config validate provisioning provider validate aws provisioning platform validate orchestrator ``` ### Testing ```bash nu provisioning/tests/config_validation_tests.nu provisioning --check server list ``` ### Management ```bash provisioning workspace info provisioning workspace list provisioning workspace activate production-cluster ``` ## Success Metrics - โœ… **Migration**: Completed without errors - โœ… **Validation**: All configurations valid - โœ… **Tests**: 6/6 tests passed - โœ… **Operations**: Check mode successful - โœ… **CI/CD**: Pipeline updated and working - โœ… **Documentation**: Team updated ## Lessons Learned 1. **Always dry-run first** - Caught potential path conflicts 2. **Backup is essential** - Easy rollback if needed 3. **Validate early and often** - Caught configuration errors immediately 4. **Test in check mode** - Verified operations before deployment 5. **Document customizations** - Team knows what changed ## Next Steps 1. โœ… Monitor first deployment with new configuration 2. โœ… Train team on new workspace structure 3. โœ… Update runbooks and documentation 4. โœ… Create additional workspaces for staging/dev 5. โœ… Implement workspace templates for new projects