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  }