| docs | 23 hours ago | ||
| netbox | 1 day ago | ||
| overlays | 1 day ago | ||
| runbooks | 23 hours ago | ||
| scripts | 1 day ago | ||
| .gitignore | 1 day ago | ||
| README.md | 23 hours ago | ||
| bundle.yaml | 19 hours ago | ||
| setup-gitbucket-repo.sh | 1 day ago | ||
Scope: Charmed OpenStack Caracal (2024.1) IPv4-only testcloud deployment on the 4-VM KVM lab, modeled in NetBox as VR0 DC0 Omega Cloud.
This repository is the v1 deliverable — IPv4-only Caracal Charmed OpenStack on the existing MAAS-provisioned network layout. v1 ships first because the upstream router infrastructure is not yet IPv6-ready; deferring on IPv6 lets v1 prove the bundle, Option B binding fix, Magnum CAPI graft, Designate-from-day-one, and the hacluster relation pattern at testcloud scale without waiting on network-side IPv6 readiness.
v2 adds IPv6 / dual-stack per the address-family matrix retained as v2-scope decisions in docs/design-decisions.md (D-004, D-004a). v2 will ship either as a sibling overlay in this repository (overlays/v2-dualstack.yaml on a v2 branch) or as a separate repository — TBD when v2 work begins.
The IPv6 prefixes already imported into NetBox under VR0 DC0 remain in NetBox as Reservation status to document the v2 intent without implying they are active. See netbox/ipv6-mark-reserved.py.
This repository is the deployment method. Bundle, overlays, runbooks, and validation scripts together describe everything required to bring up the cloud from a clean MAAS-managed Juju model. Anyone with NetBox read access, MAAS access, and the Juju controller can clone this repository and reproduce the cloud.
NetBox is authoritative for IPAM. Any IP, prefix, or VLAN value referenced in this repository traces back to NetBox. The exception is tenant per-project subnets, which under the v1 hybrid model (D-016) are Neutron-managed within a NetBox-modeled upstream tenant pool — i.e., the pool has NetBox standing, individual tenant subnets do not.
openstack-caracal-ipv4/
├── README.md # this file
├── bundle.yaml # canonical Charmed OpenStack bundle (IPv4)
├── overlays/
│ └── vr0-dc0-testcloud.yaml # 4-VM lab specifics; num_units=1 + hacluster
├── runbooks/
│ ├── 00-pre-deploy.md # backups, capi-mgmt graceful teardown
│ ├── 01-destroy-model.md # destroy openstack model + verify
│ ├── 02-deploy.md # juju deploy + settle wait
│ ├── 03-vault-init.md # vault unseal + cert auth
│ ├── 04-magnum-domain.md # domain-setup action + keystone wiring
│ ├── 04a-capi-bootstrap-cluster.md # capi-mgmt VM deploy + k3s + CAPI + ORC (D-017)
│ ├── 05-magnum-capi-driver.md # pip install driver + kubeconfig + systemd
│ ├── 06-tenant-setup.md # project, user, openrc, app credentials
│ ├── 07-dns-zones.md # Designate zones + API VIP A records (v1)
│ └── 08-validate.md # Roosevelt-rehearsal validation criteria
├── scripts/
│ ├── pre-flight-checks.sh # pre-deploy sanity checks
│ └── validate.sh # end-to-end validation runner
├── netbox/
│ ├── README.md # what's here vs. what's deferred to v2
│ ├── ipv4-prefixes-import.py # adds IPv4 prefixes + IPv4 tenant pool
│ └── ipv6-mark-reserved.py # marks IPv6 entries as Reservation (Q3)
└── docs/
└── design-decisions.md # architectural record (D-001 through D-016)
netbox/ipv4-prefixes-import.py — requirednetbox/ipv6-mark-reserved.py — required (Q3: tag existing IPv6 entries)scripts/pre-flight-checks.sh)runbooks/00-pre-deploy.md)runbooks/01-destroy-model.md)runbooks/02-deploy.md)runbooks/03-vault-init.md)runbooks/04-magnum-domain.md)capi-mgmt.maas (runbooks/04a-capi-bootstrap-cluster.md)runbooks/05-magnum-capi-driver.md)runbooks/06-tenant-setup.md)runbooks/07-dns-zones.md)runbooks/08-validate.md + scripts/validate.sh)/16 pool; Neutron owns per-project subnets within it/22 carries both ext_net FIPs (10.12.4.10–.223) and OpenStack public API VIPs (10.12.4.224–.254) on the same L2 segment; fixes the tenant→API unreachability that caused Magnum OCCM crashloop on Bobcat testcloudovn-source