From 4ead08bb395f28c6789e8ca9cb3499f1996281b0 Mon Sep 17 00:00:00 2001 From: Garet Halliday <me@garet.holiday> Date: Fri, 8 Sep 2023 16:17:10 -0500 Subject: [PATCH] use pool mode and secret format from operator config --- .../zalando_operator_discovery/config.go | 6 +- .../zalando_operator_discovery/server.go | 55 ++++++++++++++----- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/lib/gat/modes/zalando_operator_discovery/config.go b/lib/gat/modes/zalando_operator_discovery/config.go index c442f568..a5312947 100644 --- a/lib/gat/modes/zalando_operator_discovery/config.go +++ b/lib/gat/modes/zalando_operator_discovery/config.go @@ -5,7 +5,8 @@ import ( ) type Config struct { - Namespace string + Namespace string + ConfigName string Rest *rest.Config } @@ -16,7 +17,8 @@ func Load() (*Config, error) { return nil, err } return &Config{ - Namespace: "default", + Namespace: "default", + ConfigName: "postgres-operator", Rest: restConfig, }, nil diff --git a/lib/gat/modes/zalando_operator_discovery/server.go b/lib/gat/modes/zalando_operator_discovery/server.go index c522c0b3..9b2e584c 100644 --- a/lib/gat/modes/zalando_operator_discovery/server.go +++ b/lib/gat/modes/zalando_operator_discovery/server.go @@ -3,13 +3,15 @@ package zalando_operator_discovery import ( "context" "crypto/tls" + "strings" acidzalando "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do" - v1acid "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" + acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" acidv1informer "github.com/zalando/postgres-operator/pkg/generated/informers/externalversions/acid.zalan.do/v1" + "github.com/zalando/postgres-operator/pkg/util/config" "github.com/zalando/postgres-operator/pkg/util/constants" "github.com/zalando/postgres-operator/pkg/util/k8sutil" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/tools/cache" "tuxpa.in/a/zlog/log" @@ -21,6 +23,7 @@ import ( "pggat/lib/gat" "pggat/lib/gat/pool" "pggat/lib/gat/pool/dialer" + "pggat/lib/gat/pool/pools/session" "pggat/lib/gat/pool/pools/transaction" "pggat/lib/gat/pool/recipe" "pggat/lib/util/flip" @@ -40,6 +43,8 @@ type toAddDetails struct { type Server struct { config *Config + opConfig *config.Config + k8s k8sutil.KubernetesClient postgresqlInformer cache.SharedIndexInformer @@ -64,6 +69,13 @@ func (T *Server) init() error { return err } + operatorConfig, err := T.k8s.ConfigMaps(T.config.Namespace).Get(context.Background(), T.config.ConfigName, metav1.GetOptions{}) + if err != nil { + return err + } + + T.opConfig = config.NewFromMap(operatorConfig.Data) + T.postgresqlInformer = acidv1informer.NewPostgresqlInformer( T.k8s.AcidV1ClientSet, T.config.Namespace, @@ -72,25 +84,25 @@ func (T *Server) init() error { _, err = T.postgresqlInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { - psql, ok := obj.(*v1acid.Postgresql) + psql, ok := obj.(*acidv1.Postgresql) if !ok { return } T.addPostgresql(psql) }, UpdateFunc: func(oldObj, newObj interface{}) { - oldPsql, ok := oldObj.(*v1acid.Postgresql) + oldPsql, ok := oldObj.(*acidv1.Postgresql) if !ok { return } - newPsql, ok := newObj.(*v1acid.Postgresql) + newPsql, ok := newObj.(*acidv1.Postgresql) if !ok { return } T.updatePostgresql(oldPsql, newPsql) }, DeleteFunc: func(obj interface{}) { - psql, ok := obj.(*v1acid.Postgresql) + psql, ok := obj.(*acidv1.Postgresql) if !ok { return } @@ -104,14 +116,14 @@ func (T *Server) init() error { return nil } -func (T *Server) addPostgresql(psql *v1acid.Postgresql) { +func (T *Server) addPostgresql(psql *acidv1.Postgresql) { T.updatePostgresql(nil, psql) } func (T *Server) addPool(name string, userCreds, serverCreds auth.Credentials, database string) { d := dialer.Net{ Network: "tcp", - Address: name + "." + T.config.Namespace + ".svc.cluster.local:5432", // TODO(garet) lookup port from config map + Address: name + "." + T.config.Namespace + ".svc.cluster.local:5432", AcceptOptions: backends.AcceptOptions{ SSLMode: bouncer.SSLModePrefer, SSLConfig: &tls.Config{ @@ -125,7 +137,16 @@ func (T *Server) addPool(name string, userCreds, serverCreds auth.Credentials, d poolOptions := pool.Options{ Credentials: userCreds, } - p := transaction.NewPool(poolOptions) + var p *pool.Pool + switch T.opConfig.Mode { + case "transaction": + p = transaction.NewPool(poolOptions) + case "session": + p = session.NewPool(poolOptions) + default: + log.Printf(`unknown pool mode "%s"`, T.opConfig.Mode) + return + } recipeOptions := recipe.Options{ Dialer: d, @@ -137,7 +158,7 @@ func (T *Server) addPool(name string, userCreds, serverCreds auth.Credentials, d T.pools.Add(userCreds.GetUsername(), database, p) } -func (T *Server) updatePostgresql(oldPsql *v1acid.Postgresql, newPsql *v1acid.Postgresql) { +func (T *Server) updatePostgresql(oldPsql *acidv1.Postgresql, newPsql *acidv1.Postgresql) { toRemove := make(map[mapKey]struct{}) toAdd := make(map[mapKey]toAddDetails) @@ -206,10 +227,14 @@ func (T *Server) updatePostgresql(oldPsql *v1acid.Postgresql, newPsql *v1acid.Po for pair, details := range toAdd { creds, ok := credentialsCache[details.SecretUser] if !ok { - // TODO(garet) lookup config map to get this format (what a pain) - secretName := details.SecretUser + "." + newPsql.Name + ".credentials." + v1acid.PostgresCRDResourceKind + "." + acidzalando.GroupName - - secret, err := T.k8s.Secrets(T.config.Namespace).Get(context.Background(), secretName, v1.GetOptions{}) + secretName := T.opConfig.SecretNameTemplate.Format( + "username", strings.Replace(details.SecretUser, "_", "-", -1), + "cluster", newPsql.Name, + "tprkind", acidv1.PostgresCRDResourceKind, + "tprgroup", acidzalando.GroupName, + ) + + secret, err := T.k8s.Secrets(T.config.Namespace).Get(context.Background(), secretName, metav1.GetOptions{}) if err != nil { log.Printf("error getting secret: %v", err) return @@ -235,7 +260,7 @@ func (T *Server) updatePostgresql(oldPsql *v1acid.Postgresql, newPsql *v1acid.Po } } -func (T *Server) deletePostgresql(psql *v1acid.Postgresql) { +func (T *Server) deletePostgresql(psql *acidv1.Postgresql) { T.updatePostgresql(psql, nil) } -- GitLab