github.com/metaprov/modela-operator@v0.0.0-20240118193048-f378be8b74d2/controllers/components/nginx.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 Nginx struct { 13 Namespace string 14 Name string 15 ReleaseName string 16 PodNamePrefix string 17 Dryrun bool 18 } 19 20 func NewNginx() *Nginx { 21 return &Nginx{ 22 Namespace: "nginx", 23 ReleaseName: "ingress-nginx", 24 Name: "ingress-nginx", 25 PodNamePrefix: "ingress-nginx-controller", 26 Dryrun: false, 27 } 28 } 29 30 func (n Nginx) GetInstallPhase() managementv1.ModelaPhase { 31 return managementv1.ModelaPhaseInstallingNginx 32 } 33 34 func (n Nginx) IsEnabled(modela managementv1.Modela) bool { 35 if modela.Spec.Network.Nginx == nil { 36 return false 37 } 38 return modela.Spec.Network.Nginx.Install 39 } 40 41 func (n Nginx) Installed(ctx context.Context) (bool, error) { 42 if belonging, err := kube.IsDeploymentCreatedByModela(n.Namespace, "ingress-nginx-controller"); err == nil && !belonging { 43 return true, managementv1.ComponentNotInstalledByModelaError 44 } 45 if installed, err := helm.IsChartInstalled(ctx, n.Name, n.Namespace, n.ReleaseName); !installed { 46 return false, err 47 } 48 49 return true, nil 50 } 51 52 func (n Nginx) Install(ctx context.Context, modela *managementv1.Modela) error { 53 logger := log.FromContext(ctx) 54 55 if err := kube.CreateNamespace(n.Namespace, modela.Name); err != nil && !k8serr.IsAlreadyExists(err) { 56 logger.Error(err, "failed to create namespace") 57 return err 58 } 59 60 return helm.InstallChart(ctx, n.Name, n.Namespace, n.ReleaseName, modela.Spec.Network.Nginx.Values.Object) 61 } 62 63 // Check if we are still installing the database 64 func (n Nginx) Installing(ctx context.Context) (bool, error) { 65 installed, err := n.Installed(ctx) 66 if !installed { 67 return installed, err 68 } 69 running, err := kube.IsPodRunning(n.Namespace, n.PodNamePrefix) 70 if err != nil { 71 return false, err 72 } 73 return !running, nil 74 } 75 76 func (n Nginx) Ready(ctx context.Context) (bool, error) { 77 installing, err := n.Installing(ctx) 78 if err != nil && err != managementv1.ComponentNotInstalledByModelaError { 79 return false, err 80 } 81 return !installing, nil 82 } 83 84 func (n Nginx) Uninstall(ctx context.Context, modela *managementv1.Modela) error { 85 return helm.UninstallChart(ctx, n.Name, n.Namespace, n.ReleaseName, map[string]interface{}{}) 86 }