github.com/metaprov/modela-operator@v0.0.0-20240118193048-f378be8b74d2/controllers/components/prometheus.go (about)

     1  package components
     2  
     3  import (
     4  	"context"
     5  	"github.com/metaprov/modela-operator/pkg/helm"
     6  	"github.com/metaprov/modela-operator/pkg/kube"
     7  
     8  	managementv1 "github.com/metaprov/modela-operator/api/v1alpha1"
     9  	"sigs.k8s.io/controller-runtime/pkg/log"
    10  )
    11  
    12  // Modela system represent the model core system
    13  type Prometheus struct {
    14  	Namespace     string
    15  	Version       string
    16  	ReleaseName   string
    17  	RepoUrl       string
    18  	RepoName      string
    19  	Url           string
    20  	Name          string
    21  	PodNamePrefix string
    22  	Dryrun        bool
    23  }
    24  
    25  func NewPrometheus() *Prometheus {
    26  	return &Prometheus{
    27  		Namespace:     "prometheus-community",
    28  		ReleaseName:   "kube-prometheus",
    29  		RepoName:      "prometheus-community",
    30  		Name:          "prometheus",
    31  		Url:           "prometheus",
    32  		PodNamePrefix: "kube-prometheus-server",
    33  		RepoUrl:       "https://prometheus-community.github.io/helm-charts",
    34  		Dryrun:        false,
    35  	}
    36  }
    37  
    38  func (m Prometheus) GetInstallPhase() managementv1.ModelaPhase {
    39  	return managementv1.ModelaPhaseInstallingPrometheus
    40  }
    41  
    42  func (m Prometheus) IsEnabled(modela managementv1.Modela) bool {
    43  	return modela.Spec.Observability.Prometheus
    44  }
    45  
    46  func (m Prometheus) Installed(ctx context.Context) (bool, error) {
    47  	if belonging, err := kube.IsDeploymentCreatedByModela(m.Namespace, "kube-prometheus-server"); err == nil && !belonging {
    48  		return true, managementv1.ComponentNotInstalledByModelaError
    49  	}
    50  	return helm.IsChartInstalled(ctx, m.Name, m.Namespace, m.ReleaseName)
    51  }
    52  
    53  func (m Prometheus) Install(ctx context.Context, modela *managementv1.Modela) error {
    54  	logger := log.FromContext(ctx)
    55  
    56  	if err := helm.AddRepo(m.RepoName, m.RepoUrl, m.Dryrun); err != nil {
    57  		logger.Error(err, "Failed to download Helm Repo", "repo", m.RepoUrl)
    58  		return err
    59  	}
    60  
    61  	logger.Info("Added Helm Repo", "repo", m.RepoName)
    62  	if err := kube.CreateNamespace(m.Namespace, modela.Name); err != nil {
    63  		logger.Error(err, "failed to create namespace")
    64  		return err
    65  	}
    66  
    67  	logger.Info("Applying Helm Chart", "version", m.Version)
    68  	return helm.InstallChart(ctx, m.Name, m.Namespace, m.ReleaseName, modela.Spec.Observability.PrometheusValues.Object)
    69  }
    70  
    71  func (m Prometheus) Installing(ctx context.Context) (bool, error) {
    72  	installed, err := m.Installed(ctx)
    73  	if !installed {
    74  		return installed, err
    75  	}
    76  	running, err := kube.IsPodRunning(m.Namespace, m.PodNamePrefix)
    77  	if err != nil {
    78  		return false, err
    79  	}
    80  	return !running, nil
    81  }
    82  
    83  func (m Prometheus) Ready(ctx context.Context) (bool, error) {
    84  	installing, err := m.Installing(ctx)
    85  	if err != nil && err != managementv1.ComponentNotInstalledByModelaError {
    86  		return false, err
    87  	}
    88  	return !installing, nil
    89  }
    90  
    91  func (m Prometheus) Uninstall(ctx context.Context, modela *managementv1.Modela) error {
    92  	return helm.UninstallChart(
    93  		ctx,
    94  		m.Name,
    95  		m.Namespace,
    96  		m.ReleaseName,
    97  		map[string]interface{}{},
    98  	)
    99  }