Skip to content

Commit

Permalink
Report error in status if more than one DataScienceCluster installed (o…
Browse files Browse the repository at this point in the history
…pendatahub-io#687)

* DSCc, DSCIc: move len > 1 check after getting first instance.

In case of > 1 dataclusters installed report error condition in the
kubernetes status which previously was only reported in the operator
logs.
Add DuplicateDataScienceCluster string constant for that.

* DSCc, DSCIc: set status for > 1 DSCInitialization

Repeat for DSCInitialization the same logic as for
DataScienceCluster.

The check is performed in both DSCInitialization and
DataScienceCluster controllers.

Fixes: opendatahub-io#644
Signed-off-by: Yauheni Kaliuta <ykaliuta@redhat.com>

---------

Signed-off-by: Yauheni Kaliuta <ykaliuta@redhat.com>
(cherry picked from commit 4e95d43)
  • Loading branch information
ykaliuta authored and VaishnaviHire committed Nov 15, 2023
1 parent bb8f5b7 commit 61ca3b2
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 15 deletions.
28 changes: 19 additions & 9 deletions controllers/datasciencecluster/datasciencecluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,6 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R
return ctrl.Result{}, err
}

if len(instances.Items) > 1 {
message := fmt.Sprintf("only one instance of DataScienceCluster object is allowed. Update existing instance %s", req.Name)
err := errors.New(message)
_ = r.reportError(err, &instances.Items[0], message)

return ctrl.Result{}, err
}

if len(instances.Items) == 0 {
// Request object not found, could have been deleted after reconcile request.
// Owned objects are automatically garbage collected. For additional cleanup logic use operatorUninstall function.
Expand All @@ -102,6 +94,19 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R

instance := &instances.Items[0]

if len(instances.Items) > 1 {
message := fmt.Sprintf("only one instance of DataScienceCluster object is allowed. Update existing instance %s", req.Name)
err := errors.New(message)
_ = r.reportError(err, instance, message)

_, _ = r.updateStatus(ctx, instance, func(saved *dsc.DataScienceCluster) {
status.SetErrorCondition(&saved.Status.Conditions, status.DuplicateDataScienceCluster, message)
saved.Status.Phase = status.PhaseError
})

return ctrl.Result{}, err
}

var err error

// Verify a valid DSCInitialization instance is created
Expand Down Expand Up @@ -132,7 +137,12 @@ func (r *DataScienceClusterReconciler) Reconcile(ctx context.Context, req ctrl.R
dscInitializationSpec := dsciInstances.Items[0].Spec
dscInitializationSpec.DeepCopyInto(r.DataScienceCluster.DSCISpec)
default:
return ctrl.Result{}, errors.New("only one instance of DSCInitialization object is allowed")
message := "only one instance of DSCInitialization object is allowed"
_, _ = r.updateStatus(ctx, instance, func(saved *dsc.DataScienceCluster) {
status.SetErrorCondition(&saved.Status.Conditions, status.DuplicateDSCInitialization, message)
saved.Status.Phase = status.PhaseError
})
return ctrl.Result{}, errors.New(message)
}

allComponents, err := getAllComponents(&instance.Spec.Components)
Expand Down
17 changes: 11 additions & 6 deletions controllers/dscinitialization/dscinitialization_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,23 @@ func (r *DSCInitializationReconciler) Reconcile(ctx context.Context, req ctrl.Re
return ctrl.Result{}, err
}

if len(instances.Items) > 1 {
message := fmt.Sprintf("only one instance of DSCInitialization object is allowed. Update existing instance name %s", req.Name)

return ctrl.Result{}, errors.New(message)
}

if len(instances.Items) == 0 {
return ctrl.Result{}, nil
}

instance := &instances.Items[0]

if len(instances.Items) > 1 {
message := fmt.Sprintf("only one instance of DSCInitialization object is allowed. Update existing instance name %s", req.Name)

_, _ = r.updateStatus(ctx, instance, func(saved *dsci.DSCInitialization) {
status.SetErrorCondition(&saved.Status.Conditions, status.DuplicateDSCInitialization, message)
saved.Status.Phase = status.PhaseError
})

return ctrl.Result{}, errors.New(message)
}

if instance.ObjectMeta.DeletionTimestamp.IsZero() {
if !controllerutil.ContainsFinalizer(instance, finalizerName) {
r.Log.Info("Adding finalizer for DSCInitialization", "name", instance.Name, "finalizer", finalizerName)
Expand Down
2 changes: 2 additions & 0 deletions controllers/status/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ const (
ReconcileCompleted = "ReconcileCompleted"
ReconcileCompletedWithComponentErrors = "ReconcileCompletedWithComponentErrors"
ReconcileCompletedMessage = "Reconcile completed successfully"
DuplicateDataScienceCluster = "DuplicateDataScienceCluster"
DuplicateDSCInitialization = "DuplicateDSCInitialization"

// ConditionReconcileComplete represents extra Condition Type, used by .Condition.Type.
ConditionReconcileComplete conditionsv1.ConditionType = "ReconcileComplete"
Expand Down

0 comments on commit 61ca3b2

Please sign in to comment.