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 }