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