Skip to content

Service Configuration

CobaltCore manages OpenStack service configurations — files like nova.conf, keystone.conf, and neutron.conf — entirely through the operator reconciliation loop. CRD fields are the primary interface for expressing configuration intent. Operators translate these structured fields into INI config files, assemble them into Kubernetes ConfigMaps, and mount them into service pods.

This section documents how configuration is generated, validated, customized, and how C5C3's approach compares to other OpenStack deployment tools.

Design Principles

PrincipleDescription
Structured over RawCRD fields provide typed, validated configuration instead of raw INI strings
Secrets SeparatedCredentials are never stored in CRDs or Git. Connection strings (including credentials) in ConfigMaps are assembled at reconciliation time from K8s Secrets — the CRD itself never contains sensitive values. Credential lifecycle is managed externally via OpenBao and ESO (see Secret Management)
Immutable ConfigMapsEach config change produces a new hash-named ConfigMap, enabling clean rollbacks and triggering rolling restarts
Operator-Owned DefaultsSensible per-release defaults are embedded in operator code — operators know which defaults are appropriate for each OpenStack release
Escape Hatches AvailableOverride mechanisms beyond CRD fields are under design (see Customization)

Configuration Flow

text
┌─────────────────────────────────────────────────────────────────────────────┐
│                       CONFIGURATION FLOW                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────┐                                                           │
│  │ ControlPlane │  User / GitOps applies ControlPlane CR                    │
│  │ CR           │  (desired OpenStack release, service settings)            │
│  └──────┬───────┘                                                           │
│         │                                                                   │
│         ▼                                                                   │
│  ┌──────────────┐                                                           │
│  │ c5c3-operator│  Creates / updates per-service CRs                        │
│  │              │  (Nova CR, Keystone CR, Neutron CR, ...)                  │
│  └──────┬───────┘                                                           │
│         │                                                                   │
│         ▼                                                                   │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │ Service Operator (e.g. nova-operator)                                │   │
│  │                                                                      │   │
│  │  1. Read CRD spec fields (database, messaging, keystone, cache, ..)  │   │
│  │  2. Resolve infra endpoints (clusterRef → CR status, or host/port)   │   │
│  │  3. Read referenced K8s Secrets (credentials from ESO/OpenBao)       │   │
│  │  4. Merge with operator-embedded defaults for the target release     │   │
│  │  5. Render INI config file(s) from structured data                   │   │
│  │  6. Create ConfigMap with content-hash name                          │   │
│  │  7. Update Deployment/DaemonSet to reference new ConfigMap           │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│         │                                                                   │
│         ▼                                                                   │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │ Pod                                                                  │   │
│  │  /etc/<service>/<service>.conf  ◀── volume mount from ConfigMap      │   │
│  │  Secrets mounted separately (TLS certs, Ceph keys)                   │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

Comparison Summary

AspectC5C3YAOOKKolla-AnsibleRed Hat K8s OperatorsAtmosphere
Config SourceCRD fields (typed)CUE layersglobals.yml + Jinja2CRD fields + customServiceConfigHelm values
Config LanguageGo structs (operator-internal)CUEJinja2 + INI mergeGo templatesGo templates (OpenStack-Helm)
ValidationOpenAPI schema + operator checksCUE schema + metadataoslo-config-validatorOpenAPI + CELImplicit (template logic)
Secret HandlingOpenBao + ESO (fully separated)SecretInjectionLayeransible-vault + mergeK8s Secrets in CRD refsK8s Secrets
Custom ConfigStructured CRD; override options documented in CustomizationCUE merging (open)globals.yml + overridescustomServiceConfig (raw INI)Helm value overrides
Update StrategyImmutable ConfigMap + rolling restartImmutable Secrets + reconcileReconfigure playbookConfigMap + rolling restartHelm upgrade

For a deep comparison including ConfigHub, see Configuration Landscape.

Further Reading