github.com/metaprov/modela-operator@v0.0.0-20240118193048-f378be8b74d2/controllers/components/cert_manager.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  	k8serr "k8s.io/apimachinery/pkg/api/errors"
     9  	"sigs.k8s.io/controller-runtime/pkg/log"
    10  )
    11  
    12  type CertManager struct {
    13  	Namespace     string
    14  	Version       string
    15  	ReleaseName   string
    16  	Url           string
    17  	RepoUrl       string
    18  	RepoName      string
    19  	Name          string
    20  	PodNamePrefix string
    21  }
    22  
    23  func NewCertManager() *CertManager {
    24  	return &CertManager{
    25  		Namespace:     "cert-manager",
    26  		ReleaseName:   "cert-manager",
    27  		Url:           "cert-manager",
    28  		RepoName:      "jetstack",
    29  		Name:          "cert-manager",
    30  		PodNamePrefix: "cert-manager",
    31  	}
    32  }
    33  
    34  func (cm CertManager) GetInstallPhase() managementv1.ModelaPhase {
    35  	return managementv1.ModelaPhaseInstallingCertManager
    36  }
    37  
    38  func (cm CertManager) IsEnabled(modela managementv1.Modela) bool {
    39  	return modela.Spec.CertManager.Install
    40  }
    41  
    42  func (cm CertManager) Installed(ctx context.Context) (bool, error) {
    43  	if belonging, err := kube.IsDeploymentCreatedByModela(cm.Namespace, "cert-manager"); err == nil && !belonging {
    44  		return true, managementv1.ComponentNotInstalledByModelaError
    45  	}
    46  	if installed, err := helm.IsChartInstalled(ctx, cm.Name, cm.Namespace, cm.ReleaseName); !installed {
    47  		return false, err
    48  	}
    49  	return true, nil
    50  }
    51  
    52  func (cm CertManager) Install(ctx context.Context, modela *managementv1.Modela) error {
    53  	logger := log.FromContext(ctx)
    54  
    55  	if err := helm.AddRepo(cm.RepoName, cm.RepoUrl, false); err != nil {
    56  		logger.Error(err, "Failed to download Helm Repo", "repo", cm.RepoUrl)
    57  		return err
    58  	}
    59  	logger.Info("Added Helm Repo", "repo", cm.RepoName)
    60  	if err := kube.CreateNamespace(cm.Namespace, modela.Name); err != nil && !k8serr.IsAlreadyExists(err) {
    61  		logger.Error(err, "failed to create namespace")
    62  		return err
    63  	}
    64  
    65  	logger.Info("Applying Helm Chart", "version", cm.Version)
    66  	values := modela.Spec.CertManager.Values.Object
    67  	if values == nil {
    68  		values = make(map[string]interface{})
    69  	}
    70  	values["installCRDs"] = "true"
    71  	return helm.InstallChart(ctx, cm.Name, cm.Namespace, cm.ReleaseName, values)
    72  
    73  }
    74  
    75  func (cm CertManager) Installing(ctx context.Context) (bool, error) {
    76  	installed, err := cm.Installed(ctx)
    77  	if !installed {
    78  		return installed, err
    79  	}
    80  	running, err := kube.IsPodRunning(cm.Namespace, cm.PodNamePrefix)
    81  	if err != nil {
    82  		return false, err
    83  	}
    84  	return !running, nil
    85  
    86  }
    87  
    88  func (cm CertManager) Ready(ctx context.Context) (bool, error) {
    89  	installing, err := cm.Installing(ctx)
    90  	if err != nil && err != managementv1.ComponentNotInstalledByModelaError {
    91  		return false, err
    92  	}
    93  	return !installing, nil
    94  }
    95  
    96  func (cm CertManager) Uninstall(ctx context.Context, modela *managementv1.Modela) error {
    97  	logger := log.FromContext(ctx)
    98  	if err := helm.AddRepo(cm.RepoName, cm.RepoUrl, false); err != nil {
    99  		logger.Error(err, "Failed to download Helm Repo")
   100  		return err
   101  	}
   102  
   103  	logger.Info("Added Helm Repo", "repo", cm.RepoName)
   104  	return helm.UninstallChart(ctx, cm.Name, cm.Namespace, cm.ReleaseName, map[string]interface{}{})
   105  }