diff --git a/pkg/operator/ceph/cluster/nodedaemon/reconcile.go b/pkg/operator/ceph/cluster/nodedaemon/reconcile.go index a25c0f7e8..7a2ff3a26 100644 --- a/pkg/operator/ceph/cluster/nodedaemon/reconcile.go +++ b/pkg/operator/ceph/cluster/nodedaemon/reconcile.go @@ -85,6 +85,18 @@ func (r *ReconcileNode) Reconcile(context context.Context, request reconcile.Req return result, err } +func (r *ReconcileNode) cleanupExporterResources(clusterNamespace string, ns string, nodeName string) (reconcile.Result, error) { + err := k8sutil.DeleteServiceMonitor(r.opManagerContext, ns, cephExporterAppName) + if err != nil { + logger.Debugf("failed to delete service monitor for ceph exporter in namespace %q on node %q", ns, nodeName) + } + err = k8sutil.DeleteService(r.opManagerContext, r.context.Clientset, r.opConfig.OperatorNamespace, cephExporterAppName) + if err != nil { + return reconcile.Result{}, errors.Wrapf(err, "failed to delete ceph exporter metrics service in namespace %q on node %q", ns, nodeName) + } + return reconcile.Result{}, nil +} + func (r *ReconcileNode) reconcile(request reconcile.Request) (reconcile.Result, error) { logger.Debugf("reconciling node: %q", request.Name) @@ -195,6 +207,24 @@ func (r *ReconcileNode) reconcile(request reconcile.Request) (reconcile.Result, if err != nil { return reconcile.Result{}, errors.Wrapf(err, "failed to list and delete deployments in namespace %q on node %q", namespace, request.Name) } + result, err := r.cleanupExporterResources(cephCluster.Namespace, namespace, request.Name) + if err != nil { + return result, errors.Wrapf(err, "failed to cleanup exporter resources in namespace %q on node %q", namespace, request.Name) + } + } + // Cleanup exporter if the ceph version isn't supported + if !cephVersion.IsAtLeast(MinVersionForCephExporter) { + for _, cephPod := range cephPods { + if cephPod.Spec.NodeName == request.Name { + if err := r.listDeploymentAndDelete(cephExporterAppName, request.Name, namespace); err != nil { + return reconcile.Result{}, errors.Wrap(err, "failed to delete ceph-exporter") + } + result, err := r.cleanupExporterResources(cephCluster.Namespace, namespace, request.Name) + if err != nil { + return result, errors.Wrapf(err, "failed to cleanup exporter resources in namespace %q on node %q", namespace, request.Name) + } + } + } } if err := r.reconcileCrashPruner(namespace, cephCluster, cephVersion); err != nil { @@ -218,7 +248,7 @@ func (r *ReconcileNode) createOrUpdateNodeDaemons(node corev1.Node, tolerations logger.Debugf("crash collector successfully reconciled for node %q. operation: %q", node.Name, op) } } - if !cephCluster.Spec.Monitoring.MetricsDisabled { + if cephVersion.IsAtLeast(MinVersionForCephExporter) && !cephCluster.Spec.Monitoring.MetricsDisabled { op, err := r.createOrUpdateCephExporter(node, tolerations, cephCluster, cephVersion) if err != nil { if op == "unchanged" { diff --git a/pkg/operator/k8sutil/prometheus.go b/pkg/operator/k8sutil/prometheus.go index 6951767e9..ae745b287 100644 --- a/pkg/operator/k8sutil/prometheus.go +++ b/pkg/operator/k8sutil/prometheus.go @@ -23,6 +23,7 @@ import ( monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringclient "github.com/prometheus-operator/prometheus-operator/pkg/client/versioned" + kerror "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/clientcmd" @@ -101,3 +102,18 @@ func CreateOrUpdateServiceMonitor(ctx context.Context, serviceMonitorDefinition } return sm, nil } + +// DeleteServiceMonitor deletes a ServiceMonitor and returns the error if any +func DeleteServiceMonitor(ctx context.Context, ns string, name string) error { + client, err := getMonitoringClient() + if err != nil { + return fmt.Errorf("failed to get monitoring client. %v", err) + } + err = client.MonitoringV1().ServiceMonitors(ns).Delete(ctx, name, metav1.DeleteOptions{}) + if err != nil { + if kerror.IsNotFound(err) { + return nil + } + } + return err +}