Skip to content

Commit 7b19f99

Browse files
authored
Merge branch 'feature-rearchitecture' into feat/chore1
2 parents 2f9bd44 + cb56985 commit 7b19f99

File tree

4 files changed

+136
-51
lines changed

4 files changed

+136
-51
lines changed

apis/dscinitialization/v1alpha1/dscinitialization_types.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,6 @@ import (
2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323
)
2424

25-
// List of constants to show different reconciliation messages and statuses.
26-
const (
27-
ReconcileFailed = "ReconcileFailed"
28-
ReconcileInit = "ReconcileInit"
29-
ReconcileCompleted = "ReconcileCompleted"
30-
ReconcileCompletedMessage = "Reconcile completed successfully"
31-
)
32-
3325
// DSCInitializationSpec defines the desired state of DSCInitialization
3426
type DSCInitializationSpec struct {
3527
// +kubebuilder:default:=opendatahub

controllers/datasciencecluster/datasciencecluster_controller.go

Lines changed: 69 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

181182
func (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+
}

controllers/dscinitialization/dscinitialization_controller.go

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ func (r *DSCInitializationReconciler) Reconcile(ctx context.Context, req ctrl.Re
8585
if instance.Status.Conditions == nil {
8686
reason := status.ReconcileInit
8787
message := "Initializing DSCInitialization resource"
88-
status.SetProgressingCondition(&instance.Status.Conditions, reason, message)
89-
90-
instance.Status.Phase = status.PhaseProgressing
91-
err = r.Client.Status().Update(ctx, instance)
88+
instance, err = r.updateStatus(instance, func(saved *dsci.DSCInitialization) {
89+
status.SetProgressingCondition(&saved.Status.Conditions, reason, message)
90+
saved.Status.Phase = status.PhaseProgressing
91+
})
9292
if err != nil {
9393
r.Log.Error(err, "Failed to add conditions to status of DSCInitialization resource.", "DSCInitialization", req.Namespace, "Request.Name", req.Name)
9494
r.Recorder.Eventf(instance, corev1.EventTypeWarning, "DSCInitializationReconcileError",
@@ -156,24 +156,9 @@ func (r *DSCInitializationReconciler) Reconcile(ctx context.Context, req ctrl.Re
156156
}
157157

158158
// Finish reconciling
159-
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
160-
// refresh the instance in case it was updated during the reconcile
161-
err = r.Client.Get(ctx, types.NamespacedName{Name: "default"}, instance)
162-
if err != nil {
163-
r.Log.Error(err, "failed to retrieve DSCInitialization instance for status update after successfuly completed reconciliation")
164-
return err
165-
}
166-
reason := status.ReconcileCompleted
167-
message := status.ReconcileCompletedMessage
168-
status.SetCompleteCondition(&instance.Status.Conditions, reason, message)
169-
170-
instance.Status.Phase = status.PhaseReady
171-
172-
// Try to update
173-
err = r.Client.Status().Update(context.TODO(), instance)
174-
// Return err itself here (not wrapped inside another error)
175-
// so that RetryOnConflict can identify it correctly.
176-
return err
159+
_, err = r.updateStatus(instance, func(saved *dsci.DSCInitialization) {
160+
status.SetCompleteCondition(&saved.Status.Conditions, status.ReconcileCompleted, status.ReconcileCompletedMessage)
161+
saved.Status.Phase = status.PhaseReady
177162
})
178163
if err != nil {
179164
r.Log.Error(err, "failed to update DSCInitialization status after successfuly completed reconciliation")
@@ -235,3 +220,23 @@ var singletonPredicate = predicate.Funcs{
235220
return true
236221
},
237222
}
223+
224+
func (r *DSCInitializationReconciler) updateStatus(original *dsci.DSCInitialization, update func(saved *dsci.DSCInitialization)) (*dsci.DSCInitialization, error) {
225+
saved := &dsci.DSCInitialization{}
226+
err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
227+
228+
err := r.Client.Get(context.TODO(), client.ObjectKeyFromObject(original), saved)
229+
if err != nil {
230+
return err
231+
}
232+
// update status here
233+
update(saved)
234+
235+
// Try to update
236+
err = r.Client.Status().Update(context.TODO(), saved)
237+
// Return err itself here (not wrapped inside another error)
238+
// so that RetryOnConflict can identify it correctly.
239+
return err
240+
})
241+
return saved, err
242+
}

controllers/status/status.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,7 @@ const (
5656
)
5757

5858
const (
59-
// TODO: update this list of constants with proper reasons for conditions
60-
ReconcileInitiatedReason = "ReconcileInitiated"
61-
AReason = "AReason"
62-
AnotherReason = "AnotherReason"
59+
ReadySuffix = "Ready"
6360
)
6461

6562
// SetProgressingCondition sets the ProgressingCondition to True and other conditions to
@@ -107,6 +104,45 @@ func SetErrorCondition(conditions *[]conditionsv1.Condition, reason string, mess
107104
Reason: reason,
108105
Message: message,
109106
})
107+
conditionsv1.SetStatusCondition(conditions, conditionsv1.Condition{
108+
Type: conditionsv1.ConditionAvailable,
109+
Status: corev1.ConditionFalse,
110+
Reason: reason,
111+
Message: message,
112+
})
113+
conditionsv1.SetStatusCondition(conditions, conditionsv1.Condition{
114+
Type: conditionsv1.ConditionProgressing,
115+
Status: corev1.ConditionFalse,
116+
Reason: reason,
117+
Message: message,
118+
})
119+
conditionsv1.SetStatusCondition(conditions, conditionsv1.Condition{
120+
Type: conditionsv1.ConditionDegraded,
121+
Status: corev1.ConditionTrue,
122+
Reason: reason,
123+
Message: message,
124+
})
125+
conditionsv1.SetStatusCondition(conditions, conditionsv1.Condition{
126+
Type: conditionsv1.ConditionUpgradeable,
127+
Status: corev1.ConditionUnknown,
128+
Reason: reason,
129+
Message: message,
130+
})
131+
}
132+
133+
func SetComponentCondition(conditions *[]conditionsv1.Condition, component string, reason string, message string, status corev1.ConditionStatus) {
134+
condtype := component + ReadySuffix
135+
conditionsv1.SetStatusCondition(conditions, conditionsv1.Condition{
136+
Type: conditionsv1.ConditionType(condtype),
137+
Status: status,
138+
Reason: reason,
139+
Message: message,
140+
})
141+
}
142+
143+
func RemoveComponentCondition(conditions *[]conditionsv1.Condition, component string) {
144+
condtype := component + ReadySuffix
145+
conditionsv1.RemoveStatusCondition(conditions, conditionsv1.ConditionType(condtype))
110146
}
111147

112148
// SetCompleteCondition sets the ConditionReconcileComplete to True and other Conditions

0 commit comments

Comments
 (0)