Skip to content

Commit fc79003

Browse files
committed
[trait-controller] fix duplication of traits
ensure not to apply a trait that is already applied by duplicating it in the UpdateTraits payload.
1 parent 0615094 commit fc79003

1 file changed

Lines changed: 23 additions & 14 deletions

File tree

internal/controller/traits_controller.go

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func (tc *TraitsController) Reconcile(ctx context.Context, req ctrl.Request) (ct
8585
toAdd := Difference(customTraitsApplied, hv.Spec.CustomTraits)
8686
toRemove := Difference(hv.Spec.CustomTraits, customTraitsApplied)
8787

88+
// fetch current traits, to ensure we don't add duplicates
8889
current, err := resourceproviders.GetTraits(ctx, tc.serviceClient, hv.Status.HypervisorID).Extract()
8990
if err != nil {
9091
// set status condition
@@ -98,29 +99,37 @@ func (tc *TraitsController) Reconcile(ctx context.Context, req ctrl.Request) (ct
9899
}
99100

100101
var targetTraits []string
102+
slices.Sort(current.Traits)
101103
for _, trait := range current.Traits {
102104
if !slices.Contains(toRemove, trait) {
103105
targetTraits = append(targetTraits, trait)
104106
}
105107
}
106108

107-
targetTraits = slices.Concat(targetTraits, toAdd)
109+
for _, traitToAdd := range toAdd {
110+
// avoid duplicates in case the trait is already present
111+
if !slices.Contains(targetTraits, traitToAdd) {
112+
targetTraits = append(targetTraits, traitToAdd)
113+
}
114+
}
108115
slices.Sort(targetTraits)
109116

110-
result := openstack.UpdateTraits(ctx, tc.serviceClient, hv.Status.HypervisorID, openstack.UpdateTraitsOpts{
111-
ResourceProviderGeneration: current.ResourceProviderGeneration,
112-
Traits: targetTraits,
113-
})
114-
115-
if result.Err != nil {
116-
// set status condition
117-
meta.SetStatusCondition(&hv.Status.Conditions, metav1.Condition{
118-
Type: ConditionTypeTraitsUpdated,
119-
Status: metav1.ConditionFalse,
120-
Reason: ConditionTraitsFailed,
121-
Message: result.Err.Error(),
117+
if !slices.Equal(current.Traits, targetTraits) {
118+
result := openstack.UpdateTraits(ctx, tc.serviceClient, hv.Status.HypervisorID, openstack.UpdateTraitsOpts{
119+
ResourceProviderGeneration: current.ResourceProviderGeneration,
120+
Traits: targetTraits,
122121
})
123-
return ctrl.Result{}, tc.Status().Update(ctx, hv)
122+
123+
if result.Err != nil {
124+
// set status condition
125+
meta.SetStatusCondition(&hv.Status.Conditions, metav1.Condition{
126+
Type: ConditionTypeTraitsUpdated,
127+
Status: metav1.ConditionFalse,
128+
Reason: ConditionTraitsFailed,
129+
Message: result.Err.Error(),
130+
})
131+
return ctrl.Result{}, tc.Status().Update(ctx, hv)
132+
}
124133
}
125134

126135
// update status

0 commit comments

Comments
 (0)