Skip to content

Commit 5aaf411

Browse files
kvapsclaude
andcommitted
docs(plan): tick Phase 10.3 typed Node port/minor ranges + AutoTieBreaker
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
1 parent 4cae72e commit 5aaf411

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

PLAN.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,8 +548,8 @@ LINSTOR boundary.
548548
- [x] `ResourceDefinition.Spec.DRBDOptions { Net, Disk, PeerDevice, Resource, Handlers }` typed structs (2026-05-10). Embedded on RG/RD/Resource alongside the existing Props map; `pkg/drbd.ResolveDRBDOptions` walks the same controller→RG→RD→Resource hierarchy with nil-vs-set discipline so an explicit `*bool=false` survives lower-scope inheritance and an empty-string handler key DELETES the inherited entry.
549549
- [x] `ResourceDefinition.Spec.Encryption.PassphraseSecretRef LocalObjectReference` (2026-05-10). The CRD now carries `EncryptionConfig.PassphraseSecretRef`; the satellite already reads the passphrase via the apiserver on reconcile (Phase 6) — this just typifies the slot that previously lived in `Props["DrbdOptions/Encryption/passphrase"]`.
550550
- [x] `Node.Spec.SatelliteEndpoint string` (2026-05-10). Dispatcher reads typed first with Props fallback; k8s store transcodes both ways so golinstor still sees `Props["SatelliteEndpoint"]` on GET.
551-
- [ ] `Node.Spec.DRBDPortRange / DRBDMinorRange { Min, Max int32 }` — replaces `Props["DrbdOptions/TcpPortRange"]` / `"DrbdOptions/MinorNrRange"`. Defaults baked in via kubebuilder.
552-
- [ ] `Node.Spec.AutoTieBreaker *bool` — replaces `Props["DrbdOptions/AutoAddQuorumTiebreaker"]`.
551+
- [x] `Node.Spec.DRBDPortRange / DRBDMinorRange { Min, Max int32 }` (2026-05-10). Typed PortRange struct on NodeSpec; ResourceReconciler.nodeRange resolves typed first with legacy "min-max" Props fallback. CRD enum/min validation in place via kubebuilder markers.
552+
- [x] `AutoTieBreaker *bool` (2026-05-10). Lives on `DRBDResourceOptions.AutoTieBreaker` (the natural home alongside Quorum/AutoPromote — the Props key was per-RD, not per-Node, so the original "Node.Spec" plan-line was a misclassification). Section-less `DrbdOptions/AutoAddQuorumTiebreaker` is routed via a new `applySectionlessKey` transcoder helper; `isAutoTieBreakerEnabled` reads typed first, legacy Props fallback.
553553
- [x] `Resource.Spec.StoragePool string` (2026-05-10). Typed field on Resource; dispatcher's buildVolumes + autoplacer dispatch read typed first; auto-diskful promotion stamps both typed + legacy Props key; k8s store transcodes both ways.
554554
- [ ] Topology: drop `Props["Aux/zone"]` / `"Aux/rack"`. Use Kubernetes-native `metadata.labels["topology.blockstor.io/zone"]` etc. Autoplacer reads labels via `client.MatchingLabels`. This is also the upgrade path to label-aware features like `topologySpreadConstraints` later.
555555
- [x] REST shim transcoder (2026-05-10). `pkg/store/k8s/drbd_transcode.go` splits the wire `props` bag into `Spec.DRBDOptions` (recognised keys) + `Spec.ExtraProps` (unknown DrbdOptions/* + non-DRBD residual keys); inverse re-emits typed back to `props` on GET. Pinned by 7 unit tests (per-section recognition, unknown-key fallthrough, parse-error fallback, round-trip losslessness, bool spelling tolerance). Controller's `resolveEffectiveProps` now walks typed via `ResolveDRBDOptions` and flattens via `drbd.TypedDRBDOptionsToProps` for the dispatcher → satellite renders the same .res file from typed CRD fields rather than string-keyed Props.

0 commit comments

Comments
 (0)