Prepare for a clean Caracal rebuild of the VR0 DC0 Omega Cloud. Capture all state needed for rollback, gracefully tear down dependent workloads, and verify the destination environment is ready before destroying the existing OpenStack model.
vopenstack-jesse as jessea123admin-openrc and user1-openrc available in $HOMEopenstack modelnetbox/ipv4-prefixes-import.py)netbox/vlans-import.py)Run the verification path of the NetBox import scripts. Confirm all entries appear correctly scoped to VR0 DC0.
cd ~/vr0-dc0-caracal NETBOX_URL=https://netbox.baldurkeep.com NETBOX_TOKEN=<token> \ python3 netbox/ipv4-prefixes-import.py --verify-only NETBOX_URL=https://netbox.baldurkeep.com NETBOX_TOKEN=<token> \ python3 netbox/vlans-import.py --verify-only
Expected: all prefixes and VLANs report scope-OK, no MISSING entries.
Backups needed for potential rollback:
# Vault unseal keys and root CA cert juju ssh vault/0 -- sudo cat /var/snap/vault/common/vault.crt > ~/backups/$(date +%F)/vault-root-ca.crt # (Unseal keys MUST be on file from initial Vault setup; verify presence) ls -la ~/.vault-keys # Export current bundle juju export-bundle --model openstack > ~/backups/$(date +%F)/bundle-pre-rebuild.yaml # Snapshot of current 'juju status' juju status --model openstack --format=yaml > ~/backups/$(date +%F)/juju-status-pre-rebuild.yaml # Inventory of FIPs and tenant resources we might want to recreate source ~/admin-openrc openstack floating ip list -c "Floating IP Address" -c "Fixed IP Address" \ -c "Project" -f csv > ~/backups/$(date +%F)/floating-ips.csv openstack server list --all-projects -c ID -c Name -c Project -c Status -f csv \ > ~/backups/$(date +%F)/servers.csv openstack network list --all-projects -c ID -c Name -c Project -f csv \ > ~/backups/$(date +%F)/networks.csv openstack loadbalancer list -c id -c name -c project_id -c vip_address -f csv \ > ~/backups/$(date +%F)/loadbalancers.csv
From the jumphost (which is the hypervisor):
for vm in openstack0 openstack1 openstack2 openstack3; do
sudo virsh snapshot-create-as --domain "$vm" \
--name "pre-caracal-rebuild-$(date +%F)" \
--description "Pre-Caracal rebuild baseline" \
--atomic
done
sudo virsh snapshot-list openstack0
These snapshots are the disaster-recovery point.
Delete the CAPI workload cluster cleanly so its OpenStack resources (LBs, FIPs, volumes, Octavia members) are released by CAPI controllers before model destroy.
export KUBECONFIG=~/magnum-capi/phase3/capi-mgmt-cluster.kubeconfig # (Adjust path if kubeconfig has moved) # Delete the workload cluster — CAPI handles tenant OpenStack cleanup kubectl delete cluster capi-mgmt-cluster -n default # Wait for finalizers; this may take ~10 minutes kubectl wait --for=delete cluster/capi-mgmt-cluster -n default --timeout=15m
Verify on the OpenStack side that resources were released:
source ~/admin-openrc openstack server list --all-projects | grep -i capi || echo "No CAPI servers remaining" openstack loadbalancer list | grep -i capi || echo "No CAPI LBs remaining" openstack floating ip list -c "Floating IP Address" -c "Fixed IP Address" -f csv
The bootstrap k3s + CAPI controllers on capi-mgmt.maas are NOT destroyed — they will be re-used post-rebuild as the Magnum CAPI mgmt plane. Verify the controllers are still healthy:
ssh capi-mgmt.maas -- sudo kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml \ get pods -A
Confirm:
capi-system namespace pods Runningcapo-system (CAPI OpenStack provider) pods Runningcert-manager pods Runningorc-system (OpenStack Resource Controller) pods RunningDo not proceed to runbooks/01-destroy-model.md until all of the following pass:
bundle-pre-rebuild.yaml exists and is non-emptyjuju-status-pre-rebuild.yaml shows desired-pre-destroy state capturedvirsh snapshot-list confirms)kubectl get cluster returns
"no resources found")
FIPs, volumes)
/var/lib/libvirt/images prior to running the rebuild deploy.