Skip to content

Commit 159127d

Browse files
committed
🌱 Mark orb-operator-helm-migration spec done
1 parent d47100d commit 159127d

5 files changed

Lines changed: 32 additions & 31 deletions

File tree

specs/2026-08-13-orb-operator-helm-migration/verification.md

Lines changed: 0 additions & 30 deletions
This file was deleted.

specs/2026-08-13-orb-operator-helm-migration/README.md renamed to specs/closed/2026-08-13-orb-operator-helm-migration/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
status: in-progress
2+
status: done
33
---
44
# orb-operator Helm Storage Migration
55

specs/2026-08-13-orb-operator-helm-migration/plan.md renamed to specs/closed/2026-08-13-orb-operator-helm-migration/plan.md

File renamed without changes.

specs/2026-08-13-orb-operator-helm-migration/requirements.md renamed to specs/closed/2026-08-13-orb-operator-helm-migration/requirements.md

File renamed without changes.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Verification
2+
3+
## Implementation Correctness
4+
5+
- [x] Deployed Helm release is the migration trigger; absence -> no-op, presence -> migration in progress
6+
- [x] Most-recent `deployed` release is selected, with history fallback when the latest is not `deployed`
7+
- [x] COS-from-Helm generator produces a COS with `None`, `spec.group = ext.Name`, `Active`, owner labels, bundle annotations, a **non-controller** CE ownerReference, and no `LabelTemplateHash` (the generator sets spec/labels/annotations; the migrator stamps the non-controller CE ownerReference, mirroring `BoxcutterStorageMigrator`)
8+
- [x] The adopting COS places all objects in a single assertion-free phase (no per-GVK assertions, no kind-based ordering; chunked at 50 only when the object count requires it)
9+
- [x] The migration step is ordered before resolution (`ResolveBundle`) - it is the first step after `ValidateClusterExtension`
10+
- [x] Revision reuse-vs-increment uses `equality.Semantic.DeepDerivative` against the latest existing revision (comparing the externalized desired spec so large releases do not spuriously increment)
11+
- [x] The adopting revision is externalized when large: phases use `objectRef`s and ClusterObjectSlices are created before the revision
12+
- [x] Revision numbering respects immutability: equivalent desired spec reuses the latest revision; a differing desired spec creates the next revision number without modifying the existing one
13+
- [x] The step returns a requeue `ctrl.Result` while the adopting revision's `completedAt` is nil (pipeline gated before `ApplyBundle`)
14+
- [x] The Helm release storage (bookkeeping secrets only, not an uninstall) is deleted only after the adopting revision reaches `completedAt`
15+
- [x] Release-history secrets are deleted oldest-to-newest, so a partial-delete failure leaves the newest deployed release present (no rewind)
16+
- [x] After the gate lifts, the COD is created with `Prevent` (codgen default unchanged) and orb stamps the `Prevent` revision that takes over via sibling handoff
17+
- [x] The migrator performs no manual adopting-revision cleanup (relies on orb's adopt/archive/prune); the non-controller CE ownerReference leaves the revision adoptable
18+
- [x] Migration is idempotent/resumable across controller restarts
19+
- [x] Helm `ActionClientGetter` and the migration step are wired into `orbOperatorReconcilerConfigurator` as the first step after `ValidateClusterExtension` (before resolution)
20+
- [x] All unit tests pass
21+
- [ ] e2e migration test passes - **deferred**: no migration e2e precedent exists in the repo (the analogous `BoxcutterStorageMigrator` is covered by unit tests only, and there is no orb e2e suite yet). Tracked as a follow-up.
22+
23+
## Project Conventions
24+
25+
- [x] Code follows Go style and passes `make lint`
26+
- [x] No `//nolint` comments added
27+
- [x] Reuses shared helpers (`splitManifestDocuments`, sanitization via `sanitizedUnstructured`, `mergeStringMaps`, the `orb` externalizer) rather than duplicating codgen logic
28+
- [x] Uses the `labels.*` key constants for annotations/labels
29+
- [x] Mirrors `BoxcutterStorageMigrator` structure where applicable (per specs/mission.md: simple, predictable, do not fight Kubernetes)
30+
- [x] Uses orb-operator and Helm types from tech-stack (`github.com/joelanford/orb-operator`, `helm.sh/helm/v3`, helm-operator-plugins)
31+
- [x] `make test-unit` passes; regeneration (`make generate manifests`) produces no unintended generated-code changes

0 commit comments

Comments
 (0)