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