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  }