-
Notifications
You must be signed in to change notification settings - Fork 10
Refactor BIOSVersionSetReconciler
#572
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Harmonize and simplify the reconciler code.
41e9b8b to
8df5d0e
Compare
| if err := r.Get(ctx, req.NamespacedName, versionSet); err != nil { | ||
| return ctrl.Result{}, client.IgnoreNotFound(err) | ||
| } | ||
| log.V(1).Info("Reconciling biosVersionSet") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we also harmonize having these placeholder log messages across controllers? That we know, we expect it when certain CRD is being processed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would say so, like the actually reconciliation of the object happens in the r.reconcile method. That is where the log belongs.
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
WalkthroughRefactoring of the BIOSVersionSet controller internal logic, including variable renaming from biosVersionSet to versionSet, switching from updateStatus to patchStatus operations, reworking ownership-based retrieval methods, replacing helper functions with new variants, and updating watch configuration to use ownership-based patterns instead of event-based predicates. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
internal/controller/biosversionset_controller.go (2)
166-173: Status computed from stale versions list.The
versionslist is fetched at line 145, butensureBIOSVersionsForServersanddeleteOrphanBIOSVersionsmodify the cluster state before status computation at line 167. The computed status won't reflect newly created or just-deleted BIOSVersions.While the
Ownspredicate will trigger another reconciliation to correct this, the patched status may briefly show incorrect counts (e.g.,AvailableBIOSVersionexcludes just-created versions or includes just-deleted ones).Consider refetching versions after the create/delete operations for immediate accuracy:
Proposed fix
if err := r.patchBIOSVersionFromTemplate(ctx, log, &versionSet.Spec.BIOSVersionTemplate, versions); err != nil { return ctrl.Result{}, fmt.Errorf("failed to patch BIOSVersion spec from template: %w", err) } + // Refetch versions to reflect creates/deletes before computing status + versions, err = r.getOwnedBIOSVersions(ctx, versionSet) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to refresh owned BIOSVersions: %w", err) + } + log.V(1).Info("Updating the status of BIOSVersionSet") status := r.getOwnedBIOSVersionSetStatus(versions)
331-345: Comment clarification.The comment on line 334 says "if the label has been removed", but this else-branch also handles cases where labels simply don't match the selector (not necessarily removed). Consider updating for clarity:
- } else { // if the label has been removed + } else { // if the Server no longer matches the selectorThe logic itself is correct—reconciling the set allows orphan BIOSVersion cleanup when a Server no longer matches.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
internal/controller/biosversionset_controller.go(3 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
internal/controller/biosversionset_controller.go (3)
api/v1alpha1/biosversionset_types.go (3)
BIOSVersionSet(49-55)BIOSVersionSetStatus(21-34)BIOSVersionSetList(60-64)api/v1alpha1/biosversion_types.go (6)
BIOSVersionList(141-145)BIOSVersion(130-136)BIOSVersionStateInProgress(19-19)BIOSVersionStateCompleted(21-21)BIOSVersionStateFailed(23-23)BIOSVersionStatePending(17-17)api/v1alpha1/server_types.go (1)
ServerList(439-443)
🔇 Additional comments (10)
internal/controller/biosversionset_controller.go (10)
44-51: LGTM!The Reconcile entry point follows standard controller-runtime conventions. The variable rename to
versionSetis consistent throughout the refactor.
53-58: LGTM!Clean delegation pattern based on deletion timestamp.
60-97: LGTM!The deletion logic correctly ensures all owned BIOSVersions reach terminal state (Completed or Failed) before removing the finalizer. The switch to
patchStatusandPatchEnsureNoFinalizeraligns with best practices for conflict-free updates.
99-123: LGTM!Clean pattern for annotation propagation with appropriate early return when no BIOSVersions exist.
183-219: LGTM!The function correctly handles:
- Avoiding duplicate BIOSVersion creation via the
withBiosVersionmap- Name length limits with
GenerateNamefallback- Proper owner reference setup for the
Ownspredicate to work
221-240: LGTM!Good defensive handling by skipping
InProgressBIOSVersions to avoid interrupting active operations.
242-265: LGTM!Properly skips
InProgressversions to avoid mid-operation template changes. TheOperationResultNonefilter for logging reduces noise from no-op patches.
267-283: LGTM!Good handling of the empty string case as
Pendingfor newly created BIOSVersions that haven't been processed yet.
285-313: LGTM!Clean helper functions with proper use of:
clientutils.ListAndFilterControlledByfor ownership-based filteringclient.MergeFromfor conflict-free status patches
350-359: LGTM!Good use of:
Owns(&metalv1alpha1.BIOSVersion{})to trigger reconciliation on owned resource changespredicate.LabelChangedPredicate{}to limit Server watches to label changes, avoiding unnecessary reconciliations on status updates
Proposed Changes
Harmonize and simplify the reconciler code.
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.