Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 32 additions & 16 deletions internal/knowledge/datasources/openstack/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
FromSecretRef(ctx, datasource.Spec.DatabaseSecretRef)
if err != nil {
log.Error(err, "failed to authenticate with database", "secretRef", datasource.Spec.DatabaseSecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "DatabaseAuthenticationFailed",
Message: "failed to authenticate with database: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -91,14 +93,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
FromSecretRef(ctx, *datasource.Spec.SSOSecretRef)
if err != nil {
log.Error(err, "failed to authenticate with SSO", "secretRef", datasource.Spec.SSOSecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "SSOAuthenticationFailed",
Message: "failed to authenticate with SSO: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -110,14 +114,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
FromSecretRef(ctx, datasource.Spec.OpenStack.SecretRef)
if err != nil {
log.Error(err, "failed to authenticate with keystone", "secretRef", datasource.Spec.OpenStack.SecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "KeystoneAuthenticationFailed",
Message: "failed to authenticate with keystone: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -131,14 +137,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
)
if err != nil {
log.Info("skipping datasource, unsupported openstack datasource type", "type", datasource.Spec.OpenStack.Type)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "UnsupportedOpenStackDatasourceType",
Message: "unsupported openstack datasource type: " + string(datasource.Spec.OpenStack.Type),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
Expand All @@ -147,14 +155,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
// Initialize the syncer before syncing.
if err := syncer.Init(ctx); err != nil {
log.Error(err, "failed to init openstack datasource", "name", datasource.Name)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "OpenStackDatasourceInitFailed",
Message: "failed to init openstack datasource: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -163,14 +173,16 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
nResults, err := syncer.Sync(ctx)
if errors.Is(err, v1alpha1.ErrWaitingForDependencyDatasource) {
log.Info("datasource sync waiting for dependency datasource", "name", datasource.Name)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionWaiting,
Status: metav1.ConditionTrue,
Reason: "WaitingForDependencyDatasource",
Message: "waiting for dependency datasource",
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
// Requeue after a short delay to check again.
Expand All @@ -179,29 +191,33 @@ func (r *OpenStackDatasourceReconciler) Reconcile(ctx context.Context, req ctrl.
// Other error
if err != nil {
log.Error(err, "failed to sync openstack datasource", "name", datasource.Name)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "OpenStackDatasourceSyncFailed",
Message: "failed to sync openstack datasource: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
}

// Update the datasource status to reflect successful sync.
old := datasource.DeepCopy()
meta.RemoveStatusCondition(&datasource.Status.Conditions, v1alpha1.DatasourceConditionError)
meta.RemoveStatusCondition(&datasource.Status.Conditions, v1alpha1.DatasourceConditionWaiting)
datasource.Status.LastSynced = metav1.NewTime(time.Now())
nextTime := time.Now().Add(datasource.Spec.OpenStack.SyncInterval.Duration)
datasource.Status.NextSyncTime = metav1.NewTime(nextTime)
datasource.Status.NumberOfObjects = nResults
datasource.Status.Took = metav1.Duration{Duration: time.Since(startedAt)}
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}

Expand Down
36 changes: 24 additions & 12 deletions internal/knowledge/datasources/prometheus/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,16 @@ func (r *PrometheusDatasourceReconciler) Reconcile(ctx context.Context, req ctrl
newSyncerFunc, ok := supportedMetricSyncers[datasource.Spec.Prometheus.Type]
if !ok {
log.Info("skipping datasource, unsupported metric type", "metricType", datasource.Spec.Prometheus.Type)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "UnsupportedPrometheusMetricType",
Message: "unsupported metric type: " + datasource.Spec.Prometheus.Type,
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, nil
Expand All @@ -79,14 +81,16 @@ func (r *PrometheusDatasourceReconciler) Reconcile(ctx context.Context, req ctrl
FromSecretRef(ctx, datasource.Spec.DatabaseSecretRef)
if err != nil {
log.Error(err, "failed to authenticate with database", "secretRef", datasource.Spec.DatabaseSecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "DatabaseAuthenticationFailed",
Message: "failed to authenticate with database: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -99,14 +103,16 @@ func (r *PrometheusDatasourceReconciler) Reconcile(ctx context.Context, req ctrl
FromSecretRef(ctx, *datasource.Spec.SSOSecretRef)
if err != nil {
log.Error(err, "failed to authenticate with SSO", "secretRef", datasource.Spec.SSOSecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "SSOAuthenticationFailed",
Message: "failed to authenticate with SSO: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -124,14 +130,16 @@ func (r *PrometheusDatasourceReconciler) Reconcile(ctx context.Context, req ctrl
prometheusURL, ok := secret.Data["url"]
if !ok {
log.Error(err, "missing 'url' in prometheus secret", "secretRef", datasource.Spec.Prometheus.SecretRef)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "MissingPrometheusURL",
Message: "missing 'url' in prometheus secret",
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
Expand All @@ -147,27 +155,31 @@ func (r *PrometheusDatasourceReconciler) Reconcile(ctx context.Context, req ctrl
nResults, nextSync, err := syncer.Sync(ctx)
if err != nil {
log.Error(err, "failed to sync prometheus datasource", "name", datasource.Name)
old := datasource.DeepCopy()
meta.SetStatusCondition(&datasource.Status.Conditions, metav1.Condition{
Type: v1alpha1.DatasourceConditionError,
Status: metav1.ConditionTrue,
Reason: "PrometheusDatasourceSyncFailed",
Message: "failed to sync prometheus datasource: " + err.Error(),
})
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}
return ctrl.Result{}, err
}

// Update the datasource status to reflect successful sync.
old := datasource.DeepCopy()
meta.RemoveStatusCondition(&datasource.Status.Conditions, v1alpha1.DatasourceConditionError)
datasource.Status.LastSynced = metav1.NewTime(time.Now())
datasource.Status.NextSyncTime = metav1.NewTime(nextSync)
datasource.Status.NumberOfObjects = nResults
datasource.Status.Took = metav1.Duration{Duration: time.Since(startedAt)}
if err := r.Status().Update(ctx, datasource); err != nil {
log.Error(err, "failed to update datasource status", "name", datasource.Name)
patch := client.MergeFrom(old)
if err := r.Status().Patch(ctx, datasource, patch); err != nil {
log.Error(err, "failed to patch datasource status", "name", datasource.Name)
return ctrl.Result{}, err
}

Expand Down
Loading