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