diff --git a/controllers/reconcilers/grafana/ingress_reconciler.go b/controllers/reconcilers/grafana/ingress_reconciler.go index 873bc8fbd..244c44392 100644 --- a/controllers/reconcilers/grafana/ingress_reconciler.go +++ b/controllers/reconcilers/grafana/ingress_reconciler.go @@ -10,8 +10,11 @@ import ( "github.com/grafana/grafana-operator/v5/controllers/reconcilers" routev1 "github.com/openshift/api/route/v1" v1 "k8s.io/api/networking/v1" + kuberr "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" logf "sigs.k8s.io/controller-runtime/pkg/log" @@ -36,6 +39,11 @@ func NewIngressReconciler(client client.Client, isOpenShift bool) reconcilers.Op func (r *IngressReconciler) Reconcile(ctx context.Context, cr *v1beta1.Grafana, vars *v1beta1.OperatorReconcileVars, scheme *runtime.Scheme) (v1beta1.OperatorStageStatus, error) { log := logf.FromContext(ctx).WithName("IngressReconciler") + err := r.deleteIngressIfNil(ctx, cr, scheme) + if err != nil { + return v1beta1.OperatorStageResultFailed, err + } + // On openshift, Fallback to Ingress when spec.route is undefined if r.isOpenShift && cr.Spec.Route != nil { log.Info("reconciling route") @@ -47,6 +55,32 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, cr *v1beta1.Grafana, return r.reconcileIngress(ctx, cr, vars, scheme) } +func (r *IngressReconciler) deleteIngressIfNil(ctx context.Context, cr *v1beta1.Grafana, scheme *runtime.Scheme) error { + if cr.Spec.Ingress != nil { + return nil + } + + ingress := model.GetGrafanaIngress(cr, scheme) + + req := ctrl.Request{ + NamespacedName: types.NamespacedName{ + Name: ingress.Name, + Namespace: ingress.Namespace, + }, + } + + err := r.client.Get(ctx, req.NamespacedName, ingress) + if err != nil { + if kuberr.IsNotFound(err) { + return nil + } + + return fmt.Errorf("error getting Ingress: %w", err) + } + + return r.client.Delete(ctx, ingress) +} + func (r *IngressReconciler) reconcileIngress(ctx context.Context, cr *v1beta1.Grafana, _ *v1beta1.OperatorReconcileVars, scheme *runtime.Scheme) (v1beta1.OperatorStageStatus, error) { if cr.Spec.Ingress == nil { return v1beta1.OperatorStageResultSuccess, nil diff --git a/controllers/reconcilers/grafana/ingress_reconciler_test.go b/controllers/reconcilers/grafana/ingress_reconciler_test.go index 501e83e96..07bb9f0c9 100644 --- a/controllers/reconcilers/grafana/ingress_reconciler_test.go +++ b/controllers/reconcilers/grafana/ingress_reconciler_test.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" routev1 "github.com/openshift/api/route/v1" + kuberr "k8s.io/apimachinery/pkg/api/errors" "k8s.io/client-go/kubernetes/scheme" networkingv1 "k8s.io/api/networking/v1" @@ -79,4 +80,51 @@ var _ = Describe("Allow use of Ingress on OpenShift", func() { }, route) Expect(err).ToNot(HaveOccurred()) }) + + It("Removes Ingress when .spec.ingress is removed", func() { + r := NewIngressReconciler(k8sClient, false) + cr := &v1beta1.Grafana{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ingress-nil", + Namespace: "default", + Labels: map[string]string{}, + }, + Spec: v1beta1.GrafanaSpec{ + Ingress: &v1beta1.IngressNetworkingV1{}, + }, + } + + ctx := context.Background() + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + vars := &v1beta1.OperatorReconcileVars{} + status, err := r.Reconcile(ctx, cr, vars, scheme.Scheme) + + Expect(err).ToNot(HaveOccurred()) + Expect(status).To(Equal(v1beta1.OperatorStageResultSuccess)) + + ingress := &networkingv1.Ingress{} + err = k8sClient.Get(ctx, types.NamespacedName{ + Name: fmt.Sprintf("%s-ingress", cr.Name), + Namespace: "default", + }, ingress) + Expect(err).ToNot(HaveOccurred()) + + cr.Spec.Ingress = nil + + Expect(k8sClient.Update(ctx, cr)).To(Succeed()) + + status, err = r.Reconcile(ctx, cr, vars, scheme.Scheme) + + Expect(err).ToNot(HaveOccurred()) + Expect(status).To(Equal(v1beta1.OperatorStageResultSuccess)) + + ingress = &networkingv1.Ingress{} + err = k8sClient.Get(ctx, types.NamespacedName{ + Name: fmt.Sprintf("%s-ingress", cr.Name), + Namespace: "default", + }, ingress) + + Expect(kuberr.IsNotFound(err)).To(BeTrue()) + }) })