diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 28552bc6f..5f34899a1 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -598,6 +598,8 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error { } }() + logNiceDiff(c.logger, oldSpec, newSpec) + if oldSpec.Spec.PostgresqlParam.PgVersion != newSpec.Spec.PostgresqlParam.PgVersion { // PG versions comparison c.logger.Warningf("postgresql version change(%q -> %q) has no effect", oldSpec.Spec.PostgresqlParam.PgVersion, newSpec.Spec.PostgresqlParam.PgVersion) @@ -610,7 +612,6 @@ func (c *Cluster) Update(oldSpec, newSpec *acidv1.Postgresql) error { // Service if !reflect.DeepEqual(c.generateService(Master, &oldSpec.Spec), c.generateService(Master, &newSpec.Spec)) || !reflect.DeepEqual(c.generateService(Replica, &oldSpec.Spec), c.generateService(Replica, &newSpec.Spec)) { - c.logger.Debugf("syncing services") if err := c.syncServices(); err != nil { c.logger.Errorf("could not sync services: %v", err) updateFailed = true diff --git a/pkg/cluster/connection_pooler.go b/pkg/cluster/connection_pooler.go index ff1dee6a9..043416243 100644 --- a/pkg/cluster/connection_pooler.go +++ b/pkg/cluster/connection_pooler.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/r3labs/diff" + "github.com/sirupsen/logrus" acidzalando "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do" acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1" appsv1 "k8s.io/api/apps/v1" @@ -406,12 +407,12 @@ func (c *Cluster) generateConnectionPoolerService(connectionPooler *ConnectionPo //delete connection pooler func (c *Cluster) deleteConnectionPooler(role PostgresRole) (err error) { - c.logger.Debugln("deleting connection pooler") + c.logger.Infof("deleting connection pooler spilo-role=%s", role) // Lack of connection pooler objects is not a fatal error, just log it if // it was present before in the manifest if c.ConnectionPooler[role] == nil || role == "" { - c.logger.Infof("No connection pooler to delete") + c.logger.Debugf("no connection pooler to delete") return nil } @@ -433,34 +434,34 @@ func (c *Cluster) deleteConnectionPooler(role PostgresRole) (err error) { Delete(context.TODO(), deployment.Name, options) if k8sutil.ResourceNotFound(err) { - c.logger.Debugf("Connection pooler deployment was already deleted") + c.logger.Debugf("connection pooler deployment was already deleted") } else if err != nil { - return fmt.Errorf("could not delete deployment: %v", err) + return fmt.Errorf("could not delete connection pooler deployment: %v", err) } - c.logger.Infof("Connection pooler deployment %q has been deleted for role %s", deployment.Name, role) + c.logger.Infof("connection pooler deployment %s has been deleted for role %s", deployment.Name, role) } // Repeat the same for the service object var service *v1.Service service = c.ConnectionPooler[role].Service if service == nil { - c.logger.Infof("nil service to be deleted") - } - if service != nil { + c.logger.Debugf("no connection pooler service object to delete") + } else { err = c.KubeClient. Services(c.Namespace). Delete(context.TODO(), service.Name, options) if k8sutil.ResourceNotFound(err) { - c.logger.Debugf("Connection pooler service was already deleted") + c.logger.Debugf("connection pooler service was already deleted") } else if err != nil { - return fmt.Errorf("could not delete service: %v", err) + return fmt.Errorf("could not delete connection pooler service: %v", err) } - c.logger.Infof("Connection pooler service %q has been deleted for role %s", service.Name, role) + c.logger.Infof("connection pooler service %s has been deleted for role %s", service.Name, role) } + c.ConnectionPooler[role] = nil return nil } @@ -475,7 +476,7 @@ func (c *Cluster) deleteConnectionPoolerSecret() (err error) { Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { - c.logger.Debugf("could not get connection pooler secret %q: %v", secretName, err) + c.logger.Debugf("could not get connection pooler secret %s: %v", secretName, err) } else { if err = c.deleteSecret(secret.UID, *secret); err != nil { return fmt.Errorf("could not delete pooler secret: %v", err) @@ -493,7 +494,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe patchData, err := specPatch(newDeployment.Spec) if err != nil { - return nil, fmt.Errorf("could not form patch for the deployment: %v", err) + return nil, fmt.Errorf("could not form patch for the connection pooler deployment: %v", err) } // An update probably requires RetryOnConflict, but since only one operator @@ -508,7 +509,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe metav1.PatchOptions{}, "") if err != nil { - return nil, fmt.Errorf("could not patch deployment: %v", err) + return nil, fmt.Errorf("could not patch connection pooler deployment: %v", err) } return deployment, nil @@ -518,7 +519,7 @@ func updateConnectionPoolerDeployment(KubeClient k8sutil.KubernetesClient, newDe func updateConnectionPoolerAnnotations(KubeClient k8sutil.KubernetesClient, deployment *appsv1.Deployment, annotations map[string]string) (*appsv1.Deployment, error) { patchData, err := metaAnnotationsPatch(annotations) if err != nil { - return nil, fmt.Errorf("could not form patch for the deployment metadata: %v", err) + return nil, fmt.Errorf("could not form patch for the connection pooler deployment metadata: %v", err) } result, err := KubeClient.Deployments(deployment.Namespace).Patch( context.TODO(), @@ -657,7 +658,22 @@ func makeDefaultConnectionPoolerResources(config *config.Config) acidv1.Resource } } +func logPoolerEssentials(log *logrus.Entry, oldSpec, newSpec *acidv1.Postgresql) { + var v []string + + for _, b := range []*bool{oldSpec.Spec.EnableConnectionPooler, oldSpec.Spec.EnableReplicaConnectionPooler, newSpec.Spec.EnableConnectionPooler, newSpec.Spec.EnableReplicaConnectionPooler} { + if b == nil { + v = append(v, "nil") + } else { + v = append(v, fmt.Sprintf("%v", *b)) + } + } + + log.Debugf("syncing connection pooler from (%v, %v) to (%v, %v)", v[0], v[1], v[2], v[3]) +} + func (c *Cluster) syncConnectionPooler(oldSpec, newSpec *acidv1.Postgresql, LookupFunction InstallFunction) (SyncReason, error) { + logPoolerEssentials(c.logger, oldSpec, newSpec) var reason SyncReason var err error @@ -767,7 +783,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql Get(context.TODO(), c.connectionPoolerName(role), metav1.GetOptions{}) if err != nil && k8sutil.ResourceNotFound(err) { - msg := "Deployment %s for connection pooler synchronization is not found, create it" + msg := "deployment %s for connection pooler synchronization is not found, create it" c.logger.Warningf(msg, c.connectionPoolerName(role)) deploymentSpec, err := c.generateConnectionPoolerDeployment(c.ConnectionPooler[role]) @@ -811,7 +827,7 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql newConnectionPooler = &acidv1.ConnectionPooler{} } - c.logger.Infof("Old: %+v, New %+v", oldConnectionPooler, newConnectionPooler) + c.logger.Infof("old: %+v, new %+v", oldConnectionPooler, newConnectionPooler) var specSync bool var specReason []string diff --git a/pkg/cluster/connection_pooler_test.go b/pkg/cluster/connection_pooler_test.go index dfbf43476..19a79e074 100644 --- a/pkg/cluster/connection_pooler_test.go +++ b/pkg/cluster/connection_pooler_test.go @@ -150,6 +150,17 @@ func TestNeedConnectionPooler(t *testing.T) { testName) } + cluster.Spec = acidv1.PostgresSpec{ + EnableConnectionPooler: boolToPointer(false), + EnableReplicaConnectionPooler: boolToPointer(false), + ConnectionPooler: nil, + } + + if needMasterConnectionPooler(&cluster.Spec) { + t.Errorf("%s: Connection pooler is enabled with flag false and nil", + testName) + } + // Test for replica connection pooler cluster.Spec = acidv1.PostgresSpec{ ConnectionPooler: &acidv1.ConnectionPooler{}, diff --git a/pkg/cluster/sync.go b/pkg/cluster/sync.go index 25c5ba6a8..2013c9f80 100644 --- a/pkg/cluster/sync.go +++ b/pkg/cluster/sync.go @@ -43,15 +43,12 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error { return err } - c.logger.Debugf("syncing secrets") - //TODO: mind the secrets of the deleted/new users if err = c.syncSecrets(); err != nil { err = fmt.Errorf("could not sync secrets: %v", err) return err } - c.logger.Debugf("syncing services") if err = c.syncServices(); err != nil { err = fmt.Errorf("could not sync services: %v", err) return err @@ -482,6 +479,7 @@ func (c *Cluster) syncSecrets() error { err error secret *v1.Secret ) + c.logger.Info("syncing secrets") c.setProcessName("syncing secrets") secrets := c.generateUserSecrets() diff --git a/pkg/controller/postgresql.go b/pkg/controller/postgresql.go index 09ed83dc0..4b5d68fe5 100644 --- a/pkg/controller/postgresql.go +++ b/pkg/controller/postgresql.go @@ -473,7 +473,7 @@ func (c *Controller) queueClusterEvent(informerOldSpec, informerNewSpec *acidv1. if err := c.clusterEventQueues[workerID].Add(clusterEvent); err != nil { lg.Errorf("error while queueing cluster event: %v", clusterEvent) } - lg.Infof("%q event has been queued", eventType) + lg.Infof("%s event has been queued", eventType) if eventType != EventDelete { return @@ -494,7 +494,7 @@ func (c *Controller) queueClusterEvent(informerOldSpec, informerNewSpec *acidv1. if err != nil { lg.Warningf("could not delete event from the queue: %v", err) } else { - lg.Debugf("event %q has been discarded for the cluster", evType) + lg.Debugf("event %s has been discarded for the cluster", evType) } } }