Migrate Legacy CE Sites to New Secure Mesh v2
Objective
This document will guide you with the steps to migrate legacy Customer Edge (CE) sites to new Secure Mesh v2 site.
Introduction
A new workflow for deploying Customer Edge (CE) sites has been introduced and is now Generally Available (GA). This workflow provides a simplified experience to deploy Customer Edges (CEs) anywhere. Therefore, it is recommended to use this new workflow for all CE deployments. We also recommend migrating existing CE sites to new Secure Mesh v2 site.
To ensure the services running on legacy CE sites are migrated fully to the new Secure Mesh v2 site, we have created a Migration Helper Utility that will help query the objects configured on the older CE site and provide it as a CSV output. Using this CSV output, customers can ensure that all services are fully moved to the new Secure Mesh v2 site.
In essence, this utility will help customers with two phases of CE site migration:
- Site Services Inventory: Get a snapshot of all the LBs/services running on the old site.
- Service Migration Audit: Verify that all the services from the snapshot captured during
Site Services Inventory
are moved over to the new site.
Note: This migration utility will not automatically migrate your legacy CE sites to new Secure Mesh v2 site. You will have to deploy the new Secure Mesh v2 site separately. This utility will provide you an inventory of objects configured on your Legacy Site, which you can use to check that all your services are migrated to new Secure Mesh v2 site.
Migration Helper Utility
Utility Setup
Clone Utility from the Repo
- git clone using https://github.com/f5devcentral/f5xc-site-query
Installation
-
Please ensure you are running python version 3.13.2
-
Create a Python Virtual Environment:
python3 -m venv myenv
-
Source the new environment:
source myenv/bin/activate
-
Install required python modules:
python3 -m pip install -r requirements.txt
Copied!
Credentials - Create an API Token for Your Tenant
-
Sign in to the F5 XC Console with Administrative privileges and navigate to
Administration
. -
Under
Personal Management
selectCredentials
. Then clickAdd Credentials
to create an API Token credential type with appropriate expiry date.

Figure: Add Credentials
- Save the generated API Token for the next step.

Figure: Copy API TOken
Define Environment Variables
-
Set environment variables with the API URL and the generated API Token.
Note: Replace the
<tenant>
below with your tenant's name. Alternatively, you can set command line options instead when running the script.export f5xc_api_url="https://<tenant>.console.ves.volterra.io/api" export f5xc_api_token="............................"
Copied!
Now that the utility is set up to run properly in your environment, let's walk through migration steps to be followed:
Migration Steps
Step 1: Getting inventory of an old site.
Before getting started with the site migration the first step is to collect a snapshot of all objects referencing the old site. For example, an object can be a load balancer. Using the utility get-sites.py
, get inventory of the legacy CE site.
In this example, we are doing migration from SMSv1 called f5xc-vmware-site
to SMSv2 f5xc-vmware-site-v2
with apps in namespace migration
.
Refer to the images below to view the state before migration:
LB Configuration:

Figure: LB Configuration before Migration
Origin Pool Configuration:

