Skip to content

Commit bae3295

Browse files
fwieselnotandy
authored andcommitted
Traits: Use Patch + FieldOwner
FieldOwner allows us to identify who maintains a field and detect if there is a conflict between multiple controllers.
1 parent 9d111ba commit bae3295

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

internal/controller/traits_controller.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ func (tc *TraitsController) Reconcile(ctx context.Context, req ctrl.Request) (ct
9393
// fetch current traits, to ensure we don't add duplicates
9494
current, err := resourceproviders.GetTraits(ctx, tc.serviceClient, hv.Status.HypervisorID).Extract()
9595
if err != nil {
96+
base := hv.DeepCopy()
9697
if meta.SetStatusCondition(&hv.Status.Conditions,
9798
getTraitCondition(err, "Failed to get current traits from placement")) {
98-
err = errors.Join(tc.Status().Update(ctx, hv))
99+
err = errors.Join(tc.Status().Patch(ctx, hv, k8sclient.MergeFromWithOptions(base, k8sclient.MergeFromWithOptimisticLock{}), k8sclient.FieldOwner(TraitsControllerName)))
99100
}
100101
return ctrl.Result{}, err
101102
}
@@ -124,18 +125,20 @@ func (tc *TraitsController) Reconcile(ctx context.Context, req ctrl.Request) (ct
124125

125126
if result.Err != nil {
126127
// set status condition
128+
base := hv.DeepCopy()
127129
if meta.SetStatusCondition(&hv.Status.Conditions,
128130
getTraitCondition(err, "Failed to update traits in placement")) {
129-
err = errors.Join(tc.Status().Update(ctx, hv))
131+
err = errors.Join(tc.Status().Patch(ctx, hv, k8sclient.MergeFromWithOptions(base, k8sclient.MergeFromWithOptimisticLock{}), k8sclient.FieldOwner(TraitsControllerName)))
130132
}
131133
return ctrl.Result{}, err
132134
}
133135
}
134136

137+
base := hv.DeepCopy()
135138
// update status unconditionally, since we want always to propagate the current traits
136139
hv.Status.Traits = targetTraits
137140
meta.SetStatusCondition(&hv.Status.Conditions, getTraitCondition(nil, "Traits successfully updated"))
138-
return ctrl.Result{}, tc.Status().Update(ctx, hv)
141+
return ctrl.Result{}, tc.Status().Patch(ctx, hv, k8sclient.MergeFromWithOptions(base, k8sclient.MergeFromWithOptimisticLock{}), k8sclient.FieldOwner(TraitsControllerName))
139142
}
140143

141144
// getTraitCondition creates a Condition object for trait updates

0 commit comments

Comments
 (0)