API stability¶
This document states what the messaging.mkurator.dev API guarantees today,
how v1alpha1 and v1beta1 relate, and what remains before full
graduation. It satisfies Phase 8b in ROADMAP.md and NFR API-1 in
NON_FUNCTIONAL_REQUIREMENTS.md.
Current version¶
| Item | Value |
|---|---|
| API group | messaging.mkurator.dev |
| Served versions | v1alpha1 + v1beta1 (all six kinds) |
| Storage version (etcd) | v1alpha1 until hub migration is proven in CI (ADR-0026) |
| Stability (Kubernetes meaning) | v1alpha1 — alpha; v1beta1 — beta (field-level stability improving) |
| MQ parameter surface | Typed spec fields (preferred on v1beta1) + spec.attributes escape hatch |
| Admission | CRD CEL (x-kubernetes-validations) + validating webhooks (ADR-0025) |
| Webhooks | Validating (referential checks, unknown-attribute warnings) + conversion (v1alpha1 ↔ v1beta1); no mutating webhooks (ADR-0009, ADR-0026) |
Kinds: QueueManagerConnection, Queue, Topic, Channel, ChannelAuthRule,
AuthorityRecord.
New manifests should use apiVersion: messaging.mkurator.dev/v1beta1; existing
v1alpha1 YAML and stored objects remain valid through conversion.
What v1alpha1 guarantees¶
Between tagged releases on main, the project aims for deliberate, documented
changes only:
- Reconcile semantics for fields documented in ATTRIBUTE_RECONCILIATION.md and kind-specific guides — drift-checked keys are corrected on the queue manager; define-only keys are applied on create/update but not compared on DISPLAY.
- OpenAPI validation on the CRD schema (enums, patterns, CEL rules) rejects structurally invalid specs at admission time when the API server or webhook is available.
- Breaking changes are called out in commit messages (
!orBREAKING CHANGE:), CHANGELOG.md, and UPGRADE.md before a release tag (CONTRIBUTING.md, GOVERNANCE.md). - Status shape (
conditions,observedGeneration,desiredMQSCwhere present) remains the observability contract; new condition reasons may appear but existingSynced/Readysemantics are not removed without a breaking release.
What v1alpha1 does not guarantee¶
- Field-level stability — names, types, and requiredness of spec fields may
change until consumers migrate to
v1beta1. - Map-only MQ parameters forever — ADR-0021
adds typed spec fields alongside
spec.attributes; onv1beta1, map keys with typed equivalents are deprecated (warnings now, rejection later). - Silent compatibility — typos in
spec.attributeskeys are not caught by OpenAPI; unknown keys may receive admission warnings but still apply if MQ accepts them. - Webhook availability as a hard dependency for basic validation — stateless
rules live in CEL; referential checks (
connectionRef, cross-CR references) require the validating webhook (ADR-0025).
Planned maturation (Phase 8)¶
Phase 8 tracks on ROADMAP.md:
| Track | Deliverable | Status | ADR |
|---|---|---|---|
| 8a | Typed fields for drift-checked MQ attributes + spec.attributes escape hatch; mutual exclusivity (CEL); internal fold into the attribute map before mqadmin |
Done | ADR-0021 |
| 8b | This stability statement (published) | Done | — |
| 8c | Optional DISPLAY capability probing | Done | ADR-0024 §4 |
| 8d | v1beta1 for all six kinds + conversion webhook + migration docs + e2e proof |
In progress (8d-0–8d-4 done; 8d-5/8d-6 open) | ADR-0026 |
During 8a, existing manifests that use only spec.attributes remain valid.
New typed fields are optional; setting both a typed field and the same key in
attributes is rejected at admission (no silent merge). The first promoted field
is Queue.spec.maxDepth (alternative to attributes.maxdepth).
Graduation to v1beta1¶
The graduation plan is recorded in ADR-0026 (hub-spoke conversion, storage migration, deprecation timeline, implementation slices 8d-0–8d-6).
Completed (on main before v0.12.0):
- Hybrid attribute surface (8a) shipped on
v1alpha1and baked for at least one minor release without schema churn on promoted fields — met byv0.11.0+v0.11.1. - Conversion webhook converts stored/read objects between
v1alpha1andv1beta1for all six kinds — implemented (8d-2); envtest round-trip per kind (8d-3); dual-version CRD bundle and samples defaulting tov1beta1(8d-4).
Completed at the v0.12.0 tag:
- Deprecation policy documented in UPGRADE.md — migration
guide and
spec.attributestimeline (8d-5; this doc sync). - v1beta1 validating admission — warnings for deprecated map keys and
referential
connectionRefchecks onv1beta1creates/updates (8d-5b). - CI e2e migration proof — apply
v1alpha1CR, upgrade CRDs, assert conversion + reconcile green (8d-6).
Deferred (optional, post-v0.12.0):
- etcd storage flip to
v1beta1hub — separate step now that 8d-6 is green; do not run dual storage versions.
The 8d exit criteria are met as of v0.12.0; pin the operator and CRD bundle
to a release tag and read CHANGELOG/UPGRADE before upgrading.
Deprecation policy (v1beta1)¶
When a drift-checked attribute gains a typed spec field:
- Prefer the typed field in new manifests (
kubectl explaindocuments it). spec.attributes["<key>"]is deprecated for that parameter onv1beta1(admission warning inv0.12.x; rejection in a later release — timeline in UPGRADE.md).- Conversion copies map values into typed fields where unambiguous so existing GitOps repos keep working through one upgrade cycle.
On v1alpha1, map-only manifests remain valid with no deprecation warnings
until you bump apiVersion.
Environment prerequisites¶
| Dependency | Supported / required |
|---|---|
| Kubernetes | 1.29+ for CRD CEL validation (INSTALL_AND_USE.md) |
| IBM MQ / mqweb | Administrative REST v3; adapter behaviour documented in IBM_MQ_REST_API.md |
Related documents¶
| Document | Role |
|---|---|
| ATTRIBUTE_RECONCILIATION.md | Drift-checked vs define-only MQ keys (today's contract) |
| adr/0021-attribute-api-shape.md | Typed fields + escape hatch decision |
| adr/0025-cel-first-admission-validation.md | CEL vs webhook split |
| adr/0026-v1beta1-graduation-plan.md | v1beta1 hub-spoke conversion and deprecation policy |
| UPGRADE.md | Release-to-release migration steps |
| FAQ.md | Short pointers for operators |