Figure: Origin Pool before Migration
Run the Migration Utility:
(myenv) WRW-ML-00044669:f5xc-site-query grygiel$ ./get-sites.py -f ./get-sites-ns-migration.json -s f5xc-vmware-site -n migration -q --log-stdout
2025-01-16 12:46:27 - INFO - Application get-sites.py started...
2025-01-16 12:46:27 - INFO - API URL: https://playground.console.ves.volterra.io/api -- Processing Namespace: migration
2025-01-16 12:46:28 - INFO - Prepare load balancer query...
2025-01-16 12:46:29 - INFO - process_load_balancers get item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/http_loadbalancers/pg-lb1 ...
2025-01-16 12:46:29 - INFO - process_load_balancers got item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/http_loadbalancers/pg-lb1 ...
2025-01-16 12:46:29 - INFO - process_load_balancers add data: [namespace: migration loadbalancer: pg-lb1 site_type: site site_name: f5xc-vmware-site]
2025-01-16 12:46:29 - INFO - Prepare proxies query...
2025-01-16 12:46:29 - INFO - Prepare origin pools query...
2025-01-16 12:46:30 - INFO - process_origin_pools get item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/origin_pools/pg-origin1 ...
2025-01-16 12:46:30 - INFO - process_origin_pools got item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/origin_pools/pg-origin1 ...
2025-01-16 12:46:30 - INFO - process_origin_pools add data: [namespace: migration proxy: pg-origin1 site_type: site site_name: f5xc-vmware-site]
2025-01-16 12:46:30 - INFO - process_origin_pools add data: [namespace: migration proxy: pg-origin1 site_type: site site_name: f5xc-vmware-site]
2025-01-16 12:46:30 - INFO - process_sites get all sites from https://playground.console.ves.volterra.io/api/config/namespaces/system/sites
2025-01-16 12:46:30 - INFO - process_sites add label information to site f5xc-vmware-site
2025-01-16 12:46:30 - INFO - process_sites <0> sites with origin pools only
2025-01-16 12:46:30 - INFO - process_sites <0> sites without labels (orphaned)
2025-01-16 12:46:30 - INFO - Prepare site details query...
Output of the migration utility for new SMSv2 site:
(myenv) WRW-ML-00044669:f5xc-site-query grygiel$ cat get-sites-ns-migration.json
{
"site": {
"f5xc-vmware-site": {
"namespaces": {
"migration": {
"loadbalancer": {
"http": {
"pg-lb1": {
"spec": {
"domains": [
"example.com"
],
"https_auto_cert": {
"http_redirect": false,
"add_hsts": false,
"tls_config": {
"default_security": {}
},
"no_mtls": {},
"default_header": {},
"enable_path_normalize": {},
"port": 443,
"non_default_loadbalancer": {},
"header_transformation_type": {
"legacy_header_transformation": {}
},
"connection_idle_timeout": 120000,
"http_protocol_options": {
"http_protocol_enable_v1_v2": {}
},
"coalescing_options": {
"default_coalescing": {}
}
},
"downstream_tls_certificate_expiration_timestamps": [],
"advertise_custom": {
"advertise_where": [
{
"site": {
"network": "SITE_NETWORK_INSIDE_AND_OUTSIDE",
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site"
},
"ip": "",
"ipv6": ""
},
"use_default_port": {}
}
]
},
"default_route_pools": [
{
"pool": {
"tenant": "playground-urxgwtyy",
"namespace": "migration",
"name": "pg-origin1"
},
"weight": 1,
"priority": 1,
"endpoint_subsets": {}
}
],
"origin_server_subset_rule_list": null,
"routes": [],
"cors_policy": null,
"disable_waf": {},
"add_location": true,
"no_challenge": {},
"more_option": null,
"user_id_client_ip": {},
"api_rate_limit_legacy": null,
"disable_rate_limit": {},
"malicious_user_mitigation": null,
"waf_exclusion_rules": [],
"data_guard_rules": [],
"blocked_clients": [],
"trusted_clients": [],
"api_protection_rules": null,
"ddos_mitigation_rules": [],
"service_policies_from_namespace": {},
"round_robin": {},
"disable_trust_client_ip_headers": {},
"disable_malicious_user_detection": {},
"disable_api_discovery": {},
"disable_bot_defense": {},
"default_sensitive_data_policy": {},
"disable_api_definition": {},
"disable_ip_reputation": {},
"disable_client_side_defense": {},
"csrf_policy": null,
"graphql_rules": [],
"protected_cookies": [],
"host_name": "",
"dns_info": [],
"state": "VIRTUAL_HOST_PENDING_A_RECORD",
"auto_cert_info": {
"auto_cert_state": "PreDomainChallengePending",
"auto_cert_expiry": null,
"auto_cert_subject": "",
"auto_cert_issuer": "",
"dns_records": [
{
"name": "_acme-challenge.example.com",
"type": "CNAME",
"value": "6333dc275a6d5338831d84a33c187c2f.autocerts.ves.volterra.io"
}
],
"state_start_time": null
},
"internet_vip_info": [],
"system_default_timeouts": {},
"jwt_validation": null,
"disable_threat_mesh": {},
"l7_ddos_action_default": {},
"cert_state": "PreDomainChallengePending",
"sensitive_data_disclosure_rules": null,
"disable_malware_protection": {}
},
"metadata": {
"name": "pg-lb1",
"namespace": "migration",
"labels": {},
"annotations": {},
"description": "",
"disable": false
},
"system_metadata": {
"uid": "992bc501-4742-425f-83ce-b02ba3aac0b0",
"creation_timestamp": "2025-01-16T11:45:05.606971845Z",
"deletion_timestamp": null,
"modification_timestamp": "2025-01-17T10:12:49.417148690Z",
"initializers": null,
"finalizers": [],
"tenant": "playground-urxgwtyy",
"creator_class": "prism",
"creator_id": "p.grygiel@ves.io",
"object_index": 0,
"owner_view": null,
"labels": {}
}
}
}
},
"origin_pools": {
"pg-origin1": {
"spec": {
"origin_servers": [
{
"private_ip": {
"ip": "10.1.1.100",
"site_locator": {
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site"
}
},
"inside_network": {}
},
"labels": {}
},
{
"private_ip": {
"ip": "10.1.1.101",
"site_locator": {
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site"
}
},
"inside_network": {}
},
"labels": {}
}
],
"no_tls": {},
"port": 443,
"same_as_endpoint_port": {},
"healthcheck": [],
"loadbalancer_algorithm": "LB_OVERRIDE",
"endpoint_selection": "LOCAL_PREFERRED",
"advanced_options": null
},
"metadata": {
"name": "pg-origin1",
"namespace": "migration",
"labels": {},
"annotations": {},
"description": "",
"disable": false
},
"system_metadata": {
"uid": "bf5583d9-94e3-4bbb-a23a-88a17edd491d",
"creation_timestamp": "2025-01-16T11:43:00.588929962Z",
"deletion_timestamp": null,
"modification_timestamp": "2025-01-17T10:12:39.770893834Z",
"initializers": null,
"finalizers": [],
"tenant": "playground-urxgwtyy",
"creator_class": "prism",
"creator_id": "p.grygiel@ves.io",
"object_index": 0,
"owner_view": null,
"labels": {}
}
}
}
}
},
"labels": {
"domain": "",
"host-os-version": "rhel-9-2023-29",
"hw-model": "vmware-virtual-platform",
"hw-serial-number": "vmware-42-36-dd-4c-d4-cc-10-f8-dd-1b-4e-92-e3-19-ae-43",
"hw-vendor": "vmware-inc",
"hw-version": "none",
"ves.io/provider": "ves-io-VMWARE",
"ves.io/siteType": "ves-io-ce"
},
"hw_info": {
"os": {
"name": "Red Hat Enterprise Linux 9.2023.29.2 (Plow)",
"vendor": "rhel",
"version": "9.2023.29",
"release": "8.9",
"architecture": "amd64"
},
"product": {
"name": "VMware Virtual Platform",
"vendor": "VMware, Inc.",
"version": "None",
"serial": "VMware-42 36 dd 4c d4 cc 10 f8-dd 1b 4e 92 e3 19 ae 43"
},
"board": {
"name": "440BX Desktop Reference Platform",
"vendor": "Intel Corporation",
"version": "None",
"serial": "None",
"asset_tag": ""
},
"chassis": {
"type": 1,
"vendor": "No Enclosure",
"version": "N/A",
"serial": "None",
"asset_tag": "No Asset Tag"
},
"bios": {
"vendor": "Phoenix Technologies LTD",
"version": "6.00",
"date": "11/12/2020"
},
"cpu": {
"vendor": "GenuineIntel",
"model": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
"speed": 2400,
"cache": 16896,
"cpus": 4,
"cores": 4,
"threads": 4,
"flags": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xsaves arat pku ospke md_clear flush_l1d arch_capabilities"
},
"memory": {
"type": "DRAM",
"speed": 0,
"size_mb": 16384
},
"storage": [
{
"name": "sda",
"driver": "sd",
"vendor": "VMware",
"model": "Virtual disk",
"serial": "",
"size_gb": 42
}
],
"network": [],
"kernel": {
"release": "5.14.0-284.30.1.el9_2.x86_64",
"version": "#1 SMP PREEMPT_DYNAMIC Fri Aug 25 09:13:12 EDT 2023",
"architecture": "x86_64"
},
"usb": [],
"gpu": null,
"numa_nodes": 0
}
}
},
"virtual_site": {},
"namespaces": [
"migration"
],
"sites_with_origin_pools_only": [],
"orphaned_sites": []
}
Convert the output to CSV:
(myenv) WRW-ML-00044669:f5xc-site-query grygiel$ ./get-sites.py -f ./get-sites-ns-migration.json -c inventory.csv --log-stdout
2025-01-16 12:49:56 - INFO - Application get-sites.py started...
2025-01-16 12:49:56 - INFO - API URL: https://playground.console.ves.volterra.io/api -- Processing Namespace: ALL
2025-01-16 12:49:56 - INFO - Processing 21 available namespaces
2025-01-16 12:49:56 - INFO - write_csv_inventory started...
2025-01-16 12:49:56 - INFO - 1 site and 0 virtual site read from ./get-sites-ns-migration.json
2025-01-16 12:49:56 - INFO - write_csv_inventory -> Done
2025-01-16 12:49:56 - INFO - Application get-sites.py finished
View the inventory CSV in excel:

