|
| 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