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 }