Condensa User Guide
Introduction
Condensa is a powerful VM migration tool designed to facilitate the migration of virtual machines from various platforms (VMware, Nutanix, Sangfor, Windows Server) to Awanio cloud platform. It supports multiple migration methods including hot migration (running VMs), cold migration, and file-based migrations using OVA and VHD/VHDX formats.
- Hot Migration: Migrate running VMs with minimal downtime (VMware only)
- Multi-Provider Support: VMware vSphere, OVA files, VHD/VHDX files
- Changed Block Tracking (CBT): Efficient incremental data transfer for VMware
- Web-Based UI: User-friendly interface for managing migrations
- Real-time Progress Tracking: Monitor migration status and progress
Installation
Before installing Condensa, ensure you have:
-
Awanio Dashboard
- You need to use a user that has Dashboard access privilege
-
Helm (v3.0 or higher)
# Install Helm if not already installed curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
-
Storage Pool configured in your Awanio Dashboard
-
Awanio API Access
- API endpoint URL (e.g.,
https://192.168.1.2/v2
) - Valid credentials for authentication
- API endpoint URL (e.g.,
-
Add the Condensa Helm repository:
helm repo add condensa https://storage.awan.io/assets/charts helm repo update
-
Create a values file (
condensa-values.yaml
):# REQUIRED: Public URL for Condensa (must be accessible by CDI for data imports) publicUrl: "http://condensa.example.com:8080" # REQUIRED: Awanio API configuration awanio: apiEndpoint: "https://192.168.1.2/v2" username: "your-username" password: "your-password" # Image configuration image: repository: registry.awan.io/images/condensa tag: latest pullPolicy: IfNotPresent # Service configuration service: type: LoadBalancer # or NodePort, ClusterIP port: 8080 # Storage configuration persistence: enabled: true storageClass: "standard" # Your storage class size: 100Gi # Storage for uploaded OVA/VHD files # Resource limits resources: requests: memory: "512Mi" cpu: "500m" limits: memory: "2Gi" cpu: "2000m" # Upload directory configuration uploadDir: "/data/uploads" # Namespace for VM migrations migrationNamespace: "vm-migrations"
-
Install Condensa:
# Create namespace kubectl create namespace condensa # Install with custom values helm install condensa condensa/condensa \ --namespace condensa \ --values condensa-values.yaml
-
Verify installation:
# Check pod status kubectl get pods -n condensa # Check service kubectl get svc -n condensa # Get the external IP/URL kubectl get svc condensa -n condensa -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
-
Access the Web UI:
Open your browser and navigate to the Condensa URL:
http://<external-ip>:8080
Parameter | Description | Default | Required |
---|---|---|---|
publicUrl | Public URL accessible by CDI | - | Yes |
awanio.apiEndpoint | Awanio API endpoint | - | Yes |
awanio.username | Awanio username | - | Yes |
awanio.password | Awanio password | - | Yes |
persistence.enabled | Enable persistent storage | true | No |
persistence.size | Storage size for uploads | 100Gi | No |
service.type | Service type | LoadBalancer | No |
uploadDir | Directory for file uploads | /data/uploads | No |
Preparing Source VMs
Proper preparation of source VMs is crucial for successful migration. Requirements vary by provider type.
For VMware vSphere environments, especially for hot migration (migrating running VMs):
- VMware vSphere 6.0 or higher
- VM hardware version 8 or higher
- Administrator access to vCenter
- Thumbprint, the SSL (SHA1) fingerprint of the remote VMware server and it is required when making a remote connection.
The following command will print the thumbprint of a VMware server called SERVER-NAME:
openssl s_client -connect SERVER-NAME:443 </dev/null |
openssl x509 -in /dev/stdin -fingerprint -sha1 -noout
Important: CBT must be enabled BEFORE creating snapshots for migration.
-
Connect to vCenter using vSphere Client
-
Power off the VM (if running):
Right-click VM → Power → Shut Down Guest OS
-
Enable CBT:
- Right-click the VM → Edit Settings
- Click “VM Options” tab
- Expand “Advanced”
- Click “Edit Configuration”
- Add the following parameter:
ctkEnabled = true
- Click OK to save
-
Power on the VM:
Right-click VM → Power → Power On
-
Create a snapshot (REQUIRED after enabling CBT):
Right-click VM → Snapshots → Take Snapshot Name: "Pre-Migration Snapshot" Description: "Snapshot for Condensa migration with CBT enabled"
⚠️ Critical: The snapshot MUST be created AFTER enabling CBT. Snapshots created before CBT enablement will cause migration failure.
-
Verify CBT is active:
- Check VM’s .vmdk files
- You should see
-ctk.vmdk
files for each disk
- Ensure VM Tools are installed and up-to-date
- Clean up unnecessary snapshots before migration
- Verify network connectivity between Condensa and vCenter
- For large VMs, consider scheduling migration during maintenance windows
For migrating VMs from Nutanix AHV:
-
Access Nutanix Prism:
https://<nutanix-cluster-ip>:9440
-
Prepare the VM:
- Shut down the VM gracefully
- Remove any unnecessary snapshots
- Note down VM specifications (CPU, Memory, Disk)
-
Export as OVA:
a. Using Nutanix Move (Recommended):
- Install Nutanix Move on a Windows/Linux machine
- Configure source as Nutanix AHV
- Select VMs to export
- Choose “Export to OVA” option
- Save to local directory
b. Using acli (Nutanix CLI):
# SSH to Nutanix CVM ssh nutanix@<cvm-ip> # List VMs acli vm.list # Export VM acli vm.export <vm-name> format=ova path=/tmp/<vm-name>.ova # Download the OVA file scp nutanix@<cvm-ip>:/tmp/<vm-name>.ova .
-
Verify OVA file:
# Check OVA contents tar -tvf <vm-name>.ova # Should contain: # - .ovf file (VM descriptor) # - .vmdk file(s) (Virtual disks) # - .mf file (Manifest)
For migrating VMs from Sangfor HCI:
-
Access Sangfor HCI Console:
https://<sangfor-hci-ip>
-
Prepare the VM:
- Stop the VM from Sangfor console
- Remove snapshots if any
- Document VM configuration
-
Export Process:
a. Navigate to Virtual Machines section
b. Select the target VM
c. Click More Actions → Export
d. Choose export format:
- Select “OVA” format
- Include all disks
- Include VM configuration
e. Start export:
Export Location: Local Computer or Network Share Format: OVA 1.0 Compression: None (for better compatibility)
f. Download the exported OVA file
-
Post-Export Verification:
# Verify OVA integrity sha256sum <vm-name>.ova # Extract and check OVF descriptor tar -xf <vm-name>.ova *.ovf cat *.ovf # Review VM specifications
For migrating VMs from Hyper-V on Windows Server:
-
Open Hyper-V Manager:
# Run as Administrator virtmgmt.msc
-
Prepare the VM:
# Stop the VM Stop-VM -Name "VMName" # Remove checkpoints (snapshots) Get-VMSnapshot -VMName "VMName" | Remove-VMSnapshot
-
Export the VM:
Method 1: Using Hyper-V Manager GUI
- Right-click VM → Export
- Choose export location
- Wait for export completion
Method 2: Using PowerShell
# Export entire VM Export-VM -Name "VMName" -Path "C:\VMExports" # Or export just the VHD/VHDX $vm = Get-VM -Name "VMName" $vhd = Get-VMHardDiskDrive -VM $vm Copy-Item $vhd.Path -Destination "C:\VMExports\VMName.vhdx"
-
Convert VHDX to VHD if needed (for compatibility):
Convert-VHD -Path "C:\VMExports\VMName.vhdx" ` -DestinationPath "C:\VMExports\VMName.vhd" ` -VHDType Dynamic
-
Prepare metadata file (create
vm-info.json
):{ "name": "VMName", "os_family": "windows", "os_version": "Windows Server 2019", "cpu": 4, "memory_mb": 8192, "disk_size_gb": 100, "architecture": "x86_64" }
# Connect to cluster
Enter-PSSession -ComputerName <cluster-node>
# Export VM
Export-VM -Name "VMName" -Path "\\share\exports"
# Or use Windows Admin Center for GUI export
Setting Up Providers
Providers are the source platforms from which VMs will be migrated. Each provider type requires specific configuration.
-
Login to Condensa Web UI
-
Navigate to Providers:
- Click “Providers” in the main menu
- Click “Add Provider” button
-
Configure VMware Provider:
Provider Type: VMware vSphere Name: vcenter-prod Description: Production vCenter Server Connection Details: - vCenter URL: https://vcenter.example.com - Username: administrator@vsphere.local - Password: ******** - Allow Insecure: No (uncheck for production) Advanced Settings: - Port: 443 - Datacenter: Datacenter-01 (optional, for filtering) - Concurrent Transfers: 4
-
Test Connection:
- Click “Test Connection”
- Verify successful connection
- Review discovered resources
-
Save Provider:
- Click “Save”
- Provider should show “Connected” status
The OVA provider handles file-based migrations using OVA files.
-
Navigate to Providers → Add Provider
-
Configure OVA Provider:
Provider Type: OVA Name: ova-imports Description: OVA File Imports Settings: - Upload Directory: /data/uploads/ova - Max File Size: 500GB - Supported Formats: .ova, .ovf
-
Upload OVA Files:
Option 1: Web UI Upload
- Click “Upload OVA” button
- Select OVA file from local system
- Add VM metadata:
VM Name: imported-vm-01 OS Type: Ubuntu Linux 20.04 CPUs: 4 Memory: 8192 MB
- Click “Upload”
Option 2: CLI Upload (for large files)
# Copy to Condensa pod kubectl cp large-vm.ova condensa/condensa-pod:/data/uploads/ova/ # Or use curl curl -X POST http://condensa.example.com:8080/api/v1/ova/upload \ -H "Authorization: Bearer <token>" \ -F "file=@large-vm.ova" \ -F "metadata=@vm-info.json"
-
Verify Upload:
- Check “OVA Uploads” section
- Verify file integrity
- Review extracted VM specifications
The VHD provider handles migrations from Hyper-V exports.
-
Navigate to Providers → Add Provider
-
Configure VHD Provider:
Provider Type: VHD Name: hyperv-imports Description: Hyper-V VHD Imports Settings: - Upload Directory: /data/uploads/vhd - Supported Formats: .vhd, .vhdx, .avhdx - Auto-convert VHDX: Yes
-
Upload VHD Files:
Step 1: Upload VHD/VHDX
# Web UI for small files (<10GB) Navigate to "VHD Uploads" → "Upload VHD" # For large files, use resumable upload curl -X POST http://condensa.example.com:8080/api/v1/vhd/uploads \ -H "Content-Type: application/json" \ -d '{ "filename": "windows-server.vhdx", "vm_name": "WinServer2019", "os_family": "windows", "os_version": "Windows Server 2019", "num_cpu": 4, "memory_mb": 16384, "disk_size_gb": 200, "architecture": "x86_64" }'
Step 2: Use TUS Protocol for large file upload
# Install tus client npm install -g tus-js-client # Upload using resumable protocol tus-upload windows-server.vhdx \ --endpoint http://condensa.example.com:8080/api/v1/tus \ --metadata filename=d2luZG93cy1zZXJ2ZXIudmhkeA==,vm_id=<vm-uuid>
-
Verify VHD Upload:
- Check processing status
- Verify disk format compatibility
- Review VM specifications
Creating and Running Migrations
Once providers are configured and source VMs are prepared, you can create and execute migrations.
-
Navigate to Migrations → Create Migration
-
Basic Configuration:
Migration Name: prod-to-awanio-batch1 Description: Production VMs migration batch 1 Source Provider: vcenter-prod (or ova-imports, hyperv-imports) Target Namespace: vm-migrations Organization: My Organization
-
Select VMs:
For VMware Provider:
- Browse available VMs
- Use filters:
- Datacenter
- Folder
- Power State
- OS Type
- Select VMs to migrate
- Review VM details (CPU, Memory, Disks)
For OVA Provider:
- Select from uploaded OVA files
- Verify “Ready” status
- Review extracted specifications
For VHD Provider:
- Select from uploaded VHD files
- Verify “Processed” status
- Confirm OS compatibility
-
Migration Settings:
Migration Type: - Hot Migration (VMware only, VM stays running) - Cold Migration (VM powered off first) Network Mapping: - Source Network: VM Network → Target Network: default - Source Network: Management → Target Network: mgmt-net Storage Settings: - Storage Class: fast-ssd - Volume Mode: Filesystem - Access Mode: ReadWriteOnce Advanced Options: - Preserve MAC Addresses: Yes - Start VM after Migration: No - Delete Source after Success: No
-
Review and Create:
- Review migration summary
- Verify resource requirements
- Click “Create Migration”
-
View Migration Details:
Migrations → Select Migration → View Details
-
Pre-flight Checks:
- Verify source connectivity
- Check target namespace exists
- Validate storage availability
- Review network mappings
-
Start Migration:
Option 1: Web UI
- Click “Start Migration” button
- Confirm action in dialog
Option 2: CLI
curl -X POST http://condensa.example.com:8080/api/v1/migrations/<id>/start \ -H "Authorization: Bearer <token>"
-
Migration Phases:
Phase 1: Preparation
- Create target namespace
- Set up DataVolumes
- Initialize transfer jobs
Phase 2: Data Transfer
- For VMware: VDDK transfer with CBT
- For OVA/VHD: HTTP import via CDI
- Progress shown in real-time
Phase 3: Conversion
- Convert disks to QCOW2
- Apply OS optimizations
- Configure drivers
Phase 4: VM Creation
- Create VirtualMachine CR
- Configure networks
- Apply resource limits
Phase 5: Verification
- Verify VM creation
- Check disk attachments
- Validate configuration
-
Real-time Progress:
- View overall progress percentage
- Monitor individual VM status
- Check data transfer rates
- View logs in real-time
-
Progress Indicators:
Overall Progress: 45% VMs Status: - vm-web-01: ✓ Completed (100%) - vm-app-01: ⟳ Transferring (67%) - vm-db-01: ⏸ Queued
-
Log Viewing:
# View migration logs kubectl logs -n condensa condensa-pod -f # View specific VM transfer kubectl get datavolume -n vm-migrations vm-web-01-disk-0 -o yaml
-
Notifications:
- Email alerts on completion
- Webhook notifications
- Slack integration (if configured)
Troubleshooting
Issue: “CBT not enabled” error
Solution:
1. Enable CBT on source VM
2. Create new snapshot AFTER enabling CBT
3. Retry migration
Issue: “Cannot connect to vCenter”
Solution:
1. Verify network connectivity
2. Check firewall rules (port 443)
3. Verify credentials
4. Try with "Allow Insecure" if using self-signed certificates
Issue: “Snapshot not found”
Solution:
1. Create snapshot on source VM
2. Wait for snapshot to consolidate
3. Refresh provider connection
Issue: “Invalid OVF descriptor”
Solution:
1. Verify OVA file integrity:
tar -tvf vm.ova
2. Extract and validate OVF:
tar -xf vm.ova *.ovf
xmllint --noout *.ovf
3. Re-export from source if corrupted
Issue: “Unsupported disk format”
Solution:
1. Convert disk to supported format:
qemu-img convert -f vmdk -O qcow2 disk.vmdk disk.qcow2
2. Repackage OVA with converted disk
Issue: “VHD file corrupted”
Solution:
1. Verify file checksum
2. Re-export from Hyper-V
3. Try converting VHDX to VHD:
Convert-VHD -Path source.vhdx -DestinationPath dest.vhd
Issue: “Metadata missing”
Solution:
1. Create vm-info.json with required fields
2. Upload metadata along with VHD
3. Or update via API after upload
Issue: DataVolume in “Pending” state
# Check DataVolume status
kubectl describe datavolume -n vm-migrations <dv-name>
# Common solutions:
1. Check PVC bound status
2. Verify storage class exists
3. Check available storage capacity
4. Review CDI pod logs:
kubectl logs -n cdi deployment/cdi-deployment
Slow Transfer Rates
Solutions:
1. Enable parallel transfers (VMware)
2. Increase CDI resource limits
3. Use faster storage class
4. Check network bandwidth
5. Schedule during off-peak hours
# Check Condensa logs
kubectl logs -n condensa deployment/condensa -f
# Check migration status
curl http://condensa.example.com:8080/api/v1/migrations/<id>/status
# Check DataVolume progress
kubectl get datavolume -n vm-migrations -w
# Check CDI importer pods
kubectl get pods -n vm-migrations | grep importer
# View importer logs
kubectl logs -n vm-migrations <importer-pod-name>
# Check events
kubectl get events -n vm-migrations --sort-by='.lastTimestamp'
Best Practices
-
Capacity Planning:
- Verify sufficient storage in target cluster
- Plan for 2x disk space during conversion
- Consider network bandwidth requirements
-
VM Preparation:
- Update VM tools/drivers
- Clean up unnecessary files
- Consolidate snapshots
- Document VM dependencies
-
Testing:
- Test with non-critical VMs first
- Verify migration process end-to-end
- Document recovery procedures
-
Batch Processing:
- Migrate VMs in logical groups
- Start with less critical workloads
- Monitor resource utilization
-
Network Considerations:
- Use dedicated migration network if possible
- Configure appropriate bandwidth limits
- Plan for network maintenance windows
-
Monitoring:
- Watch transfer rates
- Monitor source system load
- Check target cluster resources
-
Verification:
- Verify VM functionality
- Test application connectivity
- Validate performance metrics
-
Cleanup:
- Remove successful migration DataVolumes
- Clean up source snapshots
- Archive migration logs
-
Documentation:
- Document migration issues
- Update runbooks
- Record performance metrics
-
Credentials:
- Use service accounts for providers
- Rotate credentials regularly
- Implement RBAC policies
-
Network Security:
- Use TLS for all connections
- Implement network policies
- Restrict access to Condensa
-
Data Protection:
- Encrypt data in transit
- Secure upload directories
- Implement retention policies
Appendix
Source Platform | Migration Type | Requirements |
---|---|---|
VMware vSphere 6.0+ | Hot/Cold | CBT, Snapshots |
Nutanix AHV | OVA Export | OVA 1.0/2.0 |
Sangfor HCI | OVA Export | OVA 1.0 |
Hyper-V 2012+ | VHD Export | VHD/VHDX |
Azure Stack HCI | VHD Export | VHD/VHDX |
Key API endpoints for automation:
# Provider Management
GET /api/v1/providers
POST /api/v1/providers
DELETE /api/v1/providers/{id}
# Migration Management
GET /api/v1/migrations
POST /api/v1/migrations
POST /api/v1/migrations/{id}/start
POST /api/v1/migrations/{id}/cancel
GET /api/v1/migrations/{id}/status
# Upload Management
POST /api/v1/ova/upload
POST /api/v1/vhd/uploads
GET /api/v1/uploads/status
Configure Condensa using environment variables:
CONDENSA_PUBLIC_URL=http://condensa.example.com:8080
CONDENSA_UPLOAD_DIR=/data/uploads
AWANIO_API=https://api.awanio.com/v2
DB_PATH=/data/condensa.db
PORT=8080
- Documentation: https://gitlab.com/awan.io/condensa
- Issue Tracker: https://gitlab.com/awan.io/condensa/issues
- Community Support: support@awan.io
- Enterprise Support: Available with Awanio subscription
Last Updated: 2025 Version: 0.1.0