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