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 }