@@ -115,6 +115,13 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R
115115 }
116116 }
117117
118+ // Ensure all ommited components show up as explicitly disabled
119+ instance , err = r .updateComponents (instance )
120+ if err != nil {
121+ _ = r .reportError (err , instance , "error updating list of components in the CR" )
122+ return ctrl.Result {}, err
123+ }
124+
118125 // reconcile dashboard component
119126 var val ctrl.Result
120127 if instance , val , err = r .reconcileSubComponent (instance , dashboard .ComponentName , instance .Spec .Components .Dashboard .Enabled ,
@@ -156,15 +163,9 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R
156163 return val , err
157164 }
158165
159- // Update final state of spec
160- err = r .Client .Update (ctx , instance )
161- if err != nil {
162- r .Log .Info (fmt .Sprintf ("failed to set DataScienceCluster CR :%v" , instance .Name ), "error" , err )
163- // no need to return error as this is not critical and will be reconciled in the next update or reconcile loop
164- }
165166 // finalize reconciliation
166167 instance , err = r .updateStatus (instance , func (saved * dsc.DataScienceCluster ) {
167- status .SetCompleteCondition (& saved .Status .Conditions , status .ReconcileCompleted , "DataScienceCluster resource reconciled successfully. " )
168+ status .SetCompleteCondition (& saved .Status .Conditions , status .ReconcileCompleted , "DataScienceCluster resource reconciled successfully" )
168169 saved .Status .Phase = status .PhaseReady
169170 })
170171 if err != nil {
@@ -180,22 +181,55 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R
180181
181182func (r * DataScienceClusterReconciler ) reconcileSubComponent (instance * dsc.DataScienceCluster , componentName string , enabled bool ,
182183 component components.ComponentInterface , ctx context.Context ) (* dsc.DataScienceCluster , ctrl.Result , error ) {
183- err := component .ReconcileComponent (instance , r .Client , r .Scheme , enabled , r .ApplicationsNamespace )
184+
185+ // First set contidions to reflect a component is about to be reconciled
186+ instance , err := r .updateStatus (instance , func (saved * dsc.DataScienceCluster ) {
187+ if enabled {
188+ status .SetComponentCondition (& saved .Status .Conditions , componentName , status .ReconcileInit , "Component reconciliation started" , corev1 .ConditionUnknown )
189+ } else {
190+ status .SetComponentCondition (& saved .Status .Conditions , componentName , status .ReconcileInit , "Component removal started" , corev1 .ConditionUnknown )
191+ }
192+ })
184193 if err != nil {
185- instance = r .reportError (err , instance , "failed to reconcile " + componentName + " on DataScienceCluster" )
194+ instance = r .reportError (err , instance , "failed to update DataScienceCluster conditions before reconciling " + componentName )
186195 return instance , ctrl.Result {
187196 // Retry after failure until success.
188197 RequeueAfter : time .Second * 10 }, err
189198 }
190- instance , err = r .updateStatus (instance , func (saved * dsc.DataScienceCluster ) {
191- if saved .Status .InstalledComponents == nil {
192- saved .Status .InstalledComponents = make (map [string ]bool )
193- }
194- saved .Status .InstalledComponents [componentName ] = enabled
195- })
199+
200+ // Reconcile component
201+ err = component .ReconcileComponent (instance , r .Client , r .Scheme , enabled , r .ApplicationsNamespace )
202+
196203 if err != nil {
197- instance = r .reportError (err , instance , "failed to update DataScienceCluster status after reconciling " + componentName )
198- return instance , ctrl.Result {}, err
204+ // reconciliation failed: log errors, raise event and update status accordingly
205+ instance = r .reportError (err , instance , "failed to reconcile " + componentName + " on DataScienceCluster" )
206+ instance , _ = r .updateStatus (instance , func (saved * dsc.DataScienceCluster ) {
207+ if enabled {
208+ status .SetComponentCondition (& saved .Status .Conditions , componentName , status .ReconcileFailed , "Component reconciliation failed" , corev1 .ConditionFalse )
209+ } else {
210+ status .SetComponentCondition (& saved .Status .Conditions , componentName , status .ReconcileFailed , "Component removal failed" , corev1 .ConditionFalse )
211+ }
212+ })
213+ return instance , ctrl.Result {
214+ // Retry after failure until success.
215+ RequeueAfter : time .Second * 10 }, err
216+ } else {
217+ // reconciliation succeeded: update status accordingly
218+ instance , err = r .updateStatus (instance , func (saved * dsc.DataScienceCluster ) {
219+ if saved .Status .InstalledComponents == nil {
220+ saved .Status .InstalledComponents = make (map [string ]bool )
221+ }
222+ saved .Status .InstalledComponents [componentName ] = enabled
223+ if enabled {
224+ status .SetComponentCondition (& saved .Status .Conditions , componentName , status .ReconcileCompleted , "Component reconciled successfully" , corev1 .ConditionTrue )
225+ } else {
226+ status .RemoveComponentCondition (& saved .Status .Conditions , componentName )
227+ }
228+ })
229+ if err != nil {
230+ instance = r .reportError (err , instance , "failed to update DataScienceCluster status after reconciling " + componentName )
231+ return instance , ctrl.Result {}, err
232+ }
199233 }
200234 return instance , ctrl.Result {}, nil
201235}
@@ -253,3 +287,21 @@ func (r *DataScienceClusterReconciler) updateStatus(original *dsc.DataScienceClu
253287 })
254288 return saved , err
255289}
290+
291+ func (r * DataScienceClusterReconciler ) updateComponents (original * dsc.DataScienceCluster ) (* dsc.DataScienceCluster , error ) {
292+ saved := & dsc.DataScienceCluster {}
293+ err := retry .RetryOnConflict (retry .DefaultRetry , func () error {
294+
295+ err := r .Client .Get (context .TODO (), client .ObjectKeyFromObject (original ), saved )
296+ if err != nil {
297+ return err
298+ }
299+
300+ // Try to update
301+ err = r .Client .Update (context .TODO (), saved )
302+ // Return err itself here (not wrapped inside another error)
303+ // so that RetryOnConflict can identify it correctly.
304+ return err
305+ })
306+ return saved , err
307+ }
0 commit comments