diff --git a/integration_tests/db_test.go b/integration_tests/db_test.go index ea3d6b363..2ba1737c9 100644 --- a/integration_tests/db_test.go +++ b/integration_tests/db_test.go @@ -9,12 +9,8 @@ import ( "k8s.io/utils/ptr" - corev1 "k8s.io/api/core/v1" - appsv1 "k8s.io/api/apps/v1" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "github.com/redhat-developer/rhdh-operator/api" "k8s.io/apimachinery/pkg/types" @@ -39,53 +35,6 @@ var _ = When("create backstage with CR configured", func() { deleteNamespace(ctx, ns) }) - It("creates default Backstage and then update CR to not to use local DB", func() { - backstageName := createAndReconcileBackstage(ctx, ns, api.BackstageSpec{}, "") - - Eventually(func(g Gomega) { - By("creating Deployment with database.enableLocalDb=true by default") - - err := k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-%s", backstageName)}, &appsv1.StatefulSet{}) - g.Expect(err).To(Not(HaveOccurred())) - - err = k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-%s", backstageName)}, &corev1.Service{}) - g.Expect(err).To(Not(HaveOccurred())) - - err = k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-secret-%s", backstageName)}, &corev1.Secret{}) - g.Expect(err).To(Not(HaveOccurred())) - - }, time.Minute, time.Second).Should(Succeed()) - - By("updating Backstage") - update := &api.Backstage{} - err := k8sClient.Get(ctx, types.NamespacedName{Name: backstageName, Namespace: ns}, update) - Expect(err).To(Not(HaveOccurred())) - update.Spec.Database = &api.Database{} - update.Spec.Database.EnableLocalDb = ptr.To(false) - err = k8sClient.Update(ctx, update) - Expect(err).To(Not(HaveOccurred())) - _, err = NewTestBackstageReconciler(ns).ReconcileAny(ctx, reconcile.Request{ - NamespacedName: types.NamespacedName{Name: backstageName, Namespace: ns}, - }) - Expect(err).To(Not(HaveOccurred())) - - Eventually(func(g Gomega) { - By("deleting Local Db StatefulSet, Service and Secret") - err = k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-%s", backstageName)}, &appsv1.StatefulSet{}) - g.Expect(err).To(HaveOccurred()) - g.Expect(errors.IsNotFound(err)) - - err = k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-%s", backstageName)}, &corev1.Service{}) - g.Expect(err).To(HaveOccurred()) - g.Expect(errors.IsNotFound(err)) - - err = k8sClient.Get(ctx, types.NamespacedName{Namespace: ns, Name: fmt.Sprintf("backstage-psql-secret-%s", backstageName)}, &corev1.Secret{}) - g.Expect(err).To(HaveOccurred()) - g.Expect(errors.IsNotFound(err)) - }, time.Minute, time.Second).Should(Succeed()) - - }) - It("creates Backstage with disabled local DB and secret", func() { backstageName := createAndReconcileBackstage(ctx, ns, api.BackstageSpec{ Database: &api.Database{ diff --git a/internal/controller/backstage_controller.go b/internal/controller/backstage_controller.go index 338884dfa..abe61d1ed 100644 --- a/internal/controller/backstage_controller.go +++ b/internal/controller/backstage_controller.go @@ -5,23 +5,14 @@ import ( "fmt" "reflect" - "github.com/redhat-developer/rhdh-operator/pkg/platform" - "github.com/redhat-developer/rhdh-operator/pkg/model/multiobject" + "github.com/redhat-developer/rhdh-operator/pkg/platform" "github.com/redhat-developer/rhdh-operator/pkg/utils" "k8s.io/utils/ptr" - openshift "github.com/openshift/api/route/v1" - - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - corev1 "k8s.io/api/core/v1" - - appsv1 "k8s.io/api/apps/v1" - "github.com/redhat-developer/rhdh-operator/pkg/model" "github.com/redhat-developer/rhdh-operator/api" @@ -123,10 +114,6 @@ func (r *BackstageReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, errorAndStatus(&backstage, "failed to apply backstage objects", err) } - if err := r.cleanObjects(ctx, backstage); err != nil { - return ctrl.Result{}, errorAndStatus(&backstage, "failed to clean backstage objects ", err) - } - r.setDeploymentStatus(ctx, &backstage, *bsModel) return ctrl.Result{}, nil } @@ -187,50 +174,6 @@ func (r *BackstageReconciler) applyPayload(ctx context.Context, obj client.Objec return nil } -func (r *BackstageReconciler) cleanObjects(ctx context.Context, backstage api.Backstage) error { - - const failedToCleanup = "failed to cleanup runtime" - // check if local database disabled, respective objects have to deleted/unowned - if !backstage.Spec.IsLocalDbEnabled() { - if err := r.tryToDelete(ctx, &appsv1.StatefulSet{}, model.DbStatefulSetName(backstage.Name), backstage.Namespace); err != nil { - return fmt.Errorf("%s %w", failedToCleanup, err) - } - if err := r.tryToDelete(ctx, &corev1.Service{}, model.DbServiceName(backstage.Name), backstage.Namespace); err != nil { - return fmt.Errorf("%s %w", failedToCleanup, err) - } - if err := r.tryToDelete(ctx, &corev1.Secret{}, model.DbSecretDefaultName(backstage.Name), backstage.Namespace); err != nil { - return fmt.Errorf("%s %w", failedToCleanup, err) - } - } - - //// check if route disabled, respective objects have to deleted/unowned - if r.Platform.IsOpenshift() && !backstage.Spec.IsRouteEnabled() { - if err := r.tryToDelete(ctx, &openshift.Route{}, model.RouteName(backstage.Name), backstage.Namespace); err != nil { - return fmt.Errorf("%s %w", failedToCleanup, err) - } - } - - return nil -} - -// tryToDelete tries to delete the object by name and namespace, does not throw error if object not found or CRD does not exist -func (r *BackstageReconciler) tryToDelete(ctx context.Context, obj client.Object, name string, ns string) error { - obj.SetName(name) - obj.SetNamespace(ns) - if err := r.Delete(ctx, obj); err != nil { - if meta.IsNoMatchError(err) { - // RHDHBUGS-1990: no match for kind or resource, which can happen for example if the Prometheus CRDs - // are not installed when trying to delete a ServiceMonitor resource - return nil - } - if errors.IsNotFound(err) { - return nil - } - return fmt.Errorf("failed to delete %s: %w", name, err) - } - return nil -} - // SetupWithManager sets up the controller with the Manager. func (r *BackstageReconciler) SetupWithManager(mgr ctrl.Manager) error { diff --git a/internal/controller/backstage_controller_test.go b/internal/controller/backstage_controller_test.go deleted file mode 100644 index d62441aee..000000000 --- a/internal/controller/backstage_controller_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package controller - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -type fakeDeleteClient struct { - client.Client - deleteFunc func(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error -} - -func (f *fakeDeleteClient) Delete(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error { - return f.deleteFunc(ctx, obj, opts...) -} - -func TestBackstageReconciler_tryToDelete(t *testing.T) { - tests := []struct { - name string - deleteFunc func(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error - wantErr bool - }{ - { - name: "success", - deleteFunc: func(_ context.Context, _ client.Object, _ ...client.DeleteOption) error { - return nil - }, - wantErr: false, - }, - { - name: "not found error", - deleteFunc: func(_ context.Context, _ client.Object, _ ...client.DeleteOption) error { - return apierrors.NewNotFound( - schema.GroupResource{Group: "my-group", Resource: "my-resource"}, - "some-name", - ) - }, - wantErr: false, - }, - { - // RHDHBUGS-1990 - name: "no match error", - deleteFunc: func(_ context.Context, _ client.Object, _ ...client.DeleteOption) error { - return &meta.NoKindMatchError{ - GroupKind: schema.GroupKind{Group: "monitoring.coreos.com", Kind: "ServiceMonitor"}, - } - }, - wantErr: false, - }, - { - name: "other error", - deleteFunc: func(_ context.Context, _ client.Object, _ ...client.DeleteOption) error { - return fmt.Errorf("any other unexpected error") - }, - wantErr: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - r := &BackstageReconciler{ - Client: &fakeDeleteClient{ - deleteFunc: tt.deleteFunc, - }, - } - err := r.tryToDelete(context.TODO(), &unstructured.Unstructured{}, "my-name", "my-ns") - - if tt.wantErr { - assert.Error(t, err, "expected an error but got none") - } else { - assert.NoError(t, err, "expected no error but got one") - } - }) - } -} diff --git a/internal/controller/monitor.go b/internal/controller/monitor.go index f844f7ad4..fb6b4db3b 100644 --- a/internal/controller/monitor.go +++ b/internal/controller/monitor.go @@ -19,12 +19,7 @@ func (r *BackstageReconciler) applyServiceMonitor(ctx context.Context, backstage lg := log.FromContext(ctx).WithValues("Backstage", backstage.Name) if !backstage.Spec.IsMonitoringEnabled() { - lg.Info("monitoring disabled, deleting any existing ServiceMonitor") - return r.tryToDelete(ctx, - &monitoringv1.ServiceMonitor{}, - utils.GenerateRuntimeObjectName(backstage.Name, "metrics"), - backstage.Namespace, - ) + return nil } sm := &monitoringv1.ServiceMonitor{ diff --git a/internal/controller/monitor_test.go b/internal/controller/monitor_test.go index e9fabab0e..69ea34f28 100644 --- a/internal/controller/monitor_test.go +++ b/internal/controller/monitor_test.go @@ -8,7 +8,6 @@ import ( monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" "github.com/stretchr/testify/assert" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -70,14 +69,6 @@ func TestApplyServiceMonitor_MonitoringDisabled(t *testing.T) { // Apply service monitor (should delete the existing one) err = r.applyServiceMonitor(ctx, backstage) assert.NoError(t, err) - - // Verify ServiceMonitor was deleted - sm := &monitoringv1.ServiceMonitor{} - err = r.Get(ctx, types.NamespacedName{ - Name: utils.GenerateRuntimeObjectName(backstage.Name, "metrics"), - Namespace: backstage.Namespace, - }, sm) - assert.True(t, apierrors.IsNotFound(err)) } func TestApplyServiceMonitor_MonitoringEnabled_NoCRD(t *testing.T) {