| docs | 22 hours ago | ||
| netbox | 7 days ago | ||
| overlays | 7 days ago | ||
| runbooks | 1 day ago | ||
| scripts | 7 days ago | ||
| .gitignore | 3 hours ago | ||
| README.md | 22 hours ago | ||
| bundle.yaml | 12 hours ago | ||
| fix-bundle-add-memcached.py | 14 hours ago | ||
| fix-bundle-haclusters.py | 14 hours ago | ||
| fix-bundle-metal-vips.py | 12 hours ago | ||
| fix-bundle-router-bindings.py | 14 hours ago | ||
| fix-bundle-v1.py | 14 hours ago | ||
| setup-gitbucket-repo.sh | 7 days 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/
│ # (deprecated; see runbooks/deprecated/ - superseded by D-017 + D-018 + v1-do-doc-NN set)
│ ├── 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-019)
└── netbox-vip-queue.md # post-deploy NetBox imports (workstream 2)
The deploy is executed via the runbooks/v1-do-doc-NN-*.md execution documents in numeric order:
| Doc | Purpose |
|---|---|
v1-do-doc-01-prep.md |
Pre-flight state check (repo, openrc, MAAS state of 5 VMs) |
v1-do-doc-02-pki.md |
Octavia PKI overlay generation |
v1-do-doc-03-destroy.md |
Conditional model + MAAS teardown (clean state for rebuild) |
v1-do-doc-04-deploy.md |
juju deploy + settle wait + on-disk PKI verification |
v1-do-doc-05-vault-init.md |
Vault initialization + cert cascade + admin-openrc regeneration |
v1-do-doc-06-magnum-domain.md |
Magnum Keystone domain setup |
v1-do-doc-07-capi-bootstrap.md |
CAPI bootstrap cluster + workload pivot |
v1-do-doc-08-magnum-driver.md |
Magnum CAPI Helm driver graft |
v1-do-doc-09-tenant.md |
Tenant project/user/openrc + Snapshot 2 |
v1-do-doc-10-validate.md |
D-011 acceptance criteria + Snapshot 3 |
NetBox imports are run separately (gated on external NetBox engineer review; see netbox/README.md).
/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 testcloud1.1.1.1 / 1.0.0.1) directly via --dns-nameserver. *.cloud.neumatrix.local FQDN tree remains internal-only, resolved via static /etc/hosts on bootstrap-relevant hosts.ovn-source