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  }