Figure: View the Inventory CSV in Excel
Step 2: Create a new Secure Mesh v2 site.
Looking at the infrastructure resources from the get-sites-ns-migration.json
we got from Step 1, create a new Secure Mesh v2 site having identical resources as the legacy CE site (f5xc-vmware-site
) in this example.
For example, we have created a SMSv2 site in VMware f5xc-vmware-site-v2
using steps provided in here.
Step 3: Move configuration objects to the new Secure Mesh v2 site.
Here you will be doing manual migration of HTTP LB pg-lb1 from f5xc-vmware-site
to SMSv2 f5xc-vmware-site-v2
.
Refer to the images below to view the state after migration.
LB Configuration:

Figure: LB Configuration after Migration
Origin Pool Configuration:
Here you will be doing manual migration of Origin pool pg-origin1 from f5xc-vmware-site
to SMSv2 f5xc-vmware-site-v2
.

Figure: Origin Pool Configuration after Migration
Once the objects are manually migrated to new site, use the migration utility to get inventory of objects on new Secure Mesh v2 site.
Run the migration utility on new SMSv2 site:
(myenv) WRW-ML-00044669:`f5xc-site-query grygiel$ ./get-sites.py -f ./get-sites-ns-migration-after.json -s f5xc-vmware-site-v2 -n migration -q --log-stdout`
2025-01-17 11:26:50 - INFO - Application get-sites.py started...
2025-01-17 11:26:50 - INFO - API URL: https://playground.console.ves.volterra.io/api -- Processing Namespace: migration
2025-01-17 11:26:51 - INFO - Prepare load balancer query...
2025-01-17 11:26:51 - INFO - process_load_balancers get item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/http_loadbalancers/pg-lb1 ...
2025-01-17 11:26:51 - INFO - process_load_balancers got item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/http_loadbalancers/pg-lb1 ...
2025-01-17 11:26:51 - INFO - process_load_balancers add data: [namespace: migration loadbalancer: pg-lb1 site_type: site site_name: f5xc-vmware-site-v2]
2025-01-17 11:26:51 - INFO - Prepare proxies query...
2025-01-17 11:26:52 - INFO - Prepare origin pools query...
2025-01-17 11:26:52 - INFO - process_origin_pools get item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/origin_pools/pg-origin1 ...
2025-01-17 11:26:52 - INFO - process_origin_pools got item: https://playground.console.ves.volterra.io/api/config/namespaces/migration/origin_pools/pg-origin1 ...
2025-01-17 11:26:52 - INFO - process_origin_pools add data: [namespace: migration proxy: pg-origin1 site_type: site site_name: f5xc-vmware-site-v2]
2025-01-17 11:26:52 - INFO - process_origin_pools add data: [namespace: migration proxy: pg-origin1 site_type: site site_name: f5xc-vmware-site-v2]
2025-01-17 11:26:52 - INFO - process_sites get all sites from https://playground.console.ves.volterra.io/api/config/namespaces/system/sites
2025-01-17 11:26:52 - INFO - process_sites add label information to site f5xc-vmware-site-v2
2025-01-17 11:26:52 - INFO - process_sites <0> sites with origin pools only
2025-01-17 11:26:52 - INFO - process_sites <0> sites without labels (orphaned)
Output of the migration utility:
(myenv) WRW-ML-00044669:f5xc-site-query grygiel$ cat get-sites-ns-migration-after.json
{
"site": {
"f5xc-vmware-site-v2": {
"namespaces": {
"migration": {
"loadbalancer": {
"http": {
"pg-lb1": {
"spec": {
"domains": [
"example.com"
],
"https_auto_cert": {
"http_redirect": false,
"add_hsts": false,
"tls_config": {
"default_security": {}
},
"no_mtls": {},
"default_header": {},
"enable_path_normalize": {},
"port": 443,
"non_default_loadbalancer": {},
"header_transformation_type": {
"legacy_header_transformation": {}
},
"connection_idle_timeout": 120000,
"http_protocol_options": {
"http_protocol_enable_v1_v2": {}
},
"coalescing_options": {
"default_coalescing": {}
}
},
"downstream_tls_certificate_expiration_timestamps": [],
"advertise_custom": {
"advertise_where": [
{
"site": {
"network": "SITE_NETWORK_INSIDE_AND_OUTSIDE",
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site-v2"
},
"ip": "",
"ipv6": ""
},
"use_default_port": {}
}
]
},
"default_route_pools": [
{
"pool": {
"tenant": "playground-urxgwtyy",
"namespace": "migration",
"name": "pg-origin1"
},
"weight": 1,
"priority": 1,
"endpoint_subsets": {}
}
],
"origin_server_subset_rule_list": null,
"routes": [],
"cors_policy": null,
"disable_waf": {},
"add_location": true,
"no_challenge": {},
"more_option": null,
"user_id_client_ip": {},
"api_rate_limit_legacy": null,
"disable_rate_limit": {},
"malicious_user_mitigation": null,
"waf_exclusion_rules": [],
"data_guard_rules": [],
"blocked_clients": [],
"trusted_clients": [],
"api_protection_rules": null,
"ddos_mitigation_rules": [],
"service_policies_from_namespace": {},
"round_robin": {},
"disable_trust_client_ip_headers": {},
"disable_malicious_user_detection": {},
"disable_api_discovery": {},
"disable_bot_defense": {},
"default_sensitive_data_policy": {},
"disable_api_definition": {},
"disable_ip_reputation": {},
"disable_client_side_defense": {},
"csrf_policy": null,
"graphql_rules": [],
"protected_cookies": [],
"host_name": "",
"dns_info": [],
"state": "VIRTUAL_HOST_PENDING_A_RECORD",
"auto_cert_info": {
"auto_cert_state": "PreDomainChallengePending",
"auto_cert_expiry": null,
"auto_cert_subject": "",
"auto_cert_issuer": "",
"dns_records": [
{
"name": "_acme-challenge.example.com",
"type": "CNAME",
"value": "6333dc275a6d5338831d84a33c187c2f.autocerts.ves.volterra.io"
}
],
"state_start_time": null
},
"internet_vip_info": [],
"system_default_timeouts": {},
"jwt_validation": null,
"disable_threat_mesh": {},
"l7_ddos_action_default": {},
"cert_state": "PreDomainChallengePending",
"sensitive_data_disclosure_rules": null,
"disable_malware_protection": {}
},
"metadata": {
"name": "pg-lb1",
"namespace": "migration",
"labels": {},
"annotations": {},
"description": "",
"disable": false
},
"system_metadata": {
"uid": "992bc501-4742-425f-83ce-b02ba3aac0b0",
"creation_timestamp": "2025-01-16T11:45:05.606971845Z",
"deletion_timestamp": null,
"modification_timestamp": "2025-01-17T10:26:28.181519685Z",
"initializers": null,
"finalizers": [],
"tenant": "playground-urxgwtyy",
"creator_class": "prism",
"creator_id": "p.grygiel@ves.io",
"object_index": 0,
"owner_view": null,
"labels": {}
}
}
}
},
"origin_pools": {
"pg-origin1": {
"spec": {
"origin_servers": [
{
"private_ip": {
"ip": "10.1.1.100",
"site_locator": {
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site-v2"
}
},
"inside_network": {}
},
"labels": {}
},
{
"private_ip": {
"ip": "10.1.1.101",
"site_locator": {
"site": {
"tenant": "playground-urxgwtyy",
"namespace": "system",
"name": "f5xc-vmware-site-v2"
}
},
"inside_network": {}
},
"labels": {}
}
],
"no_tls": {},
"port": 443,
"same_as_endpoint_port": {},
"healthcheck": [],
"loadbalancer_algorithm": "LB_OVERRIDE",
"endpoint_selection": "LOCAL_PREFERRED",
"advanced_options": null
},
"metadata": {
"name": "pg-origin1",
"namespace": "migration",
"labels": {},
"annotations": {},
"description": "",
"disable": false
},
"system_metadata": {
"uid": "bf5583d9-94e3-4bbb-a23a-88a17edd491d",
"creation_timestamp": "2025-01-16T11:43:00.588929962Z",
"deletion_timestamp": null,
"modification_timestamp": "2025-01-17T10:25:49.393744125Z",
"initializers": null,
"finalizers": [],
"tenant": "playground-urxgwtyy",
"creator_class": "prism",
"creator_id": "p.grygiel@ves.io",
"object_index": 0,
"owner_view": null,
"labels": {}
}
}
}
}
},
"labels": {
"domain": "",
"host-os-version": "rhel-9-2024-40",
"hw-model": "vmware-virtual-platform",
"hw-serial-number": "vmware-42-24-d2-dc-5b-57-71-20-bc-05-31-8a-1b-5f-a0-ba",
"hw-vendor": "vmware-inc",
"hw-version": "none",
"ves.io/provider": "ves-io-VMWARE",
"ves.io/siteType": "ves-io-ce"
},
"hw_info": {
"os": {
"name": "Red Hat Enterprise Linux 9.2024.40.4 (Plow)",
"vendor": "rhel",
"version": "9.2024.40",
"release": "9.5",
"architecture": "amd64"
},
"product": {
"name": "VMware Virtual Platform",
"vendor": "VMware, Inc.",
"version": "None",
"serial": "VMware-42 24 d2 dc 5b 57 71 20-bc 05 31 8a 1b 5f a0 ba"
},
"board": {
"name": "440BX Desktop Reference Platform",
"vendor": "Intel Corporation",
"version": "None",
"serial": "None",
"asset_tag": ""
},
"chassis": {
"type": 1,
"vendor": "No Enclosure",
"version": "N/A",
"serial": "None",
"asset_tag": "No Asset Tag"
},
"bios": {
"vendor": "Phoenix Technologies LTD",
"version": "6.00",
"date": "12/09/2019"
},
"cpu": {
"vendor": "GenuineIntel",
"model": "Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz",
"speed": 2200,
"cache": 14080,
"cpus": 4,
"cores": 4,
"threads": 4,
"flags": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 smep bmi2 invpcid rdseed adx smap clflushopt clwb arat md_clear flush_l1d arch_capabilities"
},
"memory": {
"type": "DRAM",
"speed": 0,
"size_mb": 16384
},
"storage": [
{
"name": "sda",
"driver": "sd",
"vendor": "VMware",
"model": "Virtual disk",
"serial": "",
"size_gb": 83
}
],
"network": [
{
"name": "ens192",
"driver": "vmxnet3",
"ip_address": [],
"mac_address": "00:50:56:a4:8c:de",
"port": "",
"speed": 0,
"link_quality": "QUALITY_UNKNOWN",
"link_type": "LINK_TYPE_UNKNOWN"
},
{
"name": "ens224",
"driver": "vmxnet3",
"ip_address": [],
"mac_address": "00:50:56:a4:c5:e2",
"port": "",
"speed": 0,
"link_quality": "QUALITY_UNKNOWN",
"link_type": "LINK_TYPE_UNKNOWN"
}
],
"kernel": {
"release": "5.14.0-427.37.1.el9_4.x86_64",
"version": "#1 SMP PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024",
"architecture": "x86_64"
},
"usb": [],
"gpu": null,
"numa_nodes": 1
}
}
},
"virtual_site": {},
"namespaces": [
"migration"
],
"sites_with_origin_pools_only": [],
"orphaned_sites": []
}
Convert the above output to CSV:
(myenv) WRW-ML-00044669:f5xc-site-query grygiel$ ./get-sites.py -f ./get-sites-ns-migration-after.json -c inventory-after.csv --log-stdout
2025-01-17 11:28:16 - INFO - Application get-sites.py started...
2025-01-17 11:28:16 - INFO - API URL: https://playground.console.ves.volterra.io/api -- Processing Namespace: ALL
2025-01-17 11:28:17 - INFO - Processing 21 available namespaces
2025-01-17 11:28:17 - INFO - write_csv_inventory started...
2025-01-17 11:28:17 - INFO - 1 site and 0 virtual site read from ./get-sites-ns-migration-after.json
2025-01-17 11:28:17 - INFO - write_csv_inventory -> Done
2025-01-17 11:28:17 - INFO - Application get-sites.py finished
View CSV in Excel:

Figure: View CSV in Excel
Here you see that we migrated HTTP LB object and Origin pool object to the new Secure Mesh v2 site.
Frequently Asked Questions (FAQs)
Why should I build a new site and migrate services to the new site?
A new and simplified workflow for Secure Mesh sites has been introduced and is now Generally Available (GA). This allows for simplified experience to deploy Customer Edges (CEs) anywhere. It is recommended to use the new workflow for all Customer Edge deployments and to migrate existing Customer Edge sites to the new Secure Mesh v2 site.
Will this utility migrate from the old site to the new site?
The migration helper utility will not migrate your services from old site to new site, but rather aids you in planning for migration by helping create a snapshot of all services prior to migration, run validation checks against the new site to verify site infra compatibility and lastly allows you to keep track of services that are migrated over to the site to ensure old site is decommissioned once everything is moved over.
What are the minimum requirements to take advantage of the utility?
The utility needs an API token of your tenant in F5 Distributed Cloud to query necessary information and an environment to run the utility as a python script.