Rebuild an application delivery estate — F5 BIG-IP, Citrix NetScaler, A10 Thunder, Kemp, Radware Alteon, or NGINX — onto VMware NSX ALB (AVI) or F5 BIG-IP, object-by-object, through a review-and-deploy migration plan that translates virtual servers, pools, monitors, and SSL profiles for you.
Consolidating an application delivery estate is a per-object slog: every virtual server has a pool, the pool has members and a load-balancing method, a health monitor, maybe a persistence profile, and — on anything fronting HTTPS — an SSL/TLS profile with a cipher string and a certificate. Doing that by hand across hundreds of virtual servers is where migrations stall.
Versus turns that into a migration plan: you point it at a source load balancer, it reads the normalized inventory Versus already holds for that device, translates each virtual server into the target platform's object model, shows you the projected build side-by-side with the source, and — for AVI targets — provisions it through the workflow engine with an approval gate. The two supported targets are VMware NSX ALB (AVI) and F5 BIG-IP.
A migration plan works at two granularities at once: object-by-object (virtual server → pool → members → monitor → persistence → SSL profile) and device-by-device (one plan sources from one device; run several plans to consolidate an estate onto one target).
Supported source vendors — detected from the device's vendor field in inventory:
| Source | Notes |
|---|---|
| A10 Thunder | Deepest fidelity — live SSL templates, cipher normalization, aFleX classification, persistence |
| Kemp LoadMaster | SubVS / content rules surfaced as migration notes |
| Citrix NetScaler | Content-switching and rewrite/responder policies surfaced as notes |
| F5 BIG-IP | iRules and iApp-owned objects surfaced as notes |
| Radware Alteon | AppShape++ scripts surfaced as notes |
| NGINX | location/upstream config surfaced as notes |
Supported target platforms:
| Target | Key | What the plan does |
|---|---|---|
| VMware NSX ALB (AVI) | avi | Translate and provision (pools, virtual services, monitors, SSL profiles) via the migration workflow |
| F5 BIG-IP | f5 | Translate and produce a projected LTM build plan + checklist for review |
The source inventory is the same normalized VirtualServer / Pool / Monitor model every Versus collector populates, which is why one translation core works across vendors — the source is already normalized before the converter ever runs.
At the heart of the feature is a small, pure converter (adc_migrate.convert_vs) with no database or network side effects. It takes one normalized virtual server plus the target platform and vendor, and returns a four-part result:
convert_vs(vs, target_platform='avi', source_vendor='netscaler', target_settings={...})
# ->
{
'source': { name, destination, port, protocol, vendor, pool_count },
'target': { ...projected AVI or F5 objects... },
'checklist': [ { step, label, status, detail }, ... ],
'migration_notes': [ "Rewrite/Responder policies -> AVI DataScript or F5 iRule", ... ],
}
Load-balancing method maps from the source token to the target's enum. For AVI:
| Source method | AVI algorithm |
|---|---|
round-robin, ratio* | LB_ALGORITHM_ROUND_ROBIN |
least-connections* | LB_ALGORITHM_LEAST_CONNECTIONS |
fastest* | LB_ALGORITHM_FASTEST_RESPONSE |
observed, predictive | LB_ALGORITHM_LEAST_LOAD |
source-ip | LB_ALGORITHM_CONSISTENT_HASH |
For an F5 target the method is carried through as the F5 loadBalancingMode string directly.
Health monitors map by type — for AVI, to the built-in system monitors (System-HTTP, System-HTTPS, System-TCP, System-UDP, System-Ping); for F5, to the native monitor templates (http, https, tcp, gateway_icmp, udp, tcp_half_open). When a source monitor lands on a built-in, its checklist step is marked done — there is nothing to create.
SSL detection keys off the port and protocol: a virtual server on 443/8443 gets an SSL-enabled service and a secure application profile (AVI System-Secure-HTTP, or an F5 clientssl profile). Otherwise the converter picks an HTTP or L4 profile based on protocol.
For an AVI target, the converter emits a virtual_service (VIP, service port, application profile, cloud, SE-group, tenant) and a pool (name, lb_algorithm, health_monitor_refs, servers):
{
"virtual_service": {
"name": "web-app-vs",
"vip": [{ "ip_address": "10.20.0.50" }],
"services": [{ "port": 443, "enable_ssl": true }],
"application_profile_ref": "System-Secure-HTTP",
"cloud_ref": "Default-Cloud",
"se_group_ref": "Default-Group",
"tenant": "admin"
},
"pool": {
"name": "web-app-vs-pool",
"lb_algorithm": "LB_ALGORITHM_LEAST_CONNECTIONS",
"health_monitor_refs": ["System-HTTPS"],
"servers": [{ "ip": "10.30.0.11", "port": 443, "enabled": true }]
}
}
For an F5 target it emits an ltm virtual + ltm pool shaped for iControl REST — destination /{partition}/{vip}:{port}, profiles (http, clientssl, or fastL4), pool loadBalancingMode, monitor, and members as ip:port strings — using the plan's f5_partition and f5_route_domain.
Whatever isn't a clean 1:1 translation is surfaced as a migration note rather than silently dropped or guessed. These are keyed by source vendor — for example, an F5 source flags "Review iRules — port to AVI DataScripts (→AVI) or keep as iRules (→F5)" and "Check iApp-owned objects — detach before migrating"; a NetScaler source flags content-switching vservers and rewrite/responder policies. A virtual server with no pool is always flagged for manual review. The notes are the honest edge of the tool: it translates the structural 90% and tells you exactly what needs a human decision.
A migration is a MigrationPlan (plan type Legacy ADC / adc_to_avi) with one MigrationItem per source virtual server. You work with it from Workflows → Migrations in the UI, or over the API under /api/devices/migration-plans/.
Create a plan naming the source_device, the target_device, and target_platform (avi or f5). Then pull in the source virtual servers — populate_items reads them straight from the normalized inventory:
POST /api/devices/migration-plans/{id}/populate_items/
{ "default_se_group": "Prod-SE-Group", "default_cloud": "Default-Cloud" }
Each imported item carries the source VS name, IP, port, protocol, and its pool members. You can restrict the import with include_vs_names.
Every item has target-name fields you can override — target_name, target_pool_name, target_hm_name, target_client_ssl_name, target_server_ssl_name, target_persist_name, target_app_profile_name, target_vip, target_se_group, target_cloud. A naming convention can generate these consistently. If you use a source device that shares SSL templates across virtual servers (common on A10), sync_shared_ssl collapses them so provisioning creates one shared AVI profile instead of duplicates.
The review_detail endpoint returns the full per-VS comparison: source config beside projected target objects, the per-object checklist, and migration notes.
GET /api/devices/migration-plans/{id}/review_detail/
For an A10 source this fetches SSL templates, health-monitor names, and persistence templates live from the device so ciphers and certificate names are accurate. For other source vendors it renders the structural conversion. For an F5 target it returns the projected LTM build for each item. Where the source is an A10, a vs-status call adds a live up/down pill per virtual server, so you can see operational state at every step.
If items don't already have a target_vip, the plan can allocate one per item from IPAM during the run. Set each item's vip_network (a CIDR) and an ipam_device on the plan; the allocation step calls Infoblox or BlueCat to reserve the next free address and records the allocation reference for later cleanup.
Execution runs as a standard Versus workflow — the built-in ADC Migration (Kemp/A10 → AVI) definition (slug adc-migration) — with the plan id passed in as migration_plan_id. Its sections are:
Validate Plan -> [Approve] -> Allocate VIPs -> Provision AVI -> Finalise
migrated. Port-80 companions of a port-443 VIP are detected and folded into the SSL virtual service automatically.completed or failed.Because it's an ordinary workflow run, you drive it exactly like any other automation — trigger it, watch it section-by-section, approve the gate, and retry a failed step — from the UI or the Workflow API. Run the Provision step with dry_run enabled first to log everything it would create without touching the target.
Each item advances through pending → ready → migrated (or failed / skipped), so the plan is a durable, resumable record of exactly what was built.
ADC migration is not a standalone tool — it stands on the rest of Versus:
VirtualServer / Pool / Monitor inventory the collectors already keep current; live device calls are only made to fetch vendor bodies the normalized model doesn't carry (A10 SSL cipher templates, aFleX bodies).The result is that consolidating onto AVI or F5 becomes a reviewable, approvable, resumable change instead of a spreadsheet and a long weekend.